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

View file

@ -9,9 +9,6 @@
# Short-Description: Backup manager using rsync and OpenSSH chroot.
### END INIT INFO
set -e
. /etc/default/evobackup
case "$1" in
start)
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'