initial
[rrq/overlay-boot.git] / functions
1 # This file implements common functions for all boot methods
2
3 die() {
4     echo "$*" >&2
5     exit 1
6 }
7
8 # grab and set a configuration variable
9 # $1 = variable, [ $2 = default .. error otherwise ]
10 config() {
11     eval $1="$(sed "/^$1=.*/{s|^$1=||;b};d" $CONFIG)"
12     [ -z "$(eval echo "\$$1")" ] || return 0
13     [ $# -lt 2 ] && die "Missing $1=... in $CONFIG"
14     eval $1="'$2'"
15     eval echo "$1=\$$1"
16 }
17
18 # Unless the subhost already has a private /etc/network/interfaces,
19 # install an "empty" one
20 setup_networking() {
21     [ -r $UPPER/etc/network/interfaces ] && return 0
22     [ "$UPPER/etc/network" = "/etc/network" ] && exit 1
23     mkdir -p $UPPER/etc/network
24     cat <<EOF > $UPPER/etc/network/interfaces
25 # Generated for $NAME subhost
26 auto lo
27 iface lo inet loopback
28 EOF
29     return 1
30 }
31
32 # Setup the network namespace for the given $CABLES
33 # $1=netns ( $2="br=mac" .. )
34 setup_veth_cables() {
35     local NETNS BR IF MAC C i ADD
36     NETNS="$1"
37     shift 1
38     i=0
39     ADD=false
40     setup_networking || ADD=true
41     for C in "$@" ; do
42         IF=$NETNS$i
43         MAC="${C#*=}"
44         [ -z "$MAC" ] || MAC="address $MAC"
45         ip link add $IF type veth peer name eth$i $MAC netns $NETNS
46         ip link set $IF up
47         $ADD && cat <<EOF >> $UPPER/etc/network/interfaces
48
49 auto eth$i
50 iface eth$i inet manual
51 EOF
52         BR="${C%=*}"
53         [ -z "$BR" ] || brctl addif $BR $IF
54         i=$((i+1))
55     done
56 }
57
58 REAPER=$(dirname $(realpath $0))/reaper/reaper
59 # (name live system root work)
60 # Set up an overlay fmr $name on $live, with a new tmpfs on its /run,
61 # and "install" a "reaper" as the upcoming pid 1
62 setup_overlay() {
63     set -x
64     mkdir -p $4/run
65     mount -t tmpfs -osize=100M tmpfs $4/run
66     mkdir -p $4/run/lock
67     grep -q "$1 $2" /proc/mounts || \
68         mount -t overlay -olowerdir=$3,upperdir=$4,workdir=$5 $1 $2 || \
69         die "Cannot set up the overlay mount $2"
70     mount --bind $4/run $2/run
71     cp $REAPER $LIVE/.reaper
72 }
73
74
75 # Check if $SRV is "live" ; will 
76 is_live() {
77     pgrep -f ".reaper $SRV" > /dev/null
78 }
79
80 start_services() {
81     for S in "$@" ; do
82         service $S start
83     done
84 }