cherry-pick.vblade-24-1-g02afd36.support-for-vblade-persistence.patch 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851
  1. Subject: RFC: Support for vblade persistence
  2. Origin: vblade-24-1-g02afd36
  3. Upstream-Author: Christoph Biedl <debian.axhn@manchmal.in-ulm.de>
  4. Date: Sat Sep 1 18:27:04 2018 +0200
  5. Additionally, a typo fix
  6. --- /dev/null
  7. +++ b/contrib/persistence/vblade-generator
  8. @@ -0,0 +1,37 @@
  9. +#!/bin/sh
  10. +
  11. +set -eu
  12. +
  13. +SERVICEFILE="/lib/systemd/system/vblade@.service"
  14. +WANTDIR="$1/vblade.service.wants"
  15. +
  16. +CONFIG_DIR=/etc/vblade.conf.d/
  17. +
  18. +if [ -d "$CONFIG_DIR" ] ; then
  19. + mkdir -p "$WANTDIR"
  20. + cd "$CONFIG_DIR"
  21. + for CONFIG in *.conf ; do
  22. + [ -f "$CONFIG" ] || continue
  23. + INSTANCE="$(systemd-escape "${CONFIG%%.conf}")"
  24. + LINK="$WANTDIR/vblade@$INSTANCE.service"
  25. +
  26. + sh -n "$CONFIG_DIR$CONFIG" 2>/dev/null || continue
  27. +
  28. + shelf=
  29. + slot=
  30. + netif=
  31. + filename=
  32. + options=
  33. +
  34. + . "$CONFIG_DIR$CONFIG"
  35. +
  36. + [ "$netif" ] || continue
  37. + [ "$shelf" ] || continue
  38. + [ "$slot" ] || continue
  39. + [ "$filename" ] || continue
  40. +
  41. + ln -s "$SERVICEFILE" "$LINK"
  42. + done
  43. +fi
  44. +
  45. +exit 0
  46. --- /dev/null
  47. +++ b/contrib/persistence/vblade-persistence.txt
  48. @@ -0,0 +1,107 @@
  49. +
  50. += VBLADE-PERSISTENCE(5)
  51. +
  52. +== NAME
  53. +
  54. +vblade-persistence - description of the vblade persistence
  55. +
  56. +== DESCRIPTION
  57. +
  58. +vblade-persistence uses the files in `/etc/vblade.conf.d/` to manage
  59. +exports. File names must end in `.conf`. The "instance" name is the
  60. +file name without `.conf`.
  61. +
  62. +The file format is a POSIX shell fragment.
  63. +
  64. +The following variables *must* be defined: `netif`, `shelf`, `slot`,
  65. +and `filename`. See vblade(8) for their meaning. Incomplete
  66. +configuration files are ignored, so are files that are not a valid
  67. +shell syntax.
  68. +
  69. +Additionally, the following variables may be defined:
  70. +
  71. +* `options`
  72. +
  73. +Any options as provided by vblade(7).
  74. +
  75. +* `ionice`
  76. +
  77. +Use these to define an I/O scheduling class and level for that export.
  78. +The value must be understood by ionice(1).
  79. +
  80. +
  81. +== EXAMPLE
  82. +
  83. +----
  84. + shelf=14
  85. + slot=2
  86. + netif=ens3
  87. + filename=/dev/mapper/export
  88. + options='-r -m 11:22:33:44:55:66,22:33:44:55:66:77 -o 8'
  89. + ionice='--class best-effort --classdata 7'
  90. +----
  91. +
  92. +
  93. +== USAGE
  94. +
  95. +=== On systems using systemd
  96. +
  97. +Install `vblade-generator` in `/lib/systemd/system-generators/`, and
  98. +both `vblade.service` and `vblade@.service` in `/lib/systemd/system/`.
  99. +Enable the vblade service, reload systemd. Additional units for each
  100. +export should appear, named `vblade@<instance>.service`.
  101. +
  102. +=== On systems using SysV init
  103. +
  104. +Individual instances may be controlled by providing their name as
  105. +a second option, e.g.
  106. +
  107. +----
  108. + /etc/init.d/vblade status demo
  109. +----
  110. +
  111. +Two different init scripts are available:
  112. +
  113. +==== `vblade.init.lsb-daemon`
  114. +
  115. +Uses LSB functions and daemon(1) program to control the instance.
  116. +
  117. +Pros: daemon(1) is a very fine tool for this, providing also respawning
  118. +and output redirection.
  119. +
  120. +==== `vblade.init.daemon`
  121. +
  122. +As above, but without using LSB functions.
  123. +
  124. +Pros: Should be fairly portable, no thrills.
  125. +
  126. +==== Template
  127. +
  128. +The template for these scripts is `vblade.init.in`, the actual
  129. +templating is done using tpage(1p), see `vblade.init.generate`.
  130. +
  131. +Support for using Debian's start-stop-daemon has been prepared but
  132. +requires pid file supprt in vblade to be usable.
  133. +
  134. +
  135. +== BUGS
  136. +
  137. +On SysV init systems, the configuration files are always sourced as
  138. +shell scripts. On systemd systems, the configuration file is just
  139. +a key/value store without shell expansion.
  140. +
  141. +It's a wise idea to run `sh -n` against a configuration file after any
  142. +modification for basic format validation.
  143. +
  144. +
  145. +== SEE ALSO
  146. +
  147. +daemon: <http://www.libslack.org/daemon/>
  148. +
  149. +tpage(1p)
  150. +
  151. +vblade(8)
  152. +
  153. +== AUTHOR
  154. +
  155. +Christoph Biedl <sourceforge.bnwi@manchmal.in-ulm.de>
  156. --- /dev/null
  157. +++ b/contrib/persistence/vblade.init.daemon
  158. @@ -0,0 +1,191 @@
  159. +#!/bin/sh
  160. +
  161. +PATH=/sbin:/usr/sbin:/bin:/usr/bin
  162. +DESC="vblade export"
  163. +NAME=vblade
  164. +VBLADE="/usr/sbin/$NAME"
  165. +DAEMON=/usr/bin/daemon
  166. +IONICE=/usr/bin/ionice
  167. +PIDDIR="/var/run/vblade/"
  168. +
  169. +[ -x "$VBLADE" ] || exit 0
  170. +[ -x "$DAEMON" ] || exit 0
  171. +
  172. +mkdir -p "$PIDDIR"
  173. +
  174. +# Emulation of LSB functions
  175. +VERBOSE=1
  176. +log_daemon_msg () {
  177. + printf '%s ' "$@"
  178. +}
  179. +log_end_msg () {
  180. + local CODE="$1"
  181. + if [ "$CODE" -eq 0 ] ; then
  182. + echo '.'
  183. + else
  184. + echo 'failed!'
  185. + fi
  186. +}
  187. +
  188. +# Start a vblade instance
  189. +#
  190. +# Return
  191. +# 0 if daemon has been started
  192. +# 1 if daemon was already running
  193. +# 2 if daemon could not be started
  194. +do_start () {
  195. + local INSTANCE="$1"
  196. + local CONFIG="$2"
  197. +
  198. + sh -n "$CONFIG" 2>/dev/null || return 2
  199. +
  200. + shelf=
  201. + slot=
  202. + filename=
  203. + netif=
  204. + options=
  205. + ionice=
  206. +
  207. + . "$CONFIG"
  208. +
  209. + [ "$netif" ] || return 2
  210. + [ "$shelf" ] || return 2
  211. + [ "$slot" ] || return 2
  212. + [ "$filename" ] || return 2
  213. +
  214. + if [ "$ionice" ] ; then
  215. + if [ -x "$IONICE" ] ; then
  216. + ionice="$IONICE $ionice"
  217. + else
  218. + ionice=
  219. + fi
  220. + fi
  221. +
  222. + "$DAEMON" \
  223. + --running \
  224. + --name "$INSTANCE" \
  225. + --pidfiles "$PIDDIR" \
  226. + && return 1
  227. + $ionice "$DAEMON" \
  228. + --respawn \
  229. + --name "$INSTANCE" \
  230. + --pidfiles "$PIDDIR" \
  231. + --output daemon.notice \
  232. + --stdout daemon.notice \
  233. + --stderr daemon.err -- \
  234. + $VBLADE $options $shelf $slot $netif $filename || return 2
  235. +}
  236. +
  237. +# Stop a vblade instance
  238. +#
  239. +# Return
  240. +# 0 if daemon has been stopped
  241. +# 1 if daemon was already stopped
  242. +# 2 if daemon could not be stopped
  243. +# other if a failure occurred
  244. +do_stop () {
  245. + local INSTANCE="$1"
  246. +
  247. + "$DAEMON" \
  248. + --running \
  249. + --name "$INSTANCE" \
  250. + --pidfiles "$PIDDIR" || return 1
  251. + "$DAEMON" \
  252. + --stop \
  253. + --name "$INSTANCE" \
  254. + --pidfiles "$PIDDIR" \
  255. + --stop || return 2
  256. + # Wait until the process is gone
  257. + for i in $(seq 1 10) ; do
  258. + "$DAEMON" \
  259. + --running \
  260. + --name "$INSTANCE" \
  261. + --pidfiles "$PIDDIR" || return 0
  262. + done
  263. + return 2
  264. +}
  265. +
  266. +EXIT=0
  267. +
  268. +do_action () {
  269. + local CONFIG="$1"
  270. +
  271. + INSTANCE="$(basename "${CONFIG%%.conf}")"
  272. +
  273. + case "$ACTION" in
  274. + start)
  275. + [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$INSTANCE"
  276. + do_start "$INSTANCE" "$CONFIG"
  277. + case "$?" in
  278. + 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
  279. + 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
  280. + esac
  281. + ;;
  282. + stop)
  283. + [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$INSTANCE"
  284. + do_stop "$INSTANCE"
  285. + case "$?" in
  286. + 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
  287. + 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
  288. + esac
  289. + ;;
  290. + status)
  291. + if "$DAEMON" \
  292. + --running \
  293. + --name "$INSTANCE" \
  294. + --pidfiles "$PIDDIR"
  295. + then
  296. + echo "$DESC instance $INSTANCE is running"
  297. + else
  298. + echo "$DESC instance $INSTANCE is not running"
  299. + EXIT=1
  300. + fi
  301. + ;;
  302. + restart|force-reload)
  303. + log_daemon_msg "Restarting $DESC" "$INSTANCE"
  304. + do_stop "$INSTANCE"
  305. + case "$?" in
  306. + 0|1)
  307. + do_start "$INSTANCE" "$CONFIG"
  308. + case "$?" in
  309. + 0) log_end_msg 0 ;;
  310. + *)
  311. + # Old process is still running or
  312. + # failed to start
  313. + log_end_msg 1 ;;
  314. + esac
  315. + ;;
  316. + *)
  317. + # Failed to stop
  318. + log_end_msg 1
  319. + ;;
  320. + esac
  321. + ;;
  322. + *)
  323. + echo "Usage: /etc/init.d/vblade {start|stop|status|restart|force-reload} [<export> ...]" >&2
  324. + exit 3
  325. + ;;
  326. + esac
  327. +}
  328. +
  329. +
  330. +ACTION="$1"
  331. +shift
  332. +
  333. +if [ "$1" ] ; then
  334. + while [ "$1" ] ; do
  335. + CONFIG="/etc/vblade.conf.d/$1.conf"
  336. + if [ -f "$CONFIG" ] ; then
  337. + do_action "$CONFIG"
  338. + fi
  339. + shift
  340. + done
  341. +else
  342. + for CONFIG in /etc/vblade.conf.d/*.conf ; do
  343. + if [ -f "$CONFIG" ] ; then
  344. + do_action "$CONFIG"
  345. + fi
  346. + done
  347. +fi
  348. +
  349. +exit $EXIT
  350. --- /dev/null
  351. +++ b/contrib/persistence/vblade.init.generate
  352. @@ -0,0 +1,24 @@
  353. +#!/bin/sh
  354. +
  355. +set -e
  356. +
  357. +TEMPDIR="$(mktemp --directory --tmpdir "vblade.init.generate.$$.XXXXX")"
  358. +trap "cd / ; rm -rf \"$TEMPDIR\"" EXIT
  359. +
  360. +run () {
  361. + local OUTPUT="$1"
  362. + echo "I: Processing $OUTPUT"
  363. + TEMP="$TEMPDIR/$OUTPUT"
  364. + shift
  365. + tpage "$@" vblade.init.in>"$TEMP"
  366. + sh -n "$TEMP"
  367. + if [ -f "$OUTPUT" ] && cmp -s "$TEMP" "$OUTPUT" ; then
  368. + echo "I: $OUTPUT is fresh"
  369. + else
  370. + cp "$TEMP" "$OUTPUT"
  371. + fi
  372. +}
  373. +
  374. +# run 'vblade.init.debian' --define lsb=1 --define control=ssd
  375. +run 'vblade.init.lsb-daemon' --define lsb=1 --define control=daemon
  376. +run 'vblade.init.daemon' --define lsb= --define control=daemon
  377. --- /dev/null
  378. +++ b/contrib/persistence/vblade.init.in
  379. @@ -0,0 +1,245 @@
  380. +#!/bin/sh
  381. +
  382. +[% IF lsb -%]
  383. +### BEGIN INIT INFO
  384. +# Provides: vblade
  385. +# Required-Start: $remote_fs $syslog $network
  386. +# Required-Stop: $remote_fs $syslog $network
  387. +# Default-Start: 2 3 4 5
  388. +# Default-Stop: 0 1 6
  389. +# Short-Description: vblade exports
  390. +# Description: Manage all vlbade exports defined in
  391. +# /etc/vblade.conf.d/
  392. +### END INIT INFO
  393. +
  394. +[% END -%]
  395. +PATH=/sbin:/usr/sbin:/bin:/usr/bin
  396. +DESC="vblade export"
  397. +NAME=vblade
  398. +VBLADE="/usr/sbin/$NAME"
  399. +[% IF control == 'ssd' -%]
  400. +[% PERL -%]die ('control=ssd cannot be used as long as vblade as no pidfile support');[% END -%]
  401. +[% ELSIF control == 'daemon' -%]
  402. +DAEMON=/usr/bin/daemon
  403. +[% END -%]
  404. +IONICE=/usr/bin/ionice
  405. +PIDDIR="/var/run/vblade/"
  406. +
  407. +[ -x "$VBLADE" ] || exit 0
  408. +[% IF control == 'daemon' -%]
  409. +[ -x "$DAEMON" ] || exit 0
  410. +[% END -%]
  411. +
  412. +mkdir -p "$PIDDIR"
  413. +
  414. +[% IF lsb -%]
  415. +# Load the VERBOSE setting and other rcS variables
  416. +. /lib/init/vars.sh
  417. +
  418. +# Define LSB functions
  419. +. /lib/lsb/init-functions
  420. +[% ELSE -%]
  421. +# Emulation of LSB functions
  422. +VERBOSE=1
  423. +log_daemon_msg () {
  424. + printf '%s ' "$@"
  425. +}
  426. +log_end_msg () {
  427. + local CODE="$1"
  428. + if [ "$CODE" -eq 0 ] ; then
  429. + echo '.'
  430. + else
  431. + echo 'failed!'
  432. + fi
  433. +}
  434. +[% END -%]
  435. +
  436. +# Start a vblade instance
  437. +#
  438. +# Return
  439. +# 0 if daemon has been started
  440. +# 1 if daemon was already running
  441. +# 2 if daemon could not be started
  442. +do_start () {
  443. + local INSTANCE="$1"
  444. + local CONFIG="$2"
  445. +
  446. + sh -n "$CONFIG" 2>/dev/null || return 2
  447. +
  448. + shelf=
  449. + slot=
  450. + filename=
  451. + netif=
  452. + options=
  453. + ionice=
  454. +
  455. + . "$CONFIG"
  456. +
  457. + [ "$netif" ] || return 2
  458. + [ "$shelf" ] || return 2
  459. + [ "$slot" ] || return 2
  460. + [ "$filename" ] || return 2
  461. +
  462. + if [ "$ionice" ] ; then
  463. + if [ -x "$IONICE" ] ; then
  464. + ionice="$IONICE $ionice"
  465. + else
  466. + ionice=
  467. + fi
  468. + fi
  469. +
  470. +[% IF control == 'ssd' -%]
  471. + local PIDFILE="$PIDDIR/$INSTANCE.pid"
  472. + start-stop-daemon --start --quiet \
  473. + --pidfile "$PIDFILE" --exec "$VBLADE" --test > /dev/null \
  474. + || return 1
  475. + start-stop-daemon --start --quiet \
  476. + --pidfile "$PIDFILE" \
  477. + --exec $ionice "$VBLADE" -- \
  478. + $shelf $slot $netif $filename $options \
  479. + || return 2
  480. +[% ELSIF control == 'daemon' -%]
  481. + "$DAEMON" \
  482. + --running \
  483. + --name "$INSTANCE" \
  484. + --pidfiles "$PIDDIR" \
  485. + && return 1
  486. + $ionice "$DAEMON" \
  487. + --respawn \
  488. + --name "$INSTANCE" \
  489. + --pidfiles "$PIDDIR" \
  490. + --output daemon.notice \
  491. + --stdout daemon.notice \
  492. + --stderr daemon.err -- \
  493. + $VBLADE $options $shelf $slot $netif $filename || return 2
  494. +[% END -%]
  495. +}
  496. +
  497. +# Stop a vblade instance
  498. +#
  499. +# Return
  500. +# 0 if daemon has been stopped
  501. +# 1 if daemon was already stopped
  502. +# 2 if daemon could not be stopped
  503. +# other if a failure occurred
  504. +do_stop () {
  505. + local INSTANCE="$1"
  506. +
  507. +[% IF control == 'ssd' -%]
  508. + local PIDFILE="$PIDDIR/$INSTANCE.pid"
  509. + start-stop-daemon --stop --quiet \
  510. + --retry=TERM/30/KILL/5 --pidfile "$PIDFILE" --name "$NAME"
  511. + RETVAL="$?"
  512. + [ "$RETVAL" = 2 ] && return 2
  513. + # Many daemons don't delete their pidfiles when they exit.
  514. + rm -f "$PIDFILE"
  515. + return "$RETVAL"
  516. +[% ELSIF control == 'daemon' -%]
  517. + "$DAEMON" \
  518. + --running \
  519. + --name "$INSTANCE" \
  520. + --pidfiles "$PIDDIR" || return 1
  521. + "$DAEMON" \
  522. + --stop \
  523. + --name "$INSTANCE" \
  524. + --pidfiles "$PIDDIR" \
  525. + --stop || return 2
  526. + # Wait until the process is gone
  527. + for i in $(seq 1 10) ; do
  528. + "$DAEMON" \
  529. + --running \
  530. + --name "$INSTANCE" \
  531. + --pidfiles "$PIDDIR" || return 0
  532. + done
  533. + return 2
  534. +[% END -%]
  535. +}
  536. +
  537. +EXIT=0
  538. +
  539. +do_action () {
  540. + local CONFIG="$1"
  541. +
  542. + INSTANCE="$(basename "${CONFIG%%.conf}")"
  543. +
  544. + case "$ACTION" in
  545. + start)
  546. + [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$INSTANCE"
  547. + do_start "$INSTANCE" "$CONFIG"
  548. + case "$?" in
  549. + 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
  550. + 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
  551. + esac
  552. + ;;
  553. + stop)
  554. + [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$INSTANCE"
  555. + do_stop "$INSTANCE"
  556. + case "$?" in
  557. + 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
  558. + 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
  559. + esac
  560. + ;;
  561. + status)
  562. +[% IF lsb -%]
  563. + status_of_proc -p "$PIDDIR/$INSTANCE.pid" "$VBLADE" "vblade instance $INSTANCE" || EXIT=$?
  564. +[% ELSE -%]
  565. + if "$DAEMON" \
  566. + --running \
  567. + --name "$INSTANCE" \
  568. + --pidfiles "$PIDDIR"
  569. + then
  570. + echo "$DESC instance $INSTANCE is running"
  571. + else
  572. + echo "$DESC instance $INSTANCE is not running"
  573. + EXIT=1
  574. + fi
  575. +[% END -%]
  576. + ;;
  577. + restart|force-reload)
  578. + log_daemon_msg "Restarting $DESC" "$INSTANCE"
  579. + do_stop "$INSTANCE"
  580. + case "$?" in
  581. + 0|1)
  582. + do_start "$INSTANCE" "$CONFIG"
  583. + case "$?" in
  584. + 0) log_end_msg 0 ;;
  585. + *)
  586. + # Old process is still running or
  587. + # failed to start
  588. + log_end_msg 1 ;;
  589. + esac
  590. + ;;
  591. + *)
  592. + # Failed to stop
  593. + log_end_msg 1
  594. + ;;
  595. + esac
  596. + ;;
  597. + *)
  598. + echo "Usage: /etc/init.d/vblade {start|stop|status|restart|force-reload} [<export> ...]" >&2
  599. + exit 3
  600. + ;;
  601. + esac
  602. +}
  603. +
  604. +
  605. +ACTION="$1"
  606. +shift
  607. +
  608. +if [ "$1" ] ; then
  609. + while [ "$1" ] ; do
  610. + CONFIG="/etc/vblade.conf.d/$1.conf"
  611. + if [ -f "$CONFIG" ] ; then
  612. + do_action "$CONFIG"
  613. + fi
  614. + shift
  615. + done
  616. +else
  617. + for CONFIG in /etc/vblade.conf.d/*.conf ; do
  618. + if [ -f "$CONFIG" ] ; then
  619. + do_action "$CONFIG"
  620. + fi
  621. + done
  622. +fi
  623. +
  624. +exit $EXIT
  625. --- /dev/null
  626. +++ b/contrib/persistence/vblade.init.lsb-daemon
  627. @@ -0,0 +1,185 @@
  628. +#!/bin/sh
  629. +
  630. +### BEGIN INIT INFO
  631. +# Provides: vblade
  632. +# Required-Start: $remote_fs $syslog $network
  633. +# Required-Stop: $remote_fs $syslog $network
  634. +# Default-Start: 2 3 4 5
  635. +# Default-Stop: 0 1 6
  636. +# Short-Description: vblade exports
  637. +# Description: Manage all vblade exports defined in
  638. +# /etc/vblade.conf.d/
  639. +### END INIT INFO
  640. +
  641. +PATH=/sbin:/usr/sbin:/bin:/usr/bin
  642. +DESC="vblade export"
  643. +NAME=vblade
  644. +VBLADE="/usr/sbin/$NAME"
  645. +DAEMON=/usr/bin/daemon
  646. +IONICE=/usr/bin/ionice
  647. +PIDDIR="/var/run/vblade/"
  648. +
  649. +[ -x "$VBLADE" ] || exit 0
  650. +[ -x "$DAEMON" ] || exit 0
  651. +
  652. +mkdir -p "$PIDDIR"
  653. +
  654. +# Load the VERBOSE setting and other rcS variables
  655. +. /lib/init/vars.sh
  656. +
  657. +# Define LSB functions
  658. +. /lib/lsb/init-functions
  659. +
  660. +# Start a vblade instance
  661. +#
  662. +# Return
  663. +# 0 if daemon has been started
  664. +# 1 if daemon was already running
  665. +# 2 if daemon could not be started
  666. +do_start () {
  667. + local INSTANCE="$1"
  668. + local CONFIG="$2"
  669. +
  670. + sh -n "$CONFIG" 2>/dev/null || return 2
  671. +
  672. + shelf=
  673. + slot=
  674. + filename=
  675. + netif=
  676. + options=
  677. + ionice=
  678. +
  679. + . "$CONFIG"
  680. +
  681. + [ "$netif" ] || return 2
  682. + [ "$shelf" ] || return 2
  683. + [ "$slot" ] || return 2
  684. + [ "$filename" ] || return 2
  685. +
  686. + if [ "$ionice" ] ; then
  687. + if [ -x "$IONICE" ] ; then
  688. + ionice="$IONICE $ionice"
  689. + else
  690. + ionice=
  691. + fi
  692. + fi
  693. +
  694. + "$DAEMON" \
  695. + --running \
  696. + --name "$INSTANCE" \
  697. + --pidfiles "$PIDDIR" \
  698. + && return 1
  699. + $ionice "$DAEMON" \
  700. + --respawn \
  701. + --name "$INSTANCE" \
  702. + --pidfiles "$PIDDIR" \
  703. + --output daemon.notice \
  704. + --stdout daemon.notice \
  705. + --stderr daemon.err -- \
  706. + $VBLADE $options $shelf $slot $netif $filename || return 2
  707. +}
  708. +
  709. +# Stop a vblade instance
  710. +#
  711. +# Return
  712. +# 0 if daemon has been stopped
  713. +# 1 if daemon was already stopped
  714. +# 2 if daemon could not be stopped
  715. +# other if a failure occurred
  716. +do_stop () {
  717. + local INSTANCE="$1"
  718. +
  719. + "$DAEMON" \
  720. + --running \
  721. + --name "$INSTANCE" \
  722. + --pidfiles "$PIDDIR" || return 1
  723. + "$DAEMON" \
  724. + --stop \
  725. + --name "$INSTANCE" \
  726. + --pidfiles "$PIDDIR" \
  727. + --stop || return 2
  728. + # Wait until the process is gone
  729. + for i in $(seq 1 10) ; do
  730. + "$DAEMON" \
  731. + --running \
  732. + --name "$INSTANCE" \
  733. + --pidfiles "$PIDDIR" || return 0
  734. + done
  735. + return 2
  736. +}
  737. +
  738. +EXIT=0
  739. +
  740. +do_action () {
  741. + local CONFIG="$1"
  742. +
  743. + INSTANCE="$(basename "${CONFIG%%.conf}")"
  744. +
  745. + case "$ACTION" in
  746. + start)
  747. + [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$INSTANCE"
  748. + do_start "$INSTANCE" "$CONFIG"
  749. + case "$?" in
  750. + 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
  751. + 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
  752. + esac
  753. + ;;
  754. + stop)
  755. + [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$INSTANCE"
  756. + do_stop "$INSTANCE"
  757. + case "$?" in
  758. + 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
  759. + 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
  760. + esac
  761. + ;;
  762. + status)
  763. + status_of_proc -p "$PIDDIR/$INSTANCE.pid" "$VBLADE" "vblade instance $INSTANCE" || EXIT=$?
  764. + ;;
  765. + restart|force-reload)
  766. + log_daemon_msg "Restarting $DESC" "$INSTANCE"
  767. + do_stop "$INSTANCE"
  768. + case "$?" in
  769. + 0|1)
  770. + do_start "$INSTANCE" "$CONFIG"
  771. + case "$?" in
  772. + 0) log_end_msg 0 ;;
  773. + *)
  774. + # Old process is still running or
  775. + # failed to start
  776. + log_end_msg 1 ;;
  777. + esac
  778. + ;;
  779. + *)
  780. + # Failed to stop
  781. + log_end_msg 1
  782. + ;;
  783. + esac
  784. + ;;
  785. + *)
  786. + echo "Usage: /etc/init.d/vblade {start|stop|status|restart|force-reload} [<export> ...]" >&2
  787. + exit 3
  788. + ;;
  789. + esac
  790. +}
  791. +
  792. +
  793. +ACTION="$1"
  794. +shift
  795. +
  796. +if [ "$1" ] ; then
  797. + while [ "$1" ] ; do
  798. + CONFIG="/etc/vblade.conf.d/$1.conf"
  799. + if [ -f "$CONFIG" ] ; then
  800. + do_action "$CONFIG"
  801. + fi
  802. + shift
  803. + done
  804. +else
  805. + for CONFIG in /etc/vblade.conf.d/*.conf ; do
  806. + if [ -f "$CONFIG" ] ; then
  807. + do_action "$CONFIG"
  808. + fi
  809. + done
  810. +fi
  811. +
  812. +exit $EXIT
  813. --- /dev/null
  814. +++ b/contrib/persistence/vblade.service
  815. @@ -0,0 +1,13 @@
  816. +[Unit]
  817. +Description=vblade exports
  818. +Documentation=man:vblade-persistence(5)
  819. +Documentation=man:vblade(8)
  820. +
  821. +[Service]
  822. +Type=oneshot
  823. +ExecStart=/bin/true
  824. +ExecReload=/bin/true
  825. +RemainAfterExit=on
  826. +
  827. +[Install]
  828. +WantedBy=multi-user.target
  829. --- /dev/null
  830. +++ b/contrib/persistence/vblade@.service
  831. @@ -0,0 +1,18 @@
  832. +[Unit]
  833. +Description=vblade instance %I
  834. +SourcePath=/etc/vblade.conf.d/%I.conf
  835. +Documentation=man:vblade(8)
  836. +PartOf=vblade.service
  837. +After=rc-local.service
  838. +
  839. +[Service]
  840. +Type=simple
  841. +Environment="ionice=-c2 -n7"
  842. +EnvironmentFile=/etc/vblade.conf.d/%I.conf
  843. +ExecStart=/usr/bin/ionice $ionice /usr/sbin/vblade $shelf $slot $netif $filename $options
  844. +SyslogIdentifier=vblade
  845. +Restart=always
  846. +RestartSec=10
  847. +
  848. +[Install]
  849. +WantedBy=multi-user.target