#!/usr/bin/env python # -*- coding: utf-8 -*- # kpov_random_helpers should be imported by add_assignment.py # TODO (polz): instructions = { 'si':u""" Prijavi se na sistem kot uporabnik student z geslom vaje. V domači mapi najdeš imenik Mapa z 20 datotekami. - Preimenuj vse datoteke tako, da zamenjaš minuse s podčrtaji - Napiši čim krajši ukaz v bash, ki vse datoteke iz enega (izvornega) podanega imenika premakne v drug (ciljni) podani imenik. Spravi ga v /home/student/mv_ukaz. Pazi, da bodo ob testiranju v izvornem imeniku iste datoteke, kot so bile, ko je bila virtualka nova, ciljni imenik pa bo prazen. - Napiši ukaz, ki s pomočjo ukaza grep v datoteko ~/mama.txt izpiše vse navadne (ne skrite) datoteke v trenutnem imeniku, ki vsebujejo niz "mama", v datoteko ~/napake.txt pa izpiše vse morebitne napake (npr. to, da so nekateri objekti v trenutnem imeniku dejansko imeniki ali napačne simbolične povezave). Ukaz spravite v datoteko /home/student/mama_ukaz. - Napiši program (lahko v bash), ki bo 5s sledil vsebini /var/log/syslog. V primeru, da se v syslogu pojavi niz "zmeda", naj program izpiše "imam ga". Poleg tega naj program med sledenjem syslog-u odšteva od 5 do 1 (vsako sekundo naj se izpiše naslednja številka. Program naj bo v /home/student/syslog_ukaz.sh - Nastavi okoljsko spremenljivko TEST, da bo imela isto vrednost kot okoljska spremenljivka USER + število okoljskih spremenljivk, ki v imenu ali vrednosti ne vsebujejo besede TEST. Primer: polz37 # tole je zoprno, ker se lahko zelo hitro spremeni. Treba bo izbrati # neko drugo stran - recimo http://localhost/mojastran.html - S pomočjo programa cURL preštej pojavitev niza "images" v html kodi (shranjena stran 24ur.com) in število zapiši v spremenljivko $images. - V imeniku "Mapa" najdeš datoteko count.txt. Preštej število vrstic v njej in rezultat zapiši v novo datoteko lines.txt - Namesti paket "cowsay" in ga preizkusi :) - Napiši najkrajši ukaz, ki s pomočjo Pythona zažene preprost (integriran) HTTP strežnik kateri streže datoteke iz imenika, ki ga dobite podanega. """, 'en':u""" Log into the system. In your home folder you will find a directory called Folder containing 20 files. - Rename all files replacing minus sign with the underscore - Specify the shortest command for copying all the files located in /home/user/Folder into the folder /home/user/new - Specify the shortest command, which will, using the grep command, write all normal (not hidden) files containing a string "mama" located in working directory (pwd) into file "mama.txt" while writing errors such as files in current directory being folders or symbolic links in the file called "Errors.txt" - Specify a command, which will track the contents of /var/log/syslog for 5s. In case it finds the entry "confusion" in syslog, print "got it". In addition, let the program subtrack 1 from the counter every second(5 to 1) to show the status of the tracker. - Set the variable TEST, which will have the same value as the variable USER + the number of variables that do not include the name TEST, for example polz37. - With the help of cURL count the number of "images" string occurences in html code (saved 24ur.com website) and save it to variable $images. - In directory "Mapa" exists file count.txt - Install packet "cowsay" and test it :) - Write shortest command possible which will with the help of Python start a simple (integrated) HTTP server and will serve the files from the current directory on port 8000.""" } computers = { 'malishell': { 'disks': [ { 'name': 'malishell', }, #{ 'name': 'CDROM', # 'options':{'readonly': True}, # 'parts': [],# no parts, no mounting. #} ], 'network_interfaces': [{'network': 'net1'}], 'flavor': 'm1.tiny', 'config_drive': False }, 'SimpleArbiter': { 'disks': [ { 'name': 'simpleArbiterDhcp', # attempt automount }, #{ 'name': 'CDROM', # 'options': {'readonly': True}, # 'parts': [{'dev': 'b1', 'path': '/cdrom'}], #}, ], 'network_interfaces': [{'network': 'net1'}, {'network': 'test-net'}], 'flavor': 'm1.tiny', 'config_drive': False } } networks = { 'net1': {'public': False}, 'test-net': {'public': True} } params_meta = { 'IP_malishell': {'descriptions': {'si': 'Naslov malishell'}, 'w': True, 'public':True, 'type': 'IP', 'generated': False}, 'file_creator_random_seed': {'descriptions': {'si': 'random file creator seed'}, 'w': False, 'public':False, 'type': None, 'generated': True}, 'file_rename_dirname': {'descriptions': {'si': 'imenik z datotekami, ki naj se jih preimenuje'}, 'w': False, 'public':True, 'type': 'dirname', 'generated': True}, 'mv_src_dir': {'descriptions': {'si': 'imenik, iz katerega premakni datoteke'}, 'w': False, 'public':True, 'type': 'dirname', 'generated': True}, 'mv_dst_dir': {'descriptions': {'si': 'imenik, v katerega premakni datoteke'}, 'w': False, 'public':True, 'type': 'dirname', 'generated': True}, 'cowsay_string': {'descriptions': {'si': 'Kaj rece krava?'}, 'w': False, 'public':True, 'type': 'short', 'generated': True}, 'syslog_n_zmeda': {'descriptions': {'si': 'st. zapisov zmeda v 5s'}, 'w': False, 'public':True, 'type': 'uint', 'generated': True}, } def task(IP_malishell, file_rename_dirname, mv_src_dir, mv_dst_dir, cowsay_string): import pxssh # TODO: (polz) this has to be changed! Get a move on! # # sv: Z primozem lavricem sva skusala nekaj narediti # Ker gen params ni narejen, sklepam da je "Mapa" na namizju, # imena datotek pa so: 1,1-,2,2-,3,3-,4,5,6,7,8,9,.mama1,mama2,mama3,mama4,mama5,mojimenik,novi,oce1 # v mojimenik se nahaja mojimenikfile # mama2 vsebuje "mama" #Stirje subt-aski dodani.By Mihec. results = dict() conn = pxssh.pxssh() conn.login(IP_malishell, 'student', 'vaje') # preimenuj datoteke conn.sendline('/bin/ls -a1 {}'.format(file_rename_dirname)) conn.prompt() results['preimenuj'] = conn.before # premakni datoteke s cim krajsim ukazom conn.sendline('/bin/ls -a1 {}'.format(mv_src_dir)) conn.prompt() results['pre_mv_src'] = conn.before conn.sendline('/bin/ls -a1 {}'.format(mv_dst_dir)) conn.prompt() results['pre_mv_dst'] = conn.before conn.sendline('/bin/ls -l ~/mv_ukaz') conn.prompt() results['mv_ls_size'] = conn.before conn.sendline('. ~/mv_ukaz') conn.prompt() conn.sendline('/bin/ls -a1 {}'.format(mv_src_dir)) conn.prompt() results['post_mv_src'] = conn.before conn.sendline('/bin/ls -a1 {}'.format(mv_dst_dir)) conn.prompt() results['post_mv_dst'] = conn.before # mama_ukaz # conn.sendline('cd /home/student/grep_test_dir') conn.prompt() conn.sendline('. ~/mama_ukaz') conn.prompt() conn.sendline('cat ~/napake.txt') conn.prompt() results['grep_napake'] = conn.before conn.sendline('cat ~/mama.txt') conn.prompt() results['grep_mama'] = conn.before # sledenje syslog conn.sendline('date') conn.prompt() conn.sendline('/usr/local/bin/syslog_spammer &') conn.prompt() results['syslog_start_time'] = conn.before conn.sendline('/home/student/syslog_ukaz.sh') conn.prompt() results['syslog_result'] = conn.before conn.sendline('date') conn.prompt() results['syslog_end_time'] = conn.before conn.sendline('cowsay "{}"'.format(cowsay_string)) conn.prompt() results['cowsay'] = conn.before conn.logout() #results['curl'] = subprocess.check_output(["cat","/home/student/Desktop/website.txt"]) #results['chkimages'] = subprocess.check_output(["curl www.24ur.com >> dlg.txt && cat dlg.txt | grep -c ","images"]) #results['count'] = subprocess.check_output(["wc","/home/student/Desktop/count.txt"]) #results['lines'] = subprocess.check_output(["cat","/home/student/Desktop/lines.txt"]) #results['cowsay'] = subprocess.check_output(["dpkg --get-selections | grep","cowsay"]) #results['phttp'] = subprocess.check_output(["lsof -i ",":8080"]) return results def gen_params(user_id, params_meta): import random import subprocess params = dict() homedir = '/home/student/' r = random.Random(user_id) params['file_creator_random_seed'] = str(r.random()) params['file_rename_dirname'] = homedir + kpov_random_helpers.default_generators['dirname'](r) params['mv_src_dir'] = homedir + "".join([r.choice("abcdefgh") for i in xrange(6)]) params['mv_dst_dir'] = homedir + "".join([r.choice("ijklmnop") for i in xrange(6)]) params['syslog_n_zmeda'] = str(r.randint(5, 15)) params['cowsay_string'] = kpov_random_helpers.default_generators['short_text'](r) #params['phttp'] = "8080" #params['images'] = subprocess.check_output(["echo","$images"]) return params def task_check(results, params): import re import random score = 0 r = random.Random(params['file_creator_random_seed']) fnames = [] for i in xrange(20): fnames.append("".join([ r.choice("_abcdefghijk") for j in xrange(8)])) #TO FINISH SCORING WE REQUIRE DICT KEYS AND FUNCTIONS gen_params AND task TO BE FINISHED #POINTS FOR EACH TASK MAY BE ADJUSTED IN THE FUTURE #TASK 1 # print( results['preimenuj']) lines = results['preimenuj'].split("\n") task1_ok = len(lines) == len(fnames) + 4 task1_ok = task1_ok and lines[0].find(params['file_rename_dirname']) >= 0 task1_ok = task1_ok and lines[1].strip() == "." task1_ok = task1_ok and lines[2].strip() == ".." # print task1_ok for fname in fnames: # print task1_ok, fname, results['preimenuj'].find(fname) task1_ok = task1_ok and results['preimenuj'].find(fname) > 0 if task1_ok: score += 2 # premakni datoteke s cim krajsim ukazom fnames = [] for i in xrange(40): fnames.append("".join([ r.choice("123456789abcdefghijk") for j in xrange(8)])) task2_re = re.search( r"-rw[x-][r-][w-][x-][r-][w-][x-] \d* student student (\d*) .*mv_ukaz", results['mv_ls_size']) mv_ls_size = int(task2_re.group(1)) task2_ok = mv_ls_size < 15 and mv_ls_size > 2 pre_src = set([i.strip() for i in results['pre_mv_src'].split('\n')[3:-1]]) pre_dst = set([i.strip() for i in results['pre_mv_dst'].split('\n')[3:-1]]) task2_ok = task2_ok and pre_src == set(fnames) task2_ok = task2_ok and len(pre_dst) < 2 post_src = set([i.strip() for i in results['post_mv_src'].split('\n')[3:-1]]) post_dst = set([i.strip() for i in results['post_mv_dst'].split('\n')[3:-1]]) task2_ok = task2_ok and post_dst == set(fnames) task2_ok = task2_ok and len(post_src) < 2 if task2_ok: score += 2 # mama_ukaz # task3_ok = True mama_fnames = [] for i in xrange(20): mama_fnames.append("".join([ r.choice("123456789abcdefghijk") for j in xrange(8)])) papa_fnames = [] for i in xrange(20): papa_fnames.append("".join([ r.choice("123456789abcdefghijk") for j in xrange(8)])) dirnames = [] for i in xrange(20): dirnames.append("".join([ r.choice("123456789abcdefghijk") for j in xrange(8)])) linknames = [] for i in xrange(20): linknames.append("".join([ r.choice("123456789abcdefghijk") for j in xrange(8)])) print( results['grep_mama']) print( results['grep_napake']) for i in dirnames + linknames + papa_fnames: if (i not in papa_fnames) and results['grep_napake'].find(i) < 0: task3_ok = False if results['grep_mama'].find(i) >= 0: task3_ok = False for i in papa_fnames: if results['grep_napake'].find(i) >= 0: task3_ok = False if results['grep_mama'].find(i) >= 0: task3_ok = False for i in mama_fnames: if results['grep_mama'].find(i) < 0: task3_ok = False if task3_ok: score += 2 # sledenje syslog print( results['syslog_start_time']) print( results['syslog_result']) print( results['syslog_end_time']) return score def prepare_disks(templates, params): # d = templates['simpleArbiterDhcp'] import random print "Haha!" print params print templates d = templates['malishell'] r = random.Random(params['file_creator_random_seed']) # rename d.mkdir(params['file_rename_dirname']) d.chown("student", "student", params['file_rename_dirname']) for i in xrange(20): fname = params['file_rename_dirname'] + '/' + "".join( [r.choice("-abcdefghijk") for j in xrange(8)]) d.touch(fname) d.chown("student", "student", fname) # mv ukaz d.mkdir(params['mv_src_dir']) d.chown("student", "student", params['mv_src_dir']) for i in xrange(40): fname = params['mv_src_dir'] + '/' +"".join( [r.choice("123456789abcdefghijk") for j in xrange(8)]) d.touch(fname) d.chown("student", "student", fname) d.mkdir(params['mv_dst_dir']) d.chown("student", 'student', params['mv_dst_dir']) # grep mama # mama fnames d.mkdir('/home/student/grep_test_dir') for i in xrange(20): d.write("/home/student/grep_test_dir/" + "".join( [ r.choice("123456789abcdefghijk") for j in xrange(8)]), "mama") # papa fnames for i in xrange(20): d.write("/home/student/grep_test_dir/" + "".join( [ r.choice("123456789abcdefghijk") for j in xrange(8)]), "papa") # dirnames for i in xrange(20): d.mkdir("/home/student/grep_test_dir/" + "".join( [ r.choice("123456789abcdefghijk") for j in xrange(8)])) # linknames for i in xrange(20): d.ln_sf("mali zeleni", "/home/student/grep_test_dir/" + "".join( [ r.choice("123456789abcdefghijk") for j in xrange(8)])) # sledenje syslog spammer_source = "#!/bin/sh\n" + int(params['syslog_n_zmeda']) * "logger zmeda\n" d.write("/usr/local/bin/syslog_spammer", spammer_source) d.chmod("0775", "/usr/local/bin/syslog_spammer")