This repository has been archived on 2025-02-01. You can view files and clone it, but cannot push or open issues or pull requests.
salt-inventory/saltinventory.py
2014-11-17 18:34:58 +01:00

126 lines
3.9 KiB
Python
Executable file

#!/usr/bin/python
#
# Requirements:
#
# * salt
# * python-netaddr
#
import salt.client
from netaddr import *
from jinja2 import Template, BaseLoader, TemplateNotFound, FileSystemLoader, Environment
# settings
config = {
'base_path': 'www/',
'host_page_path': 'www/hosts/',
'network_page_path': 'www/networks/',
'template_path': 'templates/',
}
# class definitions
class Inventorizer:
config = None
saltcmd = None
host_list = {}
network_list = {}
def __init__(self, config):
self.config = config
self.saltcmd = salt.client.LocalClient()
self.process()
def process(self):
self.collectHostData()
self.createHostList()
self.collectNetworkData()
self.createHostPages()
self.createNetworkList()
self.createNetworkPages()
def collectHostData(self):
self.host_list = self.saltcmd.cmd('*', 'grains.items')
def collectNetworkData(self):
result = self.saltcmd.cmd('*', 'network.interfaces')
for hostname, hostdata in result.iteritems():
for interface, interfacedata in hostdata.iteritems():
if interfacedata.has_key('inet'):
for netdata in interfacedata['inet']:
ip = IPNetwork(netdata['address'] + '/' + netdata['netmask'])
host = {'hostname': hostname, 'address': netdata['address'], 'netobj': ip}
self.addNetworkHost(ip, host)
if interfacedata.has_key('secondary'):
for netdata in interfacedata['secondary']:
ip = IPNetwork(netdata['address'] + '/' + netdata['netmask'])
host = {'hostname': hostname, 'address': netdata['address'], 'netobj': ip}
self.addNetworkHost(ip, host)
if interfacedata.has_key('inet6'):
for netdata in interfacedata['inet6']:
ip = IPNetwork(netdata['address'] + '/' + netdata['prefixlen'])
host = {'hostname': hostname, 'address': netdata['address'], 'netobj': ip}
self.addNetworkHost(ip, host)
def addNetworkHost(self, ip, host):
if self.network_list.has_key(ip.cidr):
self.network_list[ip.cidr].append(host)
else:
self.network_list[ip.cidr] = [host]
def createHostList(self):
fo = open(self.config['base_path'] + "hostlist.html", "wb")
env = Environment(loader = FileSystemLoader(config['template_path']))
template = env.get_template('hostlist_template.html')
fo.write(template.render({'hostlist': self.host_list}))
fo.close
def createHostPages(self):
for hostname, hostdata in self.host_list.iteritems():
self.createHostPage(hostname, hostdata)
def createHostPage(self, hostname, hostdata):
fo = open(self.config['host_page_path'] + hostname + ".html", "wb")
env = Environment(loader = FileSystemLoader(config['template_path']))
template = env.get_template('host_template.html')
fo.write(template.render(hostdata))
fo.close
def createNetworkList(self):
fo = open(self.config['base_path'] + "networklist.html", "wb")
env = Environment(loader = FileSystemLoader(config['template_path']))
env.filters['len'] = self.lenFilter
template = env.get_template('networklist_template.html')
fo.write(template.render({'networklist': self.network_list}))
fo.close
def createNetworkPages(self):
for network, networkdata in self.network_list.iteritems():
self.createNetworkPage(network, networkdata)
def createNetworkPage(self, network, networkdata):
fo = open(self.config['network_page_path'] + str(network.cidr).replace('/', '_') + ".html", "wb")
env = Environment(loader = FileSystemLoader(config['template_path']))
env.filters['replace'] = self.replaceFilter
template = env.get_template('network_template.html')
fo.write(template.render({'network': network, 'data': networkdata}))
fo.close
def lenFilter(self, list):
return len(list)
def replaceFilter(self, str, old, new):
return str(str).replace(old, new)
# main program
inv = Inventorizer(config)