]> Kevux Git Server - koopa/blob
a20217cffd46224b1ecae03d8eb9f2d36475bb9d
[koopa] /
1 #!/bin/bash
2 #
3 # autocreate_ldap_accounts_in_postgresql      Helper service for auto-populating ldap accounts in postgresql.
4 #
5 # chkconfig: 345 40 60
6 # description: Provide a per-database/per-role way to auto-create ldap accounts and auto assign a single role.
7
8 ### BEGIN INIT INFO
9 # Provides: autocreate_ldap_accounts_in_postgresql
10 # Required-Start: $local_fs $network
11 # Required-Stop: $local_fs $network
12 # Default-Start: 3 4 5
13 # Default-Stop: 0 1 2 6
14 # Short-Description: Auto-create ldap-based accounts in postgresql.
15 # Description: Provide a per-database/per-role way to auto-create ldap accounts and auto assign a single role.
16 ### END INIT INFO
17
18 # Source function library.
19 . /etc/rc.d/init.d/functions
20
21 main() {
22   local process_owner="alap"
23   local process_group="alap"
24   local path_programs="/programs/"
25   local path_service="${path_programs}bin/autocreate_ldap_accounts_in_postgresql"
26   local path_settings="${path_programs}settings/autocreate_ldap_accounts_in_postgresql/"
27   local path_systems="${path_settings}systems.settings"
28   local path_pids="/var/run/autocreate_ldap_accounts_in_postgresql/"
29   local parameter_system=$2
30   local alap_systems=
31   local i=
32   local j=
33
34   # when process_owner is defined, make sure that the binary has the following set:
35   # setcap cap_net_bind_service=ep /programs/bin/autocreate_ldap_accounts_in_postgresql
36
37   if [[ ! -f $path_systems ]] ; then
38     echo "No valid path_systems file defined at: $path_systems"
39     exit -1
40   fi
41
42   if [[ ! -d $path_pids ]] ; then
43     mkdir -p $path_pids
44   fi
45
46   if [[ $process_owner != "" ]] ; then
47     chown $process_owner $path_pids
48   fi
49
50   alap_systems=$(grep -o '^alap_systems[[:space:]][[:space:]]*.*$' $path_systems | sed -e 's|^alap_systems[[:space:]][[:space:]]*||')
51
52   if [[ $alap_systems == "" ]] ; then
53     echo "No valid systems defined by setting 'alap_systems' in file: $path_systems"
54     exit -1
55   fi
56
57   if [[ $parameter_system != "" ]] ; then
58     j=$alap_systems
59     alap_systems=
60
61     for i in $j ; do
62       if [[ $i == $parameter_system ]] ; then
63         alap_systems=$i
64         break;
65       fi
66     done
67
68     i=
69     j=
70
71     if [[ $alap_systems == "" ]] ; then
72       echo "System '$parameter_system' is not a valid system defined by setting 'alap_systems' in file: $path_systems"
73       exit -1
74     fi
75   fi
76
77   j=$alap_systems
78   alap_systems=
79   for i in $j ; do
80     if [[ -f $path_settings${i}.settings ]] ; then
81       alap_systems="$alap_systems$i "
82     else
83       echo "Skipping system '$i' because it does not have a settings file defined here: '$path_settings${i}.settings'"
84     fi
85   done
86
87   i=
88   j=
89
90   case "$1" in
91     start)
92       start
93       ;;
94     stop)
95       stop
96       ;;
97     restart)
98       restart
99       ;;
100     status)
101       status
102       ;;
103     *)
104       echo "Usage: autocreate_ldap_accounts_in_postgresql {start|stop|restart|status}"
105       return 2
106   esac
107
108   return $?
109 }
110
111 start() {
112   local alap_name_system=
113   local alap_name_group=
114   local alap_name_database=
115   local alap_connect_user=
116   local alap_connect_password=
117   local alap_port=
118   local alap_system=
119   local result=
120   local any_success=0
121   local any_failure=0
122
123   for alap_system in $alap_systems ; do
124     load_system_settings
125     check_pid
126
127     if [[ $result -eq -1 ]] ; then
128       continue
129     elif [[ $result -gt 0 ]] ; then
130       echo "Not starting process for $alap_system, it is already running with pid=$pid."
131       continue
132     fi
133
134     start_command
135
136     if [[ $result -eq 0 ]] ; then
137       wait_pid
138
139       if [[ $result -eq 0 ]] ; then
140         get_pid
141       fi
142
143       if [[ $pid == "" ]] ; then
144         echo "Started process for $alap_system but was unable to determine pid, command: $path_service $alap_name_system $alap_name_group $alap_name_database $alap_port."
145       else
146         echo "Successfully started process for $alap_system, pid=$pid, command: $path_service $alap_name_system $alap_name_group $alap_name_database $alap_port."
147       fi
148     fi
149   done
150
151   if [[ $any_success -ne 0 || $any_failure -eq 1 ]] ; then
152     exit -1
153   fi
154
155   return 0
156 }
157
158 stop() {
159   local alap_name_system=
160   local alap_name_group=
161   local alap_name_database=
162   local alap_port=
163   local alap_system=
164   local result=
165   local any_success=0
166   local any_failure=0
167   local original_pid=
168
169   for alap_system in $alap_systems ; do
170     load_system_settings
171     get_pid
172
173     if [[ $pid == "" ]] ; then
174       continue
175     fi
176
177     stop_command
178
179     if [[ $result -eq 0 ]] ; then
180       original_pid=$pid
181       check_pid
182
183       if [[ $result -eq -2 ]] ; then
184         echo "Successfully stopped process for $alap_system, pid=$original_pid."
185       else
186         echo "Sent stop command for $alap_system, pid=$pid, but pid file ($pid_file) still exists."
187       fi
188     fi
189   done
190
191   if [[ $any_success -ne 0 || $any_failure -eq 1 ]] ; then
192     exit -1
193   fi
194
195   return 0
196 }
197
198 restart() {
199   local alap_name_system=
200   local alap_name_group=
201   local alap_name_database=
202   local alap_port=
203   local alap_system=
204   local result=
205   local any_success=0
206   local any_failure=0
207   local original_pid=
208
209   for alap_system in $alap_systems ; do
210     load_system_settings
211     check_pid
212
213     if [[ $result -lt 0 ]] ; then
214       continue
215     elif [[ $result -gt 0 ]] ; then
216       stop_command
217
218       if [[ $result -ne 0 ]] ; then
219         continue
220       fi
221
222       original_pid=$pid
223       check_pid
224
225       if [[ $result -eq -2 ]] ; then
226         echo "Successfully stopped process for $alap_system, pid=$original_pid."
227       else
228         echo "Sent stop command for $alap_system, pid=$original_pid, but pid file ($pid_file) still exists (cannot start process, skipping)."
229         continue
230       fi
231     fi
232
233     start_command
234
235     if [[ $result -eq 0 ]] ; then
236       wait_pid
237
238       if [[ $result -eq 0 ]] ; then
239         get_pid
240       fi
241
242       if [[ $pid == "" ]] ; then
243         echo "Started process for $alap_system but was unable to determine pid, command: $path_service $alap_name_system $alap_name_group $alap_name_database $alap_port."
244       else
245         echo "Successfully started process for $alap_system, pid=$pid, command: $path_service $alap_name_system $alap_name_group $alap_name_database $alap_port."
246       fi
247     fi
248   done
249
250   if [[ $any_success -ne 0 ]] ; then
251     exit -1
252   fi
253
254   return 0
255 }
256
257 status() {
258   local alap_name_system=
259   local alap_name_group=
260   local alap_name_database=
261   local alap_port=
262   local alap_system=
263   local pid_file=
264   local pid=
265   local result=
266
267   for alap_system in $alap_systems ; do
268     load_system_settings
269     get_pid
270
271     if [[ $pid == "" ]] ; then
272       continue
273     fi
274
275     echo "The system '$alap_system' appears to be running as process $pid."
276   done
277
278   return 0
279 }
280
281 load_system_settings() {
282   local path_system=$path_settings${alap_system}.settings
283   alap_name_system=
284   alap_name_group=
285   alap_name_database=
286   alap_connect_user=
287   alap_connect_password=
288   alap_port=
289
290   if [[ $alap_system == "" || ! -f $path_system ]] ; then
291     echo "No valid path_systems file defined at: $path_system"
292     exit -1
293   fi
294
295   alap_name_system=$(grep -o '^alap_name_system[[:space:]][[:space:]]*.*$' $path_system | sed -e 's|^alap_name_system[[:space:]][[:space:]]*||')
296   alap_name_group=$(grep -o '^alap_name_group[[:space:]][[:space:]]*.*$' $path_system | sed -e 's|^alap_name_group[[:space:]][[:space:]]*||')
297   alap_name_database=$(grep -o '^alap_name_database[[:space:]][[:space:]]*.*$' $path_system | sed -e 's|^alap_name_database[[:space:]][[:space:]]*||')
298   alap_connect_user=$(grep -o '^alap_connect_user[[:space:]][[:space:]]*.*$' $path_system | sed -e 's|^alap_connect_user[[:space:]][[:space:]]*||')
299   alap_connect_password=$(grep -o '^alap_connect_password[[:space:]][[:space:]]*.*$' $path_system | sed -e 's|^alap_connect_password[[:space:]][[:space:]]*||')
300   alap_port=$(grep -o '^alap_port[[:space:]][[:space:]]*.*$' $path_system | sed -e 's|^alap_port[[:space:]][[:space:]]*||')
301
302   if [[ $alap_name_system == "" ]] ; then
303     echo "No valid alap_name_system setting defined in file: $path_system"
304     exit -1
305   fi
306
307   if [[ $alap_name_group == "" ]] ; then
308     echo "No valid alap_name_group setting defined in file: $path_system"
309     exit -1
310   fi
311
312   if [[ $alap_name_database == "" ]] ; then
313     echo "No valid alap_name_database setting defined in file: $path_system"
314     exit -1
315   fi
316
317   if [[ $alap_connect_user == "" ]] ; then
318     echo "No valid alap_connect_user setting defined in file: $path_system"
319     exit -1
320   fi
321
322   if [[ $alap_port == "" ]] ; then
323     echo "No valid alap_port setting defined in file: $path_system"
324     exit -1
325   fi
326 }
327
328 start_command() {
329   export alap_connect_user="$alap_connect_user"
330   export alap_connect_password="$alap_connect_password"
331
332   if [[ $process_owner == "" ]] ; then
333     $path_service $alap_name_system $alap_name_group $alap_name_database $alap_port
334     result=$?
335   else
336     su $process_owner -m -c "$path_service $alap_name_system $alap_name_group $alap_name_database $alap_port"
337     result=$?
338   fi
339
340   if [[ $result -ne 0 ]] ; then
341     echo "Failed to start process, command: $path_service $alap_name_system $alap_name_group $alap_name_database $alap_port."
342     any_failure=1
343   else
344     any_success=1
345   fi
346 }
347
348 stop_command() {
349   # -3 = SIGQUIT, -15 = SIGTERM, -9 = SIGKILL
350   kill -3 $pid
351   result=$?
352
353   if [[ $result -ne 0 ]] ; then
354     echo "Signal to quit failed, command: kill -3 $pid."
355     any_failure=1
356   else
357     any_success=1
358
359     # pause and give the process time to close down.
360     sleep 0.1
361   fi
362 }
363
364 wait_pid() {
365   local k=
366   local max=32
367
368   pid=
369   pid_file=$path_pids$alap_system.pid
370   result=-1
371
372   # the started process will go into the background, so wait until the pid file is created, but only wait for so long.
373   let k=0
374   while [[ $k -lt $max ]] ; do
375     if [[ -f $pid_file ]] ; then
376       result=0
377       break
378     fi
379
380     sleep 0.05
381
382     let k=$k+1
383   done
384
385   return 0
386 }
387
388 get_pid() {
389   pid=
390   pid_file=$path_pids$alap_system.pid
391
392   if [[ ! -f $pid_file ]] ; then
393     echo "No pid file ($pid_file) found for system '$alap_system', it must not be running."
394     return 0
395   fi
396
397   pid=$(cat $pid_file)
398   result=$?
399
400   if [[ $result -ne 0 ]] ; then
401     echo "Failed to read the pid file ($pid_file) for system '$alap_system', command: cat $pid_file."
402     pid=
403     return 0
404   fi
405
406   if [[ $pid == "" ]] ; then
407     echo "The pid file ($pid_file) for system '$alap_system' is empty."
408     pid=
409     return 0
410   fi
411
412   result=$(ps --no-headers -o pid -p $pid)
413   if [[ $? -lt 0 ]] ; then
414     echo "An error occured while searching for the process for system '$alap_system', command: ps --no-headers -o pid -p $pid."
415     pid=
416     return 0
417   fi
418
419   if [[ $result == "" ]] ; then
420     echo "No process $pid was found for the system '$alap_system', the pid file might be stale or inaccurate."
421     pid=
422     return 0
423   fi
424 }
425
426 check_pid() {
427   pid=
428   pid_file=$path_pids$alap_system.pid
429
430   if [[ ! -f $pid_file ]] ; then
431     result=-2
432     return 0
433   fi
434
435   pid=$(cat $pid_file)
436   result=$?
437
438   if [[ $result -ne 0 ]] ; then
439     echo "Failed to read the pid file ($pid_file) for system '$alap_system', command: cat $pid_file."
440     result=-1
441     return 0
442   fi
443
444   if [[ $pid == "" ]] ; then
445     result=0
446     return 0
447   fi
448
449   result=$(ps --no-headers -o pid -p $pid)
450   if [[ $? -lt 0 ]] ; then
451     echo "An error occured while searching for the process for system '$alap_system', command: ps --no-headers -o pid -p $pid."
452     result=-1
453     return 0
454   fi
455
456   if [[ $result == "" ]] ; then
457     result=
458
459     # the pid file is invalid, so remove the pid file.
460     rm -f $pid_file
461
462     # return 0 to allow for starting a new process.
463     result=0
464     return 0
465   fi
466
467   result=1
468   return 0
469 }
470
471 main "$1" "$2"