1#!/bin/sh
2
3if [ "$#" -lt 1 ] || [ "$#" -gt 2 ]; then
4    echo "Usage: $0 <database_path> <qemu_bin_dir>" >&2
5    exit 1
6fi
7
8DB_PATH="$1"
9DB_ACTUAL_VERSION=17
10DB_CURRENT_VERSION=$(sqlite3 "$DB_PATH" -line 'PRAGMA user_version;' | sed 's/.*[[:space:]]=[[:space:]]//')
11USER=$(whoami)
12RC=0
13
14if [ "$#" -eq 2 ]; then
15    QEMU_BIN_PATH="$3"
16else
17    USER_DIR=$(grep ${USER} /etc/passwd | awk 'BEGIN { FS = ":" }; { printf "%s\n", $6 }')
18    if [ ! -d "$USER_DIR" ]; then
19        echo "Couldn't find user home directory" >&2
20        exit 1
21    fi
22    #TODO we shouldn't expect to find .nemu.cfg in homedir
23    if [ ! -f ${USER_DIR}/.nemu.cfg ]; then
24        echo "Couldn't find .nemu.cfg in user home directory" >&2
25        exit 1
26    fi
27
28    #TODO we shouldn't expect to find .nemu.cfg in homedir
29    QEMU_BIN_PATH=$(grep qemu_bin_path ${USER_DIR}/.nemu.cfg | awk '{ printf "%s\n", $3 }')
30    if [ -z "$QEMU_BIN_PATH" ]; then
31        echo "Couldn't get qemu_bin_path from .nemu.cfg" >&2
32        exit 1
33    fi
34fi
35
36if [ "$DB_CURRENT_VERSION" -lt 3 ]; then
37    echo "Database version less then 3 is not supported"
38    exit 1
39fi
40
41if [ "$DB_CURRENT_VERSION" = "$DB_ACTUAL_VERSION" ]; then
42    echo "No need to upgrade."
43    exit 0
44fi
45
46db_update_machine()
47{
48# TODO make machine column NOT NULL
49    local a
50    local rc=0
51    local archs=$(sqlite3 "$DB_PATH" -line 'SELECT DISTINCT arch FROM vms;' | awk '{print $NF}')
52
53    for a in $archs; do
54        local def=$(${QEMU_BIN_PATH}/qemu-system-"${a}" -M help | awk '/(default)/ {print $1}')
55        [ -z "$def" ] && rc=1
56        sqlite3 "$DB_PATH" -line "UPDATE vms SET machine='${def}' WHERE machine IS NULL and arch='${a}'" || rc=1
57    done
58
59    return $rc
60}
61
62echo "database version: ${DB_CURRENT_VERSION}"
63while [ "$DB_CURRENT_VERSION" != "$DB_ACTUAL_VERSION" ]; do
64    [ "$RC" = 1 ] && break;
65
66    case "$DB_CURRENT_VERSION" in
67        ( 3 )
68            (
69            sqlite3 "$DB_PATH" -line 'ALTER TABLE vms ADD initrd char;' &&
70            sqlite3 "$DB_PATH" -line 'ALTER TABLE vms ADD machine char;' &&
71            sqlite3 "$DB_PATH" -line 'PRAGMA user_version=4'
72            ) || RC=1
73            ;;
74
75        ( 4 )
76            (
77            sqlite3 "$DB_PATH" -line 'CREATE TABLE snapshots(id integer primary key autoincrement, '`
78               `'vm_name char, snap_name char, backing_drive char, snap_idx integer, '`
79               `'active integer, TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL)' &&
80            sqlite3 "$DB_PATH" -line 'ALTER TABLE ifaces ADD vhost integer;' &&
81            sqlite3 "$DB_PATH" -line 'UPDATE ifaces SET vhost="0";' &&
82            sqlite3 "$DB_PATH" -line 'UPDATE ifaces SET if_drv="virtio-net-pci" WHERE if_drv="virtio";' &&
83            sqlite3 "$DB_PATH" -line 'PRAGMA user_version=5'
84            ) || RC=1
85            ;;
86
87        ( 5 )
88            (
89            sqlite3 "$DB_PATH" -line 'ALTER TABLE vms ADD fs9p_enable integer;' &&
90            sqlite3 "$DB_PATH" -line 'ALTER TABLE vms ADD fs9p_path char;' &&
91            sqlite3 "$DB_PATH" -line 'ALTER TABLE vms ADD fs9p_name char;' &&
92            sqlite3 "$DB_PATH" -line 'UPDATE vms SET fs9p_enable="0";' &&
93            sqlite3 "$DB_PATH" -line 'ALTER TABLE ifaces ADD macvtap integer;' &&
94            sqlite3 "$DB_PATH" -line 'ALTER TABLE ifaces ADD parent_eth char;' &&
95            sqlite3 "$DB_PATH" -line 'UPDATE ifaces SET macvtap="0";' &&
96            sqlite3 "$DB_PATH" -line 'CREATE TABLE veth(id integer primary key autoincrement, '`
97                `'l_name char, r_name char);' &&
98            sqlite3 "$DB_PATH" -line 'PRAGMA user_version=6'
99            ) || RC=1
100            ;;
101
102        ( 6 )
103            (
104            sqlite3 "$DB_PATH" -line 'CREATE TABLE vmsnapshots(id integer primary key autoincrement, '`
105               `'vm_name char, snap_name char, load integer, timestamp char)' &&
106            sqlite3 "$DB_PATH" -line 'CREATE TABLE usb(id integer primary key autoincrement, '`
107                `'vm_name char, dev_name char, vendor_id char, product_id char, serial char)' &&
108            sqlite3 "$DB_PATH" -line 'PRAGMA user_version=7'
109            ) || RC=1
110            ;;
111
112        ( 7 )
113            (
114            sqlite3 "$DB_PATH" -line 'ALTER TABLE vms ADD usb_type char;' &&
115            sqlite3 "$DB_PATH" -line 'UPDATE vms SET usb_type="XHCI";' &&
116            sqlite3 "$DB_PATH" -line 'PRAGMA user_version=8'
117            ) || RC=1
118            ;;
119
120        ( 8 )
121            (
122            sqlite3 "$DB_PATH" -line 'ALTER TABLE vms ADD spice integer;' &&
123            sqlite3 "$DB_PATH" -line 'UPDATE vms SET spice="1";' &&
124            sqlite3 "$DB_PATH" -line 'PRAGMA user_version=9'
125            ) || RC=1
126            ;;
127
128        ( 9 )
129            (
130            sqlite3 "$DB_PATH" -line 'ALTER TABLE vms ADD debug_port integer;' &&
131            sqlite3 "$DB_PATH" -line 'UPDATE vms SET debug_port="";' &&
132            sqlite3 "$DB_PATH" -line 'ALTER TABLE vms ADD debug_freeze integer;' &&
133            sqlite3 "$DB_PATH" -line 'UPDATE vms SET debug_freeze="0";' &&
134            sqlite3 "$DB_PATH" -line 'PRAGMA user_version=10'
135            ) || RC=1
136            ;;
137
138        ( 10 )
139            (
140            sqlite3 "$DB_PATH" -line 'ALTER TABLE vms ADD cmdappend char;' &&
141            sqlite3 "$DB_PATH" -line 'ALTER TABLE ifaces ADD altname char;' &&
142            sqlite3 "$DB_PATH" -line 'PRAGMA user_version=11'
143            ) || RC=1
144            ;;
145
146         ( 11 )
147            (
148            sqlite3 "$DB_PATH" -line 'ALTER TABLE vms ADD team char;' &&
149            sqlite3 "$DB_PATH" -line 'DROP TABLE IF EXISTS lastval;' &&
150            db_update_machine &&
151            sqlite3 "$DB_PATH" -line 'PRAGMA user_version=12'
152            ) || RC=1
153            ;;
154
155         ( 12 )
156            (
157            sqlite3 "$DB_PATH" -line 'ALTER TABLE vms RENAME TO tmp;' &&
158            sqlite3 "$DB_PATH" -line 'CREATE TABLE vms(id integer PRIMARY KEY AUTOINCREMENT, '`
159               `'name char(31), mem integer, smp char, kvm integer, '`
160               `'hcpu integer, vnc integer, arch char(32), iso char, '`
161               `'install integer, usb integer, usbid char, bios char, kernel char, '`
162               `'mouse_override integer, kernel_append char, tty_path char, '`
163               `'socket_path char, initrd char, machine char, fs9p_enable integer, '`
164               `'fs9p_path char, fs9p_name char, usb_type char, spice integer, '`
165               `'debug_port integer, debug_freeze integer, cmdappend char, team char);' &&
166            sqlite3 "$DB_PATH" -line 'INSERT INTO vms SELECT * FROM tmp;' &&
167            sqlite3 "$DB_PATH" -line 'DROP TABLE tmp;' &&
168            sqlite3 "$DB_PATH" -line 'PRAGMA user_version=13'
169            ) || RC=1
170            ;;
171
172         ( 13 )
173             (
174             sqlite3 "$DB_PATH" -line 'ALTER TABLE vms ADD display_type char;' &&
175             sqlite3 "$DB_PATH" -line 'UPDATE vms SET display_type="qxl";' &&
176             sqlite3 "$DB_PATH" -line 'PRAGMA user_version=14'
177             ) || RC=1
178            ;;
179
180         ( 14 )
181             (
182             sqlite3 "$DB_PATH" -line 'ALTER TABLE drives ADD discard integer;' &&
183             sqlite3 "$DB_PATH" -line 'UPDATE drives SET discard="0";' &&
184             sqlite3 "$DB_PATH" -line 'PRAGMA user_version=15'
185             ) || RC=1
186            ;;
187
188         ( 15 )
189             (
190             sqlite3 "$DB_PATH" -line 'ALTER TABLE ifaces ADD netuser integer;' &&
191             sqlite3 "$DB_PATH" -line 'ALTER TABLE ifaces ADD hostfwd char;' &&
192             sqlite3 "$DB_PATH" -line 'UPDATE ifaces SET netuser="0";' &&
193             sqlite3 "$DB_PATH" -line 'PRAGMA user_version=16'
194             ) || RC=1
195            ;;
196
197         ( 16 )
198             (
199             sqlite3 "$DB_PATH" -line 'ALTER TABLE ifaces ADD smb char;' &&
200             sqlite3 "$DB_PATH" -line 'PRAGMA user_version=17'
201             ) || RC=1
202            ;;
203
204        ( * )
205            echo "Unsupported database user_version" >&2
206            exit 1
207    esac
208
209    DB_CURRENT_VERSION=$(sqlite3 "$DB_PATH" -line 'PRAGMA user_version;' | sed 's/.*[[:space:]]=[[:space:]]//')
210done
211
212[ "$RC" = 0 ] && echo "database upgrade complete."
213