--- /dev/null
+ #!/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