#!/usr/bin/bash # Push VM-Disk-Image on server set -eu show_help() { cat << EOF >&2 Usage: $(basename "$0") [-u vmname] [-d vmname] [-a] [-t]" When using option -u (upload), the disk from VM vmname will be synced on server. Otherwise the images from images.list and xml-directory will be synced from server. Using flag -t all torrents and xml-VM-Definitions will be synced EOF } VM_DIR="/tmp/${SUDO_UID}/vmimages" upload_image() { # check if VM-Diskimage exists if [[ ! (-f "/var/lib/libvirt/images/${VM_NAME}.qcow2" || -f "${VM_DIR}/${VM_NAME}.qcow2") ]]; then echo "File not found ${VM_NAME}.qcow2" >&2 exit 1 fi # link private VM-Diskimage to system-Dir if [[ -f "${VM_DIR}/${VM_NAME}.qcow2" \ && ( -f "/var/lib/libvirt/images/${VM_NAME}.qcow2" && ("${VM_DIR}/${VM_NAME}.qcow2" -nt "/var/lib/libvirt/images/${VM_NAME}.qcow2") \ || ! -f "/var/lib/libvirt/images/${VM_NAME}.qcow2") ]]; then echo "copy private VM-Diskimage to system-dir" ln -f "${VM_DIR}/${VM_NAME}.qcow2" "/var/lib/libvirt/images/${VM_NAME}.qcow2" fi # check if VM-Machine-Definition XML exists if [[ ! (-f "/var/lib/libvirt/images/xml/${VM_NAME}.xml" || -f "${VM_DIR}/xml/${VM_NAME}.xml") ]]; then echo "File not found ${VM_NAME}.xml" >&2 exit 1 fi # copy private VM-Maschine-Definition XML to system-Dir if [[ -f "${VM_DIR}/xml/${VM_NAME}.xml" \ && ( -f "/var/lib/libvirt/images/xml/${VM_NAME}.xml" && $(cmp -s "${VM_DIR}/xml/${VM_NAME}.xml" "/var/lib/libvirt/images/xml/${VM_NAME}.xml") \ || ! -f "/var/lib/libvirt/images/xml/${VM_NAME}.xml") ]]; then echo "copy private VM-Maschine-Definition XML to system-dir" cp "${VM_DIR}/xml/${VM_NAME}.xml" "/var/lib/libvirt/images/xml/" fi # (re-) create torrent file /usr/local/bin/vmimage-torrent create "${VM_NAME}.qcow2" # Upload Torrent, qcow2 and machine-definition-XML [[ -f "/var/lib/libvirt/images/${VM_NAME}.qcow2.torrent" ]] && rsync -av --password-file=/etc/rsync.secret \ "/var/lib/libvirt/images/${VM_NAME}.qcow2.torrent" rsync://vmuser@server:/vmimages-upload/ rsync -av --password-file=/etc/rsync.secret "/var/lib/libvirt/images/${VM_NAME}.qcow2" \ rsync://vmuser@server:/vmimages-upload/ rsync -av --password-file=/etc/rsync.secret "/var/lib/libvirt/images/xml/${VM_NAME}.xml" \ rsync://vmuser@server:/vmimages-upload/xml/ } download_image() { if [[ -f "/var/lib/libvirt/images/${VM_NAME}.qcow2.torrent" ]]; then cd /var/lib/libvirt/images ctorrent -e 0 "${VM_NAME}.qcow2.torrent" /usr/local/bin/vmimage-torrent restart "${VM_NAME}.qcow2" else rsync -av --password-file=/etc/rsync.secret \ "rsync://vmuser@server:/vmimages-download/${VM_NAME}.qcow2" \ /var/lib/libvirt/images/ rsync -av --password-file=/etc/rsync.secret \ "rsync://vmuser@server:/vmimages-download/xml/${VM_NAME}.xml" \ /var/lib/libvirt/images/xml/ fi } sync_all_images() { rsync -av --password-file=/etc/rsync.secret --files-from=/var/lib/libvirt/images/images.list \ rsync://vmuser@server:/vmimages-download/ /var/lib/libvirt/images/ rsync -av --password-file=/etc/rsync.secret rsync://vmuser@server:/vmimages-download/xml \ /var/lib/libvirt/images/ } sync_all_torrents() { rsync -av --password-file=/etc/rsync.secret rsync://vmuser@server:/vmimages-download/*.torrent \ /var/lib/libvirt/images/ rsync -av --password-file=/etc/rsync.secret rsync://vmuser@server:/vmimages-download/xml \ /var/lib/libvirt/images/ } while getopts ':u:d:at' OPTION; do case "$OPTION" in u) VM_NAME=$OPTARG upload_image ;; d) VM_NAME=$OPTARG download_image ;; a) sync_all_images ;; t) sync_all_torrents ;; ?) show_help exit 1 ;; esac done