Refactoring

This commit is contained in:
Victor LABORIE 2016-12-20 11:04:24 +01:00
parent 9f10f9bc52
commit d663f4591d
11 changed files with 127 additions and 112 deletions

197
bkctl
View file

@ -1,24 +1,23 @@
#!/bin/bash #!/bin/bash
#
# bkctl is a shell script to create and manage a backup server which will
# handle the backup of many servers (clients).
id=$(id -u) id=$(id -u)
if [ $id != 0 ]; then if [ $id != 0 ]; then
echo "Error, you need to be root to run bkctl !" echo "Error, you need to be root to run bkctl !" >&2
exit 1 exit 1
fi fi
if [ -f /etc/default/evobackup ]; then if [ -f /etc/default/evobackup ]; then
source /etc/default/evobackup source /etc/default/evobackup
else else
echo "Error, you need /etc/default/evobackup !" echo "Error, you need /etc/default/evobackup !" >&2
exit 1 exit 1
fi fi
mkdir -p $CONFDIR $JAILDIR $INCDIR
ProgName=$(basename $0)
sub_help(){ sub_help(){
echo "Usage: $ProgName <subcommand> [options]" echo "Usage: bkctl <subcommand> [options]"
echo "Subcommands:" echo "Subcommands:"
echo " init <jailname>" echo " init <jailname>"
echo " start <jailname>" echo " start <jailname>"
@ -32,11 +31,12 @@ sub_help(){
echo " rm" echo " rm"
echo "" echo ""
echo "For help with each subcommand run:" echo "For help with each subcommand run:"
echo "$ProgName <subcommand> -h|--help" echo "bkctl <subcommand> -h|--help"
echo "" echo ""
} }
sub_init() { sub_init() {
jail=$1
mkdir -p ${JAILDIR}/${jail} mkdir -p ${JAILDIR}/${jail}
umask 022 umask 022
@ -71,14 +71,19 @@ sub_init() {
done done
done done
echo "...OK" echo "...OK"
if [ ! -f ${CONFDIR}/$jail ]; then
install -m 0640 -v ${TPLDIR}/inc.tpl ${CONFDIR}/$jail
fi
} }
sub_start() { sub_start() {
set -e set -e
jail=$1
check_jail $jail check_jail $jail
status=`check_jail_on $jail` status=$(check_jail_on $jail)
if [ $status == "ON" ]; then if [ $status == "ON" ]; then
echo "Jail $jail already running !" echo "Jail $jail already running !" >&2
exit 1 exit 1
fi fi
mount -t proc proc-chroot ${JAILDIR}/${jail}/proc/ mount -t proc proc-chroot ${JAILDIR}/${jail}/proc/
@ -105,14 +110,15 @@ sub_start() {
sub_stop() { sub_stop() {
set -e set -e
jail=$1
check_jail $jail check_jail $jail
status=`check_jail_on $jail` status=$(check_jail_on $jail)
if [ $status == "OFF" ]; then if [ $status == "OFF" ]; then
echo "Jail $jail is not running !" echo "Jail $jail is not running !" >&2
exit 1 exit 1
fi fi
pid=`cat ${JAILDIR}/${jail}/${SSHD_PID}` pid=$(cat ${JAILDIR}/${jail}/${SSHD_PID})
ps --ppid $pid -o pid=| while read conn; do for conn in $(ps --ppid $pid -o pid=); do
kill $conn kill $conn
done done
kill $pid kill $pid
@ -125,8 +131,9 @@ sub_stop() {
sub_reload() { sub_reload() {
set -e set -e
jail=$1
check_jail $jail check_jail $jail
status=`check_jail_on $jail` status=$(check_jail_on $jail)
if [ $status == "ON" ]; then if [ $status == "ON" ]; then
pkill -HUP -F ${JAILDIR}/${jail}/${SSHD_PID} pkill -HUP -F ${JAILDIR}/${jail}/${SSHD_PID}
fi fi
@ -134,6 +141,7 @@ sub_reload() {
sub_restart() { sub_restart() {
set -e set -e
jail=$1
check_jail $jail check_jail $jail
$0 stop $jail $0 stop $jail
$0 start $jail $0 start $jail
@ -141,8 +149,9 @@ sub_restart() {
sub_key() { sub_key() {
set -e set -e
jail=$1
keyfile=$2
check_jail $jail check_jail $jail
keyfile=$3
if [ -n "$keyfile" ]; then if [ -n "$keyfile" ]; then
set_key $jail $keyfile set_key $jail $keyfile
else else
@ -152,9 +161,10 @@ sub_key() {
sub_port() { sub_port() {
set -e set -e
jail=$1
port=$2
check_jail $jail check_jail $jail
port=$3 pre_port=$(get_port $jail)
pre_port=`get_port $jail`
if [ -z $port ]; then if [ -z $port ]; then
echo "$pre_port" echo "$pre_port"
else else
@ -165,19 +175,21 @@ sub_port() {
sub_status() { sub_status() {
set -e set -e
jail=$1
check_jail $jail check_jail $jail
inc=`check_inc jail` inc=$(check_inc $jail)
status=`check_jail_on $jail` status=$(check_jail_on $jail)
port=`get_port $jail` port=$(get_port $jail)
echo "$jail : $status ($port) -> $inc" echo "$jail : $status ($port) -> $inc"
} }
sub_inc() { sub_inc() {
for jail in `ls -1 $CONFDIR`; do date=$(date +"%Y-%m-%d-%H")
for jail in $(ls -1 $CONFDIR); do
echo -n "hard copy $jail begins at : " >> $LOGFILE echo -n "hard copy $jail begins at : " >> $LOGFILE
/bin/date +"%d-%m-%Y ; %H:%M" >> $LOGFILE /bin/date +"%d-%m-%Y ; %H:%M" >> $LOGFILE
mkdir -p ${INCDIR}${jail} mkdir -p ${INCDIR}${jail}
cp -alx ${JAILDIR}/${jail}/ ${INCDIR}${jail}/$DATE cp -alx ${JAILDIR}/${jail}/ ${INCDIR}${jail}/$date
echo -n "hard copy $i ends at : " >> $LOGFILE echo -n "hard copy $i ends at : " >> $LOGFILE
/bin/date +"%d-%m-%Y ; %H:%M" >> $LOGFILE /bin/date +"%d-%m-%Y ; %H:%M" >> $LOGFILE
done #| tee -a $LOGFILE | mail -s "[info] EvoBackup - create incs" $MYMAIL done #| tee -a $LOGFILE | mail -s "[info] EvoBackup - create incs" $MYMAIL
@ -192,30 +204,29 @@ sub_rm() {
# list non-obsolete inc backups # list non-obsolete inc backups
for j in $( cat $CONFDIR$i ); do for j in $( cat $CONFDIR$i ); do
MYDATE=$( echo $j | cut -d. -f1 ) date=$( echo $j | cut -d. -f1 )
BEFORE=$( echo $j | cut -d. -f2 ) before=$( echo $j | cut -d. -f2 )
date -d "$(date $MYDATE) $BEFORE" "+%Y-%m-%d" date -d "$(date $date) $before" "+%Y-%m-%d"
done > "$TMPDIR"$i.keep done > "$TMPDIR"$i.keep
# delete obsolete inc backups # delete obsolete inc backups
for j in $( grep -v -f "$TMPDIR"$i.keep "$TMPDIR"$i.files ); do for j in $( grep -v -f "$TMPDIR"$i.keep "$TMPDIR"$i.files ); do
echo -n "Delete $i/$j begins at : " >> $LOGFILE echo -n "Delete $i/$j begins at : " >> $LOGFILE
/bin/date +"%d-%m-%Y ; %H:%M" >> $LOGFILE /bin/date +"%d-%m-%Y ; %H:%M" >> $LOGFILE
cd $INCDIR$i cd $INCDIR$i
[ -n "$j" ] && rsync -a --delete $EMPTYDIR/ $j* [ -n "$j" ] && rsync -a --delete $EMPTYDIR/ $j*
[ -n "$j" ] && rmdir $j* && touch /tmp/evobackup-rm.txt [ -n "$j" ] && rmdir $j* && touch /tmp/evobackup-rm.txt
echo -n "Delete $i/$j ends at : " >> $LOGFILE echo -n "Delete $i/$j ends at : " >> $LOGFILE
/bin/date +"%d-%m-%Y ; %H:%M" >> $LOGFILE /bin/date +"%d-%m-%Y ; %H:%M" >> $LOGFILE
done done
done #| tee -a $LOGFILE | ( [ -e "/tmp/evobackup-rm.txt" ] && mail -s "[info] EvoBackup - purge incs" $MYMAIL && rm /tmp/evobackup-rm.txt ) done #| tee -a $LOGFILE | ( [ -e "/tmp/evobackup-rm.txt" ] && mail -s "[info] EvoBackup - purge incs" $MYMAIL && rm /tmp/evobackup-rm.txt )
rm -rf $TMPDIR $EMPTYDIR rm -rf $TMPDIR $EMPTYDIR
} }
check_jail() { check_jail() {
jail=$1 jail=$1
if [ ! -d ${JAILDIR}/${jail} ]; then if [ ! -d ${JAILDIR}/${jail} ]; then
echo "$jail doesn't exits !" >/dev/stderr echo "$jail doesn't exits !" >&2
exit 1 exit 1
fi fi
} }
@ -224,7 +235,7 @@ check_jail_on() {
jail=$1 jail=$1
status="OFF" status="OFF"
if [ -f ${JAILDIR}/${jail}/${SSHD_PID} ]; then if [ -f ${JAILDIR}/${jail}/${SSHD_PID} ]; then
pid=`cat ${JAILDIR}/${jail}/${SSHD_PID}` pid=$(cat ${JAILDIR}/${jail}/${SSHD_PID})
ps -p $pid > /dev/null ps -p $pid > /dev/null
if [ $? == 0 ]; then if [ $? == 0 ]; then
status="ON " status="ON "
@ -239,8 +250,8 @@ check_inc() {
jail=$1 jail=$1
inc="0" inc="0"
if [ -f ${CONFDIR}/${jail} ]; then if [ -f ${CONFDIR}/${jail} ]; then
day=`grep -c "day" ${CONFDIR}/${jail}` day=$(grep -c "day" ${CONFDIR}/${jail})
month=`grep -c "month" ${CONFDIR}/${jail}` month=$(grep -c "month" ${CONFDIR}/${jail})
inc="${day}/${month}" inc="${day}/${month}"
fi fi
echo $inc echo $inc
@ -248,7 +259,7 @@ check_inc() {
get_port() { get_port() {
jail=$1 jail=$1
port=`grep -E "Port [0-9]+" ${JAILDIR}/${jail}/${SSHD_CONFIG}|grep -oE "[0-9]+"` port=$(grep -E "Port [0-9]+" ${JAILDIR}/${jail}/${SSHD_CONFIG}|grep -oE "[0-9]+")
echo $port echo $port
} }
@ -279,56 +290,62 @@ set_key() {
cat $keyfile > ${JAILDIR}/${jail}/${AUTHORIZED_KEYS} cat $keyfile > ${JAILDIR}/${jail}/${AUTHORIZED_KEYS}
chmod 600 ${JAILDIR}/${jail}/${AUTHORIZED_KEYS} chmod 600 ${JAILDIR}/${jail}/${AUTHORIZED_KEYS}
else else
echo "Keyfile $keyfile dosen't exist !" echo "Keyfile $keyfile dosen't exist !" >&2
exit 1 exit 1
fi fi
} }
subcommand=$1 main() {
jail=$2 mkdir -p $CONFDIR $JAILDIR $INCDIR
case $subcommand in subcommand=$1
"" | "-h" | "--help") jail=$2
sub_help option=$3
;; case $subcommand in
"inc" | "rm") "" | "-h" | "--help")
pkill -f /run/bkctl.pid #| mail -s "[warn] EvoBackup - purge incs interrupted" $MYMAIL sub_help
rm -f /run/bkctl.pid ;;
sub_${subcommand} $@ & "inc" | "rm")
echo $! > /run/bkctl.pid pkill -f /run/bkctl.pid #| mail -s "[warn] EvoBackup - purge incs interrupted" $MYMAIL
;; rm -f /run/bkctl.pid
"init" | "key" | "port") sub_${subcommand} $jail &
if [ -z $jail ]; then echo $! > /run/bkctl.pid
sub_help ;;
exit 1 "init" | "key" | "port")
fi if [ -z $jail ]; then
sub_${subcommand} $@ sub_help
;; exit 1
"start" | "stop" | "reload" | "restart") fi
if [ -z $jail ]; then sub_${subcommand} $jail $option
sub_help ;;
exit 1 "start" | "stop" | "reload" | "restart")
fi if [ -z $jail ]; then
if [ $jail = "all" ]; then sub_help
for jail in `ls $JAILDIR`; do exit 1
$0 ${subcommand} $jail fi
done if [ $jail = "all" ]; then
else for jail in $(ls $JAILDIR); do
sub_${subcommand} $@ $0 ${subcommand} $jail
fi done
;; else
"status") sub_${subcommand} $jail
if [ -z $jail ]; then fi
for jail in `ls $JAILDIR`; do ;;
$0 status $jail "status")
done if [ -z $jail ]; then
else for jail in $(ls $JAILDIR); do
sub_${subcommand} $@ $0 status $jail
fi done
;; else
*) sub_${subcommand} $jail
shift fi
echo "Error: '$subcommand' is not a known subcommand." >&2 ;;
echo " Run '$ProgName --help' for a list of known subcommands." >&2 *)
exit 1 shift
;; echo "Error: '$subcommand' is not a known subcommand." >&2
esac sub_help
exit 1
;;
esac
}
main "$@"

View file

@ -1,13 +0,0 @@
# Defaults for bkctl command (evobackup)
# sourced by /usr/sbin/bkctl or /usr/local/sbin/bkctl
CONFDIR=/etc/evobackup/
JAILDIR=/backup/jails/
INCDIR=/backup/incs/
TPLDIR=/usr/share/evobackup/
LOGFILE=/var/log/evobackup.log
DATE=$(date +"%Y-%m-%d-%H")
MYMAIL=jdoe@example.com
SSHD_PID=/var/run/sshd.pid
SSHD_CONFIG=/etc/ssh/sshd_config
AUTHORIZED_KEYS=/root/.ssh/authorized_keys

View file

@ -2,7 +2,9 @@
dir=`dirname $0` dir=`dirname $0`
cp $dir/evobackup.conf /etc/default/evobackup if [ ! -f /etc/default/evobackup ]; then
install -m 0644 -v $dir/tpl/evobackup.conf /etc/default/evobackup
fi
source /etc/default/evobackup source /etc/default/evobackup
grep -q usr /etc/fstab grep -q usr /etc/fstab
@ -10,9 +12,9 @@ if [ $? == 0 ]; then
mount -o remount,rw /usr mount -o remount,rw /usr
fi fi
mkdir -p $TPLDIR mkdir -m 0755 -p $TPLDIR
cp $dir/etc/* $TPLDIR cp -v $dir/tpl/* $TPLDIR
cp $dir/bkctl /usr/local/sbin/ install -m 0755 -v $dir/bkctl /usr/local/sbin/
crontab -l|grep -q bkctl crontab -l|grep -q bkctl
if [ $? != 0 ]; then if [ $? != 0 ]; then
@ -21,13 +23,13 @@ fi
dpkg -l sysvinit >/dev/null dpkg -l sysvinit >/dev/null
if [ $? == 0 ]; then if [ $? == 0 ]; then
cp $dir/evobackup /etc/init.d/evobackup install -m 0755 -v $dir/tpl/evobackup /etc/init.d/evobackup
insserv evobackup insserv evobackup
fi fi
dpkg -l systemd >/dev/null dpkg -l systemd >/dev/null
if [ $? == 0 ] ; then if [ $? == 0 ] ; then
#cp evobackup@.service /etc/systemd/system/evobackup@.service #cp evobackup@.service /etc/systemd/system/evobackup@.service
cp $dir/evobackup /etc/init.d/evobackup install -m 0755 -v $dir/tpl/evobackup /etc/init.d/evobackup
systemctl enable evobackup systemctl enable evobackup
fi fi

View file

@ -9,9 +9,6 @@
# Short-Description: Backup manager using rsync and OpenSSH chroot. # Short-Description: Backup manager using rsync and OpenSSH chroot.
### END INIT INFO ### END INIT INFO
set -e
. /etc/default/evobackup
case "$1" in case "$1" in
start) start)
bkctl start all bkctl start all

12
tpl/evobackup.conf Normal file
View file

@ -0,0 +1,12 @@
# Defaults for bkctl command (evobackup)
# sourced by /usr/sbin/bkctl or /usr/local/sbin/bkctl
CONFDIR='/etc/evobackup/'
JAILDIR='/backup/jails/'
INCDIR='/backup/incs/'
TPLDIR='/usr/local/share/evobackup/'
LOGFILE='/var/log/evobackup.log'
MYMAIL='jdoe@example.com'
SSHD_PID='/var/run/sshd.pid'
SSHD_CONFIG='/etc/ssh/sshd_config'
AUTHORIZED_KEYS='/root/.ssh/authorized_keys'