Skip to content
Snippets Groups Projects
Commit 2117425a authored by Eduardo L. Buratti's avatar Eduardo L. Buratti
Browse files

Copy bootstrap files from buildpackage to build

parent 360a420e
No related branches found
No related tags found
No related merge requests found
#!/bin/bash
# Copyright (C) 2009-2012 Centro de Computacao Cientifica e Software Livre
# Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
#
# This file is part of buildpackage
#
# buildpackage is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
# USA.
# This is the installation bootstrap
# ------------------------------------------------------------------------------
# This function checks the integrity of the tar package
verify_md5(){
printf "Verificando MD5... " >&3
if [[ ${MD5_CHECK} == $(md5sum ${FILE} | awk '{print $1}') ]] ; then
printf "OK!\n" >&3
else
printf "ERRO: Este pacote está corrompido. %b" \
"Por favor, faça um novo download.\n" >&3
rm -rf "${FILE}" &> /dev/null
exit 4
fi
}
# ------------------------------------------------------------------------------
# This function collects the agent log, data and runs some tests, in case some
# error ocurred during the installation
collect_information(){
printf "\nAlgumas informações referentes ao agente PROINFODATA %b%b%b%b" \
"recém instalado serão coletadas. O resultado da coleta " \
"será armazenado no arquivo temporário \"${LOGFILE}\". Favor " \
"enviar esse arquivo para \"proinfodata@c3sl.ufpr.br\". Assim " \
"a equipe ficará ciente do problema para resolvê-lo.\n\n" >&3
printf "Iniciando coleta das informações (isso pode demorar alguns %b" \
"minutos)... " >&3
printf " Configuration files\n%b" \
" ===================\n\n"
printf "version\n"
cat ${AGENT_DIR}/client/conf/version
printf "proxy\n"
cat ${AGENT_DIR}/client/conf/proxy
printf "inep\n"
cat ${AGENT_DIR}/client/conf/inep
printf "\n\n----------------------------------\n\n"
printf " OS information\n%b" \
" ==============\n\n"
printf "Distro\n"
DISTRO=$(cut -sd ' ' -f1 /etc/issue | head -n 1)
if test -f "/etc/le_version"; then
printf "Linux Educacional $(cat /etc/le_version)\n"
elif test "${DISTRO}" = "Ubuntu" -a -f "/usr/lib/edu/fbedu/tutorial.htm"; then
printf "Linux Educacional\n"
elif test "${DISTRO}" = "Mandriva"; then
head -n 1 /etc/issue
elif test "${DISTRO}" = "Welcome"; then
cut -sd "\\" -f1 /etc/issue | cut -d ' ' -f3-
else
cut -sd "\\" -f1 /etc/issue
fi
printf "Kernel\n"
cut -d " " -f3 /proc/version
printf "\n\n----------------------------------\n\n"
printf " Commands\n%b" \
" ========\n\n"
printf "seed_mec user crontab\n"
crontab -u seed_mec -l
printf "ifconfig\n"
/sbin/ifconfig
printf "route\n"
/sbin/route
printf "Routes test\n"
for interface in $(/sbin/route | grep default | awk '{print $NF}'); do
printf "Tested interface: ${interface}\n"
# Send ICMP ECHO_REQUEST to root server I or J
ping -c 1 -I ${interface} 192.36.148.17
ping -c 1 -I ${interface} 192.58.128.30
done
printf "\n\n----------------------------------\n\n"
printf " seed_mec user files\n%b" \
" ===================\n\n"
ls -lR "${SEED_MEC_HOME}"
printf "\n\n----------------------------------\n\n"
printf " Inventory XML\n%b" \
" =============\n\n"
cat ${AGENT_DIR}/data/collect-data.xml
printf "\n\n----------------------------------\n\n"
printf " run.sh\n%b" \
" ========\n\n"
cat ${AGENT_DIR}/client/run.sh
printf "\n\n----------------------------------\n\n"
printf " agent.sh\n%b" \
" ========\n\n"
cat ${AGENT_DIR}/agent.sh
printf "\n\n----------------------------------\n\n"
printf " Collect agent log\n%b" \
" =================\n\n"
cat ${AGENT_DIR}/log/collect.log
printf "\n\n----------------------------------\n\n"
printf " Web service client log\n%b" \
" ======================\n\n"
cat ${AGENT_DIR}/client/run.log
printf "\n\n----------------------------------\n\n"
printf " TincUCA client log\n%b" \
" ==================\n\n"
cat ${AGENT_DIR}/log/tincucaclient-install.log
printf "\n\n----------------------------------\n\n"
printf "feito!\n\nFavor enviar o arquivo temporário \"${LOGFILE}\"%b%b%b" \
" para \"proinfodata@c3sl.ufpr.br\".\n\n" \
"Em caso de dúvidas, acesse o portal do PROINFODATA:\n" \
"proinfodata.c3sl.ufpr.br\n" >&3
}
# ------------------------------------------------------------------------------
printf "Iniciando instalação do agente PROINFODATA. Tenha certeza de %b%b%b" \
"estar conectado à Internet e executando este arquivo como super-" \
"usuário (root). Além disso, para o agente funcionar é necessário " \
"ter instalado no sistema os pacotes \"cron\" e \"sudo\".\n"
# These variables will be replaced when generating the installation package
MD5_CHECK=
BOOTSTRAP_LINES=
# Set variables
FILE="SEED2.tgz"
PROJECTOR=$(grep "Projetor ProInfo" /etc/issue 2> /dev/null)
UCA_SERVER=$(grep "Metasys School Server" /etc/issue 2> /dev/null)
UCA_CLASSMATE=$(grep "Metasys ClassmatePC" /etc/issue 2> /dev/null)
if test -f "/usr/sbin/projetor" -o -n "${PROJECTOR}"; then
SEED_MEC_HOME="/mnt/conf/seed_mec"
else
SEED_MEC_HOME="/opt/seed_mec"
fi
AGENT_DIR="${SEED_MEC_HOME}/SEED2"
LASTEXEC="${AGENT_DIR}/tmp/lastExec.tmp"
LOGFILE=/tmp/collected-information.log
# Save stdout to file descriptor 3 and redirect all output to $LOGFILE
exec 3>&1 &> ${LOGFILE}
# Check if lastExec.tmp exist then save its content to prevent that
# agent send a inventory more than once per day
if test -f ${LASTEXEC}; then
LASTEXECBACKUP=$(cat ${LASTEXEC})
fi
# Remove any previous installation of the agent
rm -rf "${AGENT_DIR}"
/usr/sbin/userdel -r seed_mec
/usr/sbin/groupdel seed_mec
# Create seed_mec group and exit on error (except by the error of previous
# existence of seed_mec group)
if ! /usr/sbin/groupadd -f seed_mec; then
printf "ERRO: Falha ao criar o grupo seed_mec.\n" >&3
exit 1
fi
# Create the directory path to make sure useradd(1) will be able to create the
# home for seed_mec user
mkdir -p "$(dirname ${SEED_MEC_HOME})"
# This is a temporary skel directory to avoid installing in the default skel
TMPSKEL=$(mktemp -d)
# Create seed_mec user with seed_mec as group, BASH as default shell,
# $SEED_MEC_HOME as home and $TMPSKEL as temporary skel
/usr/sbin/useradd -r -m -g seed_mec -s /bin/bash -d "${SEED_MEC_HOME}" \
-k "${TMPSKEL}" seed_mec
RETVAL=$?
# If an error occurred (return isn't 0), besides the previous existence of
# seed_mec user (return 9, which means the agent will be reinstalled), print an
# error message and exit
if test ${RETVAL} -ne 0 -a ${RETVAL} -ne 9; then
printf "ERRO: Falha ao criar o usuário seed_mec.\n" >&3
exit 2
fi
# Remove the temporary skel, as it isn't needed anymore
rmdir "${TMPSKEL}"
# ------------------------------------------------------------------------------
# Ensure seed_mec's home exists
mkdir -p "${SEED_MEC_HOME}"
# Remove old crontab of seed_mec, in case there's one, avoinding a specific
# error of wrong owner (lack of permissions)
crontab -u seed_mec -r
# Check if this is not an UCA Classmate, UCA Server nor PROINFO Projector, and
# if the line that gives root permission doesn't exist before adding it
if ! test -n "${PROJECTOR}" -o -f "/usr/sbin/projetor" -o \
-f "/etc/cmpc-release" -o -n "${UCA_SERVER}" -o \
-n "${UCA_CLASSMATE}"; then
# Remove any possible line containing a rule for seed_mec user before adding
# root permissions in the sudoers file
TMPFILE=$(mktemp)
sed '/^seed_mec[\t ]*ALL=(ALL/d' /etc/sudoers > "${TMPFILE}"
mv "${TMPFILE}" /etc/sudoers
chmod 440 /etc/sudoers
# Add root permissions to seed_mec user, without the need of password
if ! $(echo -e "seed_mec\tALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers)
then
printf "ERRO: Falha ao adicionar permissões de super-usuário %b" \
"ao usuário seed_mec.\n" >&3
exit 3
fi
fi
# ------------------------------------------------------------------------------
# Uncompress tar package and check its integrity
tail -n +${BOOTSTRAP_LINES} $0 > "${SEED_MEC_HOME}/${FILE}"
cd "${SEED_MEC_HOME}"
verify_md5
# Remove old agent and extract the new one
rm -rf "${AGENT_DIR}" &> /dev/null
tar xzf "${FILE}" &> /dev/null
rm -rf "${FILE}" &> /dev/null
# Change files' owner
if ! chown -R seed_mec:seed_mec "${SEED_MEC_HOME}"; then
rm -rf "${SEED_MEC_HOME}" &> /dev/null
printf "ERRO: Falha ao mudar dono dos arquivos.\n" >&3
exit 5
fi
# ------------------------------------------------------------------------------
# Export a variable to inform the agent that this is its first execution
export FIRST_EXECUTION=1
# Restore lastExec.tmp
if ! test -z ${LASTEXECBACKUP};then
echo ${LASTEXECBACKUP} > ${LASTEXEC}
fi
# Run the agent and check if its execution went alright, exiting in case of
# error
if ! su -c "bash ${AGENT_DIR}/update.sh" seed_mec ||
! su -c "bash ${AGENT_DIR}/inventory.sh" seed_mec; then
printf "ERRO: Falha na execução do novo agente.\n" >&3
collect_information
exit 6
fi
# Restore stdout and close fd 3
exec >&3 3>&-
printf "\nO agente PROINFODATA foi instalado com sucesso. %b%b" \
"Em caso de dúvidas, acesse o portal do PROINFODATA:\n" \
"proinfodata.c3sl.ufpr.br\n"
exit 0
#!/bin/bash
# Copyright (C) 2009-2012 Centro de Computacao Cientifica e Software Livre
# Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
#
# This file is part of buildpackage
#
# buildpackage is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
# USA.
# This is the update bootstrap
# ------------------------------------------------------------------------------
# This function verifies if the package MD5 is correct
verify_md5(){
printf "[SEED2-update] Checking MD5... "
if [[ ${MD5_CHECK} == $(md5sum "${SEED_MEC_HOME}/update/tmp/${FILE}" | \
awk '{print $1}') ]]; then
printf "OK!\n"
else
printf "ERROR: This package is currupted.\n"
rm -rf ${FILE} &> /dev/null
exit 1
fi
}
# ------------------------------------------------------------------------------
# Re-create the inep and proxy's MD5
restore_inep_proxy_md5sum(){
for FILE in inep proxy; do
md5sum "${SEED_MEC_HOME}/SEED2/client/conf/${FILE}" |cut -d' ' -f1 > \
"${SEED_MEC_HOME}/${UPDATE_DIR}/.md5sum/client/conf/${FILE}"
# The backup md5 is the same
cp -a "${SEED_MEC_HOME}/${UPDATE_DIR}/.md5sum/client/conf/${FILE}" \
"${SEED_MEC_HOME}/${UPDATE_DIR}/.md5sum/.backup/client/conf/"
done
}
# ------------------------------------------------------------------------------
# Re-create the inep and proxy files' backup and copy the MD5 files
restore_inep_proxy_backup(){
for FILE in inep proxy; do
# The backup itself
cp -a "${SEED_MEC_HOME}/SEED2/client/conf/${FILE}" \
"${SEED_MEC_HOME}/${UPDATE_DIR}/.backup/client/conf/"
done
}
# ------------------------------------------------------------------------------
# These variables will be replaced while generating the package
FILE=
MD5_CHECK=
BOOTSTRAP_LINES=
if test -n "${HOME}"; then
SEED_MEC_HOME=${HOME}
else
SEED_MEC_HOME=/opt/seed_mec
fi
UPDATE_DIR="update/tmp/SEED2-run"
# ------------------------------------------------------------------------------
# Create auxiliar directories
mkdir -p "${SEED_MEC_HOME}/update/tmp"
mkdir -p "${SEED_MEC_HOME}/update/old"
# Extract the tar package
tail -n +${BOOTSTRAP_LINES} "$0" > "${SEED_MEC_HOME}/update/tmp/${FILE}"
verify_md5
cd "${SEED_MEC_HOME}/update/tmp"
tar xzf "${FILE}" &> /dev/null
cd - &> /dev/null
# ------------------------------------------------------------------------------
# Make sure the directories exist in the update tree to backup the inep and
# proxy files, along with their counterparts (backup and MD5)
mkdir -p "${SEED_MEC_HOME}/update/tmp/SEED2-run/client/conf"
mkdir -p "${SEED_MEC_HOME}/update/tmp/SEED2-run/.md5sum/client/conf"
mkdir -p "${SEED_MEC_HOME}/update/tmp/SEED2-run/.backup/client/conf"
mkdir -p "${SEED_MEC_HOME}/update/tmp/SEED2-run/.md5sum/.backup/client/conf"
# Check if the inep and proxy files exist
ERROR=0
INEP_PROXY="${SEED_MEC_HOME}/SEED2/client/conf/inep
${SEED_MEC_HOME}/SEED2/client/conf/proxy"
for FILE in ${INEP_PROXY}; do
test -f "${FILE}" || ERROR=1
done
# Copy the inep and proxy files. Also, copy their backups and MD5 counterparts,
# if they exist. Otherwise, create them
if test "${ERROR}" -eq 0; then
# Copy inep and proxy to the new tree
cp -a "${SEED_MEC_HOME}/SEED2/client/conf/"{inep,proxy} \
"${SEED_MEC_HOME}/update/tmp/SEED2-run/client/conf/"
# Copy or create the md5 files from inep and proxy
(test -d "${SEED_MEC_HOME}/SEED2/.md5sum" &&
cp -a "${SEED_MEC_HOME}/SEED2/.md5sum/client/conf/"{inep,proxy} \
"${SEED_MEC_HOME}/update/tmp/SEED2-run/.md5sum/client/conf/" &&
cp -a "${SEED_MEC_HOME}/SEED2/.md5sum/.backup/client/conf/"{inep,proxy} \
"${SEED_MEC_HOME}/update/tmp/SEED2-run/.md5sum/.backup/client/conf/") ||
restore_inep_proxy_md5sum
# Copy or create the backup files from inep and proxy
(test -d "${SEED_MEC_HOME}/SEED2/.backup" &&
cp -a "${SEED_MEC_HOME}/SEED2/.backup/client/conf/"{inep,proxy} \
"${SEED_MEC_HOME}/update/tmp/SEED2-run/.backup/client/conf/") ||
restore_inep_proxy_backup
fi
# ------------------------------------------------------------------------------
# TODO: do some security backup???
#cp -ra "${SEED_MEC_HOME}/SEED2/" "${SEED_MEC_HOME}/old/"
# If something interrupts the script here, the tree will not be entirely
# correct, so a file is created to mark that something happened. During the next
# next execution the package will try to recover itself
##### CRITICAL #####
touch "${SEED_MEC_HOME}/SEED2/updating"
# md5sum and backup folders
rm -rf "${SEED_MEC_HOME}/SEED2/.md5sum" \
"${SEED_MEC_HOME}/SEED2/.backup" &> /dev/null
mv -f "${SEED_MEC_HOME}/update/tmp/SEED2-run/"{.md5*,.back*}* \
"${SEED_MEC_HOME}/SEED2/"
# Copy the files themself
rm -rf "${SEED_MEC_HOME}/SEED2/"{bin,lib,net,client,extra,network-scripts,scripts} &> /dev/null
mv -f "${SEED_MEC_HOME}/update/tmp/SEED2-run/"* \
"${SEED_MEC_HOME}/SEED2/"
rm -f "${SEED_MEC_HOME}/SEED2/updating" &> /dev/null
### END CRITICAL ###
# ------------------------------------------------------------------------------
# Remove auxiliar directories
rm -rf "${SEED_MEC_HOME}/update" &> /dev/null
# Call the agent
"${SEED_MEC_HOME}/SEED2/update.sh"
exit 0
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment