~cloud-init-dev/cloud-init/trunk

« back to all changes in this revision

Viewing changes to tools/uncloud-init

  • Committer: Scott Moser
  • Date: 2016-08-10 15:06:15 UTC
  • Revision ID: smoser@ubuntu.com-20160810150615-ma2fv107w3suy1ma
README: Mention move of revision control to git.

cloud-init development has moved its revision control to git.
It is available at 
  https://code.launchpad.net/cloud-init

Clone with 
  git clone https://git.launchpad.net/cloud-init
or
  git clone git+ssh://git.launchpad.net/cloud-init

For more information see
  https://git.launchpad.net/cloud-init/tree/HACKING.rst

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/bin/sh
2
 
# vi: ts=4 noexpandtab
3
 
 
4
 
# This script is meant to "kvmify" an image.  Its not meant to be
5
 
# terribly robust, or a good idea to ever run in a "real image".
6
 
# its' only intended method of invocation is from the kernel as 'init'
7
 
# in which case it will then invoke /sbin/init after it is done
8
 
#  init=/path/to/kvmify-init
9
 
 
10
 
KEY="xupdate"
11
 
UMOUNT=""
12
 
RMDIR=""
13
 
MARK=/var/lib/cloud/sem/uncloud-init.once
14
 
ROOT_RW=""
15
 
 
16
 
doexec() {
17
 
        if [ -n "$ROOT_RW" ]; then
18
 
                mkdir -p "${MARK%/*}";
19
 
                date > "${MARK}";
20
 
        fi
21
 
        cleanup;
22
 
        log "invoking /sbin/init $*"
23
 
        exec /sbin/init "$@";
24
 
}
25
 
log() { echo "::${0##*/}:" "$@"; }
26
 
cleanup() {
27
 
        [ -z "${UMOUNT}" ] || { umount "${UMOUNT}" && unset UMOUNT; }
28
 
        [ -z "${RMDIR}" ] || { rm -Rf "${RMDIR}" && unset RMDIR; }
29
 
        [ -z "${ROOT_RW}" ] || { mount -o remount,ro / ; unset ROOT_RW; }
30
 
}
31
 
 
32
 
updateFrom() {
33
 
        local dev=$1 fmt=$2
34
 
        local mp="";
35
 
 
36
 
        [ "${fmt}" = "tar" -o "${fmt}" = "mnt" ] ||
37
 
                { log FAIL "unknown format ${fmt}"; return 1; }
38
 
 
39
 
        log INFO "updating from ${dev} format ${fmt}"
40
 
                [ ! -e "${dev}" -a -e "/dev/${dev}" ] && dev="/dev/${dev}"
41
 
        [ -e "${dev}" ] || { echo "no file $dev"; return 2; }
42
 
 
43
 
        mp=$(mktemp -d "${TEMPDIR:-/tmp}/update.XXXXXX") && 
44
 
                RMDIR="${mp}" ||
45
 
                { log FAIL "failed to mktemp"; return 1; }
46
 
 
47
 
        if [ "$fmt" = "tar" ]; then
48
 
                dd "if=${dev}" | ( tar -C "${mp}" -xf - ) ||
49
 
                        { log FAIL "failed to extract ${dev}"; return 1; }
50
 
        elif [ "$fmt" = "mnt" ]; then
51
 
                mount -o ro "${dev}" "${mp}" && UMOUNT=${mp} ||
52
 
                        { log FAIL "failed mount ${mp}"; return 1; }
53
 
        else
54
 
                log FAIL "unknown format ${fmt}"; return 1;
55
 
        fi
56
 
 
57
 
        if [ -d "${mp}/updates" ]; then
58
 
                rsync -av "${mp}/updates/" "/" ||
59
 
                        { log FAIL "failed rsync updates/ /"; return 1; }
60
 
        fi
61
 
        if [ -f "${mp}/updates.tar" ]; then
62
 
                tar -C / -xvf "${mp}/updates.tar" ||
63
 
                        { log FAIL "failed tar -C / -xvf ${mp}/updates.tar"; return 1; }
64
 
        fi
65
 
        script="${mp}/updates.script"
66
 
        if [ -f "${script}" -a -x "${script}" ]; then
67
 
                MP_DIR=${mp} "${mp}/updates.script" ||
68
 
                        { log FAIL "failed to run updates.script"; return 1; }
69
 
        fi
70
 
}
71
 
 
72
 
fail() { { [ $# -eq 0 ] && log "FAILING" ; } || log "$@"; exit 1; }
73
 
 
74
 
[ -s "$MARK" ] && { log "already updated" ; doexec "$@"; }
75
 
 
76
 
mount -o remount,rw / || fail "failed to mount rw"
77
 
ROOT_RW=1
78
 
 
79
 
if [ ! -e /proc/cmdline ]; then
80
 
        mount -t proc /proc /proc
81
 
        read cmdline < /proc/cmdline
82
 
        umount /proc
83
 
else
84
 
        read cmdline < /proc/cmdline
85
 
fi
86
 
 
87
 
ubuntu_pass=""
88
 
 
89
 
for x in ${cmdline}; do
90
 
        case "$x" in
91
 
                ${KEY}=*)
92
 
                        val=${x#${KEY}=}
93
 
                        dev=${val%:*}
94
 
                        [ "${dev}" = "${val}" ] && fmt="" || fmt=${val#${dev}:}
95
 
                        log "update from ${dev},${fmt}"
96
 
                        updateFrom "${dev}" "${fmt}" || fail "update failed"
97
 
                        log "end update  ${dev},${fmt}"
98
 
                        ;;
99
 
                ubuntu-pass=*|ubuntu_pass=*) ubuntu_pass=${x#*=};;
100
 
                helpmount) helpmount=1;;
101
 
                root=*) rootspec=${x#root=};;
102
 
        esac
103
 
done
104
 
 
105
 
if [ "${ubuntu_pass}" = "R" -o "${ubuntu_pass}" = "random" ]; then
106
 
        ubuntu_pass=$(python -c 'import string, random;
107
 
random.seed(); print "".join(random.sample(string.letters+string.digits, 8))')
108
 
        log "settting ubuntu pass = ${ubuntu_pass}" 
109
 
        printf "\n===\nubuntu_pass = %s\n===\n" "${ubuntu_pass}" >/dev/ttyS0
110
 
fi
111
 
 
112
 
[ -z "${ubuntu_pass}" ] ||
113
 
        printf "ubuntu:%s\n" "${ubuntu_pass}" > /root/ubuntu-user-pass
114
 
 
115
 
if [ -e /root/ubuntu-user-pass ]; then
116
 
        log "changing ubuntu user's password!"
117
 
        chpasswd < /root/ubuntu-user-pass ||
118
 
        log "FAIL: failed changing pass"
119
 
fi
120
 
 
121
 
cp /etc/init/tty2.conf /etc/init/ttyS0.conf &&
122
 
        sed -i s,tty2,ttyS0,g /etc/init/ttyS0.conf 2>/dev/null &&
123
 
        log "enabled console on ttyS0"
124
 
 
125
 
pa=PasswordAuthentication
126
 
sed -i "s,${pa} no,${pa} yes," /etc/ssh/sshd_config 2>/dev/null &&
127
 
        log "enabled passwd auth in ssh" ||
128
 
        log "failed to enable passwd ssh"
129
 
 
130
 
grep -q vga16fb /etc/modprobe.d/blacklist.conf || {
131
 
        echo "blacklist vga16fb" >> /etc/modprobe.d/blacklist.conf &&
132
 
        log "blacklisted vga16fb"
133
 
}
134
 
 
135
 
#lstr="${rootspec}"
136
 
#if ! grep -q "^${lstr}[[:space:]]" /etc/fstab; then
137
 
#       log "changing / in /etc/ftab to agree with cmdline (${lstr}) (bug 509841)"
138
 
#       sed -i "s,^\([^[[:space:]#]\+\)\([[:space:]]\+\)/\([[:space:]]\+\),${lstr}\2/\3," /etc/fstab
139
 
#fi
140
 
 
141
 
doexec "$@"