27
27
to something public.
28
28
29
29
'''
30
- import simplejson
31
30
import argparse
31
+ import ConfigParser
32
32
import requests
33
33
import re
34
34
38
38
import simplejson as json
39
39
40
40
41
+ config_file = 'swinds.ini'
42
+
43
+ # Get configuration variables
44
+ config = ConfigParser .ConfigParser ()
45
+ config .readfp (open (config_file ))
46
+
47
+
48
+
41
49
# Orion Server IP or DNS/hostname
42
- server = '10.10.10.10'
50
+ server = config . get ( 'solarwinds' , 'npm_server' )
43
51
# Orion Username
44
- user = 'ansible'
52
+ user = config . get ( 'solarwinds' , 'npm_user' )
45
53
# Orion Password
46
- password = 'password'
54
+ password = config . get ( 'solarwinds' , 'npm_password' )
47
55
# Field for groups
48
- groupField = 'Vendor '
56
+ groupField = 'GroupName '
49
57
# 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'
51
65
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'"
52
67
53
- payload = "query=SELECT+" + hostField + "+," + groupField + "+FROM+Orion.Nodes"
68
+ # payload = "query=SELECT+" + hostField + "+," + groupField + "+FROM+Orion.Nodes"
54
69
url = "https://" + server + ":17778/SolarWinds/InformationService/v3/Json/Query"
55
70
req = requests .get (url , params = payload , verify = False , auth = (user , password ))
56
71
57
72
jsonget = req .json ()
58
- # json_resp = json.loads(req)
59
73
60
74
61
75
class SwInventory (object ):
@@ -74,6 +88,9 @@ def __init__(self):
74
88
# Called with `--list`.
75
89
if self .args .list :
76
90
self .inventory = self .get_list ()
91
+ if use_groups :
92
+ self .groups = self .get_groups ()
93
+ self .add_groups_to_hosts (self .groups )
77
94
# Called with `--host [hostname]`.
78
95
elif self .args .host :
79
96
# Not implemented, since we return _meta info `--list`.
@@ -83,25 +100,50 @@ def __init__(self):
83
100
self .inventory = self .empty_inventory ()
84
101
85
102
print (json .dumps (self .inventory , indent = 2 ))
86
-
87
103
def get_list (self ):
88
104
hostsData = jsonget
89
- dumped = eval (simplejson .dumps (jsonget ))
105
+ dumped = eval (json .dumps (jsonget ))
90
106
91
107
# Inject data below to speed up script
92
108
final_dict = {'_meta' : {'hostvars' : {}}}
93
109
94
110
# Loop hosts in groups and remove special chars from group names
95
111
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 ])
98
114
if m [groupField ] in final_dict :
99
115
final_dict [m [groupField ]]['hosts' ].append (m [hostField ])
100
116
else :
101
117
final_dict [m [groupField ]] = {'hosts' : [m [hostField ]]}
118
+ return final_dict
102
119
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 ]]}
103
137
return final_dict
104
138
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
+
105
147
# Empty inventory for testing.
106
148
def empty_inventory (self ):
107
149
return {'_meta' : {'hostvars' : {}}}
0 commit comments