Adding Network info and edition
parent
843555a9d5
commit
e2fcc56ce0
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,4 +1,5 @@
|
||||||
from config import *
|
from config import *
|
||||||
|
from functions.fnet import *
|
||||||
import base64
|
import base64
|
||||||
import time
|
import time
|
||||||
import lxc
|
import lxc
|
||||||
|
@ -65,7 +66,18 @@ def get_info_vm(vm_name):
|
||||||
state, maxmem, mem, cpus, cput = dom.info()
|
state, maxmem, mem, cpus, cput = dom.info()
|
||||||
return state, maxmem, mem, cpus, cput
|
return state, maxmem, mem, cpus, cput
|
||||||
|
|
||||||
#Screenshot
|
def attach_net(vm_name,net_name):
|
||||||
|
dom = conn.lookupByName(vm_name)
|
||||||
|
network_xml = f'<interface type="network"><source network="{net_name}"/><model type="virtio"/></interface>'
|
||||||
|
dom.attachDeviceFlags(network_xml, libvirt.VIR_DOMAIN_AFFECT_CONFIG | libvirt.VIR_DOMAIN_AFFECT_LIVE)
|
||||||
|
|
||||||
|
def detach_net(vm_name, net_name, net_mac,net_int):
|
||||||
|
dom = conn.lookupByName(vm_name)
|
||||||
|
# network_xml = f'<interface type="network"><mac address="{net_mac}"/><source network="{net_name}"/><model type="virtio"/></interface>'
|
||||||
|
network_xml = f'<interface type="bridge"><mac address="{net_mac}"/><source network="{net_name}" bridge="{net_int}"/></interface>'
|
||||||
|
print(network_xml)
|
||||||
|
dom.detachDeviceFlags(network_xml, libvirt.VIR_DOMAIN_AFFECT_CONFIG | libvirt.VIR_DOMAIN_AFFECT_LIVE)
|
||||||
|
|
||||||
def get_screenshot(vm_name):
|
def get_screenshot(vm_name):
|
||||||
dom = conn.lookupByName(vm_name)
|
dom = conn.lookupByName(vm_name)
|
||||||
stream = conn.newStream()
|
stream = conn.newStream()
|
||||||
|
@ -83,8 +95,6 @@ def get_screenshot(vm_name):
|
||||||
os.remove(file)
|
os.remove(file)
|
||||||
return data
|
return data
|
||||||
|
|
||||||
#Autostart
|
|
||||||
|
|
||||||
def get_autostart(vm_name):
|
def get_autostart(vm_name):
|
||||||
dom = conn.lookupByName(vm_name)
|
dom = conn.lookupByName(vm_name)
|
||||||
return dom.autostart()
|
return dom.autostart()
|
||||||
|
@ -97,3 +107,12 @@ def unset_autostart(vm_name):
|
||||||
dom = conn.lookupByName(vm_name)
|
dom = conn.lookupByName(vm_name)
|
||||||
dom.setAutostart(0)
|
dom.setAutostart(0)
|
||||||
|
|
||||||
|
"""
|
||||||
|
def get_net_vm(vm_name):
|
||||||
|
netws, nu2 = get_virt_int()
|
||||||
|
vm_net_list=[]
|
||||||
|
for net in netws:
|
||||||
|
if vm_name in net[1][0]:
|
||||||
|
vm_net_list.append(net[0][0][0])
|
||||||
|
return vm_net_list
|
||||||
|
"""
|
||||||
|
|
|
@ -1,99 +0,0 @@
|
||||||
from config import *
|
|
||||||
import base64
|
|
||||||
import time
|
|
||||||
import lxc
|
|
||||||
|
|
||||||
def get_version():
|
|
||||||
vlxc = lxc.version
|
|
||||||
vlibvirt = str(libvirt.getVersion()/1000000) #1000000 * major + 1000 * minor + release
|
|
||||||
vhype = hype_version
|
|
||||||
return vlxc, vlibvirt, vhype
|
|
||||||
|
|
||||||
|
|
||||||
def set_memory(vm_name,memory_new):
|
|
||||||
dom = conn.lookupByName(vm_name)
|
|
||||||
dom.shutdown()
|
|
||||||
time.sleep(3)
|
|
||||||
alive=0
|
|
||||||
while alive < 5:
|
|
||||||
if dom.isActive():
|
|
||||||
time.sleep(3)
|
|
||||||
alive+=1
|
|
||||||
else:
|
|
||||||
alive=6
|
|
||||||
if dom.isActive():
|
|
||||||
dom.destroy()
|
|
||||||
dom.setMaxMemory(memory_new)
|
|
||||||
dom.setMemoryFlags(memory_new)
|
|
||||||
dom.create()
|
|
||||||
time.sleep(3)
|
|
||||||
alive=0
|
|
||||||
while alive < 3:
|
|
||||||
if dom.isActive():
|
|
||||||
alive=4
|
|
||||||
else:
|
|
||||||
time.sleep(3)
|
|
||||||
alive+=1
|
|
||||||
|
|
||||||
def set_vcpu(vm_name,vcpu_new):
|
|
||||||
dom = conn.lookupByName(vm_name)
|
|
||||||
dom.shutdown()
|
|
||||||
time.sleep(3)
|
|
||||||
alive=0
|
|
||||||
while alive < 5:
|
|
||||||
if dom.isActive():
|
|
||||||
time.sleep(3)
|
|
||||||
alive+=1
|
|
||||||
else:
|
|
||||||
alive=6
|
|
||||||
if dom.isActive():
|
|
||||||
dom.destroy()
|
|
||||||
dom.setVcpusFlags(vcpu_new,libvirt.VIR_DOMAIN_AFFECT_CONFIG | libvirt.VIR_DOMAIN_VCPU_MAXIMUM)
|
|
||||||
dom.setVcpusFlags(vcpu_new,libvirt.VIR_DOMAIN_AFFECT_CONFIG | libvirt.VIR_DOMAIN_VCPU_CURRENT)
|
|
||||||
dom.create()
|
|
||||||
time.sleep(3)
|
|
||||||
alive=0
|
|
||||||
while alive < 3:
|
|
||||||
if dom.isActive():
|
|
||||||
alive=4
|
|
||||||
else:
|
|
||||||
time.sleep(3)
|
|
||||||
alive+=1
|
|
||||||
|
|
||||||
def get_info_vm(vm_name):
|
|
||||||
dom = conn.lookupByName(vm_name)
|
|
||||||
state, maxmem, mem, cpus, cput = dom.info()
|
|
||||||
return state, maxmem, mem, cpus, cput
|
|
||||||
|
|
||||||
#Screenshot
|
|
||||||
def get_screenshot(vm_name):
|
|
||||||
dom = conn.lookupByName(vm_name)
|
|
||||||
stream = conn.newStream()
|
|
||||||
imageType = dom.screenshot(stream,0)
|
|
||||||
file = "tmp_screen_" + dom.name()
|
|
||||||
fileHandler = open(file, 'wb')
|
|
||||||
streamBytes = stream.recv(262120)
|
|
||||||
while streamBytes != b'':
|
|
||||||
fileHandler.write(streamBytes)
|
|
||||||
streamBytes = stream.recv(262120)
|
|
||||||
fileHandler.close()
|
|
||||||
stream.finish()
|
|
||||||
with open(file, "rb") as f:
|
|
||||||
data = base64.b64encode(f.read())
|
|
||||||
os.remove(file)
|
|
||||||
return data
|
|
||||||
|
|
||||||
#Autostart
|
|
||||||
|
|
||||||
def get_autostart(vm_name):
|
|
||||||
dom = conn.lookupByName(vm_name)
|
|
||||||
return dom.autostart()
|
|
||||||
|
|
||||||
def set_autostart(vm_name):
|
|
||||||
dom = conn.lookupByName(vm_name)
|
|
||||||
dom.setAutostart(1)
|
|
||||||
|
|
||||||
def unset_autostart(vm_name):
|
|
||||||
dom = conn.lookupByName(vm_name)
|
|
||||||
dom.setAutostart(0)
|
|
||||||
|
|
|
@ -2,6 +2,35 @@ from app import *
|
||||||
import ipaddress
|
import ipaddress
|
||||||
from xml.dom import minidom
|
from xml.dom import minidom
|
||||||
|
|
||||||
|
|
||||||
|
def ip_fom_mac(vm_name,net_mac):
|
||||||
|
dom=conn.lookupByName(vm_name)
|
||||||
|
mac_ip=[]
|
||||||
|
try:
|
||||||
|
ifaces = dom.interfaceAddresses(libvirt.VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_AGENT)
|
||||||
|
except:
|
||||||
|
ifaces = None
|
||||||
|
result="---.---.---.---"
|
||||||
|
|
||||||
|
if ifaces is None:
|
||||||
|
result="---.---.---.---"
|
||||||
|
else:
|
||||||
|
for (name, val) in ifaces.items():
|
||||||
|
if val['addrs']:
|
||||||
|
for addr in val['addrs']:
|
||||||
|
if addr['addr']:
|
||||||
|
mac_ip.append([val['hwaddr'],addr['addr']])
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
result = "---.---.---.---"
|
||||||
|
for int in mac_ip:
|
||||||
|
if int[0] == net_mac:
|
||||||
|
result=int[1]
|
||||||
|
else:
|
||||||
|
result = "---.---.---.---"
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
def diff_net(min_dhcp,max_dhcp):
|
def diff_net(min_dhcp,max_dhcp):
|
||||||
ip1 = ipaddress.IPv4Address(min_dhcp)
|
ip1 = ipaddress.IPv4Address(min_dhcp)
|
||||||
ip2 = ipaddress.IPv4Address(max_dhcp)
|
ip2 = ipaddress.IPv4Address(max_dhcp)
|
||||||
|
@ -43,28 +72,44 @@ def create_network(net_name,net_int):
|
||||||
net_use.create()
|
net_use.create()
|
||||||
net_use.setAutostart(True)
|
net_use.setAutostart(True)
|
||||||
|
|
||||||
def list_network_VM():
|
def get_mac_net(vm_name,net_name):
|
||||||
net_tree = []
|
dom = conn.lookupByName(vm_name)
|
||||||
net_na = []
|
raw_xml = dom.XMLDesc()
|
||||||
#Host Interfaces
|
net_xml = minidom.parseString(raw_xml)
|
||||||
net_hard_int = conn.listInterfaces()
|
VM_mac = []
|
||||||
#Virtual Interfaces
|
for device in net_xml.getElementsByTagName('devices'):
|
||||||
net_list = conn.listAllNetworks()
|
ifaces = device.getElementsByTagName('interface')
|
||||||
for net_name in net_list:
|
for iface in ifaces:
|
||||||
if net_name.isActive():
|
sources = iface.getElementsByTagName('source')
|
||||||
net_sub_tree=[]
|
for source in sources:
|
||||||
net_sub_tree.append(net_name.name())
|
if source.getAttribute('network') == net_name:
|
||||||
net_use = conn.networkLookupByName(net_name.name())
|
mac = iface.getElementsByTagName('mac')
|
||||||
ports = net_use.listAllPorts()
|
target = iface.getElementsByTagName('target')
|
||||||
net_ports = []
|
ip = ip_fom_mac(vm_name,str(mac[0].getAttribute('address')))
|
||||||
for port in ports:
|
VM_mac.append([target[0].getAttribute('dev'),mac[0].getAttribute('address'),ip])
|
||||||
raw_xml = port.XMLDesc()
|
return VM_mac
|
||||||
net_xml = minidom.parseString(raw_xml)
|
|
||||||
net_element = net_xml.documentElement
|
def get_virt_int():
|
||||||
net_VM = net_element.getElementsByTagName("name")[0]
|
net_na = []
|
||||||
net_ports.append(net_VM.firstChild.data)
|
out=[]
|
||||||
net_sub_tree.append(net_ports)
|
for network in conn.listAllNetworks():
|
||||||
net_tree.append(net_sub_tree)
|
if network.isActive():
|
||||||
else:
|
int_name=[]
|
||||||
net_na.append(net_name.name())
|
int_mac = conn.interfaceLookupByName(network.bridgeName())
|
||||||
return net_hard_int,net_tree,net_na
|
int_name.append([network.name(),network.bridgeName(),int_mac.MACString()])
|
||||||
|
net_detail = conn.networkLookupByName(network.name())
|
||||||
|
net_vms = net_detail.listAllPorts()
|
||||||
|
vm_name=[]
|
||||||
|
for vm in net_vms:
|
||||||
|
net_VM_info = []
|
||||||
|
raw_xml = vm.XMLDesc()
|
||||||
|
net_xml = minidom.parseString(raw_xml)
|
||||||
|
net_element = net_xml.documentElement
|
||||||
|
net_VM = net_element.getElementsByTagName("name")[0]
|
||||||
|
net_VM_info = [net_VM.firstChild.data,get_mac_net(net_VM.firstChild.data,network.name())]
|
||||||
|
if net_VM_info not in vm_name:
|
||||||
|
vm_name.append(net_VM_info)
|
||||||
|
out.append([int_name,vm_name])
|
||||||
|
else:
|
||||||
|
net_na.append(network.name())
|
||||||
|
return out, net_na
|
||||||
|
|
|
@ -109,6 +109,31 @@
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<br>
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
Networking for {{ vm_name }}
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
Attach new network<hr>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm">
|
||||||
|
<form action="/addnetvm" method="post">
|
||||||
|
<input type="hidden" name="vm_name" value="{{ vm_name }}">
|
||||||
|
<label for="new_net_vm">Network</label>
|
||||||
|
<select id="new_net_vm" class="form-control" name="new_net_vm" placeholder="Profile" required>
|
||||||
|
{%for net in list_net %}
|
||||||
|
<option value={{ net }}>{{ net }}</option>
|
||||||
|
{%endfor%}
|
||||||
|
</select><br>
|
||||||
|
<button type="submit" class="btn btn-outline-info btn-hype"><i class="fa-solid fa-plus"></i> Add</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -29,15 +29,33 @@ Virtual Interfaces:
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% for item in net_tree %}
|
{% for item in net_tree %}
|
||||||
<li class="list-group-item bg-info text-dark">
|
<li class="list-group-item bg-info text-dark">
|
||||||
<strong><i class="fa-solid fa-ethernet"></i> {{ item[0] }}</strong>
|
<table class="table table-sm text-dark table-borderless"><tr><td>
|
||||||
|
<strong><i class="fa-solid fa-network-wired"></i> {{ item[0][0][0] }} - <i class="fa-solid fa-ethernet"></i> {{ item[0][0][1] }} - {{ item[0][0][2] }}</strong>
|
||||||
|
</td><td>
|
||||||
<form action="/delnet" method="post">
|
<form action="/delnet" method="post">
|
||||||
<input type="hidden" id="net_del" name="net_del" class="form-control" value="{{ item[0] }}">
|
<input type="hidden" id="net_del" name="net_del" class="form-control" value="{{ item[0][0][0] }}">
|
||||||
<button name="delete" class="btn btn-outline-secondary" type="submit" onclick="loading();">Delete</button>
|
<button name="delete" class="btn btn-outline-danger btn-sm" type="submit" onclick="loading();"><i class="fa fa-trash" aria-hidden="true"></i></button>
|
||||||
</form><br>
|
</form>
|
||||||
|
</td></tr></table>
|
||||||
<ul class="list-group">
|
<ul class="list-group">
|
||||||
{% for sub_item in item[1] %}
|
{% for sub_item in item[1] %}
|
||||||
<li class="list-group-item bg-warning text-dark">
|
<li class="list-group-item bg-warning text-dark">
|
||||||
<i class="fa-solid fa-desktop"></i> {{ sub_item }}
|
<p class="text-start"><i class="fa-solid fa-desktop"></i> {{ sub_item[0] }}<br></p>
|
||||||
|
{% for pitem in sub_item[1] %}
|
||||||
|
<table class="table table-sm text-dark table-responsive table-borderless"><tr><td>
|
||||||
|
<center><i class="fa-solid fa-ethernet"></i> {{ pitem[0] }} - <i class="fa-solid fa-at"></i> {{ pitem[1] }} - {{ pitem[2] }}<br></center>
|
||||||
|
</td><td>
|
||||||
|
</td><td>
|
||||||
|
|
||||||
|
<form action="/delnetvm" method="post">
|
||||||
|
<input type="hidden" id="vm_name" name="vm_name" class="form-control" value="{{ sub_item[0] }}">
|
||||||
|
<input type="hidden" id="del_net_vm" name="del_net_vm" class="form-control" value="{{ item[0][0][0] }}">
|
||||||
|
<input type="hidden" id="del_mac_vm" name="del_mac_vm" class="form-control" value="{{ pitem[1] }}">
|
||||||
|
<input type="hidden" id="del_net_int" name="del_net_int" class="form-control" value="{{ item[0][0][1] }}">
|
||||||
|
<button name="delete" class="btn btn-outline-danger btn-sm" type="submit" onclick="loading();"><i class="fa fa-trash" aria-hidden="true"></i></button>
|
||||||
|
</form>
|
||||||
|
</td></tr></table>
|
||||||
|
{% endfor %}
|
||||||
</li>
|
</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
@ -1,56 +0,0 @@
|
||||||
{% extends 'layout.html' %}
|
|
||||||
{% block content %}
|
|
||||||
{% include 'menu.html' %}
|
|
||||||
<!--
|
|
||||||
<div class="container">
|
|
||||||
<div class="row justify-content-md-center">
|
|
||||||
<div class="col">
|
|
||||||
<ul class="list-group">
|
|
||||||
<li class="list-group-item bg-primary text-dark">
|
|
||||||
Physical interface
|
|
||||||
<center>
|
|
||||||
{% for pint in net_hard_int %}
|
|
||||||
<strong><i class="fa-solid fa-ethernet"></i> {{ pint }}</strong><br>
|
|
||||||
{% endfor %}
|
|
||||||
</center></li>
|
|
||||||
{% for item in net_tree %}
|
|
||||||
<li class="list-group-item bg-info text-dark">
|
|
||||||
<center><strong><i class="fa-solid fa-ethernet"></i> {{ item[0] }}</strong></center><br>
|
|
||||||
<ul class="list-group">
|
|
||||||
{% for sub_item in item[1] %}
|
|
||||||
<li class="list-group-item bg-warning text-dark">
|
|
||||||
<center><i class="fa-solid fa-desktop"></i> {{ sub_item }}</center>
|
|
||||||
</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
-->
|
|
||||||
<div class="container">
|
|
||||||
<div class="row justify-content-md-center">
|
|
||||||
<div class="col">
|
|
||||||
{% for pint in net_hard_int %}
|
|
||||||
<strong><i class="fa-solid fa-ethernet"></i> {{ pint }}</strong><br>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row justify-content-md-center">
|
|
||||||
<div class="col">
|
|
||||||
<div class="mermaid">
|
|
||||||
graph TD
|
|
||||||
{% for item in net_tree %}
|
|
||||||
root[Root] --- {{ item[0] }}[{{ item[0] }}]
|
|
||||||
{% for sub_item in item[1] %}
|
|
||||||
{{ item[0] }}[{{ item[0] }}] --- {{ sub_item }}[{{ sub_item }}]
|
|
||||||
{% endfor %}
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<script>mermaid.initialize({startOnLoad:true});</script>
|
|
||||||
{% endblock %}
|
|
Loading…
Reference in New Issue