summaryrefslogtreecommitdiff
path: root/manage-baserock
blob: 143bced897123d2d8d08636280cb8c57eb35778a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#!/bin/bash

BASEROCK_BASE="${BASEROCK_BASE:-/opt/baserock/chroots}"

ACTION="$1"
SYSTEM=$(echo $2 | tr -c -d A-Za-z0-9_-)
URL="$3"

list_baserocks () {
    (cd "${BASEROCK_BASE}" && ls -d */baserock) 2>/dev/null | sed -e's@/baserock$@@'
}

case "${ACTION}" in
    list)
        for SYSTEM in $(list_baserocks); do
            if test -e "${BASEROCK_BASE}/${SYSTEM}/default"; then
                echo "${SYSTEM} *"
            else
                echo "${SYSTEM}"
            fi
        done
        ;;
    add)
        if test $(id -u) != "0"; then
            exec sudo "$0" "$@"
        fi

        if test -d "${BASEROCK_BASE}/${SYSTEM}/baserock"; then
            echo "Sorry, $SYSTEM already exists"
            exit 1
        fi
        
        TEMP_BASE=$(mktemp -d --tmpdir="${BASEROCK_BASE}")
        cleanup () { rm -rf "${TEMP_BASE}"; }
        trap cleanup 0

        if test "x${URL}" = "x${URL##http://}" -a "x${URL}" = "x${URL##https://}"; then
            if ! ln -s "$(readlink -e "${URL}")" "${TEMP_BASE}/tarball"; then
                echo "Sorry, could not link ${URL} into place";
                exit 1;
            fi
        else
            if ! wget -O "${TEMP_BASE}/tarball" "$URL"; then
                echo "Sorry, could not download ${URL}";
                exit 1;
            fi
        fi

        mkdir "${TEMP_BASE}/root"
        if ! tar -C "${TEMP_BASE}/root" -xf "${TEMP_BASE}/tarball"; then
            echo "Sorry, could not unpack ${URL}";
            exit 1;
        fi

        ENTRIES=$(ls "${TEMP_BASE}/root" | wc -l | sed -e's/^ *//;s/ *$//')
        if test "x${ENTRIES}" = "x1"; then
            mv "${TEMP_BASE}/root/"* "${BASEROCK_BASE}/${SYSTEM}"
        else
            mv "${TEMP_BASE}/root" "${BASEROCK_BASE}/${SYSTEM}"
        fi

        if ! test -d "${BASEROCK_BASE}/${SYSTEM}/baserock"; then
            echo "Sorry, ${URL} does not appear to contain a baserock system";
            rm -rf "${BASEROCK_BASE}/${SYSTEM}";
            exit 1;
        fi

        NR_BRS=$(list_baserocks | wc -l | sed -e's/^ *//;s/ *$//')
        if test "$NR_BRS" = "1"; then
            touch "${BASEROCK_BASE}/${SYSTEM}/default"
        fi

        if ! test -r "${BASEROCK_BASE}/${SYSTEM}/root/.bashrc"; then
            cat > "${BASEROCK_BASE}/${SYSTEM}/root/.bashrc" <<EOF
PS1="\u@\h(baserock-${SYSTEM}):\w\$ "
EOF
        fi

        if ! test -r "${BASEROCK_BASE}/${SYSTEM}/root/.bash_profile"; then
            cat > "${BASEROCK_BASE}/${SYSTEM}/root/.bash_profile" <<EOF
. ~/.bashrc
EOF
        fi

        br-ct-sync-chroots
        
        ;;
    rm)
        if test $(id -u) != "0"; then
            exec sudo "$0" "$@"
        fi

        if ! test -d "${BASEROCK_BASE}/${SYSTEM}/baserock"; then
            echo "Sorry, $SYSTEM does not exist or is not a baserock chroot"
            exit 1
        fi
        rm -rf "${BASEROCK_BASE}/${SYSTEM}"
        br-ct-sync-chroots
        ;;
    set-default)
        if test $(id -u) != "0"; then
            exec sudo "$0" "$@"
        fi

        if ! test -d "${BASEROCK_BASE}/${SYSTEM}/baserock"; then
            echo "Sorry, $SYSTEM does not exist or is not a baserock chroot"
            exit 1
        fi
        
        rm -f "${BASEROCK_BASE}/"*/default
        touch "${BASEROCK_BASE}/${SYSTEM}/default"
        br-ct-sync-chroots
        ;;
    *)
        echo >&2 "usage: $0 list | add <name> <url> | rm <name> | set-default <name>"
        exit 1
        ;;
esac