| 1 | #!/bin/sh |
|---|
| 2 | |
|---|
| 3 | # vblade-persist: this script sets up a permanent vblade instance under |
|---|
| 4 | # runit supervision |
|---|
| 5 | |
|---|
| 6 | # Author: Daniel Kahn Gillmor <dkg@fifthhorseman.net> |
|---|
| 7 | # Copyright: November 2007 |
|---|
| 8 | # License: GPLv3 or later |
|---|
| 9 | |
|---|
| 10 | VDIR=/var/lib/vblade-persist/vblades |
|---|
| 11 | SDIR=/usr/share/vblade-persist |
|---|
| 12 | |
|---|
| 13 | usage() { |
|---|
| 14 | echo "usage: vblade-persist setup SHELF SLOT NETIF SOURCE" |
|---|
| 15 | echo " vblade-persist ls" |
|---|
| 16 | echo " vblade-persist start|stop|restart|auto|noauto SHELF SLOT" |
|---|
| 17 | echo " vblade-persist start|stop|restart|auto|noauto all" |
|---|
| 18 | } |
|---|
| 19 | |
|---|
| 20 | error() { |
|---|
| 21 | echo "vblade-persist: $1" >&2 |
|---|
| 22 | } |
|---|
| 23 | |
|---|
| 24 | fatal() { |
|---|
| 25 | error "$1" |
|---|
| 26 | exit ${2:-'1'} |
|---|
| 27 | } |
|---|
| 28 | |
|---|
| 29 | require_sv() { |
|---|
| 30 | [ -x /usr/bin/sv ] || fatal "/usr/bin/sv not available. Please install runit." |
|---|
| 31 | } |
|---|
| 32 | |
|---|
| 33 | # FIXME: make this test a little more robust. |
|---|
| 34 | verify_vblade_persist_path() { |
|---|
| 35 | [ -d "$1" ] |
|---|
| 36 | } |
|---|
| 37 | |
|---|
| 38 | # shelf identifiers should be integers: |
|---|
| 39 | # FIXME: check that they're in a certain range? |
|---|
| 40 | verify_shelf() { |
|---|
| 41 | expr match "$1" '[0-9][0-9]*' >/dev/null |
|---|
| 42 | } |
|---|
| 43 | |
|---|
| 44 | # slot identifiers should be integers: |
|---|
| 45 | # FIXME: check that they're in a certain range? |
|---|
| 46 | verify_slot() { |
|---|
| 47 | expr match "$1" '[0-9][0-9]*' >/dev/null |
|---|
| 48 | } |
|---|
| 49 | |
|---|
| 50 | # FIXME: if there's no ip and no ifconfig, what do we do? |
|---|
| 51 | verify_interface() { |
|---|
| 52 | if [ -x /bin/ip ] ; then |
|---|
| 53 | /bin/ip link show "$1" >/dev/null |
|---|
| 54 | elif [ -x /sbin/ifconfig ] ; then |
|---|
| 55 | /sbin/ifconfig -s "$1" > /dev/null |
|---|
| 56 | else |
|---|
| 57 | error "Don't know how to test interface. Assuming '$1' is acceptable." |
|---|
| 58 | true |
|---|
| 59 | fi |
|---|
| 60 | } |
|---|
| 61 | |
|---|
| 62 | # make sure that the device is either a block device or a link to a |
|---|
| 63 | # block device: |
|---|
| 64 | verify_source() { |
|---|
| 65 | [ -b `readlink -f "$1"` ] |
|---|
| 66 | } |
|---|
| 67 | |
|---|
| 68 | setup() { |
|---|
| 69 | SHELF="$1" |
|---|
| 70 | SLOT="$2" |
|---|
| 71 | NETIF="$3" |
|---|
| 72 | SOURCE="$4" |
|---|
| 73 | |
|---|
| 74 | verify_shelf "$SHELF" || fatal "not a valid shelf: '$SHELF'" |
|---|
| 75 | verify_slot "$SLOT" || fatal "not a valid shelf: '$SLOT'" |
|---|
| 76 | verify_interface "$NETIF" || fatal "not a valid interface: '$NETIF'" |
|---|
| 77 | verify_source "$SOURCE" || fatal "not a valid source: '$SOURCE'" |
|---|
| 78 | |
|---|
| 79 | DNAME="e$SHELF.$SLOT" |
|---|
| 80 | |
|---|
| 81 | mkdir "$VDIR/$DNAME" || fatal "Could not create directory '$VDIR/$DNAME'" |
|---|
| 82 | mkdir "$VDIR/$DNAME/env" |
|---|
| 83 | mkdir "$VDIR/$DNAME/log" |
|---|
| 84 | mkdir "$VDIR/$DNAME/macs" |
|---|
| 85 | |
|---|
| 86 | # start it off idle (so that the admin can decide when to start): |
|---|
| 87 | touch "$VDIR/$DNAME/down" |
|---|
| 88 | |
|---|
| 89 | ln -s "$SDIR/vblade-run" "$VDIR/$DNAME/run" |
|---|
| 90 | ln -s "$SDIR/vblade-finish" "$VDIR/$DNAME/finish" |
|---|
| 91 | ln -s "$SDIR/vblade-logrun" "$VDIR/$DNAME/log/run" |
|---|
| 92 | |
|---|
| 93 | echo "$SHELF" > "$VDIR/$DNAME/env/SHELF" |
|---|
| 94 | echo "$SLOT" > "$VDIR/$DNAME/env/SLOT" |
|---|
| 95 | echo "$NETIF" > "$VDIR/$DNAME/env/NETIF" |
|---|
| 96 | echo "$SOURCE" > "$VDIR/$DNAME/env/SOURCE" |
|---|
| 97 | |
|---|
| 98 | # tell runit to supervise this vblade: |
|---|
| 99 | ln -s "$VDIR/$DNAME" "/var/service/vblade-$DNAME" || fatal "Could not set up supervision for this vblade" |
|---|
| 100 | } |
|---|
| 101 | |
|---|
| 102 | |
|---|
| 103 | list() { |
|---|
| 104 | |
|---|
| 105 | echo -e '#shelf slot netif source auto stat' |
|---|
| 106 | for dev in `ls "$VDIR"` ; do |
|---|
| 107 | echo $(cat "$VDIR/$dev/env/SHELF" "$VDIR/$dev/env/SLOT" "$VDIR/$dev/env/NETIF" "$VDIR/$dev/env/SOURCE") $( [ -e "$VDIR/$dev/down" ] && echo 'no')auto $(cat "$VDIR/$dev/supervise/stat") |
|---|
| 108 | done |
|---|
| 109 | } |
|---|
| 110 | |
|---|
| 111 | svcommand() { |
|---|
| 112 | require_sv |
|---|
| 113 | CMD="$1" |
|---|
| 114 | SVDIR="$2" |
|---|
| 115 | verify_vblade_persist_path "$SVDIR" || fatal "This is not a vblade-persist path" |
|---|
| 116 | sv "$CMD" "$SVDIR" |
|---|
| 117 | } |
|---|
| 118 | |
|---|
| 119 | |
|---|
| 120 | auto() { |
|---|
| 121 | verify_vblade_persist_path "$2" || fatal "This is not a vblade-persist path" |
|---|
| 122 | if [ "$1" == "auto" ] ; then |
|---|
| 123 | rm -f "$2/down" |
|---|
| 124 | else |
|---|
| 125 | touch "$2/down" |
|---|
| 126 | fi |
|---|
| 127 | } |
|---|
| 128 | |
|---|
| 129 | autoall() { |
|---|
| 130 | AUTO="$1" |
|---|
| 131 | for dev in `ls "$VDIR"` ; do |
|---|
| 132 | auto "$AUTO" "$VDIR/$dev" |
|---|
| 133 | done |
|---|
| 134 | } |
|---|
| 135 | |
|---|
| 136 | svall() { |
|---|
| 137 | require_sv |
|---|
| 138 | CMD="$1" |
|---|
| 139 | for dev in `ls "$VDIR"` ; do |
|---|
| 140 | svcommand "$CMD" "$VDIR/$dev" |
|---|
| 141 | done |
|---|
| 142 | } |
|---|
| 143 | |
|---|
| 144 | case "$1" in |
|---|
| 145 | setup) |
|---|
| 146 | setup "$2" "$3" "$4" "$5" |
|---|
| 147 | ;; |
|---|
| 148 | l*) |
|---|
| 149 | list |
|---|
| 150 | ;; |
|---|
| 151 | start|stop|restart) |
|---|
| 152 | if [ "all" == "$2" ] ; then |
|---|
| 153 | svall "$1" |
|---|
| 154 | else |
|---|
| 155 | verify_shelf "$2" || fatal "Not a valid shelf: '$2'" |
|---|
| 156 | verify_slot "$3" || fatal "Not a valid slot: '$3'" |
|---|
| 157 | svcommand "$1" "$VDIR/e$2.$3" |
|---|
| 158 | fi |
|---|
| 159 | ;; |
|---|
| 160 | auto|noauto) |
|---|
| 161 | if [ "all" == "$2" ] ; then |
|---|
| 162 | autoall "$1" |
|---|
| 163 | else |
|---|
| 164 | verify_shelf "$2" || fatal "Not a valid shelf: '$2'" |
|---|
| 165 | verify_slot "$3" || fatal "Not a valid slot: '$3'" |
|---|
| 166 | auto "$1" "$VDIR/e$2.$3" |
|---|
| 167 | fi |
|---|
| 168 | ;; |
|---|
| 169 | *) |
|---|
| 170 | usage |
|---|
| 171 | exit 1 |
|---|
| 172 | ;; |
|---|
| 173 | esac |
|---|