From 457033d6bbedc395fcd844bac2d06b7cae3d1cbe Mon Sep 17 00:00:00 2001 From: "gasperfele@fri1.uni-lj.si" Date: Thu, 12 Feb 2015 10:16:51 +0000 Subject: Task smb_client_uptime done. git-svn-id: https://svn.lusy.fri.uni-lj.si/kpov-public-svn/kpov-public@273 5cf9fbd1-b2bc-434c-b4b7-e852f4f63414 --- kpov_judge/tasks/snmp_agent_uptime/task.py | 228 ++++++++++++++++------------- kpov_judge/test_prepare_disks.py | 5 + 2 files changed, 133 insertions(+), 100 deletions(-) diff --git a/kpov_judge/tasks/snmp_agent_uptime/task.py b/kpov_judge/tasks/snmp_agent_uptime/task.py index 13abf92..53a1ac3 100644 --- a/kpov_judge/tasks/snmp_agent_uptime/task.py +++ b/kpov_judge/tasks/snmp_agent_uptime/task.py @@ -7,7 +7,7 @@ instructions = { 'si':u""" Naloga: Postavi tri navidezne racunalnike: -- SimpleArbiter s sliko diska simpleArbiterDhcp, +- SimpleArbiter s sliko diska simpleArbiterDhcpGW, - SNMPServer in - SNMPClient. Napiši program upminutes, ki bo izpisal v minutah koliko casa je racunalnik @@ -16,15 +16,17 @@ vklopljen. Postavi ga na SNMPClient v domaci imenik uporabnika test z geslom test. Poskrbi, da bo SNMP strežnik prek SNMP pod -NET-SNMP-EXTEND-MIB::nsExtendOutpucd k t2Table sporocal, koliko casa je vklopljen +SNMP_UPTIME_OID sporočal, koliko casa je vklopljen v sekundah. Napiši skripto, poimenovano beri.sh, ki prek SNMP prebere vrednost s strežnika - SNMPServer na OID 1.3.6.1.4.1.8072.1.3.2.4.1.4. + SNMPServer na OID SNMP_CLIENT_OID + Postavi jo na SNMP klienta, v domaci imenik uporabnika test z geslom test. -Navodila za ostale metode pa so obarvana rdece oz. komentirana z # +Poskrbi, da bodo podatki na SNMPServer dostopni za skupino (community) studentje. +Parametra SNMP_UPTIME_OID in SNMP_CLIENT_OID lahko dobiš na SimpleArbiter. """, 'en':u""" Set up three virtual computers, SimpleArbiter with the disk image simpleArbiterDhcp, @@ -33,10 +35,12 @@ the uptime of the computer in minutes. Set it up on SNMPClient in the home direc of the user test with the password test. Make sure that the SNMP server reports it's uptime in seconds over SNMP under -NET-SNMP-EXTEND-MIB::nsExtendOutput2Table . +SNMP_UPTIME_OID . -Write a script called beri.sh that reads the value from the OID 1.3.6.1.4.1.8072.1.3.2.4.1.4. +Write a script called beri.sh that reads the value from the OID SNMP_CLIENT_OID on SNMPServer. Set it up on SNMPClient in the home directory of the user test. + +Make all the data available over SNMP readable by the "studentje" community. """ } @@ -74,7 +78,7 @@ computers = { 'SimpleArbiter': { 'disks': [ - { 'name': 'simpleArbiterDhcp', + { 'name': 'simpleArbiterDhcpGW', # attempt automount }, #{ 'name': 'CDROM', @@ -90,103 +94,127 @@ computers = { networks = { 'net1': {'public': False}, 'test-net': {'public': True} } -params_meta = {'SNMP_VALUE': {'descriptions': {'si': 'Vrednost, dostopna prek SNMP'}, 'w': False, 'public':True, 'type': 'number', 'generated': True}, 'SNMP_OID_ON_SERVER': {'descriptions': {'si': 'OID, na katerem je vrednost dostopna'}, 'w': False, 'public':True, 'type': 'str', 'generated': True}, 'SNMP_OID_ON_CLIENT': {'descriptions': {'si': 'OID, ki naj ga klient bere'}, 'w': False, 'public':True, 'type': 'OID', 'generated': True}, } - -def task(SNMP_VALUE, SNMP_OID_ON_SERVER, SNMP_OID_ON_CLIENT): - #<== Aleksander Fujs 6310020 ==> - # TODO popravi IPje - import netsnmp - from paramiko import SSHClient - return_results = {} - - client = SSHClient() - client.load_system_host_keys() - client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) - - client.connect('10.173.146.199', username='root', password='kaboom') - stdin, stdout, stderr = client.exec_command('uptime=$( - - # TODO (polz) start working on this. If gen_params doesn't yet work, change it to set the parameter values manually - # run cpu temp script on client - # run SNMP read SNMP_OID_ON_CLIENT script on client - # read data on SNMP_OID_ON_CLIENT - # read data from SNMP server - #import netsnmp - #session = netsnmp.Session(DestHost=SNMP_VALUE['type'],Version=2,Community='public') - #Dobimo vrednost casa - #vars=netsnmp.Varbind(SNMP_OID_ON_SERVER['type']) - #Shranimo vrednost casa v imenik od SNMP_OID_ON_SERVER - #var=netsnmp.Varbind(SNMP_OID_ON_SERVER['decdscriptions'['si'],'0',session.get(vars),SNMP_OID_ON_SERVER['type']) - #netsnmp.snmpset(var,Version=2,DestHost=SNMP_VALUE['type'],Community='public') - - - #return session.get(vars) - return 0 +params_meta = { + 'SNMP_VALUE': {'descriptions': {'si': 'Vrednost, dostopna prek SNMP'}, 'w': False, 'public':False, 'type': 'short', 'generated': True}, + 'SNMP_UPTIME_OID': {'descriptions': {'si': 'SNMP_UPTIME_OID (za uptime)'}, 'w': False, 'public':True, 'type': 'str', 'generated': True}, + 'SNMP_CLIENT_OID': {'descriptions': {'si': 'SNMP_CLIENT_OID, ki naj ga klient bere'}, 'w': False, 'public':True, 'type': 'OID', 'generated': True}, + 'SERVER_IP': {'descriptions': {'si': 'IP SNMP strežnika'}, 'w': True, 'public':True, 'type': 'IP', 'generated': False}, + 'CLIENT_IP': {'descriptions': {'si': 'IP SNMP klienta'}, 'w': True, 'public':True, 'type': 'IP', 'generated': False}, + +} + +def task(SERVER_IP, CLIENT_IP, SNMP_UPTIME_OID, SNMP_CLIENT_OID): + #<== Aleksander Fujs 6310020 ==> + # TODO popravi IPje + import netsnmp + import paramiko + from paramiko import SSHClient + return_results = {} + + client = SSHClient() + client.load_system_host_keys() + client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + + client.connect(SERVER_IP, username='root', password='kaboom') + stdin, stdout, stderr = client.exec_command('uptime=$( + def gen_params(user_id, params_meta): - import random - params = dict() - # TODO (polz) this is wrong. Try something like: - r = random.Random(user_id) - #params['SNMP_VALUE'] = r.randint(0, 255) - #params_meta['SNMP_OID_ON_SERVER'] = '1.3.6.1.4.1.8072.1.3.2.4.1.4' - #params_meta['SNMP_OID_ON_CLIENT'] = '1.3.6.1.4.1.8072.1.3.2.4.1.4.' - # You can also create an OID creation function in kpov_random_helpers. - # this should probably return params_meta - - #<== Aleksander Fujs 6310020 ==> - #TODO better random value - params['SNMP_VALUE'] = str(r.randint(0, 255)) - params['SNMP_OID_ON_SERVER'] = 'NET-SNMP-EXTEND-MIB::nsExtendOutput2Table' - #TODO possible upgrade for last number to bi random between 0 and 255 - params['SNMP_OID_ON_CLIENT'] = '1.3.6.1.4.1.8072.1.3.2.4.1.4' - #<== Aleksander Fujs 6310020 ==> - - return params + import random + params = dict() + r = random.Random(user_id) + # You can also create an OID creation function in kpov_random_helpers. + # this should probably return params_meta + + #<== Aleksander Fujs 6310020 ==> + params['SNMP_VALUE'] = kpov_random_helpers.alnum_gen(r, 64) + params['SNMP_UPTIME_OID'] = 'NET-SNMP-EXTEND-MIB::nsExtendOutLine."{}".1'.format( + kpov_random_helpers.hostname_gen(r)) + params['SNMP_CLIENT_OID'] = '1.3.6.1.4.1.8072.9999.9999.{}'.format( + r.randint(0, 255)) + #<== Aleksander Fujs 6310020 ==> + + return params def task_check(results, params): - #TODO improve regex - import re - score = 0 - print results - if re.search(results['client_script'][0].strip(), results['client_uptime'][0].strip()): - score += 3 - #TODO +- second or two of allowed error time - if re.search(results['server_OID'].split(':')[1].strip(), results['server_uptime'][0].strip()): - score += 3 - - print results['server_uptime'][0].strip() - print results['server_OID'].split(':')[1].strip() - print score - return score + #TODO improve regex + import re + score = 0 + client_script_uptime = int(results['client_script'].strip()) + client_uptime = int(results['client_uptime'].strip()) + d = client_uptime - client_script_uptime*60 + if d >= 0 and d < 60: + score += 3 + server_uptime = int(results['server_uptime'].strip()) + lines = results['server_OID'].split('\n') + unique_part_start = params['SNMP_UPTIME_OID'].find('"') + unique_part_end = params['SNMP_UPTIME_OID'].find('"', unique_part_start+1) + unique_part = params['SNMP_UPTIME_OID'][unique_part_start+1:unique_part_end] + server_oid = 'iso.3.6.1.4.1.8072.1.3.2.4.1.2.{}.'.format(len(unique_part)) + server_oid += '.'.join([str(ord(i)) for i in unique_part]) + '.1.' + found_uptime = False + for line in lines: + try: + oid, uptime_s = line.split(':') + d = server_uptime - int(uptime_s.strip()) + if oid.strip() == server_oid and d >= -2 and d <= 5: + found_uptime = True + break + except Exception, e: + pass + if len(lines) <= 10 and found_uptime: + score += 3 + if results['client_script2'].find(params['SNMP_VALUE']) >= 0: + score += 4 + print score + return score def prepare_disks(templates, params): # d = templates['simpleArbiterDhcp'] - pass + prog = """#!/usr/bin/python +import sys +oid = sys.argv[2] +action = sys.argv[1] +if action == '-g' and oid == ".{oid}": + print ".{oid}" + print "string" + print "{val}" +elif action == '-n' and oid < ".{oid}": + print ".{oid}" + print "string" + print "{val}" +""".format(oid = params['SNMP_CLIENT_OID'], val = params['SNMP_VALUE']) + templates['SNMPServer'].write('/usr/local/bin/snmpext.py', prog) + templates['SNMPServer'].chmod('766', '/usr/local/bin/snmpext.py') diff --git a/kpov_judge/test_prepare_disks.py b/kpov_judge/test_prepare_disks.py index 963f5cd..0e9aaac 100755 --- a/kpov_judge/test_prepare_disks.py +++ b/kpov_judge/test_prepare_disks.py @@ -22,6 +22,11 @@ class SSHGuestFs: client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(hostname, username=username, password=password) self.conn = client + def __del__(self): + try: + self.conn.close() + except: + pass def chmod(self, mode, path): self.conn.exec_command('chmod {} "{}"'.format(mode, path)) def chown(self, owner, group, path): -- cgit v1.2.1