diff --git a/nlvmi b/nlvmi index b84d95a..1b6183a 100755 --- a/nlvmi +++ b/nlvmi @@ -5,7 +5,12 @@ source /etc/nlvmi/nlvmi.conf if [ $LOGLEVEL -gt "1" ]; then echo "configuration loaded"; fi #checking directories -if [ ! -d $VMDIRECTORY ]; then echo "VMDIRECTORY wrong, $VMDIRECTORY does not exist"; exit 1; fi +echo $VMDIRECTORY | while read line; do IFS='|' read -r -a array + for dir in "${array[@]}"; do + if [ ! -d $dir ]; then echo "VMDIRECTORY wrong, $dir does not exist"; exit 1; fi + done +done <<< "$line" + if [ ! -d $RUNDIRECTORY ]; then if [ $LOGLEVEL -gt "1" ]; then echo "creating $RUNDIRECTORY"; fi; mkdir -p $RUNDIRECTORY; fi #checking database @@ -92,91 +97,42 @@ function vmstart { if [ $LOGLEVEL -gt "1" ]; then echo "startvm function entered for vmid $1"; fi sqlite3 $SQLITEFILE "SELECT * FROM vms WHERE id=$1" | while read line; do IFS='|' read -r -a array <<< "$line" - if [ ${array[6]}=="" ]; then - DRIVE1=""; fi - if [ ${array[6]}!="" ]; then - DRIVE1="-drive file=${array[6]},cache=none,format=raw,if=virtio,aio=native"; fi - if [ ${array[7]}=="" ]; then - DRIVE2=""; fi - if [ ${array[7]}!="" ]; then - DRIVE2="-drive file=${array[7]},cache=none,format=raw,if=virtio,aio=native"; fi - if [ ${array[8]}=="" ]; then - DRIVE3=""; fi - if [ ${array[8]}!="" ]; then - DRIVE3="-drive file=${array[8]},cache=none,format=raw,if=virtio,aio=native"; fi - if [ ${array[9]}=="" ]; then - CDROM=""; fi - if [ ${array[9]}!="" ]; then - CDROM="-cdrom file=${array[9]}"; fi - if [ ${array[11]}=="" ]; then - NETDEV1=""; fi - if [ ${array[11]}!="" ]; then - NETDEV1="-net nic,macaddr=${array[11]},model=virtio,netdev=net0"; fi - if [ ${array[15]}=="" ]; then - TAPDEV1=""; fi - if [ ${array[15]}!="" ]; then - TAPDEV1="-netdev tap,ifname=${array[15]},script=no,id=net0"; fi - if [ ${array[16]}=="" ]; then - TAPDEV2=""; fi - if [ ${array[16]}!="" ]; then - TAPDEV2="-netdev tap,ifname=${array[16]},script=no,id=net0"; fi - if [ ${array[17]}=="" ]; then - TAPDEV3=""; fi - if [ ${array[17]}!="" ]; then - TAPDEV3="-netdev tap,ifname=${array[17]},script=no,id=net0"; fi - if [ ${array[18]}=="" ]; then - VNCPORT=""; fi - if [ ${array[18]}!="" ]; then - VNCPORT="-vnc ${array[18]},websocket=${array[19]},password"; fi - if [ ${array[21]}=="" ]; then - USBDEV1=""; fi - if [ ${array[21]}!="" ]; then - USBDEV1="-usbdevice ${array[21]}"; fi - if [ ${array[22]}=="" ]; then - USBDEV2=""; fi - if [ ${array[22]}!="" ]; then - USBDEV2="-usbdevice ${array[22]}"; fi - if [ ${array[23]}=="" ]; then - USBDEV3=""; fi - if [ ${array[23]}!="" ]; then - USBDEV3="-usbdevice ${array[22]}"; fi - if [ ${array[28]}=="" ]; then - CPUTYPE=""; fi - if [ ${array[28]}!="" ]; then - CPUTYPE="-cpu ${array[28]}"; fi - if [ ${array[26]}=="" ]; then - SMP=""; fi - if [ ${array[26]}!="" ]; then - SMP="-smp ${array[26]}"; fi - if [ ${array[25]}=="" ]; then - MEMORY=""; fi - if [ ${array[25]}!="" ]; then - MEMORY="-m ${array[25]}"; fi - if [ ${array[27]}=="" ]; then - CUSTOM=""; fi - if [ ${array[27]}!="" ]; then - CUSTOM="${array[27]}"; fi - tunctl -t $TAPDEV1 -u ${array[3]} - brctl addif br0 $TAPDEV1 - ifconfig $TAPDEV1 up - su ${array[3]} -c \"${array[10]} -enable-kvm $CPUTYPE $MEMORY $SMP -boot ${array[5]} $USBDEV1 $USBDEV2 $USBDEV3 -k ${array[24]} -daemonize $DRIVE1 $DRIVE2 $DRIVE3 $CDROM $NETDEV1 $TAPDEV1 $TAPDEV2 $TAPDEV3 $VNCPORT $CUSTOM -pidfile $RUNDIRECTORY/${array[1]}.pid -monitor unix:$RUNDIRECTORY/${array[1]}.mon,server,nowait\" - + if [ ! -z ${array[6]} ]; then DRIVE1="-drive file=${array[6]},cache=none,format=raw,if=virtio,aio=native"; fi + if [ ! -z ${array[7]} ]; then DRIVE2="-drive file=${array[7]},cache=none,format=raw,if=virtio,aio=native"; fi + if [ ! -z ${array[8]} ]; then DRIVE3="-drive file=${array[8]},cache=none,format=raw,if=virtio,aio=native"; fi + if [ ! -z ${array[9]} ]; then CDROM="-cdrom ${array[9]}"; fi + if [ ! -z ${array[11]} ]; then NETDEV1="-net nic,macaddr=${array[11]},model=virtio,netdev=net0"; fi + if [ ! -z ${array[15]} ]; then TAPDEV1="-netdev tap,ifname=${array[15]},script=no,id=net0"; fi + if [ ! -z ${array[16]} ]; then TAPDEV2="-netdev tap,ifname=${array[16]},script=no,id=net0"; fi + if [ ! -z ${array[17]} ]; then TAPDEV3="-netdev tap,ifname=${array[17]},script=no,id=net0"; fi + if [ ! -z ${array[18]} ]; then VNCPORT="-vnc ${array[18]},websocket=${array[19]},password"; fi + if [ ! -z ${array[21]} ]; then USBDEV1="-usb -device usb-ehci,id=ehci -device usb-${array[21]},bus=usb-bus.0"; fi + if [ ! -z ${array[28]} ]; then CPUTYPE="-cpu ${array[28]}"; fi + if [ ! -z ${array[26]} ]; then SMP="-smp ${array[26]}"; fi + if [ ! -z ${array[25]} ]; then MEMORY="-m ${array[25]}"; fi + if [ ! -z ${array[27]} ]; then CUSTOM="${array[27]}"; fi +# tunctl -t $TAPDEV1 -u ${array[3]} +# brctl addif br0 $TAPDEV1 +# ifconfig $TAPDEV1 up + COMMAND=(su ${array[3]} -c "${array[10]} -enable-kvm $CPUTYPE $MEMORY $SMP -boot ${array[5]} $USBDEV1 -k ${array[24]} -daemonize $DRIVE1 $DRIVE2 $DRIVE3 $CDROM $NETDEV1 $TAPDEV1 $TAPDEV2 $TAPDEV3 $VNCPORT $CUSTOM -pidfile $RUNDIRECTORY/${array[1]}.pid -monitor unix:$RUNDIRECTORY/${array[1]}.mon,server,nowait") + if [ $LOGLEVEL -gt "1" ]; then echo ${COMMAND[@]}; fi + `"${COMMAND[@]}"` #Set VNC Password - echo "change vnc password ${array[20]}" | socat - unix-connect:$RUNDIRECTORY/${array[1]}.mon >/dev/null +# echo "change vnc password ${array[20]}" | socat - unix-connect:$RUNDIRECTORY/${array[1]}.mon >/dev/null done export VMFOUND="yes" } function vmstop { - if [ -e $RUNDIRDIRECTORY/$1.pid ]; then echo "pidfile not exist"; exit 1; fi + if [ ! -e $RUNDIRECTORY/$1.pid ]; then echo "pidfile $RUNDIRECTORY/$1.pid does not exist"; exit 1; fi if [ $LOGLEVEL -gt "1" ]; then echo "stopvm function entered for VM $1"; fi - sqlite3 $SQLITEFILE "SELECT * FROM vms WHERE vmname=$1" | while read line; do + sqlite3 $SQLITEFILE "SELECT * FROM vms WHERE vmname='$1'" | while read line; do IFS='|' read -r -a array <<< "$line" - echo "system_powerdown" | socat - unix-connect:$RUNDIRDIRECTORY/${array[1]}.mon >/dev/null + echo "system_powerdown" | socat - unix-connect:$RUNDIRECTORY/${array[1]}.mon >/dev/null STOPPED="no" while [ $STOPPED = "no" ]; do - ps -ef | grep `cat $RUNDIRDIRECTORY/${array[1]}.pid` | grep -v grep >/dev/null || STOPPED="yes" + ps -ef | grep `cat $RUNDIRECTORY/${array[1]}.pid` | grep -v grep >/dev/null || STOPPED="yes" done done } @@ -198,6 +154,18 @@ if [ $# -gt 0 ]; then vmstart $arrays done if [[ $VMFOUND == "no" ]]; then echo "no VM with that name found!"; exit 1; fi) + elif [ $1 == "stop" ]; then +echo $1 $2 + if [ -z $2 ]; then echo "stop needs a vmname!"; exit 1; fi + VMFOUND="no" + if [ $LOGLEVEL -gt "1" ]; then echo "searching for vmname $2"; fi + sqlite3 $SQLITEFILE "SELECT id FROM vms WHERE vmname='$2'" | (while read line; do + IFS='|' read -r -a arrays <<< "$line" + declare VMFOUND="yes" + export "$VMFOUND" + vmstop $2 + done + if [[ $VMFOUND == "no" ]]; then echo "no VM with that name found!"; exit 1; fi) fi else diff --git a/nlvmi.conf b/nlvmi.conf deleted file mode 100644 index d17a778..0000000 --- a/nlvmi.conf +++ /dev/null @@ -1,34 +0,0 @@ -########## -# This is the configuration file for the -# NativenetLightweightVMInterface -# basic settings go in here -# GPLv3 - -#Loglovel 1-3, 3 is debug -LOGLEVEL="3" - -#Where your images are stored like qcow2 -VMDIRECTORY="/kvm" - -#Where your iso images are stored -ISODIRECTORY="/kvm/iso" - -#Where pids and monitor sockets are getting stored -RUNDIRECTORY="/run/nlvmi" - -#which database mariadb or sqlite -DATABASETYPE="sqlite" - -#only sqlite settings -SQLITEFILE="/etc/nlvmi/nlvmi.sqlite" -#The unix user that runs php, to grand permissions on the sqlite file -PHPUSER="nobody" - - - -#only mariadb settings -MARIAHOST="localhost" -MARIADB="nlvmi" -MARIAUSER="root" -MARIAPASS="" -