summaryrefslogtreecommitdiff
path: root/others/vm.sh2
diff options
context:
space:
mode:
Diffstat (limited to 'others/vm.sh2')
-rwxr-xr-xothers/vm.sh2291
1 files changed, 0 insertions, 291 deletions
diff --git a/others/vm.sh2 b/others/vm.sh2
deleted file mode 100755
index fe3eec0..0000000
--- a/others/vm.sh2
+++ /dev/null
@@ -1,291 +0,0 @@
1#!/bin/bash
2
3help(){
4 echo -e "\n$0
5 info
6 create\n -vcpu\n -ram \n -disk \n -ssh-keys-dir \n -add-disk-block\n -public-ssh-port
7 manage\n -start\n -shutdown\n -reboot\n -kill\n -erase
8 disk\n -attach\n -detach\n -resize\n"
9 exit 1
10}
11
12case "$1" in
13 "create")
14 if [[ $# -lt 2 ]]; then
15 echo ""
16 echo -e "$0 $1 [VM_NAME]"
17 echo -e "default: -vcpu 8 -ram 8 -disk 60 --ssh-keys-dir keys/"
18 echo -e "args[GB]:\n -vcpu\n -ram \n -disk \n -ssh-keys-dir \n -add-disk-block\n -public-ssh-port)"
19 echo ""
20 exit 1
21 fi
22
23 VM_NAME=$2
24 VCPU=8
25 RAM_GB=8000 #memory is noted as mb in the virt-install program
26 DISK_GB=64
27 SSH_KEYS_DIR="k/"
28 DISK_BLOCK_GB=0
29 PSP=${PSP:-0}
30
31 while [[ $# -gt 0 ]]; do
32 case "$1" in
33 create)
34 shift 2
35 ;;
36 -vcpu)
37 VCPU=$2
38 shift 2
39 ;;
40 -ram)
41 RAM_GB=$(($2*1000))
42 shift 2
43 ;;
44 -disk)
45 DISK_GB=$2
46 shift 2
47 ;;
48 -ssh-keys-dir)
49 SSH_KEYS_DIR=$2
50 shift 2
51 ;;
52 -add-disk-block)
53 DISK_BLOCK_GB=$2
54 shift 2
55 ;;
56 -public-ssh-port)
57 PSP=$2
58 shift 2
59 ;;
60 *)
61 echo "Unknown argument: $1"
62 exit 1
63 ;;
64 esac
65 done
66 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"
67 dir_path="/var/lib/libvirt/images/"
68 src_file="/var/lib/libvirt/images/fedora40.qcow2"
69 seed_iso="/var/lib/libvirt/images/seed.iso"
70 packages=("nc" "htop" "wireguard-tools" "bind-utils" "tmux" "net-tools" "curl" "mlocate" "dnsmasq" "qemu-kvm" "libvirt" "libvirt-daemon-kvm" "virt-install" "virt-manager" "genisoimage")
71 NEW_IMG_PATH="/var/lib/libvirt/images/${VM_NAME}.qcow2"
72 XML_PATH="/tmp/${VM_NAME}.xml"
73 DISK_BLOCK_GB_BASE_PATH="/var/lib/libvirt/images/${VM_NAME}-vm-disks/"
74 DISK_BLOCK_GB_PATH="${DISK_BLOCK_GB_BASE_PATH}${VM_NAME}-vda-${DISK_BLOCK_GB}G.qcow2"
75 ssh_private=$(cat /home/x/m)
76
77 function check_package_installed() {
78 local package_name=$1
79 rpm -q "$package_name" &> /dev/null
80 }
81
82 for package in "${packages[@]}"; do
83 if ! check_package_installed "$package"; then
84 sudo dnf install -y "$package" &> /dev/null
85 fi
86 done
87
88 [ ! -d $dir_path ] && sudo mkdir -p $dir_path &> /dev/null
89 [ ! -f "$src_file" ] && (sudo wget -O "$src_file" "$download_url" &> /dev/null || { echo "Failed to download Fedora image"; exit 1; })
90
91 echo -e "#cloud-config\nusers:\n - name: fedora\n ssh-authorized-keys:" > user-data
92
93 for key in "$SSH_KEYS_DIR"*.pub; do
94 echo " - $(cat "$key")" >> user-data
95 done
96
97 echo " sudo: ['ALL=(ALL) NOPASSWD:ALL']
98 groups: wheel
99 shell: /bin/bash" >> user-data
100
101 if [ "$PSP" -ne 0 ]; then
102 echo "write_files:" >> user-data
103 echo " - path: /home/fedora/m" >> user-data
104 echo " content: |" >> user-data
105 while read -r line; do
106 echo " $line" >> user-data
107 done <<< "${ssh_private}"
108 fi
109
110 echo 'runcmd:' >> user-data
111 if [ "$DISK_BLOCK_GB" -ne 0 ]; then
112 echo ' - echo "#!/bin/bash" > /home/fedora/disk-setup.sh' >> user-data
113 echo " - echo \"DISK='/dev/vda'; MOUNT_PATH='/home/${VM_NAME}-vda-${DISK_BLOCK_GB}G';\" >> /home/fedora/disk-setup.sh" >> user-data
114 echo " - echo '[ ! -d \$MOUNT_PATH ] && sudo mkdir -p \$MOUNT_PATH;' >> /home/fedora/disk-setup.sh" >> user-data
115 echo " - echo 'sudo blkid | grep -q \$DISK || sudo mkfs.ext4 \$DISK;' >> /home/fedora/disk-setup.sh" >> user-data
116 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
117 echo ' - echo "sudo mount -a;" >> /home/fedora/disk-setup.sh' >> user-data
118 echo ' - echo "sudo systemctl daemon-reload" >> /home/fedora/disk-setup.sh' >> user-data
119 echo ' - sudo chmod +x /home/fedora/disk-setup.sh' >> user-data
120 echo ' - sudo /home/fedora/disk-setup.sh' >> user-data
121 echo ' - sudo rm -f /home/fedora/disk-setup.sh' >> user-data
122 fi
123
124 if [ "$PSP" -ne 0 ]; then
125 echo ' - sudo chmod 600 /home/fedora/man1' >> user-data
126 echo " - (echo \"* * * * * /home/fedora/initial.sh\") | crontab -" >> user-data
127 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
128 echo " - chmod +x /home/fedora/initial.sh" >> user-data
129 echo " - /home/fedora/initial.sh" >> user-data
130 fi
131
132 echo ' - sudo growpart /dev/sda 1' >> user-data
133 echo ' - sudo xfs_growfs /' >> user-data
134 echo ' - sudo dnf install -y vim git' >> user-data
135 echo ' - cd /home/fedora' >> user-data
136 echo ' - git clone https://git.0nom.ch/setup' >> user-data
137 echo ' - sudo ./setup/setup.sh' >> user-data
138 echo ' - touch /home/fedora/runcmd_done' >> user-data
139
140 echo -e "instance-id: iid-fedora-vm\nlocal-hostname: fedora-cloudimg" > meta-data
141
142 genisoimage -output "$seed_iso" -volid cidata -joliet -rock user-data meta-data &> /dev/null || { echo "Failed to create seed.iso."; exit 1; }
143
144 sudo cp $src_file $NEW_IMG_PATH &> /dev/null || { echo "Failed to create a new image."; exit 1; }
145
146 if sudo virsh list --all | awk "\$2==\"$VM_NAME\"" | grep -q .; then
147 # if sudo virsh list --all | grep -q "$VM_NAME"; then
148 echo -e "\n$VM_NAME already exist. Delete it using \n$0 manage -erase $VM_NAME\nExiting..."
149 exit 1
150 fi
151
152 sudo virt-install --name $VM_NAME \
153 --vcpus $VCPU \
154 --ram $RAM_GB \
155 --disk path=$NEW_IMG_PATH,size=$DISK_GB,format=qcow2 \
156 --disk path=$seed_iso,device=cdrom \
157 --os-type linux \
158 --os-variant fedora38 \
159 --virt-type kvm \
160 --graphics none \
161 --network bridge=virbr0,model=virtio \
162 --print-xml > $XML_PATH || { echo "Failed to print XML."; exit 1; }
163
164 sudo virsh define $XML_PATH &> /dev/null || { echo "Failed to define the new VM."; exit 1; }
165
166 sudo qemu-img resize $NEW_IMG_PATH +$DISK_GB"G" #&> /dev/null
167
168 sudo virsh start $VM_NAME
169 echo ""
170
171 if [ $DISK_BLOCK_GB -ne 0 ]; then
172 sudo mkdir -p $DISK_BLOCK_GB_BASE_PATH
173 sudo qemu-img create -f qcow2 $DISK_BLOCK_GB_PATH "${DISK_BLOCK_GB}G"
174 sudo virsh attach-disk $VM_NAME $DISK_BLOCK_GB_PATH vda --cache none --subdriver qcow2
175 fi
176
177 message="waiting 29s to begin finding ip address..."
178 duration=29
179 for ((i=$duration; i>=1; i--)); do
180 printf "\r%s%2ds" "$message" $i
181 sleep 1
182 done
183 echo
184
185 while true; do
186 OUTPUT=$($0 info | grep "$VM_NAME")
187 if [[ "$OUTPUT" != "" ]]; then
188 IP_ADDRESS=$(echo "$OUTPUT" | grep -oP '\d+\.\d+\.\d+\.\d+')
189 if [[ ! -z "$IP_ADDRESS" ]]; then
190 echo -e "\nIP address of $VM_NAME is:\n$IP_ADDRESS"
191 break
192 else
193 echo "IP address for $VM_NAME not found. Retrying in 1 second..."
194 sleep 1
195 fi
196 else
197 echo "$VM_NAME not found. Exiting..."
198 exit 1
199 fi
200 done
201
202 ;;
203 "manage")
204 if [[ $# -lt 2 ]]; then
205 echo ""
206 echo -e "$0 $1 arg [VM_1] [VM_2] [VM_3] \n$0 $1 arg --all"
207 echo -e "args:\n -start\n -shutdown\n -kill\n -erase "
208 echo ""
209 exit 1
210 fi
211
212 arg=$2
213 shift 2
214
215 if [[ "$1" == "--all" ]]; then
216 vms=$(sudo virsh list --all --name)
217 set -- $vms
218 fi
219
220 case $arg in
221 "-shutdown")
222 for vm in "$@"; do
223 sudo virsh shutdown "$vm" > /dev/null 2>&1
224 printf "%-50s%10s\n" "Shutting down $vm..." $([[ $? -eq 0 ]] && echo "Successful" || echo "Failed")
225 done
226 ;;
227 "-kill")
228 for vm in "$@"; do
229 sudo virsh destroy "$vm" > /dev/null 2>&1
230 printf "%-50s%10s\n" "Destroying $vm..." $([[ $? -eq 0 ]] && echo "Successful" || echo "Failed")
231 done
232 ;;
233 "-erase")
234 echo -e "\nWARNING: THIS IS IRREVERSIBLE. Sleeping for 10 seconds. Ctrl-C to stop. WARNING.\n"
235 sleep 10
236 echo -e "\nErasing image(s) from /var/lib/libvirt/images/\n"
237 for vm in "$@"; do
238 sudo virsh destroy "$vm" > /dev/null 2>&1
239 sudo virsh undefine "$vm" --remove-all-storage > /dev/null 2>&1
240 printf "%-50s%10s\n" "Removing $vm..." $([[ $? -eq 0 ]] && echo "Successful" || echo "Failed")
241 done
242 ;;
243 "-start")
244 for vm in "$@"; do
245 sudo virsh start "$vm" > /dev/null 2>&1
246 printf "%-50s%10s\n" "Starting $vm..." $([[ $? -eq 0 ]] && echo "Successful" || echo "Failed")
247 done
248 ;;
249 "-reboot")
250 for vm in "$@"; do
251 sudo virsh shutdown "$vm" > /dev/null 2>&1
252 sudo virsh start "$vm" > /dev/null 2>&1
253 printf "%-50s%10s\n" "Rebooting $vm..." $([[ $? -eq 0 ]] && echo "Successful" || echo "Failed")
254 done
255 ;;
256 *)
257 echo "Unknown argument: $arg"
258 exit 1
259 ;;
260 esac
261 ;;
262 "info")
263 printf "%-4s %-10s %-15s %-10s %-10s %-6s %-8s %-12s\n" "Id" "Name" "IP" "State" "Network" "vCPUs" "RAM(GB)" "Disk(GB)"
264 printf "%-4s %-10s %-15s %-10s %-10s %-6s %-8s %-12s\n" "----" "----------" "---------------" "----------" "----------" "-----" "-------" "-----------"
265
266 vms=$(sudo virsh list --name --all)
267
268 id=1
269 for vm in $vms; do
270 mac=$(sudo virsh dumpxml $vm | grep "mac address" | awk -F\' '{ print $2}')
271 net=$(sudo virsh dumpxml $vm | grep "<source network" | awk -F\' '{print $2}')
272 if [ -z "$net" ]
273 then
274 net="default"
275 fi
276 ip=$(sudo virsh net-dhcp-leases $net | grep $mac | awk '{print $5}' | cut -f1 -d'/')
277 state=$(sudo virsh domstate $vm)
278 vcpus=$(sudo virsh dominfo $vm | grep "CPU(s)" | awk '{print $2}')
279 ram=$(bc <<< "scale=2; $(sudo virsh dominfo $vm | grep "Max memory" | awk '{print $3}')/1000000")
280 disk=$(sudo du -sk /var/lib/libvirt/images/${vm}.qcow2 | awk '{ printf "%.2f", $1/1024/1024 }')
281
282 printf "%-4s %-10s %-15s %-10s %-10s %-6s %-8s %-12s\n" "$id" "$vm" "$ip" "$state" "$net" "$vcpus" "$ram" "$disk"
283 id=$((id+1))
284 done
285 exit 0
286 ;;
287 *)
288 help
289 exit 1
290 ;;
291esac