Skip to content

Commit 1d35de1

Browse files
authored
Merge pull request cbabs#1 from seismiccollision/master
Looks good. Thanks for the improvement.
2 parents 036de4d + a2e378e commit 1d35de1

File tree

2 files changed

+58
-12
lines changed

2 files changed

+58
-12
lines changed

swinds.ini

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[solarwinds]
2+
npm_server = 10.10.10.10
3+
npm_user = ansible
4+
npm_password = password

swinds.py

100644100755
+54-12
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
to something public.
2828
2929
'''
30-
import simplejson
3130
import argparse
31+
import ConfigParser
3232
import requests
3333
import re
3434

@@ -38,24 +38,38 @@
3838
import simplejson as json
3939

4040

41+
config_file = 'swinds.ini'
42+
43+
# Get configuration variables
44+
config = ConfigParser.ConfigParser()
45+
config.readfp(open(config_file))
46+
47+
48+
4149
# Orion Server IP or DNS/hostname
42-
server = '10.10.10.10'
50+
server = config.get('solarwinds', 'npm_server')
4351
# Orion Username
44-
user = 'ansible'
52+
user = config.get('solarwinds', 'npm_user')
4553
# Orion Password
46-
password = 'password'
54+
password = config.get('solarwinds', 'npm_password')
4755
# Field for groups
48-
groupField = 'Vendor'
56+
groupField = 'GroupName'
4957
# Field for host
50-
hostField = 'IPAddress'
58+
hostField = 'SysName'
59+
60+
payload = "query=SELECT C.Name as GroupName, N.SysName FROM Orion.Nodes as N JOIN Orion.ContainerMemberSnapshots as CM on N.NodeID = CM.EntityID JOIN Orion.Container as C on CM.ContainerID=C.ContainerID WHERE CM.EntityDisplayName = 'Node' AND N.Vendor = 'Cisco'"
61+
62+
use_groups = True
63+
parentField = 'ParentGroupName'
64+
childField = 'ChildGroupName'
5165

66+
group_payload = "query=SELECT C.Name as ParentGroupName, CM.Name as ChildGroupName FROM Orion.ContainerMemberSnapshots as CM JOIN Orion.Container as C on CM.ContainerID=C.ContainerID WHERE CM.EntityDisplayName = 'Group'"
5267

53-
payload = "query=SELECT+" + hostField + "+," + groupField + "+FROM+Orion.Nodes"
68+
#payload = "query=SELECT+" + hostField + "+," + groupField + "+FROM+Orion.Nodes"
5469
url = "https://"+server+":17778/SolarWinds/InformationService/v3/Json/Query"
5570
req = requests.get(url, params=payload, verify=False, auth=(user, password))
5671

5772
jsonget = req.json()
58-
# json_resp = json.loads(req)
5973

6074

6175
class SwInventory(object):
@@ -74,6 +88,9 @@ def __init__(self):
7488
# Called with `--list`.
7589
if self.args.list:
7690
self.inventory = self.get_list()
91+
if use_groups:
92+
self.groups = self.get_groups()
93+
self.add_groups_to_hosts(self.groups)
7794
# Called with `--host [hostname]`.
7895
elif self.args.host:
7996
# Not implemented, since we return _meta info `--list`.
@@ -83,25 +100,50 @@ def __init__(self):
83100
self.inventory = self.empty_inventory()
84101

85102
print(json.dumps(self.inventory, indent=2))
86-
87103
def get_list(self):
88104
hostsData = jsonget
89-
dumped = eval(simplejson.dumps(jsonget))
105+
dumped = eval(json.dumps(jsonget))
90106

91107
# Inject data below to speed up script
92108
final_dict = {'_meta': {'hostvars': {}}}
93109

94110
# Loop hosts in groups and remove special chars from group names
95111
for m in dumped['results']:
96-
# Allow Upper/lower letters and numbers. Remove everything else
97-
m[groupField] = re.sub('[^A-Za-z0-9]+', '', m[groupField])
112+
# Allow Upper/lower letters and numbers. Replace everything else with underscore
113+
m[groupField] = self.clean_inventory_item(m[groupField])
98114
if m[groupField] in final_dict:
99115
final_dict[m[groupField]]['hosts'].append(m[hostField])
100116
else:
101117
final_dict[m[groupField]] = {'hosts': [m[hostField]]}
118+
return final_dict
102119

120+
#if self.args.groups:
121+
def get_groups(self):
122+
req = requests.get(url, params=group_payload, verify=False, auth=(user, password))
123+
hostsData = req.json()
124+
dumped = eval(json.dumps(hostsData))
125+
126+
parentField = 'ParentGroupName'
127+
childField = 'ChildGroupName'
128+
final_dict = {}
129+
for m in dumped['results']:
130+
# Allow Upper/lower letters and numbers. Replace everything else with underscore
131+
m[parentField] = self.clean_inventory_item(m[parentField])
132+
m[childField] = self.clean_inventory_item(m[childField])
133+
if m[parentField] in final_dict:
134+
final_dict[m[parentField]]['children'].append(m[childField])
135+
else:
136+
final_dict[m[parentField]] = {'children': [m[childField]]}
103137
return final_dict
104138

139+
def add_groups_to_hosts (self, groups):
140+
self.inventory.update(groups)
141+
142+
@staticmethod
143+
def clean_inventory_item(item):
144+
item = re.sub('[^A-Za-z0-9]+', '_', item)
145+
return item
146+
105147
# Empty inventory for testing.
106148
def empty_inventory(self):
107149
return {'_meta': {'hostvars': {}}}

0 commit comments

Comments
 (0)