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-05 00:04:22 +02:00
# version 0.3
# 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-20 15:24:09 +02:00
# Treat unset variables as an error when substituting.
set -u
2015-09-13 15:29:22 +02:00
test -f /etc/evomaintenance.cf && . /etc/evomaintenance.cf
2018-09-20 14:25:16 +02:00
[ -n " ${ HOSTNAME } " ] || HOSTNAME = $( hostname)
[ -n " ${ HOSTNAME_INTERNAL } " ] || HOSTNAME_INTERNAL = " ${ HOSTNAME } "
[ -n " ${ EVOMAINTMAIL } " ] || EVOMAINTMAIL = evomaintenance-$( echo " ${ HOSTNAME_INTERNAL } " | cut -d- -f1) @${ REALM }
[ -n " ${ LOGFILE } " ] || LOGFILE = /var/log/evomaintenance.log
if [ " ${ HOSTNAME } " = " ${ HOSTNAME_INTERNAL } " ] ; then
HOSTNAME_TEXT = " ${ HOSTNAME } "
else
HOSTNAME_TEXT = " ${ HOSTNAME_INTERNAL } ( ${ HOSTNAME } ) "
fi
2015-09-13 15:29:22 +02:00
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-05 18:44:53 +02:00
WHO = $( LC_ALL = C who -m)
USER = $( echo ${ WHO } | cut -d" " -f1)
2018-09-05 00:03:16 +02:00
IP = $( echo ${ WHO } | cut -d" " -f6 | sed -e " s/^(// ; s/) $// " )
2018-09-06 10:12:06 +02:00
BEGIN_DATE = " $( date "+%Y" ) $( echo ${ WHO } | cut -d" " -f3,4,5) "
END_DATE = $( date +"%Y %b %d %H:%M" )
# we can't use "date --iso8601" because this options is not available everywhere
NOW_ISO = $( date +"%Y-%m-%dT%H:%M:%S%z" )
2015-09-13 15:29:22 +02:00
2018-09-20 15:24:46 +02:00
# git diffs
GIT_DIFFS = ""
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)
if [ " ${ CHANGED_LINES } " != "0" ] ; then
DIFF = $( ${ GIT_BIN } diff --stat | tail -n 10)
# append diff data, without empty lines
GIT_DIFFS = $( echo " ${ GIT_DIFFS } \n ${ GIT_DIR } (last 10 lines)\n ${ DIFF } \n " | 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_DIFFS } " ] ; then
echo "/!\ There are some uncommited changes. If you proceed, everything will be commited."
echo " ${ GIT_DIFFS } "
echo ""
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-06 10:54:02 +02:00
echo " ----------- ${ NOW_ISO } --------------- " >> " ${ LOGFILE } "
2018-09-06 10:12:06 +02:00
echo " ${ BLOB } " >> " ${ LOGFILE } "
2018-09-04 22:50:25 +02:00
# git commit
2018-09-07 15:03:25 +02:00
GIT_COMMITS = ""
2018-09-04 23:10:27 +02:00
if test -x " ${ GIT_BIN } " ; then
2018-09-06 10:46:50 +02:00
# loop on possible directories managed by GIT
2018-09-20 15:24:46 +02:00
for dir in ${ GIT_REPOSITORIES } ; do
2018-09-06 10:46:50 +02:00
# 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
2018-09-20 15:24:46 +02:00
CHANGED_LINES = $( ${ GIT_BIN } status --porcelain | wc -l)
2018-09-06 12:22:35 +02:00
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
2018-09-07 15:03:25 +02:00
SHA = $( ${ GIT_BIN } rev-parse --short HEAD)
STATS = $( ${ GIT_BIN } show --stat | tail -1)
# append commit data, without empty lines
GIT_COMMITS = $( echo " ${ GIT_COMMITS } \n ${ GIT_DIR } : ${ SHA } – ${ STATS } " | sed -e '/^$/d' )
2018-09-06 10:12:26 +02:00
fi
fi
2018-09-06 10:46:50 +02:00
# unset environment variables to prevent accidental influence on other git commands
unset GIT_DIR GIT_WORK_TREE
2018-09-06 10:12:26 +02:00
done
2018-09-07 15:03:25 +02:00
if [ -n " ${ GIT_COMMITS } " ] ; then
echo " ${ GIT_COMMITS } " >> " ${ LOGFILE } "
fi
2015-12-02 16:20:42 +01:00
fi
2018-09-04 22:50:25 +02:00
# insert into PG
2018-09-20 14:25:37 +02:00
# SQL_TEXTE=`echo "${TEXTE}" | sed "s/'/\\\\\\'/g ; s@/@\\\\\/@g ; s@\\&@et@g"`
SQL_TEXTE = ` echo " ${ TEXTE } " | sed "s/'/''/g" `
2018-09-04 22:50:25 +02:00
2018-09-20 15:25:25 +02:00
PG_QUERY = " INSERT INTO evomaint(hostname,userid,ipaddress,begin_date,end_date,details) VALUES (' ${ HOSTNAME_INTERNAL } ',' ${ USER } ',' ${ IP } ',' ${ BEGIN_DATE } ',now(),' ${ SQL_TEXTE } ') "
echo " ${ PG_QUERY } " | psql ${ PGDB } ${ PGTABLE } -h ${ PGHOST }
2015-09-13 15:29:22 +02:00
2018-09-04 22:50:25 +02:00
# send mail
2018-09-07 15:03:25 +02:00
MAIL_TEXTE = $( echo " ${ TEXTE } " | sed "s@/@\\\\\/@g" )
MAIL_GIT_COMMITS = $( echo " ${ GIT_COMMITS } " | sed "s@/@\\\\\/@g" )
2015-09-13 15:29:22 +02:00
cat /usr/share/scripts/evomaintenance.tpl | \
2018-09-20 14:25:16 +02:00
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 } / " | \
2018-09-20 15:23:52 +02:00
${ SENDMAIL_BIN } -oi -t -f ${ FROM }