From a7515fc01e19a072fe376a16fee7ec9d11238d11 Mon Sep 17 00:00:00 2001 From: eliot Date: Sun, 24 May 2020 22:15:58 +0200 Subject: [PATCH] --- linux-intro/linux_exam2018.txt.mdwn | 232 ++++++++++++++++++++++++++++ 1 file changed, 232 insertions(+) create mode 100644 linux-intro/linux_exam2018.txt.mdwn diff --git a/linux-intro/linux_exam2018.txt.mdwn b/linux-intro/linux_exam2018.txt.mdwn new file mode 100644 index 0000000..d169157 --- /dev/null +++ b/linux-intro/linux_exam2018.txt.mdwn @@ -0,0 +1,232 @@ + #!/bin/bash -e + + #TODO + # 1. One trap is not fully functioning see TODO further down. + + #Options if no terminal argument is given + OPTIONS=\ + "(h)elp + (p)rocesses + (u)sers + (d)ownload + (f)iles + (q)uit" + + + + ### Supported functionality ### + + function help { + echo -e "\\033[1m${0}\\033[0m usage: + \\e[0;31m-h\\e[0m Prints this help + \\e[0;31m-p\\e[0m Show total number of processes and list the 10 most not nice ones + \\e[0;31m-u \\e[0m Show all local users and their login shell with less + \\e[0;31m-d\\e[0m Asks for path and downloads Stallman's frontpage to given path + (defaults to /tmp/ if no path given) + \\e[0;31m-f\\e[0m Asks for directory and returns total disk space used by it in MB (recursively) + + If the arguments '-q' or '-h' is given no additional commands will be executed, + otherwise multiple arguments can be given to this program and executed in order. + However, if no arguments are given at launch, the user is presented with choices inside of the program. + In this menu the user can choose between these options by entering the integer (1-6) + " + + } + + function processes { + #Number of processes (excludes the title row) + let PROCS=$(ps -eo pid,cmd,ni --sort=-ni | wc -l)-1 + echo "Number of processes: $PROCS"; echo + + #show 10 lowest NIce processes + echo "Most NOT nice processes: " + ps -eo pid,cmd,ni --sort=-ni | tail -n 10 + echo + } + + function users { + awk -F: '{ print "User: " $1 "\nShell: " $7 "\n"}' < /etc/passwd | less + } + + function download { + FILE_NAME="stallman.html" + + echo "In what directory do you wish to save this file? (either absolute or relative path)" + read MY_PATH + + while [ ! -d "$MY_PATH" ] + do + if [ -z "$MY_PATH" ]; then + echo "No path given, defaulting to /tmp/" + MY_PATH="/tmp/" + break + fi + echo -e "The folder '${MY_PATH}' does not exist!\n" + echo "In what directory do you wish to save this file? (either absolute or relative path)" + read MY_PATH + done + + wget https://stallman.org/ -O "${MY_PATH}/${FILE_NAME}" + } + + function files { + echo "Enter the directory (absolute or relative path) which you'd like to know the size of" + read MY_PATH + #MY_PATH=$(pwd) + + UNIT="MB" + let UNIT_RAW=1024*1024 + + SIZE=$(df -B $UNIT_RAW "$MY_PATH" | awk 'FNR==2 {print $2}') + + # Unexpected output (awk parsing return empty string) + if [ -z "$SIZE" ]; then + return 1 + fi + + echo "Disk space used by $MY_PATH is $SIZE $UNIT" + } + + + + ### Helper functions ### + + function ask_quit { + echo "Would you like to quit? (y/n)" + read PROMPT + + if [ "$PROMPT" = "y" ]; then + echo "OK exiting..." + exit 0 + fi + + return + } + + #send all arguments here to see if they are valid (with "$@") + #if either help or any invalid options are given it will not continue with other commands + function arguments_valid { + while [ $# -gt 0 ] + do + case $1 in + "-h") + help + exit 0 + ;; + "-p") + ;; + "-u") + ;; + "-d") + ;; + "-f") + ;; + *) + echo "Invalid detected. Bye!" + exit 1 + ;; + esac + shift + done + } + + function menu { + + #present exit dialogue on SIGINT if already in menu + trap ask_quit SIGINT + + echo -e "\tNo arguments were given, choose between the options below by entering the integer (1-6)\n" + + select OPTION in ${OPTIONS}; + do + #TODO! The below trap seems to disable the 'ask_quit' trap above, + # so it seems to be a problem with changing the trap like this multiple times. + # ideally it should change back and forth depending on if we're in menu or in these functions below. + #return to menu on SIGINT + #trap menu SIGINT + case $OPTION in + "(h)elp") + help + ;; + "(p)rocesses") + processes + ;; + + "(u)sers") + users + ;; + + "(d)ownload") + download + ;; + + "(f)iles") + files + ;; + + "(q)uit") + echo "Bye!" + break + ;; + *) + echo "Invalid option. Bye!" + break + ;; + + esac + done + } + + + + + ### Option menu for user ### + + #The program starts here! + echo -e "\e[1;35mWelcome to the exam script of 2018! Let's begin\e[0m\n" + + #Hint: + #Can test traps with + #ps aux | grep exam2018_test.sh + #kill -QUIT pid + #kill -INT pid + + #Default behavior ask for confirmation to quit on these signals + trap ask_quit SIGQUIT SIGINT + + #No options presents user with alternatives in terminal + if [ $# -eq 0 ]; then + menu + + #Arguments given to program + else + arguments_valid "$@" + + while [ $# -gt 0 ] + do + case $1 in + "-h") + help + exit 0 + ;; + "-p") + processes + ;; + "-u") + users + ;; + "-d") + download + ;; + "-f") + files + ;; + *) + echo "Invalid option. Bye!" + exit 1 + ;; + esac + shift + done + exit 0 + fi -- 2.39.2