User:Ptomusk

From ICO wiki

Info

Erinevate ainete raames lisatud sisu

Skriptimiskeeled (I387)

Tunnis lahendatud näited

Teine

  1. Teha skript, mis küsib kasutajalt kataloogi nime ja siis väljastab kõik (tavalised) failid/kaustad, mis seal kataloogis asuvad 3p

Ptomusk 14:29, 29 September 2013 (EEST)

#!/bin/bash
_short_help="`basename $0` [DIRECTORY]"
_long_help="Output the files in the specified directory"
if [ "$1" = '--help' ]; then
        echo $_short_help
        echo $_long_help
        exit 0
elif [ -d "$1" ]; then
	find "$1/" -maxdepth 1 -type f
else
	echo "No such directory!"
	echo $_short_help
	exit 1
fi

Link originaalpostitusele: Bash_quests_2013#Teine

Quest 30

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Luua isikukoodi parser ja õigsuse kontroll.
#Sisendiks fail kus igal real on isikukood, mis võib olla õige või vale.
#Väljundiks on fail kus on õiged isikukoodid kus kontrollsumma klapib ning kuupäev on korrektne (aastas 12 kuud ning iga kuu päevade arv sobiv).
#
#NB! Kuupäeva õigsuse kontrollimiseks kasutage datetime.strptime funktsiooni ja uuesti vormindamiseks datetime.strftime funktsiooni
#
#Autor: Peeter Tomusk

#Useful sources
#Isikukoodi spetsifikatsiooni (tasuta) kirjeldus - http://et.wikipedia.org/wiki/Isikukood

##Import modules
import sys
import os
from string import rstrip
import time
#from calendar import isleap

##Some initial variables
helpmessage="Usage: %s [input_file_name] [[--debug]]" % sys.argv[0]
helplongmessage="""

Test the validity of Estonian ID-codes in a file and print properly formatted lines with the birth-date and gender on screen
"""
debug=False
input_file=""
seed={1:(1,2,3,4,5,6,7,8,9,1),2:(3,4,5,6,7,8,9,1,2,3)}

##Parse arguments
#Check that we have arguments
if len(sys.argv)==1:
	sys.stderr.write("Invalid number of arguments!\n\n%s\n" % helpmessage)
	sys.exit(4)
#Loop trough all arguments except the first one (scripts own name)
while len(sys.argv[1:])>0:
	#If the argument is help
	if sys.argv[1]=="--help":
		print helpmessage+helplongmessage
		sys.exit(0)
	#If the argument is debug
	if sys.argv[1]=="--debug":
		debug=True
		del sys.argv[1]
	#In other cases presume it's a filename 
	else:
		#Test if we already have a filename
		if len(input_file)>0:
			sys.stderr.write("Input file \"%s\" is already specified and filename \"%s\" is one too many\ncurrently only one file is supported, sorry!\n" % (input_file,sys.argv[1]))
			sys.exit(2)
		#Test if the file exists
		elif os.path.isfile(sys.argv[1]):
			input_file=sys.argv[1]
			del sys.argv[1]
		#If the doesn't exists
		else:
			sys.stderr.write("Input file \"%s\" doesn't exist!\n" % sys.argv[1])
			sys.exit(1)

##Do some actual work
#Test if we can read the file
if os.access(input_file,os.R_OK):
	#and read it's contents to a list
	f=open(input_file,"r")
	input_data=f.readlines()
	f.close 
#Or give an error
else:
	sys.stderr.write("Cannot read file \"%s\"\n" % input_file)
	sys.exit(3)

#For each line in the file
for code in input_data:
	code=rstrip(code,"\n")
	#Find the gender
	if int(code[0])%2==0:
		gender="naine"
	elif int(code[0])%2==1:
		gender="mees"
	#Find the appropriate number of hundreds for the birthyear
	cents=18+(((int(code[0])%2)+int(code[0]))/3)
	#Check if the date is a proper value
	try:
		birthdate=time.strftime("%Y.%m.%d",time.strptime("%s%s.%s.%s" % (cents,code[1:3],code[3:5],code[5:7]),"%Y.%m.%d"))
	except ValueError as error:
		if debug:
			print "%s is wrong, because %s" % (code,error)
		continue
	#Verify the code against it's checksum
	for seed_type in 1,2:
		#Initialise a variable for the seed multiplication sums
		codesum=0
		#For each non-checksum element in the code
		for index in range(10):
			#Multiply it with the current seed and add the result
			codesum=codesum+(seed[seed_type][index]*int(code[index]))
		#Calculate the checksum
		checksum=codesum%11
		#If checksum is 10
		if checksum==10:
			if seed_type==1:
				continue
			elif seed_type==2:
				checksum=0
		#If the checksum is not 10 and matches the original
		if checksum!=10 and checksum==int(code[-1]):
			print "%s - %s - %s" % (code,birthdate,gender)
			break
	else:
		if debug:
			print "%s is wrong, because the checksum is wrong" % code


