summaryrefslogtreecommitdiff
path: root/tasks/snmp_agent_uptime/task.py
diff options
context:
space:
mode:
Diffstat (limited to 'tasks/snmp_agent_uptime/task.py')
-rw-r--r--tasks/snmp_agent_uptime/task.py224
1 files changed, 224 insertions, 0 deletions
diff --git a/tasks/snmp_agent_uptime/task.py b/tasks/snmp_agent_uptime/task.py
new file mode 100644
index 0000000..919fcb4
--- /dev/null
+++ b/tasks/snmp_agent_uptime/task.py
@@ -0,0 +1,224 @@
+# kpov_util should be imported by add_assignment.py
+
+# TODO: finish this.
+instructions = {
+ 'si': '''\
+<p>
+Postavi tri navidezne računalnike: <em>SimpleArbiter</em>, <em>SNMPServer</em> in <em>SNMPClient</em>.
+
+<p>
+Napiši program <code>upminutes</code>, ki bo izpisal v minutah, koliko časa je racunalnik vklopljen. Postavi ga na <em>SNMPClient</em> v domači imenik uporabnika <code>test</code> z geslom <code>test</code>.
+
+<p>
+Poskrbi, da bo strežnik SNMP pod OID
+
+<pre><code>{{SNMP_UPTIME_OID}}</code></pre>
+
+<p>
+sporočal, koliko časa je vklopljen v sekundah.
+
+<p>
+Napiši skripto, poimenovano <code>beri.sh</code>, ki prek SNMP prebere vrednost s <em>simpleArbiterDhcpGWSNMP</em> na OID
+
+<pre><code>{{SNMP_CLIENT_OID}}</code></pre>
+
+<p>
+kot član skupnosti <code>testers</code>. Postavi jo na <em>SNMPClient</em>, v domači imenik uporabnika <code>test</code>. Poskrbi, da bodo podatki na SNMPServer dostopni za skupino (angl. <em lang="en">community</em>) <code>studentje</code>.
+''',
+ 'en': '''\
+<p>
+Set up three virtual computers: <em>SimpleArbiter</em>, <em>SNMPServer</em> and <em>SNMPClient</em>.
+
+<p>
+Write a program called <code>upminutes</code>. This program should output the uptime of the computer in minutes. Set it up on <em>SNMPClient</em> in the home directory of the user <code>test</code> with the password <code>test</code>.
+
+<p>
+Make sure that the SNMP server reports its uptime in seconds over SNMP under OID
+
+<pre><code>{{SNMP_UPTIME_OID}}</code></pre>
+
+<p>
+Write a script called <code>beri.sh</code> that reads the value from the OID
+
+<pre><code>{{SNMP_CLIENT_OID}}</code></pre>
+
+<p>
+on <em>simpleArbiterDhcpGWSNMP</em> as a member of the community <code>testers</code>. Set it up on <em>SNMPClient</em> in the home directory of the user <code>test</code>. Make all the data available over SNMP readable by the community <code>studentje</code>.
+''',
+}
+
+computers = {
+ 'SNMPClient': {
+ 'disks': [
+ { 'name': 'student-SNMPClient',
+
+ },
+ ],
+ 'network_interfaces': [{'network': 'net1'}],
+ 'flavor': 'm1.tiny',
+ 'config_drive': False
+ },
+ 'SNMPServer': {
+ 'disks': [
+ { 'name': 'student-SNMPServer',
+ },
+ ],
+ 'network_interfaces': [{'network': 'net1'}],
+ 'flavor': 'm1.tiny',
+ 'config_drive': False
+
+ },
+
+ 'SimpleArbiter': {
+ 'disks': [
+ { 'name': 'simpleArbiterDhcpGWSNMP',
+ },
+ ],
+ 'network_interfaces': [{'network': 'net1'}, {'network': 'test-net'}],
+ 'flavor': 'm1.tiny',
+ 'config_drive': False
+ }
+}
+
+networks = { 'net1': {'public': False}, 'test-net': {'public': True} }
+
+params_meta = {
+ 'SNMP_VALUE': {'descriptions': {'si': 'Vrednost, dostopna prek SNMP', 'en': 'The value available over SNMP'}, 'w': False, 'public':False, 'type': 'short', 'generated': True},
+ 'SNMP_UPTIME_OID': {'descriptions': {'si': 'SNMP_UPTIME_OID (za uptime)', 'en': 'SNMP_UPTIME_OID (for the uptime)'}, 'w': False, 'public':True, 'type': 'str', 'generated': True},
+ 'SNMP_CLIENT_OID': {'descriptions': {'si': 'SNMP_CLIENT_OID, ki naj ga klient bere', 'en':'The OID that the client should read'}, 'w': False, 'public':True, 'type': 'OID', 'generated': True},
+ 'SERVER_IP': {'descriptions': {'si': 'IP SNMP strežnika', 'en':'IP of the SNMP server'}, 'w': True, 'public':True, 'type': 'IP', 'generated': False},
+ 'CLIENT_IP': {'descriptions': {'si': 'IP SNMP klienta', 'en': 'IP of the SNMP client'}, '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='student', password='vaje')
+ 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()
+ r = random.Random(user_id)
+ # You can also create an OID creation function in kpov_util.
+ # this should probably return params_meta
+
+ #<== Aleksander Fujs 6310020 ==>
+ params['SNMP_VALUE'] = kpov_util.alnum_gen(r, 64)
+ params['SNMP_UPTIME_OID'] = 'NET-SNMP-EXTEND-MIB::nsExtendOutLine."{}".1'.format(
+ kpov_util.hostname_gen(r))
+ params['SNMP_CLIENT_OID'] = '1.3.6.1.4.1.8072.2.9999.9999.{}'.format(
+ r.randint(0, 255))
+ #<== Aleksander Fujs 6310020 ==>
+
+ return params
+
+def task_check(results, params):
+ #TODO improve regex
+ import re
+ score = 0
+ hints = []
+ 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 < 62:
+ score += 3
+ else:
+ hints += ["client uptime script output wrong."]
+ 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 as e:
+ pass
+ if len(lines) <= 50 and found_uptime:
+ score += 3
+ else:
+ hints += ["Uptime not found in server's MDB"]
+ if results['client_script2'].find(params['SNMP_VALUE']) >= 0:
+ score += 4
+ else:
+ hints += ["beri.sh not working properly"]
+ return score, hints
+
+def prepare_disks(templates, task_params, global_params):
+# d = templates['simpleArbiterDhcp']
+ prog = """#!/usr/bin/python
+import sys
+action = sys.argv[1]
+oid = sys.argv[2]
+
+foo_oid = ".{oid}"
+foo_oid_start = foo_oid[:foo_oid.rfind('.')]
+foo_oid_end = foo_oid[len(foo_oid_start)+1:]
+oid_end = oid[len(foo_oid_start)+1:]
+oid_start = oid[:len(foo_oid_start)]
+
+if action == '-n' and (
+ (oid_start == foo_oid_start) and (
+ (len(oid_end) == 0) or (int(oid_end) < int(foo_oid_end))
+ )
+ ):
+ oid = foo_oid
+
+if action != '-s' and oid == foo_oid:
+ print foo_oid
+ print "string"
+ print "{val}"
+""".format(oid = task_params['SNMP_CLIENT_OID'], val = task_params['SNMP_VALUE'])
+ templates['simpleArbiterDhcpGWSNMP'].write('/usr/local/bin/snmpext.py', prog)
+ templates['simpleArbiterDhcpGWSNMP'].chmod(0o755, '/usr/local/bin/snmpext.py')
+ write_default_config(templates['simpleArbiterDhcpGWSNMP'], global_params)