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