BASH

Kodune töö
#!/usr/bin/env bash
# Looge skript, mis looks uue veebkodu Kasutaja sisestab: 'loo-kodu www.minuveebisait.ee'
# Skript paigaldab apache2 serveri, kui see puudub
# Loob nimelahenduse (lihtsalt /etc/hosts failis)
# Kopeerib vaikimisi veebisaidi ja modifitseerib index.html faili sisu vastavalt loodavale lehele
#
# Autor: Peeter Tomusk
# Modifikatsioonid: skript kasutab Nginx veebiserverit ning paigaldab ka php toe

#Baseline variables
_document_root="/srv/www"
_install_packages=""
_nginx_package_name="nginx"
_php_package_name="php5-fpm"
_index_file_name="index.html"

#Functions
function f_error(){
	_message="$1"
	_exit_status="$2"
	echo $_message 1>&2
	exit $_exit_status
}

function f_name_resolution(){
	_website_name="$2"
	case $1 in
		add)
			echo -e "127.0.0.1\t$_website_name" >> /etc/hosts
			;;
		remove)
			cat /etc/hosts | grep -v $_website_name > /etc/hosts.new && rm /etc/hosts && mv /etc/hosts.new /etc/hosts
			;;
		check)
			grep $_website_name /etc/hosts 2>&1 > /dev/null
			if [ $? -eq 0 ];then
				true
			else
				false
			fi
			;;
	esac
}

#Parse input
if [ $UID -ne 0 ];then
	f_error "This script must be run as root, please use sudo!" 1
elif [ -n "$1" ] && [ -z "$2" ];then
	if [ "$1" = '--help' ];then
		echo "`basename $0` [name-of-the-vhost-to-create]"
		exit 0
	else
		if [ -d "$1" ];then
			f_error "The desired directory $_document_root/$1 already exists!" 3
		elif f_name_resolution "check" $1;then
			f_error "The desired DNS alias already exists!" 4
		elif [ -d /etc/nginx/sites-enabled ] && [ `grep root /etc/nginx/sites-enabled/* | grep "$1"` ];then
			f_error "The desired vhost \"$1\" already exists!" 5
		fi
	fi
else
	f_error "Wrong number of parameters!" 2
fi

#Assing parameters to variables
_website_name="$1"

#Check for the required packages
echo "-- Checking the environment --"
for _package in $_nginx_package_name $_php_package_name;do
echo -n "$_package: "
	if [ -n "`dpkg -l | grep ^ii | grep \"$_package\"`" ];then
		echo "Found"
	else
		echo "To be installed"
		_install_packages="$_package $_install_packages"
	fi
done
#If needed perform software installation and configuration
if [ -n "$_install_packages" ];then
	echo "Installing packages"
	apt-get install -y $_install_packages 2>&1 >> /tmp/$$_install.log
	if [ $? -eq 0 ];then
		echo "Success!" && rm /tmp/$$_install.log
	else
		cat /tmp/$$_install.log && rm /tmp/$$_install.log
		f_error "Package installation failed!" 6
	fi
	#If we're installing nginx for the first time, de-configure the default vhost and create the desired document root
	if [ -e /etc/nginx/sites-enabled/default ];then
		rm /etc/nginx/sites-enabled/default
	fi
	if [ ! -d $_document_root ];then
		mkdir $_document_root
	fi
	#Restart nginx to make sure it's up to speed
	service nginx restart
fi

#Setup the actual website
echo "-- Configuring the website --"
#Create document-root
echo "Creating the document-root directory"
mkdir $_document_root/$_website_name
if [ $? -ne 0 ];then
	f_error "Failed to create the target directory $_document_root/$_website_name" 7
fi
#Create the index file
echo "Creating the default index file"
echo -e '<!DOCTYPE html>\n<html>\n<head>\n\t<title>'$_website_name'</title>\n\t<meta charset="utf-8">\n</head>\n<body>\n\t<h3>Teretulemast '$_website_name' kodulehele!</h3>\n</body>\n</html>' > $_document_root/$_website_name/$_index_file_name
if [ $? -ne 0 ];then
	f_error "Failed to create the default index file $_document_root/$_website_name/$_index_file_name" 8
