summaryrefslogtreecommitdiff
path: root/others
diff options
context:
space:
mode:
authorxie hao cheng <hc@email.ch>2024-10-14 10:01:41 +0800
committerxie hao cheng <hc@email.ch>2024-10-14 10:01:41 +0800
commit1904d488d548c7798ca7fdee0987fed4df3fe2f7 (patch)
treeb4052fad58c1ade445ecd25f3090d4a360e61b3e /others
parentae62f3084426033fa0ca0246790fc328dbdab06f (diff)
updated port forward nokeys
Diffstat (limited to 'others')
-rw-r--r--others/.vm.sh.swpbin0 -> 16384 bytes
-rwxr-xr-x[-rw-r--r--]others/init.sh0
-rwxr-xr-x[-rw-r--r--]others/vm.sh0
-rwxr-xr-xothers/vm.sh2288
4 files changed, 288 insertions, 0 deletions
diff --git a/others/.vm.sh.swp b/others/.vm.sh.swp
new file mode 100644
index 0000000..962a1ee
--- /dev/null
+++ b/others/.vm.sh.swp
Binary files differ
diff --git a/others/init.sh b/others/init.sh
index b502f82..b502f82 100644..100755
--- a/others/init.sh
+++ b/others/init.sh
diff --git a/others/vm.sh b/others/vm.sh
index ceafde4..ceafde4 100644..100755
--- a/others/vm.sh
+++ b/others/vm.sh
diff --git a/others/vm.sh2 b/others/vm.sh2
new file mode 100755
index 0000000..3374d13
--- /dev/null
+++ b/others/vm.sh2
@@ -0,0 +1,288 @@
+#!/bin/bash
+
+help(){
+ echo -e "\n$0
+ info
+ create\n -vcpu\n -ram \n -disk \n -ssh-keys-dir \n -add-disk-block\n -public-ssh-port
+ manage\n -start\n -shutdown\n -reboot\n -kill\n -erase
+ disk\n -attach\n -detach\n -resize\n"
+ exit 1
+}
+
+case "$1" in
+ "create")
+ if [[ $# -lt 2 ]]; then
+ echo ""
+ echo -e "$0 $1 [VM_NAME]"
+ echo -e "default: -vcpu 8 -ram 8 -disk 60 --ssh-keys-dir keys/"
+ echo -e "args[GB]:\n -vcpu\n -ram \n -disk \n -ssh-keys-dir \n -add-disk-block\n -public-ssh-port)"
+ echo ""
+ exit 1
+ fi
+
+ VM_NAME=$2
+ VCPU=8
+ RAM_GB=8000 #memory is noted as mb in the virt-install program
+ DISK_GB=64
+ SSH_KEYS_DIR="k/"
+ DISK_BLOCK_GB=0
+ PSP=${PSP:-0}
+
+ while [[ $# -gt 0 ]]; do
+ case "$1" in
+ create)
+ shift 2
+ ;;
+ -vcpu)
+ VCPU=$2
+ shift 2
+ ;;
+ -ram)
+ RAM_GB=$(($2*1000))
+ shift 2
+ ;;
+ -disk)
+ DISK_GB=$2
+ shift 2
+ ;;
+ -ssh-keys-dir)
+ SSH_KEYS_DIR=$2
+ shift 2
+ ;;
+ -add-disk-block)
+ DISK_BLOCK_GB=$2
+ shift 2
+ ;;
+ -public-ssh-port)
+ PSP=$2
+ shift 2
+ ;;
+ *)
+ echo "Unknown argument: $1"
+ exit 1
+ ;;
+ esac
+ done
+ download_url="https://download.nus.edu.sg/mirror/fedora/linux/releases/40/Cloud/x86_64/images/Fedora-Cloud-Base-Generic.x86_64-40-1.14.qcow2"
+ dir_path="/var/lib/libvirt/images/"
+ src_file="/var/lib/libvirt/images/fedora40.qcow2"
+ seed_iso="/var/lib/libvirt/images/seed.iso"
+ packages=("nc" "htop" "wireguard-tools" "bind-utils" "tmux" "net-tools" "curl" "mlocate" "dnsmasq" "qemu-kvm" "libvirt" "libvirt-daemon-kvm" "virt-install" "virt-manager" "genisoimage")
+ NEW_IMG_PATH="/var/lib/libvirt/images/${VM_NAME}.qcow2"
+ XML_PATH="/tmp/${VM_NAME}.xml"
+ DISK_BLOCK_GB_BASE_PATH="/var/lib/libvirt/images/${VM_NAME}-vm-disks/"
+ DISK_BLOCK_GB_PATH="${DISK_BLOCK_GB_BASE_PATH}${VM_NAME}-vda-${DISK_BLOCK_GB}G.qcow2"
+ ssh_private=$(cat /home/x/m)
+
+ function check_package_installed() {
+ local package_name=$1
+ rpm -q "$package_name" &> /dev/null
+ }
+
+ for package in "${packages[@]}"; do
+ if ! check_package_installed "$package"; then
+ sudo dnf install -y "$package" &> /dev/null
+ fi
+ done
+
+ [ ! -d $dir_path ] && sudo mkdir -p $dir_path &> /dev/null
+ [ ! -f "$src_file" ] && (sudo wget -O "$src_file" "$download_url" &> /dev/null || { echo "Failed to download Fedora image"; exit 1; })
+
+ echo -e "#cloud-config\nusers:\n - name: fedora\n ssh-authorized-keys:" > user-data
+
+ for key in "$SSH_KEYS_DIR"*.pub; do
+ echo " - $(cat "$key")" >> user-data
+ done
+
+ echo " sudo: ['ALL=(ALL) NOPASSWD:ALL']
+ groups: wheel
+ shell: /bin/bash" >> user-data
+
+ if [ "$PSP" -ne 0 ]; then
+ echo "write_files:" >> user-data
+ echo " - path: /home/fedora/m" >> user-data
+ echo " content: |" >> user-data
+ while read -r line; do
+ echo " $line" >> user-data
+ done <<< "${ssh_private}"
+ fi
+
+ echo 'runcmd:' >> user-data
+ if [ "$DISK_BLOCK_GB" -ne 0 ]; then
+ echo ' - echo "#!/bin/bash" > /home/fedora/disk-setup.sh' >> user-data
+ echo " - echo \"DISK='/dev/vda'; MOUNT_PATH='/home/${VM_NAME}-vda-${DISK_BLOCK_GB}G';\" >> /home/fedora/disk-setup.sh" >> user-data
+ echo " - echo '[ ! -d \$MOUNT_PATH ] && sudo mkdir -p \$MOUNT_PATH;' >> /home/fedora/disk-setup.sh" >> user-data
+ echo " - echo 'sudo blkid | grep -q \$DISK || sudo mkfs.ext4 \$DISK;' >> /home/fedora/disk-setup.sh" >> user-data
+ echo " - echo 'grep -q \$DISK /etc/fstab || echo \"\$DISK \$MOUNT_PATH ext4 defaults,nofail 0 0\" | sudo tee -a /etc/fstab;' >> /home/fedora/disk-setup.sh" >> user-data
+ echo ' - echo "sudo mount -a;" >> /home/fedora/disk-setup.sh' >> user-data
+ echo ' - echo "sudo systemctl daemon-reload" >> /home/fedora/disk-setup.sh' >> user-data
+ echo ' - sudo chmod +x /home/fedora/disk-setup.sh' >> user-data
+ echo ' - sudo /home/fedora/disk-setup.sh' >> user-data
+ echo ' - sudo rm -f /home/fedora/disk-setup.sh' >> user-data
+ fi
+
+ if [ "$PSP" -ne 0 ]; then
+ echo ' - sudo chmod 600 /home/fedora/man1' >> user-data
+ echo " - (echo \"* * * * * /home/fedora/initial.sh\") | crontab -" >> user-data
+ echo " - echo 'PIDS=\$(pgrep -f \"ssh.*fedora@64.176.179.97\"); if [ -z \"\${PIDS}\" ]; then /usr/bin/ssh -fN -i /home/fedora/man1 -R ${PSP}:localhost:22 -o StrictHostKeyChecking=no fedora@64.176.179.97; fi' > /home/fedora/initial.sh" >> user-data
+ echo " - chmod +x /home/fedora/initial.sh" >> user-data
+ echo " - /home/fedora/initial.sh" >> user-data
+ fi
+
+ echo ' - sudo growpart /dev/sda 1' >> user-data
+ echo ' - sudo xfs_growfs /' >> user-data
+ echo ' - sudo dnf update -y' >> user-data
+ echo ' - sudo dnf install -y netcat xclip tmux htop tar tree wget curl mlocate nano vim net-tools git python3 python3-pip make' >> user-data
+ echo ' - touch /home/fedora/runcmd_done' >> user-data
+
+ echo -e "instance-id: iid-fedora-vm\nlocal-hostname: fedora-cloudimg" > meta-data
+
+ genisoimage -output "$seed_iso" -volid cidata -joliet -rock user-data meta-data &> /dev/null || { echo "Failed to create seed.iso."; exit 1; }
+
+ sudo cp $src_file $NEW_IMG_PATH &> /dev/null || { echo "Failed to create a new image."; exit 1; }
+
+ if sudo virsh list --all | grep -q "$VM_NAME"; then
+ echo -e "\n$VM_NAME already exist. Delete it using \n$0 manage -erase $VM_NAME\nExiting..."
+ exit 1
+ fi
+
+ sudo virt-install --name $VM_NAME \
+ --vcpus $VCPU \
+ --ram $RAM_GB \
+ --disk path=$NEW_IMG_PATH,size=$DISK_GB,format=qcow2 \
+ --disk path=$seed_iso,device=cdrom \
+ --os-type linux \
+ --os-variant fedora38 \
+ --virt-type kvm \
+ --graphics none \
+ --network bridge=virbr0,model=virtio \
+ --print-xml > $XML_PATH || { echo "Failed to print XML."; exit 1; }
+
+ sudo virsh define $XML_PATH &> /dev/null || { echo "Failed to define the new VM."; exit 1; }
+
+ sudo qemu-img resize $NEW_IMG_PATH +$DISK_GB"G" #&> /dev/null
+
+ sudo virsh start $VM_NAME
+ echo ""
+
+ if [ $DISK_BLOCK_GB -ne 0 ]; then
+ sudo mkdir -p $DISK_BLOCK_GB_BASE_PATH
+ sudo qemu-img create -f qcow2 $DISK_BLOCK_GB_PATH "${DISK_BLOCK_GB}G"
+ sudo virsh attach-disk $VM_NAME $DISK_BLOCK_GB_PATH vda --cache none --subdriver qcow2
+ fi
+
+ message="waiting 29s to begin finding ip address..."
+ duration=29
+ for ((i=$duration; i>=1; i--)); do
+ printf "\r%s%2ds" "$message" $i
+ sleep 1
+ done
+ echo
+
+ while true; do
+ OUTPUT=$($0 info | grep "$VM_NAME")
+ if [[ "$OUTPUT" != "" ]]; then
+ IP_ADDRESS=$(echo "$OUTPUT" | grep -oP '\d+\.\d+\.\d+\.\d+')
+ if [[ ! -z "$IP_ADDRESS" ]]; then
+ echo -e "\nIP address of $VM_NAME is:\n$IP_ADDRESS"
+ break
+ else
+ echo "IP address for $VM_NAME not found. Retrying in 1 second..."
+ sleep 1
+ fi
+ else
+ echo "$VM_NAME not found. Exiting..."
+ exit 1
+ fi
+ done
+
+ ;;
+ "manage")
+ if [[ $# -lt 2 ]]; then
+ echo ""
+ echo -e "$0 $1 arg [VM_1] [VM_2] [VM_3] \n$0 $1 arg --all"
+ echo -e "args:\n -start\n -shutdown\n -kill\n -erase "
+ echo ""
+ exit 1
+ fi
+
+ arg=$2
+ shift 2
+
+ if [[ "$1" == "--all" ]]; then
+ vms=$(sudo virsh list --all --name)
+ set -- $vms
+ fi
+
+ case $arg in
+ "-shutdown")
+ for vm in "$@"; do
+ sudo virsh shutdown "$vm" > /dev/null 2>&1
+ printf "%-50s%10s\n" "Shutting down $vm..." $([[ $? -eq 0 ]] && echo "Successful" || echo "Failed")
+ done
+ ;;
+ "-kill")
+ for vm in "$@"; do
+ sudo virsh destroy "$vm" > /dev/null 2>&1
+ printf "%-50s%10s\n" "Destroying $vm..." $([[ $? -eq 0 ]] && echo "Successful" || echo "Failed")
+ done
+ ;;
+ "-erase")
+ echo -e "\nWARNING: THIS IS IRREVERSIBLE. Sleeping for 10 seconds. Ctrl-C to stop. WARNING.\n"
+ sleep 10
+ echo -e "\nErasing image(s) from /var/lib/libvirt/images/\n"
+ for vm in "$@"; do
+ sudo virsh destroy "$vm" > /dev/null 2>&1
+ sudo virsh undefine "$vm" --remove-all-storage > /dev/null 2>&1
+ printf "%-50s%10s\n" "Removing $vm..." $([[ $? -eq 0 ]] && echo "Successful" || echo "Failed")
+ done
+ ;;
+ "-start")
+ for vm in "$@"; do
+ sudo virsh start "$vm" > /dev/null 2>&1
+ printf "%-50s%10s\n" "Starting $vm..." $([[ $? -eq 0 ]] && echo "Successful" || echo "Failed")
+ done
+ ;;
+ "-reboot")
+ for vm in "$@"; do
+ sudo virsh shutdown "$vm" > /dev/null 2>&1
+ sudo virsh start "$vm" > /dev/null 2>&1
+ printf "%-50s%10s\n" "Rebooting $vm..." $([[ $? -eq 0 ]] && echo "Successful" || echo "Failed")
+ done
+ ;;
+ *)
+ echo "Unknown argument: $arg"
+ exit 1
+ ;;
+ esac
+ ;;
+ "info")
+ printf "%-4s %-10s %-15s %-10s %-10s %-6s %-8s %-12s\n" "Id" "Name" "IP" "State" "Network" "vCPUs" "RAM(GB)" "Disk(GB)"
+ printf "%-4s %-10s %-15s %-10s %-10s %-6s %-8s %-12s\n" "----" "----------" "---------------" "----------" "----------" "-----" "-------" "-----------"
+
+ vms=$(sudo virsh list --name --all)
+
+ id=1
+ for vm in $vms; do
+ mac=$(sudo virsh dumpxml $vm | grep "mac address" | awk -F\' '{ print $2}')
+ net=$(sudo virsh dumpxml $vm | grep "<source network" | awk -F\' '{print $2}')
+ if [ -z "$net" ]
+ then
+ net="default"
+ fi
+ ip=$(sudo virsh net-dhcp-leases $net | grep $mac | awk '{print $5}' | cut -f1 -d'/')
+ state=$(sudo virsh domstate $vm)
+ vcpus=$(sudo virsh dominfo $vm | grep "CPU(s)" | awk '{print $2}')
+ ram=$(bc <<< "scale=2; $(sudo virsh dominfo $vm | grep "Max memory" | awk '{print $3}')/1000000")
+ disk=$(sudo du -sk /var/lib/libvirt/images/${vm}.qcow2 | awk '{ printf "%.2f", $1/1024/1024 }')
+
+ printf "%-4s %-10s %-15s %-10s %-10s %-6s %-8s %-12s\n" "$id" "$vm" "$ip" "$state" "$net" "$vcpus" "$ram" "$disk"
+ id=$((id+1))
+ done
+ exit 0
+ ;;
+ *)
+ help
+ exit 1
+ ;;
+esac