From 58f75cd799cefa86a378a78599710de0099cb86a Mon Sep 17 00:00:00 2001 From: hc Date: Wed, 2 Oct 2024 11:15:50 +0800 Subject: added ssh agrent forwarding --- .git.sh.swp | Bin 0 -> 12288 bytes .setup.sh.swp | Bin 12288 -> 0 bytes git/set-global_git-ssh-wrapper.sh | 33 ++++ git/set-global_user.sh | 2 + git/tools/git-ssh-wrapper.sh | 2 + openstack_config.txt | 14 -- others/openstack_config.txt | 14 ++ others/reset-ssh-connections.sh | 4 + others/setup_2_openstackenv.sh | 15 ++ others/vm.sh | 316 ++++++++++++++++++++++++++++++++++++++ reset-ssh-connections.sh | 4 - setup.sh | 4 + setup_2_openstackenv.sh | 15 -- vm.sh | 316 -------------------------------------- 14 files changed, 390 insertions(+), 349 deletions(-) create mode 100644 .git.sh.swp delete mode 100644 .setup.sh.swp create mode 100755 git/set-global_git-ssh-wrapper.sh create mode 100755 git/set-global_user.sh create mode 100755 git/tools/git-ssh-wrapper.sh delete mode 100644 openstack_config.txt create mode 100644 others/openstack_config.txt create mode 100755 others/reset-ssh-connections.sh create mode 100644 others/setup_2_openstackenv.sh create mode 100644 others/vm.sh delete mode 100755 reset-ssh-connections.sh delete mode 100644 setup_2_openstackenv.sh delete mode 100644 vm.sh diff --git a/.git.sh.swp b/.git.sh.swp new file mode 100644 index 0000000..612ed8e Binary files /dev/null and b/.git.sh.swp differ diff --git a/.setup.sh.swp b/.setup.sh.swp deleted file mode 100644 index 6e4693c..0000000 Binary files a/.setup.sh.swp and /dev/null differ diff --git a/git/set-global_git-ssh-wrapper.sh b/git/set-global_git-ssh-wrapper.sh new file mode 100755 index 0000000..e851f1b --- /dev/null +++ b/git/set-global_git-ssh-wrapper.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +if ! sudo grep -q "^AllowAgentForwarding yes" /etc/ssh/sshd_config; then + echo "AllowAgentForwarding not set. Adding it to sshd_config..." + echo "AllowAgentForwarding yes" | sudo tee -a /etc/ssh/sshd_config > /dev/null + echo "Added AllowAgentForwarding yes to /etc/ssh/sshd_config" +else + echo "AllowAgentForwarding is already set to yes in /etc/ssh/sshd_config" +fi +# this should be enabled on both client and server + +# Get the directory of this script +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" + +# Path to the git-ssh-wrapper.sh +WRAPPER_PATH="$SCRIPT_DIR/tools/git-ssh-wrapper.sh" + +# Check if the wrapper script exists +if [ ! -f "$WRAPPER_PATH" ]; then + echo "Error: git-ssh-wrapper.sh not found at $WRAPPER_PATH" + exit 1 +fi + +# Make sure the wrapper script is executable +chmod +x "$WRAPPER_PATH" + +# Set the global Git SSH command +git config --global core.sshCommand "$WRAPPER_PATH" + +echo "Git SSH command has been set to use $WRAPPER_PATH" +echo "You can verify this by running: git config --global --get core.sshCommand" + +#ssh-agent bash -c 'ssh-add ~/key && ssh -A -p24 user@code.server' diff --git a/git/set-global_user.sh b/git/set-global_user.sh new file mode 100755 index 0000000..30e11eb --- /dev/null +++ b/git/set-global_user.sh @@ -0,0 +1,2 @@ +git config --global user.email "hc@email.ch" +git config --global user.name "hc" diff --git a/git/tools/git-ssh-wrapper.sh b/git/tools/git-ssh-wrapper.sh new file mode 100755 index 0000000..dc23334 --- /dev/null +++ b/git/tools/git-ssh-wrapper.sh @@ -0,0 +1,2 @@ +#!/bin/bash +ssh -v -A -o ForwardAgent=yes "$@" diff --git a/openstack_config.txt b/openstack_config.txt deleted file mode 100644 index 5e991a6..0000000 --- a/openstack_config.txt +++ /dev/null @@ -1,14 +0,0 @@ -export OS_AUTH_URL=https://api.pub1.infomaniak.cloud/identity/v3 -export OS_PROJECT_NAME=PCP-UV9N94K -export OS_PROJECT_DOMAIN_NAME=default -export OS_USERNAME=PCU-UV9N94K -export OS_USER_DOMAIN_NAME=default -export OS_PROJECT_ID=4b23183ad37e4271900622f738cf3a17 -export OS_IDENTITY_API_VERSION=3 -export OS_INTERFACE=public -export OS_REGION_NAME=dc3-a -# To avoid being prompted for your password each time, -# write your password below and uncomment the line -#OS_PASSWORD='your password goes here' -[ -z "$OS_PASSWORD" ] && read -e -p "Please enter your OpenStack Password for project $OS_PROJECT_NAME as user $OS_USERNAME: " OS_PASSWORD -export OS_PASSWORD diff --git a/others/openstack_config.txt b/others/openstack_config.txt new file mode 100644 index 0000000..5e991a6 --- /dev/null +++ b/others/openstack_config.txt @@ -0,0 +1,14 @@ +export OS_AUTH_URL=https://api.pub1.infomaniak.cloud/identity/v3 +export OS_PROJECT_NAME=PCP-UV9N94K +export OS_PROJECT_DOMAIN_NAME=default +export OS_USERNAME=PCU-UV9N94K +export OS_USER_DOMAIN_NAME=default +export OS_PROJECT_ID=4b23183ad37e4271900622f738cf3a17 +export OS_IDENTITY_API_VERSION=3 +export OS_INTERFACE=public +export OS_REGION_NAME=dc3-a +# To avoid being prompted for your password each time, +# write your password below and uncomment the line +#OS_PASSWORD='your password goes here' +[ -z "$OS_PASSWORD" ] && read -e -p "Please enter your OpenStack Password for project $OS_PROJECT_NAME as user $OS_USERNAME: " OS_PASSWORD +export OS_PASSWORD diff --git a/others/reset-ssh-connections.sh b/others/reset-ssh-connections.sh new file mode 100755 index 0000000..f19300d --- /dev/null +++ b/others/reset-ssh-connections.sh @@ -0,0 +1,4 @@ +#!/bin/bash +ss -tnp | grep ':22' +ps -ef | grep sshd | grep -v grep | awk '{if($3!=1) print $2}' | xargs kill +#sudo systemctl restart sshd diff --git a/others/setup_2_openstackenv.sh b/others/setup_2_openstackenv.sh new file mode 100644 index 0000000..e56b66f --- /dev/null +++ b/others/setup_2_openstackenv.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +# directories +mkdir ~/work +mkdir ~/work/mounts +mkdir ~/work/mounts/private +mkdir ~/work/mounts/public +mkdir ~/work/mounts/.localtmp + +touch ~/work/mounts/.passwd-s3fs +chmod 600 ~/work/mounts/.passwd-s3fs +echo "id:pass" > ~/work/mounts/.passwd-s3fs +sudo s3fs s3ch1 ~/work/mounts/private -o passwd_file=~/work/mounts/.passwd-s3fs -o url=https://s3.pub1.infomaniak.cloud -o allow_other -o use_cache=~/work/mounts/.localtmp/ -o umask=000 -o use_path_request_style +sudo s3fs s3ch1-public ~/work/mounts/public -o passwd_file=~/work/mounts/.passwd-s3fs -o url=https://s3.pub1.infomaniak.cloud -o allow_other -o use_cache=~/work/mounts/.localtmp/ -o umask=000 -o use_path_request_style + diff --git a/others/vm.sh b/others/vm.sh new file mode 100644 index 0000000..ceafde4 --- /dev/null +++ b/others/vm.sh @@ -0,0 +1,316 @@ +#!/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="keys/" + 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.rockylinux.org/pub/rocky/9.3/images/x86_64/Rocky-9-GenericCloud-LVM-9.3-20231113.0.x86_64.qcow2" + dir_path="/var/lib/libvirt/images/" + src_file="/var/lib/libvirt/images/Rocky9.3.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-client" "bridge-utils" "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/s22/man1) + + 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 + #echo "Downloading packages..." + sudo dnf install -y "$package" &> /dev/null + fi + done + + [ ! -d $dir_path ] && mkdir -p $dir_path &> /dev/null + [ ! -f "$src_file" ] && (wget -O "$src_file" "$download_url" &> /dev/null || { echo "Failed to download Rocky"; exit 1; }) + + echo -e "#cloud-config\nusers:\n - name: root\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: sudo + shell: /bin/bash" >> user-data + + if [ "$PSP" -ne 0 ]; then + echo "write_files:" >> user-data + echo " - path: /root/man1" >> user-data + echo " content: |" >> user-data + while read -r line; do + echo " $line" >> user-data + done <<< "${ssh_private}" + fi + + echo 'runcmd:' >> user-data + #echo ' - [ /usr/bin/wget, "http://example.com/file", -O, /tmp/examplefile ]' >> user-data + #echo ' - touch /root/test1.txt' >> user-data + if [ "$DISK_BLOCK_GB" -ne 0 ]; then + echo "echo to disksetup in vm" + echo "vm name 1 ${VM_NAME}" + echo ' - echo "#!/bin/bash" > /root/disk-setup.sh' >> user-data + # echo ' - echo "sleep 40;" >> /root/disk-setup.sh' >> user-data + echo " - echo \"DISK='/dev/vda'; MOUNT_PATH='/home/${VM_NAME}-vda-${DISK_BLOCK_GB}G';\" >> /root/disk-setup.sh" >> user-data + echo " - echo '[ ! -d \$MOUNT_PATH ] && mkdir -p \$MOUNT_PATH;' >> /root/disk-setup.sh" >> user-data + echo " - echo 'blkid | grep -q \$DISK || mkfs.ext4 \$DISK;' >> /root/disk-setup.sh" >> user-data + echo " - echo 'grep -q \$DISK /etc/fstab || echo \"\$DISK \$MOUNT_PATH ext4 defaults,nofail 0 0\" >> /etc/fstab;' >> /root/disk-setup.sh" >> user-data + echo ' - echo "mount -a;" >> /root/disk-setup.sh' >> user-data + echo ' - echo "systemctl daemon-reload" >> /root/disk-setup.sh' >> user-data + echo ' - chmod +x /root/disk-setup.sh' >> user-data + echo ' - /root/disk-setup.sh' >> user-data + echo ' - rm -f /root/disk-setup.sh' >> user-data + fi + + if [ "$PSP" -ne 0 ]; then + echo ' - chmod 600 /root/man1' >> user-data + #kill ssh and reconnect every 4 hours + ##echo " - (echo \"0 */4 * * * PIDS=\\\$(pgrep -f \\\"ssh.*root@64.176.179.97\\\"); if [ -n \\\"\\\${PIDS}\\\" ]; then kill \\\${PIDS}; fi; /usr/bin/ssh -fN -i /root/man1 -R ${PSP}:localhost:22 -o StrictHostKeyChecking=no root@64.176.179.97\") | crontab -" >> user-data + echo " - (echo \"* * * * * /root/initial.sh\") | crontab -" >> user-data + echo " - echo 'PIDS=\$(pgrep -f \"ssh.*root@64.176.179.97\"); if [ -z \"\${PIDS}\" ]; then /usr/bin/ssh -fN -i /root/man1 -R ${PSP}:localhost:22 -o StrictHostKeyChecking=no root@64.176.179.97; fi' > /root/initial.sh" >> user-data + echo " - chmod +x /root/initial.sh" >> user-data + echo " - /root/initial.sh" >> user-data + fi + + #nofail is present in the fstab which means that boot will continue even if it fails to mount + echo ' - growpart /dev/sda 4 ' >> user-data #do note that restart is required for the system to register the increased disk size + echo ' - sudo lvresize -l +100%FREE /dev/rocky/lvroot' >> user-data + echo ' - sudo dnf install -y epel-release dnf-utils' >> user-data + echo ' - sudo dnf install -y nc xclip tmux htop tar tree wget curl mlocate nano vim unzip net-tools git python3 python3-pip make'>> user-data + echo ' - touch /root/runcmd_done' >> user-data + + echo -e "instance-id: iid-ihatecs\nlocal-hostname: 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; } + + cp $src_file $NEW_IMG_PATH &> /dev/null || { echo "Failed to create a new image."; exit 1; } + + if 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 rhl9 \ + --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 + + virsh start $VM_NAME + echo "" + + if [ $DISK_BLOCK_GB -ne 0 ]; then + mkdir -p $DISK_BLOCK_GB_BASE_PATH + qemu-img create -f qcow2 $DISK_BLOCK_GB_PATH "${DISK_BLOCK_GB}G" + 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 IP address is found and is not empty + 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 + + #do take note that df -h will not reflect until reboot + + ;; + "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=$(virsh list --all --name) # List all running VMs by name + set -- $vms # Set the positional parameters to the VM names + fi + + case $arg in + "-shutdown") + for vm in "$@"; do + 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 + 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 + virsh destroy "$vm" > /dev/null 2>&1 + 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 + 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 + virsh shutdown "$vm" > /dev/null 2>&1 + 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=$(virsh list --name --all) + + id=1 + for vm in $vms; do + # Get the MAC address of the VM + mac=$(virsh dumpxml $vm | grep "mac address" | awk -F\' '{ print $2}') + + # Get the network name + net=$(virsh dumpxml $vm | grep " ~/work/mounts/.passwd-s3fs -sudo s3fs s3ch1 ~/work/mounts/private -o passwd_file=~/work/mounts/.passwd-s3fs -o url=https://s3.pub1.infomaniak.cloud -o allow_other -o use_cache=~/work/mounts/.localtmp/ -o umask=000 -o use_path_request_style -sudo s3fs s3ch1-public ~/work/mounts/public -o passwd_file=~/work/mounts/.passwd-s3fs -o url=https://s3.pub1.infomaniak.cloud -o allow_other -o use_cache=~/work/mounts/.localtmp/ -o umask=000 -o use_path_request_style - diff --git a/vm.sh b/vm.sh deleted file mode 100644 index ceafde4..0000000 --- a/vm.sh +++ /dev/null @@ -1,316 +0,0 @@ -#!/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="keys/" - 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.rockylinux.org/pub/rocky/9.3/images/x86_64/Rocky-9-GenericCloud-LVM-9.3-20231113.0.x86_64.qcow2" - dir_path="/var/lib/libvirt/images/" - src_file="/var/lib/libvirt/images/Rocky9.3.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-client" "bridge-utils" "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/s22/man1) - - 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 - #echo "Downloading packages..." - sudo dnf install -y "$package" &> /dev/null - fi - done - - [ ! -d $dir_path ] && mkdir -p $dir_path &> /dev/null - [ ! -f "$src_file" ] && (wget -O "$src_file" "$download_url" &> /dev/null || { echo "Failed to download Rocky"; exit 1; }) - - echo -e "#cloud-config\nusers:\n - name: root\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: sudo - shell: /bin/bash" >> user-data - - if [ "$PSP" -ne 0 ]; then - echo "write_files:" >> user-data - echo " - path: /root/man1" >> user-data - echo " content: |" >> user-data - while read -r line; do - echo " $line" >> user-data - done <<< "${ssh_private}" - fi - - echo 'runcmd:' >> user-data - #echo ' - [ /usr/bin/wget, "http://example.com/file", -O, /tmp/examplefile ]' >> user-data - #echo ' - touch /root/test1.txt' >> user-data - if [ "$DISK_BLOCK_GB" -ne 0 ]; then - echo "echo to disksetup in vm" - echo "vm name 1 ${VM_NAME}" - echo ' - echo "#!/bin/bash" > /root/disk-setup.sh' >> user-data - # echo ' - echo "sleep 40;" >> /root/disk-setup.sh' >> user-data - echo " - echo \"DISK='/dev/vda'; MOUNT_PATH='/home/${VM_NAME}-vda-${DISK_BLOCK_GB}G';\" >> /root/disk-setup.sh" >> user-data - echo " - echo '[ ! -d \$MOUNT_PATH ] && mkdir -p \$MOUNT_PATH;' >> /root/disk-setup.sh" >> user-data - echo " - echo 'blkid | grep -q \$DISK || mkfs.ext4 \$DISK;' >> /root/disk-setup.sh" >> user-data - echo " - echo 'grep -q \$DISK /etc/fstab || echo \"\$DISK \$MOUNT_PATH ext4 defaults,nofail 0 0\" >> /etc/fstab;' >> /root/disk-setup.sh" >> user-data - echo ' - echo "mount -a;" >> /root/disk-setup.sh' >> user-data - echo ' - echo "systemctl daemon-reload" >> /root/disk-setup.sh' >> user-data - echo ' - chmod +x /root/disk-setup.sh' >> user-data - echo ' - /root/disk-setup.sh' >> user-data - echo ' - rm -f /root/disk-setup.sh' >> user-data - fi - - if [ "$PSP" -ne 0 ]; then - echo ' - chmod 600 /root/man1' >> user-data - #kill ssh and reconnect every 4 hours - ##echo " - (echo \"0 */4 * * * PIDS=\\\$(pgrep -f \\\"ssh.*root@64.176.179.97\\\"); if [ -n \\\"\\\${PIDS}\\\" ]; then kill \\\${PIDS}; fi; /usr/bin/ssh -fN -i /root/man1 -R ${PSP}:localhost:22 -o StrictHostKeyChecking=no root@64.176.179.97\") | crontab -" >> user-data - echo " - (echo \"* * * * * /root/initial.sh\") | crontab -" >> user-data - echo " - echo 'PIDS=\$(pgrep -f \"ssh.*root@64.176.179.97\"); if [ -z \"\${PIDS}\" ]; then /usr/bin/ssh -fN -i /root/man1 -R ${PSP}:localhost:22 -o StrictHostKeyChecking=no root@64.176.179.97; fi' > /root/initial.sh" >> user-data - echo " - chmod +x /root/initial.sh" >> user-data - echo " - /root/initial.sh" >> user-data - fi - - #nofail is present in the fstab which means that boot will continue even if it fails to mount - echo ' - growpart /dev/sda 4 ' >> user-data #do note that restart is required for the system to register the increased disk size - echo ' - sudo lvresize -l +100%FREE /dev/rocky/lvroot' >> user-data - echo ' - sudo dnf install -y epel-release dnf-utils' >> user-data - echo ' - sudo dnf install -y nc xclip tmux htop tar tree wget curl mlocate nano vim unzip net-tools git python3 python3-pip make'>> user-data - echo ' - touch /root/runcmd_done' >> user-data - - echo -e "instance-id: iid-ihatecs\nlocal-hostname: 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; } - - cp $src_file $NEW_IMG_PATH &> /dev/null || { echo "Failed to create a new image."; exit 1; } - - if 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 rhl9 \ - --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 - - virsh start $VM_NAME - echo "" - - if [ $DISK_BLOCK_GB -ne 0 ]; then - mkdir -p $DISK_BLOCK_GB_BASE_PATH - qemu-img create -f qcow2 $DISK_BLOCK_GB_PATH "${DISK_BLOCK_GB}G" - 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 IP address is found and is not empty - 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 - - #do take note that df -h will not reflect until reboot - - ;; - "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=$(virsh list --all --name) # List all running VMs by name - set -- $vms # Set the positional parameters to the VM names - fi - - case $arg in - "-shutdown") - for vm in "$@"; do - 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 - 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 - virsh destroy "$vm" > /dev/null 2>&1 - 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 - 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 - virsh shutdown "$vm" > /dev/null 2>&1 - 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=$(virsh list --name --all) - - id=1 - for vm in $vms; do - # Get the MAC address of the VM - mac=$(virsh dumpxml $vm | grep "mac address" | awk -F\' '{ print $2}') - - # Get the network name - net=$(virsh dumpxml $vm | grep "