2015-09-13 15:29:22 +02:00
#!/bin/sh
# EvoMaintenance script
2016-12-08 16:51:55 +01:00
# Dependencies (all OS): git postgresql-client
# Dependencies (Debian): sudo
2015-09-13 15:29:22 +02:00
2018-09-25 11:55:41 +02:00
# version 0.4.1
2018-09-05 00:04:22 +02:00
# Copyright 2007-2018 Gregory Colpart <reg@evolix.fr>, Jérémy Lecour <jlecour@evolix.fr>, Evolix <info@evolix.fr>
2016-12-08 16:32:35 +01:00
2018-09-25 09:48:29 +02:00
get_system( ) {
2019-03-07 22:21:44 +01:00
uname -s
2018-09-25 09:48:29 +02:00
}
get_fqdn( ) {
2019-03-07 22:21:44 +01:00
if [ " $( get_system) " = "Linux" ] ; then
hostname --fqdn
elif [ " $( get_system) " = "OpenBSD" ] ; then
hostname
else
echo "OS not detected!"
exit 1
fi
2018-09-25 09:48:29 +02:00
}
get_tty( ) {
2019-03-07 22:21:44 +01:00
if [ " $( get_system) " = "Linux" ] ; then
ps -o tty = | tail -1
elif [ " $( get_system) " = "OpenBSD" ] ; then
env | grep SSH_TTY | cut -d"/" -f3
else
echo "OS not detected!"
exit 1
fi
2018-09-25 09:48:29 +02:00
}
get_who( ) {
2019-03-07 22:21:44 +01:00
who = $( LC_ALL = C who -m)
2018-09-25 09:48:29 +02:00
2019-03-07 22:21:44 +01:00
if [ -n " ${ who } " ] ; then
echo " ${ who } "
else
LC_ALL = C who | grep $( get_tty) | tr -s ' '
fi
2018-09-25 09:48:29 +02:00
}
get_begin_date( ) {
2019-03-07 22:21:44 +01:00
echo " $( date "+%Y" ) $( echo $( get_who) | cut -d" " -f3,4,5) "
2018-09-25 09:48:29 +02:00
}
get_ip( ) {
2019-03-07 22:21:44 +01:00
ip = $( echo $( get_who) | cut -d" " -f6 | sed -e " s/^(// ; s/) $// " )
[ -z " ${ ip } " ] && ip = "unknown (no tty)"
[ " ${ ip } " = ":0" ] && ip = "localhost"
2018-09-25 09:48:29 +02:00
2019-03-07 22:21:44 +01:00
echo " ${ ip } "
2018-09-25 09:48:29 +02:00
}
get_end_date( ) {
2019-03-07 22:21:44 +01:00
date +"%Y %b %d %H:%M"
2018-09-25 09:48:29 +02:00
}
get_now( ) {
2019-03-07 22:21:44 +01:00
date +"%Y-%m-%dT%H:%M:%S%z"
2018-09-25 09:48:29 +02:00
}
2019-03-07 23:04:06 +01:00
get_complete_hostname( ) {
REAL_HOSTNAME = $( get_fqdn)
if [ " ${ HOSTNAME } " = " ${ REAL_HOSTNAME } " ] ; then
echo " ${ HOSTNAME } "
else
echo " ${ HOSTNAME } ( ${ REAL_HOSTNAME } ) "
fi
}
get_repository_status( ) {
dir = $1
# tell Git where to find the repository and the work tree (no need to `cd …` there)
export GIT_DIR = " ${ dir } /.git " GIT_WORK_TREE = " ${ dir } "
# If the repository and the work tree exist, try to commit changes
if test -d " ${ GIT_DIR } " && test -d " ${ GIT_WORK_TREE } " ; then
CHANGED_LINES = $( ${ GIT_BIN } status --porcelain | wc -l | tr -d ' ' )
if [ " ${ CHANGED_LINES } " != "0" ] ; then
STATUS = $( ${ GIT_BIN } status --short | tail -n 10)
# append diff data, without empty lines
RESULT = $( printf "%s\n%s\n" " ${ GIT_DIR } (last 10 lines) " " ${ STATUS } " | sed -e '/^$/d' )
fi
fi
# unset environment variables to prevent accidental influence on other git commands
unset GIT_DIR GIT_WORK_TREE
echo " ${ RESULT } "
}
2018-09-25 09:48:29 +02:00
2019-03-07 23:04:19 +01:00
hook_commit( ) {
2019-03-07 22:32:58 +01:00
GIT_COMMITS = ""
if test -x " ${ GIT_BIN } " ; then
# loop on possible directories managed by GIT
for dir in ${ GIT_REPOSITORIES } ; do
# tell Git where to find the repository and the work tree (no need to `cd …` there)
export GIT_DIR = " ${ dir } /.git " GIT_WORK_TREE = " ${ dir } "
# If the repository and the work tree exist, try to commit changes
if test -d " ${ GIT_DIR } " && test -d " ${ GIT_WORK_TREE } " ; then
CHANGED_LINES = $( ${ GIT_BIN } status --porcelain | wc -l | tr -d ' ' )
if [ " ${ CHANGED_LINES } " != "0" ] ; then
${ GIT_BIN } add --all
${ GIT_BIN } commit --message " ${ TEXTE } " --author= " ${ USER } < ${ USER } @evolix.net> " --quiet
# Add the SHA to the log file if something has been committed
SHA = $( ${ GIT_BIN } rev-parse --short HEAD)
STATS = $( ${ GIT_BIN } show --stat | tail -1)
# append commit data, without empty lines
GIT_COMMITS = $( printf "%s\n%s : %s – %s" " ${ GIT_COMMITS } " " ${ GIT_DIR } " " ${ SHA } " " ${ STATS } " | sed -e '/^$/d' )
fi
fi
# unset environment variables to prevent accidental influence on other git commands
unset GIT_DIR GIT_WORK_TREE
done
if [ -n " ${ GIT_COMMITS } " ] ; then
echo " ${ GIT_COMMITS } " >> " ${ LOGFILE } "
fi
fi
}
2019-03-07 23:04:19 +01:00
hook_db( ) {
2019-03-07 22:32:58 +01:00
# SQL_TEXTE=`echo "${TEXTE}" | sed "s/'/\\\\\\'/g ; s@/@\\\\\/@g ; s@\\&@et@g"`
2019-03-07 23:07:25 +01:00
SQL_TEXTE = $( echo " ${ TEXTE } " | sed "s/'/''/g" )
2019-03-07 22:32:58 +01:00
PG_QUERY = " INSERT INTO evomaint(hostname,userid,ipaddress,begin_date,end_date,details) VALUES (' ${ HOSTNAME } ',' ${ USER } ',' ${ IP } ',' ${ BEGIN_DATE } ',now(),' ${ SQL_TEXTE } ') "
echo " ${ PG_QUERY } " | psql ${ PGDB } ${ PGTABLE } -h ${ PGHOST }
}
2019-03-07 23:04:19 +01:00
hook_mail( ) {
2019-03-07 22:32:58 +01:00
MAIL_TEXTE = $( echo " ${ TEXTE } " | sed -e "s@/@\\\\\/@g ; s@&@\\\\&@" )
MAIL_GIT_COMMITS = $( echo " ${ GIT_COMMITS } " | sed -e "s@/@\\\\\/@g ; s@&@\\\\&@" )
cat /usr/share/scripts/evomaintenance.tpl | \
sed -e " s/__TO__/ ${ EVOMAINTMAIL } / ; s/__HOSTNAME__/ ${ HOSTNAME_TEXT } / ; s/__USER__/ ${ USER } / ; s/__BEGIN_DATE__/ ${ BEGIN_DATE } / ; s/__END_DATE__/ ${ END_DATE } / ; s/__GIT_COMMITS__/ ${ MAIL_GIT_COMMITS } / ; s/__TEXTE__/ ${ MAIL_TEXTE } / ; s/__IP__/ ${ IP } / ; s/__FULLFROM__/ ${ FULLFROM } / ; s/__FROM__/ ${ FROM } / ; s/__URGENCYFROM__/ ${ URGENCYFROM } / ; s/__URGENCYTEL__/ ${ URGENCYTEL } / " | \
${ SENDMAIL_BIN } -oi -t -f ${ FROM }
}
2015-09-13 15:29:22 +02:00
test -f /etc/evomaintenance.cf && . /etc/evomaintenance.cf
2018-09-25 09:48:29 +02:00
[ -n " ${ HOSTNAME } " ] || HOSTNAME = $( get_fqdn)
2018-09-20 16:10:03 +02:00
[ -n " ${ EVOMAINTMAIL } " ] || EVOMAINTMAIL = evomaintenance-$( echo " ${ HOSTNAME } " | cut -d- -f1) @${ REALM }
[ -n " ${ LOGFILE } " ] || LOGFILE = /var/log/evomaintenance.log
2018-09-20 14:25:16 +02:00
2019-03-07 22:32:58 +01:00
[ -n " ${ OPT_COMMIT } " ] || OPT_COMMIT = 1
[ -n " ${ OPT_DB } " ] || OPT_DB = 1
[ -n " ${ OPT_MAIL } " ] || OPT_MAIL = 1
2019-03-07 22:50:18 +01:00
# Parse options
while :; do
case $1 in
# -h|-\?|--help) # Call a "show_help" function to display a synopsis, then exit.
# show_help
# exit
# ;;
--no-commit) # Takes an option argument
OPT_COMMIT = 0
; ;
--commit) # Takes an option argument
OPT_COMMIT = 1
; ;
--no-db) # Takes an option argument
OPT_DB = 0
; ;
--db) # Takes an option argument
OPT_DB = 1
; ;
--no-mail) # Takes an option argument
OPT_MAIL = 0
; ;
--mail) # Takes an option argument
OPT_MAIL = 1
; ;
--) # End of all options.
shift
break
; ;
-?*)
printf 'WARN: Unknown option (ignored): %s\n' " $1 " >& 2
; ;
*) # Default case: If no more options then break out of the loop.
break
esac
shift
done
2018-09-20 15:56:13 +02:00
# Treat unset variables as an error when substituting.
# Only after this line, because some config variables might be missing.
set -u
2019-03-07 22:50:18 +01:00
# Gather information
2019-03-07 23:04:06 +01:00
HOSTNAME_TEXT = $( get_complete_hostname)
2018-09-25 09:48:29 +02:00
# TTY=$(get_tty)
# WHO=$(get_who)
IP = $( get_ip)
BEGIN_DATE = $( get_begin_date)
END_DATE = $( get_end_date)
USER = $( logname)
2018-09-05 18:44:53 +02:00
PATH = ${ PATH } :/usr/sbin
2015-09-13 15:29:22 +02:00
2018-09-20 15:23:52 +02:00
SENDMAIL_BIN = $( command -v sendmail)
2018-09-20 14:23:54 +02:00
GIT_BIN = $( command -v git)
2018-09-20 15:24:46 +02:00
GIT_REPOSITORIES = "/etc /etc/bind"
2018-09-20 15:56:25 +02:00
# git statuses
GIT_STATUSES = ""
2018-09-20 15:24:46 +02:00
if test -x " ${ GIT_BIN } " ; then
# loop on possible directories managed by GIT
for dir in ${ GIT_REPOSITORIES } ; do
2019-03-07 23:04:06 +01:00
RESULT = $( get_repository_status " ${ dir } " )
if test -n " ${ RESULT } " ; then
GIT_STATUSES = $( printf "%s\n%s\n" " ${ GIT_STATUSES } " " ${ RESULT } " | sed -e '/^$/d' )
2018-09-20 15:24:46 +02:00
fi
done
2019-03-07 23:04:06 +01:00
if test -n " ${ GIT_STATUSES } " ; then
2019-03-07 22:21:44 +01:00
echo "/!\ There are some uncommited changes. If you proceed, everything will be commited."
echo " ${ GIT_STATUSES } "
echo ""
2018-09-20 15:24:46 +02:00
fi
fi
2018-09-06 10:50:07 +02:00
# get input from stdin
2018-09-20 15:26:51 +02:00
echo "> Please, enter details about your maintenance"
2015-09-13 15:29:22 +02:00
read TEXTE
2018-09-04 23:08:42 +02:00
if [ " ${ TEXTE } " = "" ] ; then
2015-09-13 15:29:22 +02:00
echo "no value..."
exit 1
fi
# recapitulatif
2018-09-05 18:45:46 +02:00
BLOB = $( cat <<END
2018-09-20 14:25:16 +02:00
Host : $HOSTNAME_TEXT
2018-09-06 10:44:13 +02:00
User : $USER
IP : $IP
Begin : $BEGIN_DATE
End : $END_DATE
Message : $TEXTE
2018-09-05 18:45:46 +02:00
END
)
2018-09-20 15:26:51 +02:00
echo ""
2018-09-05 18:45:46 +02:00
echo " ${ BLOB } "
2018-09-20 15:26:51 +02:00
echo ""
echo "> Press <Enter> to submit, or <Ctrl+c> to cancel."
2015-09-13 15:29:22 +02:00
read enter
2018-09-04 22:50:25 +02:00
# write log
2018-09-25 09:48:29 +02:00
echo " ----------- $( get_now) --------------- " >> " ${ LOGFILE } "
2018-09-06 10:12:06 +02:00
echo " ${ BLOB } " >> " ${ LOGFILE } "
2018-09-04 22:50:25 +02:00
# git commit
2019-03-07 23:04:19 +01:00
[ " ${ OPT_COMMIT } " = "1" ] && hook_commit
2015-12-02 16:20:42 +01:00
2018-09-04 22:50:25 +02:00
# insert into PG
2019-03-07 23:04:19 +01:00
[ " ${ OPT_DB } " = "1" ] && hook_db
2015-09-13 15:29:22 +02:00
2018-09-04 22:50:25 +02:00
# send mail
2019-03-07 23:04:19 +01:00
[ " ${ OPT_MAIL } " = "1" ] && hook_mail
2018-09-20 16:20:34 +02:00
exit 0