From 1904d488d548c7798ca7fdee0987fed4df3fe2f7 Mon Sep 17 00:00:00 2001 From: xie hao cheng Date: Mon, 14 Oct 2024 10:01:41 +0800 Subject: updated port forward nokeys --- others/vm.sh2 | 288 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 288 insertions(+) create mode 100755 others/vm.sh2 (limited to 'others/vm.sh2') 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 "