Improved errorhandling
[grml-quickconfig.git] / grml-quickconfig
1 #!/bin/zsh
2 # Filename:      grml-quickconfig
3 # Purpose:       get fast access to some basic grml-scripts
4 # Authors:       Grml Team <team@grml.org>
5 # Bug-Reports:   see http://grml.org/bugs/
6 # License:       This file is licensed under the GPL v2.
7 ################################################################################
8
9 set -e
10
11 . /etc/grml/script-functions
12 if ! checkbootparam 'nocolor'; then
13     . /etc/grml_colors
14 fi
15
16 # variable setup {{{
17 # maximum line length
18 MAXLEN=60
19
20 # switch between character sets
21 B="\x0e"
22 N="\x0f"
23
24 set -A info
25 set -A keys
26 typeset -A keymap
27
28 HLINE="$B x $N"
29 VLINE=$(repeat $MAXLEN echo -n q)
30 HIGHLIGHT="$GREEN"
31 HIGHLIGHT_NAME="$MAGENTA"
32 SCRIPTDIR="/usr/share/grml-quickconfig/"
33
34
35 # enable alternate console fonts
36 echo -n "\e(B\e)0"
37
38 # set zsh options
39 setopt no_nomatch
40 # }}}
41
42
43 # helper functions {{{
44 print_line() {
45     esc=$(printf '\033')
46     ORIG_LEN=$(echo $(printf '%s' "$1" | sed "s#${esc}\[[0-9;]*m##g" | wc -c))
47     echo -n "${BLUE}$HLINE${NORMAL}"
48     echo -n "$1"
49     printf "%$[${MAXLEN}-${ORIG_LEN}-2]s${BLUE}${HLINE}${NORMAL}\n"
50 }
51
52 print_starting_line() {
53     echo $B ${BLUE}l"$VLINE"k${NORMAL} $N
54 }
55
56 print_closing_line() {
57     echo $B ${BLUE}m"$VLINE"j${NORMAL} $N
58 }
59
60 print_delim() {
61    echo $B ${BLUE}t"$VLINE"u${NORMAL} $N
62 }
63
64 highlight_char() {
65     echo $1 | sed -e "s/$2/$HIGHLIGHT$2$NORMAL/"
66 }
67
68 print_menu() {
69     print_starting_line
70     for x in ${info} ; do
71         echo $x
72     done
73     print_closing_line
74 }
75
76 run() {
77    echo Running Command $*
78    $*
79
80 }
81
82 get_key() {
83     stty -echo ; read -kq ${1}?"Press a key: "
84 }
85
86 bailout() {
87    [ -n "$1" ] && RC=$1 || RC=0
88    [ -n "$2" ] && print "$2" >&2
89    exit $RC
90 }
91 # }}}
92
93 trap bailout 1 2 3 3 6 9 14 15
94
95 # check boot parameter {{{
96 get_menu_dir() {
97    local TARGET="$1"
98    if [ -d "./$TARGET" ] ; then
99       MENUDIR="./$TARGET"
100    elif [ -d "$SCRIPTDIR/$TARGET" ] ; then
101       MENUDIR="$SCRIPTDIR/$TARGET"
102    fi
103 }
104 BOOT_PARAM=$(getbootparam menu) || true
105 if [ -n "$TARGET" ] ; then
106    get_menu_dir "$BOOT_PARAM"
107 fi
108 if [ -n "$1" ] ; then
109    get_menu_dir "$1"
110 fi
111
112 if [ -z "$MENUDIR" ] ; then
113    MENUDIR="$SCRIPTDIR"
114 fi
115
116 # }}}
117
118 # load modules {{{
119 if ! ls "$MENUDIR"/*.sh &>/dev/null ; then
120    bailout 1 "Error: $MENUDIR is empty, exiting."
121 fi
122 ls ${MENUDIR}/*.sh &>/dev/null || exit 1
123 for file in ${MENUDIR}/*.sh ; do
124     LINE=""
125     KEY=""
126     FUNCTION=""
127     NAME=""
128     . $file
129     if display_entry ; then
130         setopt noglob
131         if [ -n "$LINE" ] ; then
132             info+="$(eval $LINE)"
133         fi
134
135         for k in ${KEY} ; do
136             keymap[$k]=$FUNCTION
137         done
138         keys+=$KEY
139         setopt glob
140     fi
141 done
142 # }}}
143
144 if [ -z "$info" ] ; then
145    bailout 1
146 fi
147 # mainloop {{{
148 while : ; do
149     echo
150     print_menu
151     echo
152     get_key INPUT
153     case $INPUT in
154         [q|Q|$'\n'])
155             echo $INPUT
156             break
157             ;;
158         [${(k)keys}])
159             echo $INPUT
160             eval ${keymap[$INPUT]}
161             ;;
162         *)
163             echo "Unknown key"
164             echo
165             ;;
166
167         esac
168
169 done
170 echo "Happy Hacking"
171 # }}}
172
173 ## END OF FILE #################################################################
174 # vim:foldmethod=marker expandtab ai ft=zsh shiftwidth=3