fi
#Create the vhost
echo "Creating the vhost configuration"
echo -e "server {\n\tserver_name $_website_name;\n\troot $_document_root/$_website_name/;\n\tindex $_index_file_name;\n" > /etc/nginx/sites-available/$_website_name
echo -e "\t"'location ~ \.php$ {'"\n\t\t"'fastcgi_split_path_info ^(.+\.php)(/.+)$;'"\n\t\t"'fastcgi_pass 127.0.0.1:9000;'"\n\t\t"'fastcgi_index index.php;'"\n\t\t"'include fastcgi_params;' >> /etc/nginx/sites-available/$_website_name
echo -e "\t\t}\n}" >> /etc/nginx/sites-available/$_website_name
if [ $? -ne 0 ];then
	f_error "Failed to create the vhost file" 9
fi
ln -s /etc/nginx/sites-available/$_website_name /etc/nginx/sites-enabled/$_website_name
if [ $? -ne 0 ];then
	f_error "Failed to enable the vhost" 10
fi
#Add name resolution
echo "Adding name resolution"
f_name_resolution "add" $_website_name
if [ $? -ne 0 ];then
	f_error "Failed to add name resolution for $_website_name" 11
fi
#Reload nginx
echo "Reloading nginx configuration"
service nginx reload
if [ $? -ne 0 ];then
	f_error "Failed to reload nginx configuration" 12
fi
#If the script didn't die on any errors, tell the user we were successful
echo "-- Website creation is complete! --"
Vigade parandus 
Real 117 peaks 'fastcgi_pass 127.0.0.1:9000;' asemel olema 'fastcgi_pass unix:/var/run/php5-fpm.sock;'
Arvestus 30.nov kaugõpe
#!/usr/bin/env bash
#Arvestus 30.nov kaugõpe
#
#Teha skript, mis loeb käsurealt 1..n argumenti (1..n IP aadressi)
#Kui argumente pole siis väljastab veakoodi 1 (1p)
#Skript väljastab eraldi real kõik käsurea argumendid. 2p
#Skript kontrollib, kas argumentidena antud IP aadresse saab pingida. 
#
#Aadressid, mis vastavad tuleb kirjutada faili ok.txt ja need, mis ei vast kirjuta faili nok.txt
#Kui faile pole, siis väljastada teade, et vastav X.txt fail puudub, loon faili(d). 2p
#Failide omanikuks tuleb seada student ja grupiks audio 1p
#
#Skript seab failiõigused selliselt, et omanik saab lugeda ja kirjutada, grupp saab lugeda ja kirjutada, teised kasutajad ei saa midagi teha 1p
#
#Faili ok.txt kirjutamine 4p
#Faili nok.txt kirjutamine 4p
#
#Autor: Peeter Tomusk

#Baseline variables
_default_ping_amount=3
_target_hosts=""

#Parse input
while [ $# -gt 0 ];do
	case $1 in
		--help)
			echo "`basename $0` [ip-aadress] [[ip-aadress2] ... [ip-aadressN]]"
			exit 0
			;;
		*)
			_target_hosts="$1 $_target_hosts"
			shift
			;;
	esac
done

#Test for input
if [ -n "$_target_hosts" ];then
	#Test for output files
	for _file in ok.txt nok.txt;do
		if [ -f $_file ];then
			continue
		else
			echo "Ei leia faili $_file - loon selle ise."
			touch $_file
			chown student:audio $_file
			chmod 660 $_file
		fi
	done
	#Perform the check for each host and put the result to the appropriate file
	for _host in $_target_hosts;do
		echo $_host
		ping -c $_default_ping_amount $_host 2>&1 >/dev/null
		if [ $? -eq 0 ];then
			echo $_host >> ok.txt
		else
			echo $_host >> nok.txt
		fi
	done
#Or give error
else
	echo "Sihtaadresse pole!"
	exit 1
fi

Python

Kodune töö
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Etteantud failis on igal real URL
Käivitada iga unikaalse host'i kohta alamprotsess ja selle protsessi sees sooritada GET päring iga sellele hostile vastava URL'i pihta
Paralleelsete protsesside arvu peaks saama käsurealt määrata
"""
__author__="Peeter Tomusk"

###Import useful libraries
import sys
from  multiprocessing import current_process,Semaphore,Process
from urllib2 import URLError,urlopen
from string import split,rstrip
from os import path

###Baseline variables
input_files=[]
parallel_processes=5
helpmessage="%s --file [input_file_name] [--processes [number_of_parallel_processes]]" % sys.argv[0]
helpmessage_long="""
Perform GET querys to each URL in the file, grouped by the host

