source: trunk/vblade-persist/src/vblade-persist @ 694

Last change on this file since 694 was 694, checked in by dkg, 6 years ago

vblade-persist: change all instances of INTERFACE to NETIF for consistency.

  • Property svn:executable set to *
File size: 4.1 KB
Line 
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
10VDIR=/var/lib/vblade-persist/vblades
11SDIR=/usr/share/vblade-persist
12
13usage() {
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
20error() {
21    echo "vblade-persist: $1" >&2
22}
23
24fatal() {
25    error "$1"
26    exit ${2:-'1'}
27}
28
29require_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.
34verify_vblade_persist_path() {
35    [ -d "$1" ]
36}
37
38# shelf identifiers should be integers:
39# FIXME: check that they're in a certain range?
40verify_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?
46verify_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?
51verify_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:
64verify_source() {
65    [ -b `readlink -f "$1"` ]
66}
67
68setup() {
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
103list() {
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
111svcommand() {
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
120auto() {
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
129autoall() {
130    AUTO="$1"
131    for dev in `ls "$VDIR"` ; do
132        auto "$AUTO" "$VDIR/$dev"
133    done
134}
135
136svall() {
137    require_sv
138    CMD="$1"
139    for dev in `ls "$VDIR"` ; do
140        svcommand "$CMD" "$VDIR/$dev"
141    done
142}
143
144case "$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        ;;
173esac
Note: See TracBrowser for help on using the repository browser.