Script functions.sh
Jump to navigation
Jump to search
#!/bin/sh
#
# /srv/config/functions.sh
#
#
#########################
############# VARIABILI
### Percorsi
PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin";
CONF_PATH="/srv/config/etc";
LOG_PATH="/srv/config/log";
### Colori
NORMAL="\033[0;39m";
NORMALBACK="\033[0;49m";
WHITE="\033[1;37m";
WHITEBACK="\033[1;47m";
YELLOW="\033[1;33m";
YELLOWBACK="\033[1;43m";
GREEN="\033[1;32m";
GREENBACK="\033[1;42m";
CYAN="\033[1;36m";
CYANBACK="\033[1;46m";
BLUE="\033[1;34m";
BLUEBACK="\033[1;44m";
PINK="\033[1;35m";
PINKBACK="\033[1;45m";
RED="\033[1;31m";
REDBACK="\033[1;41m";
### Caratteri
UNDERLINE="\033[1;38m"
COLS=`stty size | cut -d ' ' -f 2 2>/dev/null`
if test $? -eq 0; then
SPACE="\033["$(( ${COLS} /4*3 ))"G";
else
SPACE="\033[60G";
fi;
#########################
############## FUNZIONI
### output all'utente
echo_start() {
echo -ne " ${GREEN}+${NORMAL} $1";
}
echo_stop() {
echo -ne " ${RED}-${NORMAL} $1";
}
echo_success() {
echo -e "${SPACE}${BLUE}[${GREEN} success ${BLUE}]${NORMAL}";
}
echo_done() {
echo -e "${SPACE}${BLUE}[${GREEN} done ${BLUE}]${NORMAL}";
}
echo_unknown() {
echo -e "${SPACE}${BLUE}[${RED} unknown ${BLUE}]${NORMAL}";
}
echo_no_log() {
echo -e "${SPACE}${BLUE}[${RED} no_log ${BLUE}]${NORMAL}";
}
echo_no_conf() {
echo -e "${SPACE}${BLUE}[${RED} no_conf ${BLUE}]${NORMAL}";
}
echo_no_dir() {
echo -e "${SPACE}${BLUE}[${RED} no_dir ${BLUE}]${NORMAL}";
}
echo_no_other() {
echo -e "${SPACE}${BLUE}[${RED} no_other ${BLUE}]${NORMAL}";
}
echo_running() {
echo -e "${SPACE}${BLUE}[${YELLOW} running ${BLUE}]${NORMAL}";
}
echo_not_run() {
echo -e "${SPACE}${BLUE}[${YELLOW} not_run ${BLUE}]${NORMAL}";
}
echo_warning() {
echo -e "${SPACE}${BLUE}[${WHITE} warning ${BLUE}]${NORMAL}";
}
echo_failure() {
echo -e "${SPACE}${BLUE}[${RED} failure ${BLUE}]${NORMAL}";
}
echo_no_own() {
echo -e "${SPACE}${BLUE}[${YELLOW} no-own! ${BLUE}]${NORMAL}";
}
### basename senza avere il pacchetto coreutils
base_name()
{
TEXT="$1";
TEXT_OLD="";
while test "${TEXT}" != "${TEXT_OLD}"; do
TEXT_OLD="${TEXT}";
TEXT=`echo ${TEXT} | cut -d '/' -f 2-`;
if test -z "${TEXT}"; then
echo "${TEXT_OLD}";
return 0;
fi;
done;
echo "${TEXT}";
return 0;
}
# resize per i file di log
resize()
{
FILE="$1"
NEWSIZE="$2"
if test -r "${FILE}"; then
SIZE=`du -k "${FILE}" | cut -f 1`;
if test ${SIZE} -gt ${NEWSIZE}; then
dd if="${FILE}" of="${FILE}".tmp bs=1k skip=$(($SIZE-$NEWSIZE)) &> /dev/null;
mv -f "${FILE}".tmp "${FILE}";
fi;
fi;
}
# ciclo principale
daemon_main()
{
case "${ACTION}" in
start)
echo -en "${WHITE}${TITLE}${NORMAL}...";
;;
stop)
echo -en "${WHITE}${TITLE}${NORMAL}...";
;;
esac
test ! -d "${LOG_PATH}" && echo_no_log && exit -2;
# testo tutto quello che c'e' da testare
N=1;
while test -n "${PROG[$N]}"; do
# controlla l'esistenza di un user, appoggiandosi sul filesystem
touch $LOG_PATH/tmp_file &>/dev/null;
chown "${OWN[$N]}:root" $LOG_PATH/tmp_file &> /dev/null;
if test $? -ne 0; then echo_no_own; exit -4; fi;
rm -f $LOG_PATH/tmp_file;
# testo se il programma e' eseguibile
test ! -x "${PROG[$N]}" && echo_unknown && exit -3;
# se esistono le altre variabili le testo
test -n "${FILE[$N]}" && test ! -r "${FILE[$N]}" && echo_no_conf && exit -5;
test -n "${DIR[$N]}" && test ! -d "${DIR[$N]}" && echo_no_dir && exit -6;
test -n "${OTHER[$N]}" && test ! -r "${OTHER[$N]}" && echo_no_other && exit -7;
N=$(($N+1));
done;
# eseguo la volonta' dell'admin
case "${ACTION}" in
start)
# se l'output da dare all'utente non e' singolo, vado accapo
test "${SINGLE_OUTPUT}" = "true" || echo
# avvio i comandi nell' ordine in cui sono stati dichiarati
N=1;
while test -n "${PROG[$N]}"; do
# se questo comando non va nascosto, lo mostro
test "${HIDE_OUTPUT[$N]}" = "true" || echo_start "${START_OPT[$N]}";
if test "${DAEMON[$N]}" = "true"; then
# controllo che non sia in esecuzione
# NOTA: da rifare usando i pid di start!!!!
pidof "${NAME[$N]}" &> /dev/null;
if test $? -eq 0; then
test "${HIDE_OUTPUT[$N]}" = "true" || echo_running;
else
su "${OWN[$N]}" -c "${START_OPT[$N]}" >> "${LOG_PATH}/${NAME[$N]}.log";
if test $? -eq 0; then
test "${HIDE_OUTPUT[$N]}" = "true" || echo_success;
else
test "${HIDE_OUTPUT[$N]}" = "true" || echo_failure;
fi;
fi;
else
su "${OWN[$N]}" -c "${START_OPT[$N]}" >> "${LOG_PATH}/${NAME[$N]}.log";
if test $? -eq 0; then
test "${HIDE_OUTPUT[$N]}" = "true" || echo_success;
else
test "${HIDE_OUTPUT[$N]}" = "true" || echo_failure;
fi;
fi;
N=$(($N+1));
done;
test "${SINGLE_OUTPUT}" = "true" && echo_success;
;;
stop)
# se l'output da dare all'utente non e' singolo, vado accapo
test "${SINGLE_OUTPUT}" = "true" || echo
# termino i comandi in ordine contrario a quello di avvio
# NOTA: la variabile N presa dal check e' FONDAMENTALE
N=$(($N-1));
while test ${N} -ne 0; do
# se questo comando non va nascosto, lo mostro
test "${HIDE_OUTPUT[$N]}" = "true" || echo_stop "${STOP_OPT[$N]}";
if test "${DAEMON[$N]}" = "true"; then
# controllo che sia in esecuzione
# NOTA: da rifare usando i pid di start!!!!
pidof "${NAME[$N]}" &> /dev/null;
if test $? -ne 0; then
test "${HIDE_OUTPUT[$N]}" = "true" || echo_not_run;
else
su "${OWN[$N]}" -c "${STOP_OPT[$N]}" >> "${LOG_PATH}/${NAME[$N]}.log";
if test $? -eq 0; then
test "${HIDE_OUTPUT[$N]}" = "true" || echo_success;
else
test "${HIDE_OUTPUT[$N]}" = "true" || echo_failure;
fi;
fi;
else
su "${OWN[$N]}" -c "${STOP_OPT[$N]}" >> "${LOG_PATH}/${NAME[$N]}.log";
if test $? -eq 0; then
test "${HIDE_OUTPUT[$N]}" = "true" || echo_success;
else
test "${HIDE_OUTPUT[$N]}" = "true" || echo_failure;
fi;
fi;
N=$(($N-1));
done;
test "${SINGLE_OUTPUT}" = "true" && echo_success;
;;
restart)
echo
${0} stop;
sleep 3s;
${0} start;
;;
*)
echo " Usage: ${0} {start|stop|restart}";
exit -1;
;;
esac
}
# End