OSX compatibility
[m6w6/btr] / share / btr / btrd.sh
1 #!/bin/bash
2
3 function btrd_start {
4 btrd_cancel
5 BTR_DATE=$(date +%Y%m%d%H%M%S)
6 btr_setup
7 btr_run &
8 BTR_WORKER=$!
9 }
10 export -f btrd_start
11
12 function btrd_cancel {
13 if btrd_worker_started
14 then
15 btrd_worker_kill
16 btrd_worker_reap
17 fi
18 }
19 export -f btrd_cancel
20
21 function btrd_stop {
22 BTR_DAEMON=false
23 }
24 export -f btrd_stop
25
26 function btrd_ctime {
27 stat -c %y "$1"
28 }
29 export -f btrd_ctime
30
31 function btrd_fsize {
32 local bytes=$(stat -c %s "$1")
33 }
34 export -f btrd_fsize
35
36 function btrd_status {
37 echo "BTR_BUILD='$BTR_BUILD'"
38 echo "BTR_SERVER='$BTR_SERVER'"
39 echo "BTR_PIDFILE='$BTR_PIDFILE'"
40 echo "BTR_LOGFILE='$BTR_LOGFILE'"
41 echo "BTR_COMFILE='$BTR_COMFILE'"
42 }
43 export -f btrd_status
44
45 function btrd_logrotate {
46 local i=1
47 local f="$BTR_LOGFILE"
48
49 if test -e "$f"
50 then
51 while test -e "$f.$i"
52 do
53 i=$((i+1))
54 done
55 mv "$f" "$f.$i"
56 fi
57
58 }
59 export -f btrd_logrotate
60
61 function btrd_worker_started {
62 test "$BTR_WORKER" -gt 1
63 }
64 export -f btrd_worker_started
65
66 function btrd_worker_running {
67 kill -s 0 $BTR_WORKER
68 }
69 export -f btrd_worker_running
70
71 function btrd_worker_reap {
72 wait $BTR_WORKER
73 BTR_WORKER=0
74 }
75 export -f btrd_worker_reap
76
77 function btrd_worker_kill {
78 kill $BTR_WORKER
79 }
80 export -f btrd_worker_kill
81
82 BTR_DAEMON=true
83 BTR_WORKER=0
84 BTR_SERVER=0
85 BTR_PIDFILE="$BTR_RUNDIR/$BTR_BUILD.pid"
86 BTR_LOGFILE="$BTR_RUNDIR/$BTR_BUILD.log"
87 BTR_COMFILE="$BTR_RUNDIR/$BTR_BUILD.socket"
88
89 export BTR_DAEMON BTR_WORKER BTR_SERVER BTR_PIDFILE BTR_LOGFILE BTR_COMFILE
90
91 btrd_logrotate
92
93 exec >"$BTR_LOGFILE" 2>&1
94 echo $$ >"$BTR_PIDFILE"
95
96 # see https://github.com/nmap/nmap/issues/193
97 if test $(uname -s) = Darwin; then
98 echo $(($(cksum <<<"$BTR_BUILD" | cut -d" " -f 1) % 64511 + 1024)) > "$BTR_COMFILE"
99 ncat -nlkc btrd_status 127.0.0.1 $(cat "$BTR_COMFILE") &
100 else
101 ncat -nlkc btrd_status -U "$BTR_COMFILE" &
102 fi
103 BTR_SERVER=$!
104
105 trap btrd_start HUP
106 trap btrd_cancel INT
107 trap btrd_stop TERM
108
109 while $BTR_DAEMON
110 do
111 if btrd_worker_started && btrd_worker_running
112 then
113 btrd_worker_reap
114 else
115 kill -s STOP $$
116 fi
117 done
118
119 btrd_cancel
120
121 if test "$BTR_SERVER" -gt 1
122 then
123 kill $BTR_SERVER
124 wait $BTR_SERVER
125 fi
126
127 test -e "$BTR_PIDFILE" && rm "$BTR_PIDFILE"
128 test -e "$BTR_LOGFILE" && rm "$BTR_LOGFILE"
129 test -S "$BTR_COMFILE" && rm "$BTR_COMFILE"
130
131 # vim: noet