diff --git a/bkctl b/bkctl index 4f50ae3..44955e1 100755 --- a/bkctl +++ b/bkctl @@ -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 [options]" + echo "Usage: bkctl [options]" echo "Subcommands:" echo " init " echo " start " @@ -32,11 +31,12 @@ sub_help(){ echo " rm" echo "" echo "For help with each subcommand run:" - echo "$ProgName -h|--help" + echo "bkctl -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 "$@" diff --git a/evobackup.conf b/evobackup.conf deleted file mode 100644 index c0ae2f1..0000000 --- a/evobackup.conf +++ /dev/null @@ -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 diff --git a/install.sh b/install.sh index 608a796..9663485 100755 --- a/install.sh +++ b/install.sh @@ -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 diff --git a/evobackup b/tpl/evobackup similarity index 94% rename from evobackup rename to tpl/evobackup index 37f185c..c09b31f 100755 --- a/evobackup +++ b/tpl/evobackup @@ -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 diff --git a/tpl/evobackup.conf b/tpl/evobackup.conf new file mode 100644 index 0000000..4e54d30 --- /dev/null +++ b/tpl/evobackup.conf @@ -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' diff --git a/etc/group b/tpl/group similarity index 100% rename from etc/group rename to tpl/group diff --git a/etc/inc.tpl b/tpl/inc.tpl similarity index 100% rename from etc/inc.tpl rename to tpl/inc.tpl diff --git a/etc/passwd b/tpl/passwd similarity index 100% rename from etc/passwd rename to tpl/passwd diff --git a/etc/shadow b/tpl/shadow similarity index 100% rename from etc/shadow rename to tpl/shadow diff --git a/etc/sshd_config b/tpl/sshd_config similarity index 100% rename from etc/sshd_config rename to tpl/sshd_config diff --git a/zzz_evobackup b/tpl/zzz_evobackup similarity index 100% rename from zzz_evobackup rename to tpl/zzz_evobackup