-
Notifications
You must be signed in to change notification settings - Fork 2
/
emcisilon_snapshot.py
128 lines (109 loc) · 4.57 KB
/
emcisilon_snapshot.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#!/bin/env python
# Needs Net-SNMP Python bindings
from optparse import OptionParser
import sys
import os
import netsnmp
import pickle
import socket
import struct
import time
os.environ['MIBS'] = 'all' # install F5 mibs in net-snmp mibs directory
# usually /usr/share/snmp/mibs
package = ([])
def fetchOID(host, community, graphiteroot, emcSnapshot, verbose):
if verbose:
print >> sys.stderr, 'connecting to host: %s using community: %s' % ( host, community )
statsTable = {
'quotaUsage': '.1.3.6.1.4.1.12124.1.13.3.1.5'
}
snmp = netsnmp.Session(DestHost=host, Version=2, Community=community)
# connect and fetch the list of isilon disks
emcSnapshotList = '.1.3.6.1.4.1.12124.1.13.3.1.2'
Var = netsnmp.Varbind(emcSnapshotList)
Vars = netsnmp.VarList(Var)
snmp.walk(Vars)
currentTime = time.time()
for vs in Vars:
# vs.iid = the index of the zone
# vs.tag = leaf identifier e.g. 'zone name
# vs.val = name of virtual server
# vs.type = snmp data type, e.g. counter, integer, etc
# if we specified a list of zones
# make sure we filter on those
if emcSnapshot:
if vs.val not in emcSnapshot:
continue
#import pdb;pdb.set_trace()
for type in statsTable:
try:
oid = statsTable[type] + "." + vs.iid
head, tail = oid.rsplit('.', 1)
vars = netsnmp.VarList(netsnmp.Varbind(head, tail))
result = [x[0] for x in snmp.get(vars)]
result = float(x)
if verbose:
print >> sys.stderr, '%s %s = %s' % (vs.val, type, result)
#currentTime = time.time()
datapoint = '%s.%s.%s' % (graphiteroot, vs.val.replace(' ',''), type)
package.append((datapoint, (currentTime, result)))
except Exception as uhoh:
print >> sys.stderr, "could not get oid: %s" % uhoh
#sys.exit(1)
return package, currentTime, result
def makePickle(datapoint, currentTime, data, verbose, debug):
if debug:
print >> sys.stderr, 'storing pickle in \'data.p\''
fh = open('data.p', 'wb')
pickle.dump(package, fh)
sys.exit()
shippingPackage = pickle.dumps(package, 1)
return shippingPackage
def sendPickle(carbonServer, carbonPort, shippingPackage, verbose):
packageSize = struct.pack('!L', len(shippingPackage))
if verbose:
print >> sys.stderr, 'connecting to carbon server: %s on port: %s' % ( carbonServer, carbonPort )
try:
s = socket.socket()
s.connect((carbonServer, carbonPort))
s.sendall(packageSize)
s.sendall(shippingPackage)
if verbose:
print >> sys.stderr, 'sending pickle...'
except Exception as uhoh:
print "Could not connect to carbon server: %s" % uhoh
sys.exit(1)
def main():
parser = OptionParser()
parser.add_option('-H', '--host', dest='host',
help='Hostname/IP of the network device')
parser.add_option('-c', '--community', dest='community',
help='SNMP v2c community string to use')
parser.add_option('-b', '--emcSnapshot', dest='emcSnapshot',
action='append',
help='list of emcSnapshots to fetch, if not specified will fetch entire list')
parser.add_option('-G', '--graphite-root', dest='graphiteroot',
help='root of the tree to use in Graphite')
parser.add_option('-S', '--carbon-server', dest='carbonserver',
default='127.0.0.1',
help='set the server to send the pickle to. Default: 127.0.0.1')
parser.add_option('-p', '--carbon-port', dest='carbonport',
default='2004',
type='int',
help='carbon port. Default: 2004')
parser.add_option('-v', '--verbose', dest='verbose',
action='store_true',
help='enable verbose output')
parser.add_option('-d', '--debug', dest='debug',
action='store_true',
help='do not submit to carbon. Output the pickle as file \'data.p\' in current directory')
options, args = parser.parse_args()
if not options.host or not options.community:
parser.print_help()
sys.exit()
#party time
package, currentTime, result = fetchOID(options.host, options.community, options.graphiteroot, options.emcSnapshot, options.verbose)
shippingPackage = makePickle(package, currentTime, result, options.verbose, options.debug)
sendPickle(options.carbonserver, options.carbonport, shippingPackage, options.verbose)
if __name__ == '__main__':
main()