forked from drunomics/syncd
-
Notifications
You must be signed in to change notification settings - Fork 1
/
syncd
executable file
·168 lines (140 loc) · 4.54 KB
/
syncd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#!/bin/bash
#------------------------------------------------------------
# Forked version by David Kebler d@kebler.net, 2017
# (c) Wolfgang Ziegler, nuppla@zites.net, drunomics GmbH
#------------------------------------------------------------
# BASH_MODULES="${BASH_MODULES:-/opt/bash/modules}"
# . $BASH_MODULES/load-modules.sh
# MODULES=(logit bind-mount)
# load-modules $MODULES
# USAGE: syncd {job name} commmand
CMD="$2"
if [ ! $1 ]; then
echo error! no command given
exit 1
fi
if [[ "$1" =~ ^(start|stop|restart|status|run|log)$ ]]; then
CONF_FILE="syncd"
CMD="$1"
else
CONF_FILE="$1"
fi
SSH_HOST="$3"
SSH_USER="$4"
# echo conf file: $CONF_FILE.conf command: $CMD
SYNCD_CONFIG_DIR=$PWD
SCRIPT=`readlink -f $0`
DAEMON_NAME=syncd
LINK=`readlink -f $0`
SCRIPT_DIR=`dirname $LINK`
# SET SYNCD_JOBS_DIR in environment or by default will look in job sudirectory where syncd is located
JOBS_DIR="${SYNCD_JOBS_DIR:-$SCRIPT_DIR/jobs}"
CONF_PATH=$JOBS_DIR/$CONF_FILE.conf
#echo "conf_path before search $CONF_PATH"
#echo "current directory $PWD"
# look in 1. jobs directory or (or subdirectory there of), 2 In a syncd sub folder or your pwd, 3. pwd 4. Some absolute path
if [ ! -e $CONF_PATH ]; then
if [ ! -e $PWD/syncd/$CONF_FILE.conf ]; then
if [ ! -e $PWD/$CONF_FILE.conf ]; then
if [ ! -e $CONF_FILE.conf ]; then #absolute path
echo "ERROR - Unable to find syncd configuration file $CONF_FILE.conf in standard locations"
exit 1
else
CONF_PATH=$CONF_FILE.conf # path absolute
fi
else
CONF_PATH=$PWD/$CONF_FILE.conf # in working directory
fi
else
CONF_PATH=$PWD/syncd/$CONF_FILE.conf # in syncd/ of working directory
fi
# It was in the jobs folder
fi
# echo configuration path after search $CONF_PATH
# reset filename in case of conf in a subirectory
CONF_FILE=`basename $CONF_PATH`
#echo confile=$CONF_FILE
# pid files go in the same directory as .conf
CONF_DIR=`dirname $CONF_PATH`
mkdir -p $JOBS_DIR/LOG
mkdir -p $JOBS_DIR/PID
PIDFILE="$JOBS_DIR/PID/${CONF_FILE%.*}.pid"
LOGFILE=$JOBS_DIR/LOG/${CONF_FILE%.*}.log
# echo pidfile = $PIDFILE
# echo logfile = $LOGFILE
# source the config file here
set -- $SCRIPT_DIR ;
. $CONF_PATH
# echo === cmd:$CMD
# echo === remote host $SSH_USER@$SSH_HOST ======
echo for config file $CONF_PATH
if [ -z "$WATCH_DIR" ]; then WATCH_DIR=$(dirname `dirname $CONF_PATH`);fi
if [ -z "$SSH_HOST" ]; then TARGET=$TARGET_DIR; else TARGET=$SSH_USER@$SSH_HOST:$TARGET_DIR; fi
if [ ! -z "$SSH_KEY" ]; then SSH_KEY="-e 'ssh -i $SSH_KEY'"; fi
# echo sshkey $SSH_KEY
# echo including/excluding: $RSYNC_EXCLUDE
# RSYNC_EXCLUDE in conf file be sure to add --exclude fileordir for each one, can be multiple
COMMAND="rsync $RSYNC_OPTIONS $RSYNC_EXCLUDE $SSH_KEY $WATCH_DIR/ $TARGET"
# echo $COMMAND
# uncomment for debugging
# exit 1
#command#
case $CMD in
start)
if [ -e ${PIDFILE} ] && ( ps -p `cat $PIDFILE` > /dev/null ); then
echo "$DAEMON_NAME is already running."
exit 1;
fi
export WATCH_EXCLUDE
export WATCH_VERBOSE
export WATCH_DIR
# TODO add a process name based on config file name so it can be found later
# http://stackoverflow.com/questions/11130229/start-a-process-with-a-name
$SCRIPT_DIR/watch.sh $COMMAND >> $LOGFILE &
echo "$!" > $PIDFILE
echo SYNCD $CONF_FILE
echo watching and syncing $WATCH_DIR to $TARGET at $SSH_HOST
;;
stop)
if [ ! -e ${PIDFILE} ] || ( ! ps -p `cat $PIDFILE` > /dev/null ); then
echo "$DAEMON_NAME $CONF_FILE is not running."
exit 1;
fi
echo "Stopping $DAEMON_NAME...$CONF_FILE"
PID=`cat $PIDFILE`
CHILD_PIDS=$(pgrep -P $PID);
kill $PID 2> /dev/null || echo Killing process failed, not running?
# Wait half a second and Kill child PIDs to be sure they are gone.
sleep 0.5
kill $CHILD_PIDS 2> /dev/null
rm $PIDFILE
;;
restart)
#echo RESTART COMMAND $SCRIPT ${CONF_FILE%.*}
$SCRIPT ${CONF_FILE%.*} stop
$SCRIPT ${CONF_FILE%.*} start
;;
status)
if [ -e ${PIDFILE} ] && ( ps -p `cat $PIDFILE` > /dev/null ); then
echo SYNCD $CONF_FILE
echo STATUS: watching and syncing $WATCH_DIR to $TARGET
else
echo "$DAEMON_NAME for $CONF_FILE is not running."
fi
;;
run)
echo $COMMAND
read -p "Ok to run this command? [yn]" ans
if [ $ans = y ] ; then
$COMMAND && echo Done
fi
;;
log)
tail -f $LOGFILE
;;
*)
echo "Usage: $0 {start|stop|restart|status|run|log}"
exit 3
;;
esac
echo ====================== end cmd:$CMD =====================