--file | -f		Input file
--processes | -p	Number of parallel processes to allow

Multiple input files may be specified.
10 parallel processes will be used, if not specified. If the number of processes is assigned multiple times, the last value will be used.
"""

###Functions
def error(message,exit_status):
	"A function to handle errors"
	sys.stderr.write('\033[91m'+message+'\033[0m\n')
	sys.exit(exit_status)

def readfile(filename):
	"Read file contents to a list"
	#Check if the file exists befor trying to read it
	if path.isfile(filename):
		#Read the contents of the file
		f=open(filename,"r")
		file_data=f.readlines()
		f.close
		#Return the contents of the file
		return file_data
	#Or die with an error
	else:
		error("File %s doesn't exists!" % input_file,6)

def get_target_info(input_files):
	"Read all the input files and convert their contents to a dictionary"
	#Create a dictionary to keep the information in
	target_info={}
	#For each input file
	for input_file in input_files:
		#For each host/url pair that we parse from the current file
		for item in parse_lines(readfile(input_file)):
			#If we don't have this host in our target info, add it and the url as part of a list
			if item["host"] not in target_info:
				target_info[item["host"]]=[item["url"]]
			#If we already have this host in the target_info, add the url to it's list, if it's unique
			elif item["host"] in target_info and item["url"] not in target_info[item["host"]]:
				target_info[item["host"]].append(item["url"])
	#Return a dictionary of hosts and the corresponding urls
	return target_info

def parse_lines(file_data):
	"Parse the lines in the file and return a list of dictionaries"
	return_list=[]
	#For each line
	for line in file_data:
		#Remove lines that start with a comment
		if not line.startswith('#'):
			#Strip the newline from the end of the line
			line=rstrip(line,'\n')
			#Find the host from the line
			host=split(line,"/")[2]
			return_list.append({"host":host,"url":line})
	#Return a list of host/url dictionary pairs
	return return_list

def get_query(host,url_list,parallel_process_counter):
	"Perform GET querys for each URL in the list"
	#Get a spot in the list of parallel processes
	parallel_process_counter.acquire()
	#Initiate the host specific result_data dictionary
	result={"OK":0,"Failed":0}
	#For each url in the list
	for url in url_list:
		#Try to get the url
		try:
			response=urlopen(url,timeout=5)
			#If successful, increment the specific value
			result["OK"]+=1
		except URLError as error:
			#For errors, increment the specific value
			result["Failed"]+=1
	print "Host: %s had %s successes and %s failures" % (host,result["OK"],result["Failed"])
	#Free the spot in the list of parallel processes
	parallel_process_counter.release()

###Parse input
if len(sys.argv[1:])==0:
	error("This script requires additional arguments!\n\n%s\n" % helpmessage,1)
while len(sys.argv[1:])>0:
	#If the argument is help
	if sys.argv[1]=="--help":
		print helpmessage
		print helpmessage_long
		sys.exit(0)
	#If the argument is file
	elif sys.argv[1]=='--file' or sys.argv[1]=='-f':
		#If we have additional arguments
		if not sys.argv[2].startswith("-") and len(sys.argv[1:])>=2:
			#Convert the argument to a list
			for filename in split(sys.argv[2]," "):
				#Avoid duplicates and zero-length elements
				if len(filename)>0 and filename not in input_files:
					#Add the element to the input files list
					input_files.append(filename)
			#Remove used items from arguments
			del sys.argv[2]
			del sys.argv[1]
		else:
			error("Argument %s requires additional values!" % sys.argv[1],3)
	#If the argument is processes
	elif sys.argv[1]=='--processes' or sys.argv[1]=='-p':
		#If we have additional arguments
		if not sys.argv[2].startswith("-") and len(sys.argv[1:])>=2:
			#Test if the input given is actually numeric
			if sys.argv[2].isdigit():
				#Assign the desired value to the variable
				parallel_processes=int(sys.argv[2])
				#Remove used items from arguments
				del sys.argv[2]
				del sys.argv[1]
			else:
				error("Argument \"%s\" is not a number!" % sys.argv[2],5)
		else:
			error("Argument %s requires additional values!" % sys.argv[1],4)
	else:
		error("Unknow argument \"%s\"!" % sys.argv[1],2)

###Divide and conquer
#Get the target information
target_info=get_target_info(input_files)
#Create a counter to keep track of parallel processes
parallel_process_counter=Semaphore(parallel_processes)
#For each host, start a sub-process
for host in target_info:
	#Define a process to be started
	get_process=Process(name=host,target=get_query,args=(host,target_info[host],parallel_process_counter))
	#Start the process
	get_process.start()