Code: Alles auswählen
from pysnmp.entity.rfc3413.oneliner import cmdgen
from pysnmp.proto import rfc1902
from datetime import timedelta
from webtools.blras01.models import MIB,User
class StatFile(object):
def __init__(self,file):
self.users = {}
self.errorMsg = None
self.colors = [
'#f00',
'#ff3200',
'#ff6400',
'#ff9600',
'#ffc800'
]
self.readStatFile(file)
self.updateDB()
def readStatFile(self,file):
try:
f = open(file,"r")
except IOError, error:
self.errorMsg = error
else:
for line in f:
if 'ISDN-6-DISCONNECT' in line:
tmp = line.strip().replace(',','').split()
username = tmp[-5]
uptime = tmp[-2]
if not self.users.has_key(username):
self.users[username] = [int(uptime),1]
else:
# add the current uptime to total uptime
self.users[username][0] = self.users[username][0] + int(uptime)
# increase login counter
self.users[username][1] += 1
f.close()
def userExists(self,user,names):
"""checks if the user exists in the database"""
if user in names:
return True
else:
return False
def updateDB(self):
"""if a user doesn't exist in the database, insert the new user into the DB"""
names = []
if self.users:
all_users = User.objects.all()
if all_users:
names = [ u.name for u in all_users ]
for user in self.users:
if not self.userExists(user,names):
new_user = User()
new_user.name = user
new_user.uptime = self.users[user][0]
new_user.save()
def getSortedByUptime(self):
"""returns a list of users found in the logfile, sorted by uptime"""
sortedUsers = None
if self.users:
for user in self.users:
# format all time info into human readable code
self.users[user][0] = timedelta(seconds=self.users[user][0])
# sort by uptime
sortedUsers = sorted(self.users.items(), reverse=True, key=lambda (k,v): (v,k))
if sortedUsers:
colorIterator = iter(self.colors)
for u in sortedUsers:
# try to get user data from database, set fullname if user exists
try:
userObject = User.objects.get(name=u[0])
except:
pass
else:
u[0] = userObject.fullname
# set color string
try:
u[1].append(colorIterator.next())
except StopIteration:
u[1].append('#000')
return (self.errorMsg,sortedUsers)
##########################################################################################
# SNMP
##########################################################################################
def getSNMPValue(host,comm,oid):
return cmdgen.CommandGenerator().getCmd(
cmdgen.CommunityData('my-agent', comm , 1),
cmdgen.UdpTransportTarget((host, 161)),
tuple([int(n) for n in oid.split('.')]))
def getNextSNMPValue(host,comm,mib):
return cmdgen.CommandGenerator().nextCmd(
cmdgen.CommunityData('my-agent', comm , 1),
cmdgen.UdpTransportTarget((host, 161)),
tuple([int(n) for n in mib.oid.split('.')]))
##########################################################################################
# get online users
##########################################################################################
def getOnlineUsers():
# variables
users = []
# check for logged in users
online_users_mib = MIB.objects.get(shortName='blras01_online_users')
user_uptime_mib = MIB.objects.get(shortName='blras01_user_uptime')
errorIndication, errorStatus, errorIndex, varBindTable = getNextSNMPValue('blras01','xxxxxxxx',online_users_mib)
if not errorIndication:
if varBindTable:
for vrow in varBindTable:
user_name = vrow[0][1]
user_fullname = ""
userObject = User.objects.get(name=user_name)
if userObject:
user_fullname = userObject.fullname
user_id = vrow[0][0][-2]
user_uptime = "nix"
errorIndication2, errorStatus2, errorIndex2, varBinds2 = getSNMPValue('blras01','xxxxxxxx',user_uptime_mib.oid+str(user_id)+".0")
if errorIndication2:
user_uptime = "Nix"
user_uptime = int(varBinds2[0][1])
# convert TimeTick to human readable text string
d, m = divmod(user_uptime, 8640000)
uptime_str = '%d days,<br/>' % d
d, m = divmod(m, 360000)
uptime_str += '%d:' % d
d, m = divmod(m, 6000)
uptime_str += '%02d:' % d
d, m = divmod(m, 100)
uptime_str += '%02d' % d
users.append((user_name,user_fullname,user_id,uptime_str))
return (errorIndication,users)
def getIgnoreUsers():
lala = User.objects.filter(isIgnored=True).order_by('name')
test = [ l.name for l in lala ]
return lala
Code: Alles auswählen
if sortedUsers:
colorIterator = iter(self.colors)
for u in sortedUsers:
# try to get user data from database, set fullname if user exists
try:
userObject = User.objects.get(name=u[0])
except:
pass
else:
u[0] = userObject.fullname
# set color string
try:
u[1].append(colorIterator.next())
except StopIteration:
u[1].append('#000')
Code: Alles auswählen
u[0] = userObject.fullname
Bekomme dann immer folgenden Error:
Was mache ich denn falsch?TypeError: object does not support item assignment
sortedUsers ist doch eine Liste, also sollte ich doch u[0] zuweisen können, weiter unten klappt es doch auch (u[1].append(colorIterator.next())).
Ich gehe wohl besser mal ins Bett, vielleicht fällt mir morgen der Fehler selber auf...