nlvmi/nlvmi

487 lines
20 KiB
Plaintext
Raw Permalink Normal View History

2018-08-11 20:10:39 +02:00
#!/bin/bash
#getting the config
source /etc/nlvmi/nlvmi.conf
if [ $LOGLEVEL -gt "2" ]; then echo "configuration loaded"; fi
2018-08-11 20:10:39 +02:00
2018-08-20 16:55:32 +02:00
#check if we are root and wrap if we are not
U=`/usr/bin/whoami`
if [ $U != "root" ]; then
2018-12-01 17:52:19 +01:00
if [ ! -z $1 ]; then A="$1"; else A="bla"; fi
if [ ! -z $2 ]; then B="$2"; else B="bla"; fi
if [ ! -z $3 ]; then C="$3"; else C="bla"; fi
/usr/bin/wrap-nlvmi \"$A\" \"$B\" \"$C\" && exit
2018-08-20 16:55:32 +02:00
fi
2018-09-29 19:57:00 +02:00
if [ ! -d $RUNDIRECTORY ]; then if [ $LOGLEVEL -gt "1" ]; then echo "creating $RUNDIRECTORY"; fi; mkdir -p $RUNDIRECTORY; chown root:nlvmi -R $RUNDIRECTORY; chmod g+w $RUNDIRECTORY; fi
2018-08-11 20:10:39 +02:00
#checking database
function checkdb {
if [ $DATABASETYPE == "sqlite" ]; then
if [ ! -e $SQLITEFILE ]; then echo "sqlite configured, but db-file not present! create the db first!"; exit 1; fi
SQCHECK=`sqlite3 $SQLITEFILE "SELECT name FROM sqlite_master WHERE type='table' AND name='vms'"`
if [ $SQCHECK == "vms" ]; then
if [ $LOGLEVEL -gt "1" ]; then echo "DB ready to use"; fi
else
echo "error accessing sqlite!"
exit 1;
fi
echo "sqlite ready to use";
2018-08-11 20:10:39 +02:00
elif [ $DATABASETYPE == "mariadb" ]; then
DBCON="mysql --disable-pager -u $MARIAUSER -p$MARIAPASS -h $MARIAHOST $MARIADB"
declare -a DBC=`echo "SHOW TABLES FROM $MARIADB; " | $DBCON | sed 1d`
if [ -z $DBC ]; then
echo "mariadb connection failed"; exit 1
fi
fi
return 0
}
2018-08-11 20:10:39 +02:00
#creating database
function createdb {
if [ $LOGLEVEL -gt "1" ]; then echo "going to create the db"; fi
if [ $DATABASETYPE == "sqlite" ]; then
sqlite3 $SQLITEFILE "CREATE TABLE vms (
id INTEGER PRIMARY KEY AUTOINCREMENT,
2018-11-12 16:19:19 +01:00
vmname VARCHAR(50) NOT NULL,
2018-08-11 20:10:39 +02:00
user VARCHAR(50) NOT NULL,
2018-11-12 16:19:19 +01:00
server VARCHAR(50),
arch VARCHAR(50) NOT NULL,
cputype VARCHAR(50),
cpus INTEGER,
memory INTEGER,
2018-11-12 16:19:19 +01:00
usbdev VARCHAR(50),
kblang VARCHAR(50),
custom VARCHAR(50),
2018-11-12 16:19:19 +01:00
bootoption VARCHAR(2) NOT NULL,
autostart INTEGER,
2018-11-12 16:19:19 +01:00
drive1 VARCHAR(50),
format1 VARCHAR(50),
2018-11-12 16:19:19 +01:00
drive2 VARCHAR(50),
format2 VARCHAR(50),
2018-11-12 16:19:19 +01:00
drive3 VARCHAR(50),
format3 VARCHAR(50),
2018-11-12 16:19:19 +01:00
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
2018-08-12 13:49:10 +02:00
);"
sqlite3 $SQLITEFILE "CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
2018-11-12 16:19:19 +01:00
username VARCHAR(50) NOT NULL,
password VARCHAR(255),
2018-08-12 13:49:10 +02:00
admin INTEGER
2018-08-11 20:10:39 +02:00
);"
2018-08-20 16:55:32 +02:00
sqlite3 $SQLITEFILE "CREATE TABLE servers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
hostname VARCHAR(50) NOT NULL,
connectstring VARCHAR(50),
vmdirectory VARCHAR(255),
isodirectory VARCHAR(255)
);"
2018-08-12 14:24:37 +02:00
chown -R nobody $SQLITEFILE
2018-08-11 20:10:39 +02:00
fi
checkdb && echo "DB creation successful!" || (echo "Failed to create the DB"; exit 1)
}
#create signing key
function createkey {
2018-10-10 10:54:38 +02:00
openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout "/etc/nlvmi/nlvmi_priv.key" -out "/etc/nlvmi/nlvmi_sign.crt" -days 9999 -subj "/CN=nlvmi_signing"
}
2018-10-10 20:23:40 +02:00
#check if VM is running
function checkvm {
if [ -z $1 ]; then echo "checkvm needs one argument!"; exit 1; fi
sqlite3 $SQLITEFILE "SELECT connectstring from vms LEFT JOIN servers ON vms.server = servers.hostname WHERE vmname='$1'" | while read line; do
CONN=$line
if [ ! -z $CONN ]; then
su nlvmi -c "ssh $CONN \"RPID=\\\$(<\\\"$RUNDIRECTORY/$1.pid\\\"); ps -ef | grep -v grep | grep \\\$RPID | grep qemu\"" &>/dev/null && echo "VM is running" || echo "VM is not running"
else
ps -ef | grep `cat $RUNDIRECTORY/$1.pid` | grep -v grep >/dev/null && echo "VM is running" || echo "VM is not running"
fi
done
}
2018-08-11 20:10:39 +02:00
#autostart VMs
function vmautostart {
2018-10-10 20:23:40 +02:00
if [ -z $MASTERSERVER ]; then
for startfile in /home/nlvmi/start*.tmp; do
vmname=`echo $startfile | cut -d "." -f1 | rev | cut -d "/" -f 1 | rev | sed 's/start//g'`
checkvm ${vmname} | grep "is not running" >/dev/null && sh $startfile;
done
else
for startsign in /home/nlvmli/start*.tmp.sha512; do
startfile=`echo $startsign | cut -d "." -f 1-2`
vmname=`echo $startfile | cut -d "." -f1 | rev | cut -d "/" -f1 | rev | sed 's/start//g'`
checkvm ${vmname} | grep "is not running" >/dev/null && if [ -e $startfile ]; then
openssl dgst -sha512 -verify <(openssl x509 -in "/etc/nlvmi/nlvmi_sign.crt" -pubkey -noout) -signature $startsign $startfile >/dev/null && /bin/bash $2 || echo "signature failed!!"
fi
2018-08-11 20:10:39 +02:00
done
fi
}
#start single VM
2018-08-11 20:10:39 +02:00
function vmstart {
if [ -z $1 ]; then echo "function start needs an id!"; exit 1; fi
if [ $LOGLEVEL -gt "2" ]; then echo "startvm function entered for vmid $1"; fi
2018-08-20 16:55:32 +02:00
sqlite3 $SQLITEFILE "SELECT * FROM vms LEFT JOIN servers on vms.server = servers.hostname WHERE vms.id=$1" | while read line; do
2018-08-11 20:10:39 +02:00
IFS='|' read -r -a array <<< "$line"
2018-08-20 16:55:32 +02:00
#prepare tmpfile
TMPF=/home/nlvmi/start${array[32]}-${array[1]}.tmp
rm /home/nlvmi/start*-${array[1]}.tmp &>/dev/null
2018-10-23 18:08:14 +02:00
touch $TMPF && chmod 660 $TMPF && chown nlvmi: $TMPF
2018-08-20 16:55:32 +02:00
#add user if necessary
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
2018-11-12 16:19:19 +01:00
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
2018-11-12 16:19:19 +01:00
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 "which tunctl && tunctl -t ${array[20]} -u ${array[2]} >/dev/null || ip tuntap add ${array[20]} mode tap user ${array[2]}; ifconfig ${array[20]} up" >>$TMPF; fi
2018-11-12 16:19:19 +01:00
if [ ! -z ${array[21]} ]; then MACADDR1="-net nic,macaddr=${array[21]},model=virtio,netdev=net0"; fi
2018-11-13 18:23:44 +01:00
if [ ! -z ${array[22]} ]; then BRDEV1="${array[22]}"; TAPDS1=`echo ${array[20]} | cut -c 1-15`; echo "if [ -L /sys/devices/virtual/net/${TAPDS1}/master ]; then OLDBR=\`readlink -f /sys/devices/virtual/net/${TAPDS1}/master | rev | cut -d "/" -f1 | rev\`; brctl delif \$OLDBR ${array[20]}; fi; /sbin/brctl addif ${array[22]} ${array[20]} >/dev/null" >>$TMPF; fi
if [ ! -z ${array[23]} ]; then TAPDEV2="-netdev tap,ifname=${array[23]},script=no,id=net1"; echo "which tunctl && tunctl -t ${array[23]} -u ${array[2]} >/dev/null || ip tuntap add ${array[23]} mode tap user ${array[2]}; ifconfig ${array[23]} up" >>$TMPF; fi
2018-11-12 16:19:19 +01:00
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 "if [ -L /sys/devices/virtual/net/${array[23]}/master ]; then OLDBR=\`readlink -f /sys/devices/virtual/net/${array[23]}/master | rev | cut -d "/" -f1 | rev\`; brctl delif \$OLDBR ${array[23]}; fi; /sbin/brctl addif ${array[25]} ${array[23]} >/dev/null" >>$TMPF; fi
if [ ! -z ${array[26]} ]; then TAPDEV3="-netdev tap,ifname=${array[26]},script=no,id=net2"; echo "which tunctl && tunctl -t ${array[26]} -u ${array[2]} >/dev/null || ip tuntap add ${array[26]} mode tap user ${array[2]}; ifconfig ${array[26]} up" >>$TMPF; fi
2018-11-12 16:19:19 +01:00
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 "if [ -L /sys/devices/virtual/net/${array[26]}/master ]; then OLDBR=\`readlink -f /sys/devices/virtual/net/${array[26]}/master | rev | cut -d "/" -f1 | rev\`; brctl delif \$OLDBR ${array[26]}; fi; /sbin/brctl addif ${array[28]} ${array[26]} >/dev/null" >>$TMPF; fi
if [ ! -z ${array[30]} ]; then WPORT=$((${array[30]} + 5700)); WEBSOCK=",websocket=$WPORT"; else WEBSOCK=""; fi
2018-09-24 11:56:57 +02:00
if [ ! -z ${array[31]} ]; then VNCPASS=",password"; fi
2018-11-12 16:19:19 +01:00
if [ ! -z ${array[29]} ]; then VNCPORT="-vnc :${array[29]}$WEBSOCK$VNCPASS"; fi
2018-12-01 17:52:19 +01:00
# echo "which ${array[4]} && QEMUCOMMAND=/usr/bin/${array[4]} || QEMUCOMMAND=/usr/libexec/qemu-kvm" >>$TMPF
COMMAND=(su - ${array[2]} -s /bin/bash -c \"which ${array[4]} \&\& QEMUCOMMAND=/usr/bin/${array[4]} \|\| QEMUCOMMAND=/usr/libexec/qemu-kvm\; \\\$QEMUCOMMAND -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\")
2018-08-12 18:21:58 +02:00
if [ $LOGLEVEL -gt "1" ]; then echo ${COMMAND[@]}; fi
2018-08-20 16:55:32 +02:00
echo "${COMMAND[@]}" >>$TMPF
2018-08-11 20:46:46 +02:00
#Set VNC Password
2018-08-20 16:55:32 +02:00
echo "echo \"change vnc password ${array[31]}\" | socat - unix-connect:$RUNDIRECTORY/${array[1]}.mon >/dev/null" >>$TMPF
if [ ! -z "${array[35]}" ]; then
echo "chmod g+w $RUNDIRECTORY/${array[1]}.mon" >>$TMPF
echo "chmod g+r $RUNDIRECTORY/${array[1]}.pid" >>$TMPF
2018-10-23 18:08:14 +02:00
openssl dgst -sha512 -sign "/etc/nlvmi/nlvmi_priv.key" -out /home/nlvmi/start${array[32]}-${array[1]}.tmp.sha512 $TMPF
TMPFR="/home/nlvmi/rstart${array[32]}-${array[1]}.tmp"
mv $TMPF $TMPFR
2018-10-23 18:08:14 +02:00
su nlvmi -c "ssh ${array[35]} \"rm /home/nlvmi/start*-${array[1]}.tmp*\""
mv $TMPFR $TMPF
su nlvmi -c "scp $TMPF* ${array[35]}:/home/nlvmi/"
OUT=`su nlvmi -c "ssh ${array[35]} \"/usr/bin/nlvmi remote $TMPF run\"" 2>&1`
echo $OUT
2018-10-10 20:23:40 +02:00
if [ ${array[12]} == "0" ]; then
su nlvmi -c "ssh ${array[35]} \"rm $TMPF $TMPF.sha512\""
echo $OUT
2018-10-10 20:23:40 +02:00
fi
rm $TMPF $TMPF.sha512
else
OUT=`/bin/bash $TMPF 2>&1`
echo $OUT
2018-10-10 20:23:40 +02:00
if [ ${array[12]} == "0" ]; then
rm $TMPF
fi
2018-08-20 16:55:32 +02:00
fi
2018-10-26 18:21:18 +02:00
if [ ! -z $WPORT ] && [ ! -z $NGINXCONFIGPATH ]; then
2018-10-24 18:07:29 +02:00
echo "location /${array[1]}/ {" >$NGINXCONFIGPATH/${array[1]}.conf
echo " proxy_pass http://${array[3]}:$WPORT/;" >>$NGINXCONFIGPATH/${array[1]}.conf
echo " proxy_http_version 1.1;" >>$NGINXCONFIGPATH/${array[1]}.conf
2018-10-24 18:07:29 +02:00
echo " proxy_set_header Upgrade \$http_upgrade;" >>$NGINXCONFIGPATH/${array[1]}.conf
echo " proxy_set_header Connection \"Upgrade\";" >>$NGINXCONFIGPATH/${array[1]}.conf
echo " proxy_read_timeout 61s;" >>$NGINXCONFIGPATH/${array[1]}.conf
echo " proxy_buffering off;" >>$NGINXCONFIGPATH/${array[1]}.conf
echo "}" >>$NGINXCONFIGPATH/${array[1]}.conf
2018-10-26 18:21:18 +02:00
if [ ! -z $NGINXRESTARTCOMMAND ]; then $NGINXRESTARTCOMMAND; fi
fi
2018-08-11 20:10:39 +02:00
done
export VMFOUND="yes"
}
#stop VM
function vmstop {
if [ $LOGLEVEL -gt "2" ]; then echo "stopvm function entered for VM $1"; fi
2018-11-12 16:19:19 +01:00
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
2018-08-21 16:34:49 +02:00
if [ ! -e $RUNDIRECTORY/$1.pid ]; then echo "pidfile $RUNDIRECTORY/$1.pid does not exist"; exit 1; fi
2018-11-12 16:19:19 +01:00
echo "system_powerdown" | socat - unix-connect:$RUNDIRECTORY/${array[1]}.mon >/dev/null
2018-08-21 16:34:49 +02:00
else
2018-11-12 16:19:19 +01:00
su nlvmi -c "ssh ${array[2]} \"echo \\\"system_powerdown\\\" | socat - unix-connect:$RUNDIRECTORY/${array[1]}.mon >/dev/null\""
fi
sleep 5s
2018-11-12 16:19:19 +01:00
STOPPED="no"
COUNTER=0
2018-11-12 16:19:19 +01:00
while [ $STOPPED = "no" ]; do
2018-10-10 20:23:40 +02:00
if [ $COUNTER == 10 ]; then
2018-08-21 16:34:49 +02:00
if [ -z ${array[2]} ]; then
kill `cat $RUNDIRECTORY/${array[1]}.pid`
echo "${array[1]} forcefully killed!";
STOPPED="yes"
else
TMPF=/home/nlvmi/${array[1]}.tmp
echo "kill \$(<\"$RUNDIRECTORY/${array[1]}.pid\")" >$TMPF
2018-10-10 10:54:38 +02:00
openssl dgst -sha512 -sign "/etc/nlvmi/nlvmi_priv.key" -out $TMPF.sha512 $TMPF
su nlvmi -c "scp $TMPF* ${array[2]}:/home/nlvmi/"
2018-08-21 16:34:49 +02:00
su nlvmi -c "ssh ${array[2]} \"/usr/bin/nlvmi remote /home/nlvmi/${array[1]}.tmp stop\""
su nlvmi -c "ssh ${array[2]} \"rm $TMPF $TMPF.sha512\""
rm $TMPF $TMPF.sha512
2018-08-21 16:34:49 +02:00
echo "remotekill"
STOPPED="yes"
fi
fi
((COUNTER++))
2018-08-21 16:34:49 +02:00
checkvm ${array[1]} | grep "is not running" >/dev/null && STOPPED="yes"
sleep 1s
2018-11-12 16:19:19 +01:00
done
done
}
2018-10-10 20:23:40 +02:00
#stop local vm
function vmlocalstop {
if [ ! -e $RUNDIRECTORY/$1.pid ]; then echo "pidfile $RUNDIRECTORY/$1.pid does not exist"; exit 1; fi
2018-11-12 16:19:19 +01:00
echo "system_powerdown" | socat - unix-connect:$RUNDIRECTORY/$1.mon >/dev/null
2018-10-10 20:23:40 +02:00
sleep 5s
2018-11-12 16:19:19 +01:00
STOPPED="no"
2018-10-10 20:23:40 +02:00
COUNTER=0
2018-11-12 16:19:19 +01:00
while [ $STOPPED = "no" ]; do
2018-10-10 20:23:40 +02:00
if [ $COUNTER == 10 ]; then
kill `cat $RUNDIRECTORY/$1.pid`
echo "$1 forcefully killed!";
STOPPED="yes"
fi
((COUNTER++))
ps -ef | grep `cat $RUNDIRECTORY/$1.pid` | grep -v grep >/dev/null || STOPPED="yes"
sleep 1s
done
}
2018-10-10 20:23:40 +02:00
#stopall local vms
function stopall {
for vms in $RUNDIRECTORY/*.pid; do
vmname=`echo ${vms} | rev | cut -d "/" -f1 | rev | sed 's/.pid//g'`
vmlocalstop ${vmname}
2018-08-21 15:18:33 +02:00
done
}
2018-12-01 17:52:19 +01:00
function listdirs {
if [ $2 == "isodirectory" ] || [ $2 == "vmdirectory" ]; then
COLNAMES=$2
MODE="vm"
else
COLNAMES="isodirectory,vmdirectory"
MODE="img"
fi
sqlite3 $SQLITEFILE "SELECT $COLNAMES,connectstring FROM servers WHERE hostname='$1'" | while read line; do
IFS='|' read -r -a array <<< "$line"
if [ $MODE == "vm" ]; then
IFS=';' read -r -a dirs <<< "${array[0]}"
for di in ${dirs[@]}; do
if [ -z ${array[1]} ]; then
ls -lrt -d -1 $di/{*,.*}
else
su nlvmi -c "ssh ${array[1]} \"ls -lrt -d -1 $di/{*,.*}\""
fi
done
elif [ $MODE == "img" ]; then
IFS=';' read -r -a dirs <<< "${array[0]};${array[1]}"
for di in ${dirs[@]}; do
if [ $di == $2 ]; then
if [ -z ${array[2]} ]; then
ls -lrt -d -1 $di/{*,.*}
else
su nlvmi -c "ssh ${array[2]} \"ls -lrt -d -1 $di/{*,.*}\""
fi
fi
done
fi
done
}
function delimg {
DDIR=`echo $2 | rev | cut -d "/" -f 2- | rev`
sqlite3 $SQLITEFILE "SELECT vmdirectory,isodirectory,connectstring FROM servers WHERE hostname='$1'" | while read line; do
IFS="|" read -r -a array <<< "$line"
IFS=";" read -r -a dirs <<< "${array[0]};${array[1]}"
for dir in ${dirs[@]}; do
if [ $dir == $DDIR ]; then
if [ -z ${array[2]} ]; then
if [ -e $2 ]; then rm $2 && echo "delete completed"; fi
else
su nlvmi -c "ssh ${array[2]} \"if [ -e $2 ]; then rm $2 && echo delete completed; fi\""
fi
fi
done
done
}
function createimg {
re='^[0-9]+$'
if ! [[ $2 =~ $re ]] ; then
echo "size argument is not numeric" >&2; exit 1
fi
IFS=';' read -r -a T <<< "$1"
TDIR=`echo ${T[1]} | rev | cut -d "/" -f 2- | rev`
TFOUND="no"
declare -a A=`sqlite3 $SQLITEFILE "SELECT vmdirectory,connectstring FROM servers WHERE hostname='${T[0]}'" | while read line; do
IFS="|" read -r -a array <<< "$line"
IFS=";" read -r -a dirs <<< "${array[0]}"
for di in ${dirs[@]}; do
if [ $di == $TDIR ]; then
TFOUND="yes"
TCONN=${array[1]}
fi
done
echo "($TFOUND $TCONN)"
done`
if [ ${A[0]} == "yes" ]; then
if [ -z ${A[1]} ]; then
qemu-img create -f qcow2 ${T[1]} ${2}G && echo "creatimg completed"
else
su nlvmi -c "ssh ${A[1]} \"qemu-img create -f qcow2 ${T[1]} ${2}G\"" && echo "createimg completed"
fi
fi
}
function copyimg {
IFS=';' read -r -a S <<< "$1"
IFS=';' read -r -a T <<< "$2"
SDIR=`echo ${S[1]} | rev | cut -d "/" -f 2- | rev`
TDIR=`echo ${T[1]} | rev | cut -d "/" -f 2- | rev`
SFOUND="no"
TFOUND="no"
for m in S T; do
A="$m"DIR
declare -a B=`sqlite3 $SQLITEFILE "SELECT vmdirectory,isodirectory,connectstring FROM servers WHERE hostname='${!m[0]}'" | while read line; do
IFS='|' read -r -a array <<< "$line"
IFS=';' read -r -a dirs <<< "${array[0]};${array[1]}"
for di in ${dirs[@]}; do
if [ $di == ${!A} ]; then
if [ $m == "S" ]; then
if [ -z ${array[2]} ]; then
if [ -e ${S[1]} ]; then FOUND="yes"; CONN="empty"; fi
else
su nlvmi -c "ssh ${array[2]} \"if [ ! -e ${S[1]} ]; then exit 1; fi\"" && FOUND="yes"; CONN=${array[2]}
fi
elif [ $m == "T" ]; then FOUND="yes"; CONN=${array[2]}; if [ -z $CONN ]; then CONN="empty"; fi; fi
fi
done
echo "($FOUND $CONN)"
done`
export ${m}FOUND=${B[0]}
export ${m}CONN=${B[1]}
2018-08-20 16:55:32 +02:00
done
2018-12-01 17:52:19 +01:00
if [ $SFOUND == "yes" ] && [ $TFOUND == "yes" ]; then
if [ $SCONN == "empty" ] && [ $TCONN == "empty" ]; then
if [ -z $FID ]; then
FID="nldebugger"
fi
rsync --progress ${S[1]} ${T[1]} >/tmp/$FID && echo done >/tmp/$FID || echo fail >/tmp/$FID
elif [ $SCONN == "empty" ]; then
su nlvmi -c "rsync --progress ${S[1]} $TCONN:${T[1]} >/tmp/$FID && echo done >/tmp/$FID || echo fail >/tmp/$FID"
elif [ $SCONN == $TCONN ]; then
su nlvmi -c "ssh $TCONN \"rsync --progress ${S[1]} ${T[1]}\"" >/tmp/$FID && echo done >/tmp/$FID || echo fail >/tmp/$FID
elif [ $TCONN == "empty" ]; then
su nlvmi -c "rsync --progress $SCONN:${S[1]} ${T[1]} >/tmp/$FID && echo done >/tmp/$FID || echo fail >/tmp/$FID"
else
su nlvmi -c "echo "noprogressavailable" >/tmp/$FID && scp -3 $SCONN:${S[1]} $TCONN:${T[1]}" && echo done >/tmp/$FID || echo fail >/tmp/$FID
fi
fi
2018-08-20 16:55:32 +02:00
}
2018-08-11 20:10:39 +02:00
#mainloop
if [ $# -gt 0 ]; then
2018-11-12 16:19:19 +01:00
if [ $1 == "createdb" ]; then
createdb
2018-11-12 16:19:19 +01:00
elif [ $1 == "autostart" ]; then
2018-08-11 20:10:39 +02:00
vmautostart
elif [ $1 == "checkvm" ]; then
if [ -z $2 ]; then echo "checkvm needs two arguments"; fi
checkvm $2
2018-10-24 14:49:05 +02:00
elif [ $1 == "delautostart" ]; then
if [ $2 == "local" ]; then
rm /home/nlvmi/start*-$3.tmp
rm /home/nlvmi/start*-$3.tmp.sha512
else
su nlvmi -c "ssh $2 \"rm /home/nlvmi/start*-$3.tmp; rm /home/nlvmi/start*-$3.tmp.sha512\""
fi
elif [ $1 == "delnginx" ]; then
if [ $2 == "local" ]; then
rm $NGINXCONFIGPATH/$3.conf
if [ -n $NGINXRESTARTCOMMAND ]; then $NGINXRESTARTCOMMAND; fi
fi
2018-08-11 20:10:39 +02:00
elif [ $1 == "start" ]; then
if [ -z $2 ]; then echo "start needs a vmname!"; exit 1; fi
VMFOUND="no"
if [ $LOGLEVEL -gt "2" ]; then echo "searching for vmname $2"; fi
2018-08-11 20:10:39 +02:00
sqlite3 $SQLITEFILE "SELECT id FROM vms WHERE vmname='$2'" | (while read line; do
IFS='|' read -r -a arrays <<< "$line"
declare VMFOUND="yes"
export "$VMFOUND"
vmstart $arrays
done
if [[ $VMFOUND == "no" ]]; then echo "no VM with that name found!"; exit 1; fi)
2018-08-12 18:21:58 +02:00
elif [ $1 == "stop" ]; then
if [ -z $2 ]; then echo "stop needs a vmname!"; exit 1; fi
VMFOUND="no"
if [ $LOGLEVEL -gt "2" ]; then echo "searching for vmname $2"; fi
2018-08-12 18:21:58 +02:00
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)
elif [ $1 == "stopall" ]; then
stopall
2018-12-01 17:52:19 +01:00
elif [ $1 == "listdirs" ]; then
if [ -z $2 ] || [ -z $3 ]; then echo listdirs needs two arguments; exit 1; fi
listdirs $2 $3
elif [ $1 == "createimg" ]; then
if [ -z $2 ] || [ -z $3 ]; then echo createimg needs two arguments; exit 1; fi
createimg $2 $3
elif [ $1 == "copyimg" ]; then
if [ -z $2 ] || [ -z $3 ]; then echo copyimg needs two arguments; exit 1; fi
copyimg $2 $3
elif [ $1 == "delimg" ]; then
if [ -z $2 ] || [ -z $3 ]; then echo delimg needs two arguments; exit 1; fi
delimg $2 $3
2018-08-21 16:34:49 +02:00
elif [ $1 == "remote" ]; then
if [ ! -z $MASTERSERVER ]; then
if `echo $SSH_CLIENT | grep "$MASTERSERVER " &>/dev/null`; then
if [ -e $2 ]; then
2018-11-13 18:23:44 +01:00
source /etc/profile
2018-10-10 10:54:38 +02:00
openssl dgst -sha512 -verify <(openssl x509 -in "/etc/nlvmi/nlvmi_sign.crt" -pubkey -noout) -signature $2.sha512 $2 >/dev/null && /bin/bash $2 || echo "signature failed!!"
2018-08-21 16:34:49 +02:00
fi
else
echo "not allowed";
fi
fi
elif [ $1 == "createkey" ]; then
if [ ! -z $MASTERSERVER ]; then
createkey
fi
2018-08-12 20:21:33 +02:00
fi
2018-08-11 20:10:39 +02:00
else
checkdb
fi