Compare commits
	
		
			4 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 70a193a0ce | |||
| 7e4ebe75b4 | |||
| d289b55d27 | |||
| 88f667f90f | 
| @ -27,12 +27,14 @@ def make_capsul_id(): | ||||
|   letters_n_nummers = generate(alphabet="1234567890qwertyuiopasdfghjklzxcvbnm", size=10) | ||||
|   return f"capsul-{letters_n_nummers}" | ||||
|  | ||||
| def double_check_capsul_address(id, ipv4, get_ssh_host_keys): | ||||
| def double_check_capsul_address(id, ipv4, ipv6, get_ssh_host_keys): | ||||
|   try: | ||||
|     result = current_app.config["HUB_MODEL"].get(id, get_ssh_host_keys) | ||||
|     if result != None and result.ipv4 != None and result.ipv4 != ipv4: | ||||
|       ipv4 = result.ipv4 | ||||
|       get_model().update_vm_ip(email=session["account"], id=id, ipv4=result.ipv4) | ||||
|       get_model().update_vm_ipv4(email=session["account"], id=id, ipv4=result.ipv4) | ||||
|  | ||||
|     if result != None and result.ipv6 != None and result.ipv6 != ipv6: | ||||
|       get_model().update_vm_ipv6(email=session["account"], id=id, ipv6=result.ipv6) | ||||
|  | ||||
|     if result != None and result.ssh_host_keys != None and get_ssh_host_keys: | ||||
|       get_model().update_vm_ssh_host_keys(email=session["account"], id=id, ssh_host_keys=result.ssh_host_keys) | ||||
| @ -59,37 +61,38 @@ def index(): | ||||
|   # for now we are going to check the IP according to the virt model | ||||
|   # on every request. this could be done by a background job and cached later on... | ||||
|   for vm in vms: | ||||
|     result = double_check_capsul_address(vm["id"], vm["ipv4"], False) | ||||
|     result = double_check_capsul_address(vm["id"], vm["ipv4"], vm["ipv6"], False) | ||||
|     if result is not None: | ||||
|       vm["ipv4"] = result.ipv4 | ||||
|       vm["ipv6"] = result.ipv6 | ||||
|       vm["state"] = result.state | ||||
|     else: | ||||
|       vm["state"] = "unknown" | ||||
|  | ||||
|  | ||||
|   mappedVms = [] | ||||
|   for vm in vms: | ||||
|     ip_display = vm['ipv4'] | ||||
|     if not ip_display: | ||||
|       if vm["state"] == "running": | ||||
|         ip_display = "..booting.." | ||||
|       else: | ||||
|         ip_display = "unknown" | ||||
|  | ||||
|     ip_display_class = "ok" | ||||
|     if not vm['ipv4']: | ||||
|       if vm["state"] == "running": | ||||
|         ip_display_class = "waiting-pulse" | ||||
|       else: | ||||
|         ip_display_class = "yellow" | ||||
|     ip_display = {} | ||||
|     ip_display_class = {} | ||||
|     for af in ['ipv4', 'ipv6']: | ||||
|       ip_display[af] = vm[af] | ||||
|       ip_display_class[af] = "ok" | ||||
|       if not ip_display[af]: | ||||
|         if vm["state"] == "running": | ||||
|           ip_display[af] = "..booting.." | ||||
|           ip_display_class[af] = "waiting-pulse" | ||||
|         else: | ||||
|           ip_display[af] = "unknown" | ||||
|           ip_display_class[af] = "yellow" | ||||
|  | ||||
|     mappedVms.append(dict( | ||||
|       id=vm['id'],  | ||||
|       size=vm['size'],  | ||||
|       id=vm['id'], | ||||
|       size=vm['size'], | ||||
|       state=vm['state'], | ||||
|       ipv4=ip_display,  | ||||
|       ipv4_status=ip_display_class,  | ||||
|       os=vm['os'],  | ||||
|       ipv4=ip_display['ipv4'], | ||||
|       ipv4_status=ip_display_class['ipv4'], | ||||
|       ipv6=ip_display['ipv6'], | ||||
|       ipv6_status=ip_display_class['ipv6'], | ||||
|       os=vm['os'], | ||||
|       created=vm['created'].strftime("%b %d %Y") | ||||
|     )) | ||||
|  | ||||
| @ -169,10 +172,11 @@ def detail(id): | ||||
|   else: | ||||
|     needs_ssh_host_keys = "ssh_host_keys" not in vm or len(vm["ssh_host_keys"]) == 0 | ||||
|  | ||||
|     vm_from_virt_model = double_check_capsul_address(vm["id"], vm["ipv4"], needs_ssh_host_keys) | ||||
|     vm_from_virt_model = double_check_capsul_address(vm["id"], vm["ipv4"], vm['ipv6'], needs_ssh_host_keys) | ||||
|      | ||||
|     if vm_from_virt_model is not None: | ||||
|       vm["ipv4"] = vm_from_virt_model.ipv4 | ||||
|       vm["ipv6"] = vm_from_virt_model.ipv6 | ||||
|       vm["state"] = vm_from_virt_model.state | ||||
|       if needs_ssh_host_keys: | ||||
|         vm["ssh_host_keys"] = vm_from_virt_model.ssh_host_keys | ||||
|  | ||||
| @ -144,10 +144,14 @@ class DBModel: | ||||
|       self.cursor.fetchall() | ||||
|     )) | ||||
|  | ||||
|   def update_vm_ip(self, email, id, ipv4): | ||||
|   def update_vm_ipv4(self, email, id, ipv4): | ||||
|     self.cursor.execute("UPDATE vms SET public_ipv4 = %s WHERE email = %s AND id = %s", (ipv4, email, id)) | ||||
|     self.connection.commit() | ||||
|  | ||||
|   def update_vm_ipv6(self, email, id, ipv6): | ||||
|     self.cursor.execute("UPDATE vms SET public_ipv6 = %s WHERE email = %s AND id = %s", (ipv6, email, id)) | ||||
|     self.connection.commit() | ||||
|  | ||||
|   def update_vm_ssh_host_keys(self, email, id, ssh_host_keys): | ||||
|     for key in ssh_host_keys: | ||||
|       self.cursor.execute("""  | ||||
|  | ||||
| @ -29,7 +29,8 @@ if virsh domuuid "$vmname" | grep -vqE '^[\t\s\n]*$'; then | ||||
|   esac | ||||
| fi | ||||
|  | ||||
| # this gets the ipv4 | ||||
| # this gets the vm ip addresses | ||||
| ipv4="$(virsh domifaddr "$vmname" | awk '/ipv4/ {print $4}' | cut -d'/' -f1)" | ||||
| ipv6="$(virsh domifaddr "$vmname" | awk '/ipv6/ {print $4}' | cut -d'/' -f1)" | ||||
|  | ||||
| echo "$exists $state $ipv4" | ||||
| echo "$exists $state $ipv4 $ipv6" | ||||
|  | ||||
| @ -114,24 +114,30 @@ class ShellScriptSpoke(VirtualizationInterface): | ||||
|     if len(fields) < 3: | ||||
|       return VirtualMachine(id, current_app.config["SPOKE_HOST_ID"], state=state) | ||||
|  | ||||
|     ipaddr = fields[2] | ||||
|     ip4addr = fields[2] | ||||
|  | ||||
|     if not re.match(r"^([0-9]{1,3}\.){3}[0-9]{1,3}$", ipaddr): | ||||
|     if not re.match(r"^([0-9]{1,3}\.){3}[0-9]{1,3}$", ip4addr): | ||||
|       return VirtualMachine(id, current_app.config["SPOKE_HOST_ID"], state=state) | ||||
|  | ||||
|     if get_ssh_host_keys: | ||||
|       try: | ||||
|         completedProcess2 = run([join(current_app.root_path, 'shell_scripts/ssh-keyscan.sh'), ipaddr], capture_output=True) | ||||
|         completedProcess2 = run([join(current_app.root_path, 'shell_scripts/ssh-keyscan.sh'), ip4addr], capture_output=True) | ||||
|         self.validate_completed_process(completedProcess2) | ||||
|         ssh_host_keys = json.loads(completedProcess2.stdout.decode("utf-8")) | ||||
|         return VirtualMachine(id, current_app.config["SPOKE_HOST_ID"], state=state, ipv4=ipaddr, ssh_host_keys=ssh_host_keys) | ||||
|         return VirtualMachine(id, current_app.config["SPOKE_HOST_ID"], state=state, ipv4=ip4addr, ssh_host_keys=ssh_host_keys) | ||||
|       except: | ||||
|         mylog_warning(current_app, f""" | ||||
|           failed to ssh-keyscan {id} at {ipaddr}: | ||||
|           failed to ssh-keyscan {id} at {ip4addr}: | ||||
|           {my_exec_info_message(sys.exc_info())}""" | ||||
|         ) | ||||
|  | ||||
|     return VirtualMachine(id, current_app.config["SPOKE_HOST_ID"], state=state, ipv4=ipaddr) | ||||
|     if len(fields) < 4: | ||||
|         return VirtualMachine(id, current_app.config["SPOKE_HOST_ID"], state=state, ipv4=ip4addr) | ||||
|  | ||||
|     ip6addr = fields[3] | ||||
|  | ||||
|     return VirtualMachine(id, current_app.config["SPOKE_HOST_ID"], state=state, ipv4=ip4addr, ipv6=ip6addr) | ||||
|  | ||||
|  | ||||
|   def list_ids(self) -> list: | ||||
|     completedProcess = run([join(current_app.root_path, 'shell_scripts/list-ids.sh')], capture_output=True) | ||||
|  | ||||
| @ -79,6 +79,10 @@ | ||||
|         <label class="align" for="ipv4">IPv4 Address</label> | ||||
|         <span id="ipv4">{{ vm['ipv4'] }}</span> | ||||
|       </div> | ||||
|       <div class="row justify-start"> | ||||
|         <label class="align" for="ipv6">IPv6 Address</label> | ||||
|         <span id="ipv6">{{ vm['ipv6'] }}</span> | ||||
|       </div> | ||||
|       <div class="row justify-start"> | ||||
|         <label class="align" for="os_description">Operating System</label> | ||||
|         <span id="os_description">{{ vm['os_description'] }}</span> | ||||
|  | ||||
		Reference in New Issue
	
	Block a user