f06da32fc3
Add ability to create Virtual Machine in netbox with an auto-detecting feature (currently VirtualBox, Xen, Hyper-V, VMWare, GCP) One caveat, I made the choice not to report the disk as Netbox model allow only one size but VM often have multiples. Also, lot of code refactoring to be able to use create_or_update function style, fixing a lot of corner case
68 lines
2.2 KiB
Python
68 lines
2.2 KiB
Python
import logging
|
|
import subprocess
|
|
|
|
from netaddr import IPNetwork
|
|
|
|
|
|
class IPMI():
|
|
"""
|
|
Parse IPMI output
|
|
ie:
|
|
|
|
Set in Progress : Set Complete
|
|
Auth Type Support :
|
|
Auth Type Enable : Callback :
|
|
: User :
|
|
: Operator :
|
|
: Admin :
|
|
: OEM :
|
|
IP Address Source : DHCP Address
|
|
IP Address : 10.192.2.1
|
|
Subnet Mask : 255.255.240.0
|
|
MAC Address : 98:f2:b3:f0:ee:1e
|
|
SNMP Community String :
|
|
BMC ARP Control : ARP Responses Enabled, Gratuitous ARP Disabled
|
|
Default Gateway IP : 10.192.2.254
|
|
802.1q VLAN ID : Disabled
|
|
802.1q VLAN Priority : 0
|
|
RMCP+ Cipher Suites : 0,1,2,3
|
|
Cipher Suite Priv Max : XuuaXXXXXXXXXXX
|
|
: X=Cipher Suite Unused
|
|
: c=CALLBACK
|
|
: u=USER
|
|
: o=OPERATOR
|
|
: a=ADMIN
|
|
: O=OEM
|
|
Bad Password Threshold : Not Available
|
|
"""
|
|
|
|
def __init__(self):
|
|
self.ret, self.output = subprocess.getstatusoutput('ipmitool lan print')
|
|
if self.ret != 0:
|
|
logging.error('Cannot get ipmi info: {}'.format(self.output))
|
|
|
|
def parse(self):
|
|
_ipmi = {}
|
|
if self.ret != 0:
|
|
return _ipmi
|
|
|
|
for line in self.output.splitlines():
|
|
key = line.split(':')[0].strip()
|
|
if key not in ['802.1q VLAN ID', 'IP Address', 'Subnet Mask', 'MAC Address']:
|
|
continue
|
|
value = ':'.join(line.split(':')[1:]).strip()
|
|
_ipmi[key] = value
|
|
|
|
ret = {}
|
|
ret['name'] = 'IPMI'
|
|
ret['bonding'] = False
|
|
ret['mac'] = _ipmi['MAC Address']
|
|
ret['vlan'] = int(_ipmi['802.1q VLAN ID']) \
|
|
if _ipmi['802.1q VLAN ID'] != 'Disabled' else None
|
|
ip = _ipmi['IP Address']
|
|
netmask = _ipmi['Subnet Mask']
|
|
address = str(IPNetwork('{}/{}'.format(ip, netmask)))
|
|
|
|
ret['ip'] = [address]
|
|
ret['ipmi'] = True
|
|
return ret
|