diff --git a/nlvmi b/nlvmi index a017b3e..d403531 100755 --- a/nlvmi +++ b/nlvmi @@ -44,43 +44,43 @@ function createdb { if [ $DATABASETYPE == "sqlite" ]; then sqlite3 $SQLITEFILE "CREATE TABLE vms ( id INTEGER PRIMARY KEY AUTOINCREMENT, - vmname VARCHAR(50) NOT NULL, + vmname VARCHAR(50) NOT NULL, user VARCHAR(50) NOT NULL, - server VARCHAR(50), - arch VARCHAR(50) NOT NULL, + server VARCHAR(50), + arch VARCHAR(50) NOT NULL, cputype VARCHAR(50), cpus INTEGER, memory INTEGER, - usbdev VARCHAR(50), - kblang VARCHAR(50), + usbdev VARCHAR(50), + kblang VARCHAR(50), custom VARCHAR(50), - bootoption VARCHAR(2) NOT NULL, + bootoption VARCHAR(2) NOT NULL, autostart INTEGER, - drive1 VARCHAR(50), + drive1 VARCHAR(50), format1 VARCHAR(50), - drive2 VARCHAR(50), + drive2 VARCHAR(50), format2 VARCHAR(50), - drive3 VARCHAR(50), + drive3 VARCHAR(50), format3 VARCHAR(50), - cdrom VARCHAR(50), - tapdev1 VARCHAR(50), - macaddr1 VARCHAR(50), - brdev1 VARCHAR(50), - tapdev2 VARCHAR(50), - macaddr2 VARCHAR(50), - brdev2 VARCHAR(50), - tapdev3 VARCHAR(50), - macaddr3 VARCHAR(50), - brdev3 VARCHAR(50), - vncport INTEGER, - websocket INTEGER, - vncpassword VARCHAR(50), + cdrom VARCHAR(50), + tapdev1 VARCHAR(50), + macaddr1 VARCHAR(50), + brdev1 VARCHAR(50), + tapdev2 VARCHAR(50), + macaddr2 VARCHAR(50), + brdev2 VARCHAR(50), + tapdev3 VARCHAR(50), + macaddr3 VARCHAR(50), + brdev3 VARCHAR(50), + vncport INTEGER, + websocket INTEGER, + vncpassword VARCHAR(50), prio INTEGER );" sqlite3 $SQLITEFILE "CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, - username VARCHAR(50) NOT NULL, - password VARCHAR(255), + username VARCHAR(50) NOT NULL, + password VARCHAR(255), admin INTEGER );" sqlite3 $SQLITEFILE "CREATE TABLE servers ( @@ -148,32 +148,32 @@ function vmstart { echo "if ! \`id -u ${array[2]} &>/dev/null\`; then useradd ${array[2]} -d /run/nlvmi -g nlvmi -M -s /bin/false -G kvm; fi" >>$TMPF #chown mon and pid files echo "if [ -e $RUNDIRECTORY/${array[1]}.mon ] || [ -e $RUNDIRECTORY/${array[1]}.pid ]; then chown ${array[2]}:nlvmi $RUNDIRECTORY/${array[1]}.*; fi" >>$TMPF - if [ ! -z ${array[5]} ]; then CPUTYPE="-cpu ${array[5]}"; fi - if [ ! -z ${array[6]} ]; then SMP="-smp ${array[6]}"; fi - if [ ! -z ${array[7]} ]; then MEMORY="-m ${array[7]}"; fi - if [ ! -z ${array[8]} ]; then USBDEV="-usb -device usb-ehci,id=ehci -device usb-${array[8]},bus=usb-bus.0"; fi + if [ ! -z ${array[5]} ]; then CPUTYPE="-cpu ${array[5]}"; fi + if [ ! -z ${array[6]} ]; then SMP="-smp ${array[6]}"; fi + if [ ! -z ${array[7]} ]; then MEMORY="-m ${array[7]}"; fi + if [ ! -z ${array[8]} ]; then USBDEV="-usb -device usb-ehci,id=ehci -device usb-${array[8]},bus=usb-bus.0"; fi if [ ! -z ${array[9]} ]; then KB="-k ${array[9]}"; fi - if [ ! -z ${array[10]} ]; then CUSTOM="${array[10]}"; fi - if [ ! -z ${array[13]} ]; then DRIVE1="-drive file=${array[13]}"; echo "chown ${array[2]}:nlvmi ${array[13]}" >>$TMPF; fi - if [ ! -z ${array[14]} ]; then FORMAT1=",format=${array[14]},if=virtio"; fi - if [ ! -z ${array[15]} ]; then DRIVE2="-drive file=${array[15]}"; echo "chown ${array[2]}:nlvmi ${array[15]}" >>$TMPF; fi - if [ ! -z ${array[16]} ]; then FORMAT2=",format=${array[16]},if=virtio"; fi - if [ ! -z ${array[17]} ]; then DRIVE3="-drive file=${array[17]}"; echo "chown ${array[2]}:nlvmi ${array[17]}" >>$TMPF; fi - if [ ! -z ${array[18]} ]; then FORMAT3=",format=${array[18]},if=virtio"; fi - if [ ! -z ${array[19]} ]; then CDROM="-cdrom ${array[19]}"; fi - if [ ! -z ${array[20]} ]; then TAPDEV1="-netdev tap,ifname=${array[20]},script=no,id=net0"; echo "tunctl -t ${array[20]} -u ${array[2]} && ifconfig ${array[20]} up" >>$TMPF; fi - if [ ! -z ${array[21]} ]; then MACADDR1="-net nic,macaddr=${array[21]},model=virtio,netdev=net0"; fi + if [ ! -z ${array[10]} ]; then CUSTOM="${array[10]}"; fi + if [ ! -z ${array[13]} ]; then DRIVE1="-drive file=${array[13]}"; echo "chown ${array[2]}:nlvmi ${array[13]}" >>$TMPF; fi + if [ ! -z ${array[14]} ]; then FORMAT1=",format=${array[14]},if=virtio"; fi + if [ ! -z ${array[15]} ]; then DRIVE2="-drive file=${array[15]}"; echo "chown ${array[2]}:nlvmi ${array[15]}" >>$TMPF; fi + if [ ! -z ${array[16]} ]; then FORMAT2=",format=${array[16]},if=virtio"; fi + if [ ! -z ${array[17]} ]; then DRIVE3="-drive file=${array[17]}"; echo "chown ${array[2]}:nlvmi ${array[17]}" >>$TMPF; fi + if [ ! -z ${array[18]} ]; then FORMAT3=",format=${array[18]},if=virtio"; fi + if [ ! -z ${array[19]} ]; then CDROM="-cdrom ${array[19]}"; fi + if [ ! -z ${array[20]} ]; then TAPDEV1="-netdev tap,ifname=${array[20]},script=no,id=net0"; echo "tunctl -t ${array[20]} -u ${array[2]} && ifconfig ${array[20]} up" >>$TMPF; fi + if [ ! -z ${array[21]} ]; then MACADDR1="-net nic,macaddr=${array[21]},model=virtio,netdev=net0"; fi if [ ! -z ${array[22]} ]; then BRDEV1="${array[22]}"; echo "/sbin/brctl addif ${array[22]} ${array[20]}" >>$TMPF; fi - if [ ! -z ${array[23]} ]; then TAPDEV2="-netdev tap,ifname=${array[23]},script=no,id=net1"; echo "tunctl -t ${array[23]} -u ${array[2]} && ifconfig ${array[23]} up" >>$TMPF; fi - if [ ! -z ${array[24]} ]; then MACADDR2="-net nic,macaddr=${array[24]},model=virtio,netdev=net1"; fi + if [ ! -z ${array[23]} ]; then TAPDEV2="-netdev tap,ifname=${array[23]},script=no,id=net1"; echo "tunctl -t ${array[23]} -u ${array[2]} && ifconfig ${array[23]} up" >>$TMPF; fi + if [ ! -z ${array[24]} ]; then MACADDR2="-net nic,macaddr=${array[24]},model=virtio,netdev=net1"; fi if [ ! -z ${array[25]} ]; then BRDEV2="${array[25]}"; echo "/sbin/brctl addif ${array[25]} ${array[23]}" >>$TMPF; fi - if [ ! -z ${array[26]} ]; then TAPDEV3="-netdev tap,ifname=${array[26]},script=no,id=net2"; echo "tunctl -t ${array[26]} -u ${array[2]} && ifconfig ${array[26]} up" >>$TMPF; fi - if [ ! -z ${array[27]} ]; then MACADDR3="-net nic,macaddr=${array[27]},model=virtio,netdev=net2"; fi + if [ ! -z ${array[26]} ]; then TAPDEV3="-netdev tap,ifname=${array[26]},script=no,id=net2"; echo "tunctl -t ${array[26]} -u ${array[2]} && ifconfig ${array[26]} up" >>$TMPF; fi + if [ ! -z ${array[27]} ]; then MACADDR3="-net nic,macaddr=${array[27]},model=virtio,netdev=net2"; fi if [ ! -z ${array[28]} ]; then BRDEV3="${array[28]}"; echo "/sbin/brctl addif ${array[28]} ${array[26]}" >>$TMPF; fi if [ ! -z ${array[30]} ]; then WPORT=$((${array[30]} + 5700)); WEBSOCK=",websocket=$WPORT"; else WEBSOCK=""; fi if [ ! -z ${array[31]} ]; then VNCPASS=",password"; fi - if [ ! -z ${array[29]} ]; then VNCPORT="-vnc :${array[29]}$WEBSOCK$VNCPASS"; fi - COMMAND=(su - ${array[2]} -s /bin/bash -c \"${array[4]} -name ${array[1]} -enable-kvm ${array[10]} $CPUTYPE $MEMORY $SMP -device virtio-rng-pci -boot ${array[11]} $USBDEV $KB -daemonize $DRIVE1$FORMAT1 $DRIVE2$FORMAT2 $DRIVE3$FORMAT3 $CDROM $MACADDR1 $TAPDEV1 $MACADDR2 $TAPDEV2 $MACADDR3 $TAPDEV3 $VNCPORT $CUSTOM -pidfile $RUNDIRECTORY/${array[1]}.pid -monitor unix:$RUNDIRECTORY/${array[1]}.mon,server,nowait\") + if [ ! -z ${array[29]} ]; then VNCPORT="-vnc :${array[29]}$WEBSOCK$VNCPASS"; fi + COMMAND=(su - ${array[2]} -s /bin/bash -c \"${array[4]} -name ${array[1]} -enable-kvm ${array[10]} $CPUTYPE $MEMORY $SMP -device virtio-rng-pci -boot ${array[11]} $USBDEV $KB -daemonize $DRIVE1$FORMAT1 $DRIVE2$FORMAT2 $DRIVE3$FORMAT3 $CDROM $MACADDR1 $TAPDEV1 $MACADDR2 $TAPDEV2 $MACADDR3 $TAPDEV3 $VNCPORT $CUSTOM -pidfile $RUNDIRECTORY/${array[1]}.pid -monitor unix:$RUNDIRECTORY/${array[1]}.mon,server,nowait\") if [ $LOGLEVEL -gt "1" ]; then echo ${COMMAND[@]}; fi echo "${COMMAND[@]}" >>$TMPF #Set VNC Password @@ -215,19 +215,19 @@ function vmstart { #stop VM function vmstop { - if [ $LOGLEVEL -gt "1" ]; then echo "stopvm function entered for VM $1"; fi - sqlite3 $SQLITEFILE "SELECT vms.id AS vid,vmname,connectstring FROM vms LEFT JOIN servers ON vms.server = servers.hostname WHERE vmname='$1'" | while read line; do - IFS='|' read -r -a array <<< "$line" - if [ -z ${array[2]} ]; then + if [ $LOGLEVEL -gt "1" ]; then echo "stopvm function entered for VM $1"; fi + sqlite3 $SQLITEFILE "SELECT vms.id AS vid,vmname,connectstring FROM vms LEFT JOIN servers ON vms.server = servers.hostname WHERE vmname='$1'" | while read line; do + IFS='|' read -r -a array <<< "$line" + if [ -z ${array[2]} ]; then if [ ! -e $RUNDIRECTORY/$1.pid ]; then echo "pidfile $RUNDIRECTORY/$1.pid does not exist"; exit 1; fi - echo "system_powerdown" | socat - unix-connect:$RUNDIRECTORY/${array[1]}.mon >/dev/null + echo "system_powerdown" | socat - unix-connect:$RUNDIRECTORY/${array[1]}.mon >/dev/null else - su nlvmi -c "ssh ${array[2]} \"echo \\\"system_powerdown\\\" | socat - unix-connect:$RUNDIRECTORY/${array[1]}.mon >/dev/null\"" - fi + su nlvmi -c "ssh ${array[2]} \"echo \\\"system_powerdown\\\" | socat - unix-connect:$RUNDIRECTORY/${array[1]}.mon >/dev/null\"" + fi sleep 5s - STOPPED="no" + STOPPED="no" COUNTER=0 - while [ $STOPPED = "no" ]; do + while [ $STOPPED = "no" ]; do if [ $COUNTER == 10 ]; then if [ -z ${array[2]} ]; then kill `cat $RUNDIRECTORY/${array[1]}.pid` @@ -248,19 +248,19 @@ function vmstop { ((COUNTER++)) checkvm ${array[1]} | grep "is not running" >/dev/null && STOPPED="yes" sleep 1s - done - done + done + done } #stop local vm function vmlocalstop { if [ ! -e $RUNDIRECTORY/$1.pid ]; then echo "pidfile $RUNDIRECTORY/$1.pid does not exist"; exit 1; fi - echo "system_powerdown" | socat - unix-connect:$RUNDIRECTORY/$1.mon >/dev/null + echo "system_powerdown" | socat - unix-connect:$RUNDIRECTORY/$1.mon >/dev/null sleep 5s - STOPPED="no" + STOPPED="no" COUNTER=0 - while [ $STOPPED = "no" ]; do + while [ $STOPPED = "no" ]; do if [ $COUNTER == 10 ]; then kill `cat $RUNDIRECTORY/$1.pid` echo "$1 forcefully killed!"; @@ -297,9 +297,9 @@ function listdir { #mainloop if [ $# -gt 0 ]; then - if [ $1 == "createdb" ]; then + if [ $1 == "createdb" ]; then createdb - elif [ $1 == "autostart" ]; then + elif [ $1 == "autostart" ]; then vmautostart elif [ $1 == "checkvm" ]; then if [ -z $2 ]; then echo "checkvm needs two arguments"; fi