summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgasperfele@fri1.uni-lj.si <gasperfele@fri1.uni-lj.si@5cf9fbd1-b2bc-434c-b4b7-e852f4f63414>2015-02-12 10:16:51 +0000
committergasperfele@fri1.uni-lj.si <gasperfele@fri1.uni-lj.si@5cf9fbd1-b2bc-434c-b4b7-e852f4f63414>2015-02-12 10:16:51 +0000
commit457033d6bbedc395fcd844bac2d06b7cae3d1cbe (patch)
treeefcfaeea55036df5783c85d4b8ab2b6d53f224ed
parent0bd559d148746c2fd74536489080766f458a5dba (diff)
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
-rw-r--r--kpov_judge/tasks/snmp_agent_uptime/task.py228
-rwxr-xr-xkpov_judge/test_prepare_disks.py5
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=$(</proc/uptime); uptime=${uptime%%.*}; echo $uptime')
- return_results['server_uptime'] = stdout.readlines()
-
- try:
- session = netsnmp.Session(DestHost='10.173.146.199', Version=2, Community='studentje')
- results_objs = netsnmp.VarList(netsnmp.Varbind(SNMP_OID_ON_SERVER)) #117.112.116.105.109.101 <-uptime
- session.walk(results_objs)
- for result in results_objs:
- return_results['server_OID'] = ('%s.%s: %s') % (result.tag, result.iid, result.val)
- except Exception as exception_error:
- # Check for errors and print out results
- print ('ERROR: Occurred during SNMPget for OID %s from %s: '
- '(%s)') % (SNMP_OID_ON_SERVER, '10.173.146.194', exception_error)
- sys.exit(2)
-
-
- client.connect('10.173.146.194', username='test', password='test')
- stdin, stdout, stderr = client.exec_command('/bin/bash /home/test/upminutes.sh')
- #TODO preverit da ni v skripti hardcodan
- return_results['client_script'] = stdout.readlines()
- stdin, stdout, stderr = client.exec_command('uptime=$(</proc/uptime); uptime=${uptime%%.*}; echo $(( uptime/60 ))')
- return_results['client_uptime'] = stdout.readlines()
-
- #TODO add 3 part of assigement
- return return_results
-
-
- #<== Aleksander Fujs 6310020 ==>
-
- # 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=$(</proc/uptime); uptime=${uptime%%.*}; echo $uptime')
+ return_results['server_uptime'] = stdout.read()
+
+ try:
+ session = netsnmp.Session(DestHost=SERVER_IP, Version=2, Community='studentje')
+ # results_objs = netsnmp.VarList(netsnmp.Varbind(SNMP_UPTIME_OID)) #117.112.116.105.109.101 <-uptime
+ results_objs = netsnmp.VarList(netsnmp.Varbind('.1.3.6.1.4.1.8072.1.3.2.4.1.2')) #117.112.116.105.109.101 <-uptime
+ session.walk(results_objs)
+ result_list = []
+ for result in results_objs:
+ result_list.append('{}.{}: {}'.format(
+ result.tag, result.iid, result.val))
+ return_results['server_OID'] = "\n".join(result_list)
+ except Exception as exception_error:
+ # Check for errors and print out results
+ print ('ERROR: Occurred during SNMPget for OID %s from %s: '
+ '(%s)') % (SNMP_UPTIME_OID, CLIENT_IP, exception_error)
+ sys.exit(2)
+
+
+ client.connect(CLIENT_IP, username='test', password='test')
+ stdin, stdout, stderr = client.exec_command('uptime=$(</proc/uptime); uptime=${uptime%%.*}; echo $(( uptime ))')
+ return_results['client_uptime'] = stdout.read()
+ # zakaj bi morala biti ravno bash skripta?
+ stdin, stdout, stderr = client.exec_command('/home/test/upminutes')
+ #TODO preverit da ni v skripti hardcodan
+ return_results['client_script'] = stdout.read()
+
+ stdin, stdout, stderr = client.exec_command('/home/test/beri.sh')
+ return_results['client_script2'] = stdout.read()
+ #TODO add 3 part of assigement
+ return return_results
+ #<== Aleksander Fujs 6310020 ==>
+
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):