Add editvm.sh TEMPLATE CMD command
This commit is contained in:
parent
6d81507a99
commit
787a678a79
6 changed files with 139 additions and 2 deletions
120
bin/editvm.sh
Executable file
120
bin/editvm.sh
Executable file
|
|
@ -0,0 +1,120 @@
|
|||
#! /usr/bin/env bash
|
||||
|
||||
help() {
|
||||
echo "editvm.sh DISTRO [CMD] [ARGS]"
|
||||
echo " Stops the ramdisk and start editing a VM template"
|
||||
echo " --copy PATHSRC PATHDEST: copy PATHSRC into the container as PATHDEST"
|
||||
}
|
||||
|
||||
KEEP=0
|
||||
|
||||
SYSDIR="/ramdisk/sys"
|
||||
TMPDIR="/ramdisk/tmp"
|
||||
|
||||
if [ $# -lt 2 ]; then
|
||||
help
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Files to copy into container
|
||||
COPY=()
|
||||
COPYDEST=()
|
||||
|
||||
while true; do
|
||||
case "$1" in
|
||||
"-h"|"--help")
|
||||
help
|
||||
exit 0
|
||||
;;
|
||||
"--copy")
|
||||
shift
|
||||
PATHSRC="$1"
|
||||
if [ ! -e "$PATHSRC" ]; then
|
||||
echo "COPY ERROR: File/Folder "$PATHSRC" does not exist."
|
||||
exit 1
|
||||
fi
|
||||
shift
|
||||
PATHDEST="$1"
|
||||
COPY+=("$PATHSRC")
|
||||
COPYDEST+=("$PATHDEST")
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
# Optional args processing finished
|
||||
# If no first argument is passed, syntax error
|
||||
if [[ "$1" = "" ]]; then
|
||||
help
|
||||
exit 1
|
||||
fi
|
||||
TYPE="$1"
|
||||
shift
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if systemctl is-active ramdisk; then
|
||||
echo "ERROR: Please stop ramdisk.service first"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
TEMPLATE=/var/lib/lxc/"$TYPE".template
|
||||
|
||||
if [ ! -f "$TEMPLATE" ]; then
|
||||
echo "ERROR: No such VM type "$TYPE""
|
||||
exit 1
|
||||
fi
|
||||
|
||||
export VMNAME="$TYPE-TEMPLATE"
|
||||
echo "$VMNAME"
|
||||
|
||||
export LXCROOTFS=/ramdisk/persist/$TYPE
|
||||
# Check if the rootfs exists... maybe the template actually calls another rootfs
|
||||
if [ ! -d "$LXCROOTFS" ]; then
|
||||
echo "ERROR: The container template "$TYPE" does not have its own rootfs. Maybe it's using another rootfs?"
|
||||
echo "Check the lxc.rootfs.path line in "$TEMPLATE" file to be sure."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
LXCDIR=/var/lib/lxc/"$VMNAME"
|
||||
mkdir "$LXCDIR"
|
||||
envsubst < "$TEMPLATE" > "$LXCDIR"/config
|
||||
|
||||
ROOTFS="$LXCROOTFS"
|
||||
echo "template" > "$ROOTFS"/etc/hostname
|
||||
|
||||
# Copy files into the VM
|
||||
for fileIndex in ${!COPY[@]}; do
|
||||
PATHSRC="${COPY[$fileIndex]}"
|
||||
PATHDEST="$ROOTFS""${COPYDEST[$fileIndex]}"
|
||||
# Create parent dirs
|
||||
PARENTPATHDEST="$(dirname "$PATHDEST")"
|
||||
mkdir -p "$PARENTPATHDEST"
|
||||
cp --dereference -r "$PATHSRC" "$PATHDEST"
|
||||
done
|
||||
|
||||
CMD="$1"
|
||||
shift
|
||||
|
||||
if [[ "$CMD" != "" ]]; then
|
||||
#lxc-execute -n "$VMNAME" -- "$CMD" "$@"
|
||||
lxc-start -n "$VMNAME"
|
||||
lxc-attach -n "$VMNAME" -- "$CMD" "$@"
|
||||
if [ $KEEP -eq 0 ]; then
|
||||
lxc-stop --kill "$VMNAME"
|
||||
# Don't destroy VM because we want to keep the rootfs
|
||||
# (we are just editing it live)
|
||||
# lxc-destroy -n "$VMNAME"
|
||||
rm -R /var/lib/lxc/"$VMNAME"
|
||||
fi
|
||||
else
|
||||
lxc-start -n "$VMNAME"
|
||||
lxc-attach -n "$VMNAME" bash
|
||||
if [ $KEEP -eq 0 ]; then
|
||||
lxc-stop --kill "$VMNAME"
|
||||
# Don't destroy VM because we want to keep the rootfs
|
||||
# (we are just editing it live)
|
||||
#lxc-destroy -n "$VMNAME"
|
||||
rm -R /var/lib/lxc/"$VMNAME"
|
||||
fi
|
||||
fi
|
||||
Loading…
Reference in a new issue