Statistics
| Branch: | Tag: | Revision:

amiro-os / tools / bash / setuplib.sh @ 8516dad6

History | View | Annotate | Download (9.84 KB)

1 8516dad6 Thomas Schöpping
################################################################################
2
# AMiRo-OS is an operating system designed for the Autonomous Mini Robot       #
3
# (AMiRo) platform.                                                            #
4
# Copyright (C) 2016..2020  Thomas Schöpping et al.                            #
5
#                                                                              #
6
# This program is free software: you can redistribute it and/or modify         #
7
# it under the terms of the GNU General Public License as published by         #
8
# the Free Software Foundation, either version 3 of the License, or            #
9
# (at your option) any later version.                                          #
10
#                                                                              #
11
# This program is distributed in the hope that it will be useful,              #
12
# but WITHOUT ANY WARRANTY; without even the implied warranty of               #
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                #
14
# GNU General Public License for more details.                                 #
15
#                                                                              #
16
# You should have received a copy of the GNU General Public License            #
17
# along with this program.  If not, see <http://www.gnu.org/licenses/>.        #
18
#                                                                              #
19
# This research/work was supported by the Cluster of Excellence Cognitive      #
20
# Interaction Technology 'CITEC' (EXC 277) at Bielefeld University, which is   #
21
# funded by the German Research Foundation (DFG).                              #
22
################################################################################
23
24
### print an error message #####################################################
25
# Prints a error <message> to standard output.
26
#If variable 'LOG_FILE' is specified, the message is also appended to the given file.
27
#
28
# usage:      printError <message>
29
# arguments:  <message>
30
#                 Message string to print.
31
# return:     n/a
32
#
33
function printError {
34
  local string="ERROR:   $1"
35
  # if a log file is specified
36
  if [ -n "$LOG_FILE" ]; then
37
    printf "[$(date '+%Y-%m-%d %H:%M:%S')] $string" >> $LOG_FILE
38
  fi
39
  printf "$(tput setaf 1)>>> $string$(tput sgr 0)" 1>&2
40
}
41
42
### print a warning message ####################################################
43
# Prints a warning <message> to standard output.
44
#If variable 'LOG_FILE' is specified, the message is also appended to the given file.
45
#
46
# usage:      printMessage <message>
47
# arguments:  <message>
48
#                 Message string to print.
49
# return:     n/a
50
#
51
function printWarning {
52
  local string="WARNING: $1"
53
  # if a log file is specified
54
  if [ -n "$LOG_FILE" ]; then
55
    printf "[$(date '+%Y-%m-%d %H:%M:%S')] $string" >> $LOG_FILE
56
  fi
57
  printf "$(tput setaf 3)>>> $string$(tput sgr 0)"
58
}
59
60
### print an information message ###############################################
61
# Prints an information <message> to standard output.
62
#If variable 'LOG_FILE' is specified, the message is also appended to the given file.
63
#
64
# usage:      printInfo <message>
65
# arguments:  <message>
66
#                 Message string to print.
67
# return:     n/a
68
#
69
function printInfo {
70
  local string="INFO:    $1"
71
  # if a log file is specified
72
  if [ -n "$LOG_FILE" ]; then
73
    printf "[$(date '+%Y-%m-%d %H:%M:%S')] $string" >> $LOG_FILE
74
  fi
75
  printf "$(tput setaf 2)>>> $string$(tput sgr 0)"
76
}
77
78
### print a message to file ####################################################
79
# Appends a <message> to a log file, specified by the variable 'LOG_FILE'.
80
#
81
# usage       printLog <message>
82
# arguments:  <message>
83
#                 Message string to print.
84
# return:     n/a
85
#
86
function printLog {
87
  local string="LOG:     $1"
88
  # if a log file is specified
89
  if [ -n "$LOG_FILE" ]; then
90
    printf "[$(date '+%Y-%m-%d %H:%M:%S')] $string" >> $LOG_FILE
91
  fi
92
}
93
94
### exit the script normally ###################################################
95
# Prints a delimiter and exits the script normally (returns 0).
96
#
97
# usage:      quitScript
98
# arguments:  n/a
99
# return:     0
100
#                 No error or warning occurred.
101
#
102
function quitScript {
103
  printInfo "exiting $(realpath ${BASH_SOURCE[0]})\n"
104
  printf "\n"
105
  printf "######################################################################\n"
106
  exit 0
107
}
108
109
### read a user input ##########################################################
110
# Reads a single character user input from a set up <options> and stores it in
111
# a given <return> variable.
112
#
113
# usage:      readUserInput <options> <return>
114
# arguments:  <options>
115
#                 String definiing the set of valid characters.
116
#                 If the string is empty, the user can input any character.
117
#             <return>
118
#                 Variable to store the selected character to.
119
# return:     n/a
120
#
121
function readUserInput {
122
  local input=""
123
  # read user input
124
  while [ -z $input ] || ( [ -n "$1" ] && [[ ! $input =~ ^[$1]$ ]] ); do
125
    read -p "your selection: " -n 1 -e input
126
    if [ -z $input ] || ( [ -n "$1" ] && [[ ! $input =~ ^[$1]$ ]] ); then
127
      printWarning "[$input] is no valid action\n"
128
    fi
129
  done
130
  printLog "[$input] has been selected\n"
131
  eval $2="$input"
132
}
133
134
### check whether argument is an option ########################################
135
# Checks a <string> whether it is an option.
136
# Options are defined to either start with '--' followed by any string, or
137
# to start with a single '-' followed by a single character, or
138
# to start with a single '-' followed by a single character, a '=' and any string.
139
# Examples: '--option', '--option=arg', '-o', '-o=arg', '--'
140
#
141
# usage:      parseIsOption <string>
142
# arguments:  <string>
143
#                 A string to check whether it is an option.
144
# return:     0
145
#                 <string> is an option.
146
#             -1
147
#                 <string> is not an option.
148
#
149
function parseIsOption {
150
  if [[ "$1" =~ ^-(.$|.=.*) ]] || [[ "$1" =~ ^--.* ]]; then
151
    return 0
152
  else
153
    return -1
154
  fi
155
}
156
157
### set the log file ###########################################################
158
# Sets a specified <infile> as log file and checks whether it already exists.
159
# If so, the log may either be appended to the file, its content can be cleared,
160
# or no log is generated at all.
161
# The resulting path is stored in <outvar>.
162
#
163
# usage:      setLogFile [--option=<option>] [--quiet] <infile> <outvar>
164
# arguments:  --option=<option>
165
#                 Select what to do if <file> already exists.
166
#                 Possible values are 'a', 'c', 'r' and 'n'.
167
#                 - a: append (starts with a separator)
168
#                 - c: continue (does not insert a seperator)
169
#                 - r: delete and restart
170
#                 - n: no log
171
#                 If no option is secified but <file> exists, an interactive selection is provided.
172
#             --quiet
173
#                 Suppress all messages.
174
#             <infile>
175
#                 Path of the wanted log file.
176
#             <outvar>
177
#                 Variable to store the path of the log file to.
178
# return:     0
179
#                 No error or warning occurred.
180
#             -1
181
#                 Error: invalid input
182
#
183
function setLogFile {
184
  local filepath=""
185
  local option=""
186
  local quiet=false
187
188
  # parse arguments
189
  local otherargs=()
190
  while [ $# -gt 0 ]; do
191
    if ( parseIsOption $1 ); then
192
      case "$1" in
193
        -o=*|--option=*)
194
          option=${1#*=}; shift 1;;
195
        -o*|--option*)
196
          option="$2"; shift 2;;
197
        -q|--quiet)
198
          quiet=true; shift 1;;
199
        *)
200
          printError "invalid option: $1\n"; shift 1;;
201
      esac
202
    else
203
      otherargs+=("$1")
204
      shift 1
205
    fi
206
  done
207
  filepath=$(realpath ${otherargs[0]})
208
209
  # if file already exists
210
  if [ -e $filepath ]; then
211
    # if no option was specified, ask what to do
212
    if [ -z "$option" ]; then
213
      printWarning "log file $filepath already esists\n"
214
      local userinput=""
215
      printf "Select what to do:\n"
216
      printf "  [A] - append log\n"
217
      printf "  [R] - restart log (delete existing file)\n"
218
      printf "  [N] - no log\n"
219
      readUserInput "AaRrNn" userinput
220
      option=${userinput,,}
221
    fi
222
    # evaluate option
223
    case "$option" in
224
      a|c)
225
        if [ $quiet = false ]; then
226
          printInfo "appending log to $filepath\n"
227
        fi
228
        if [ $option != c ]; then
229
          printf "\n" >> $filepath
230
          printf "######################################################################\n" >> $filepath
231
          printf "\n" >> $filepath
232
        fi
233
        ;;
234
      r)
235
        echo -n "" > $filepath
236
        if [ $quiet = false ]; then
237
          printInfo "content of $filepath wiped\n"
238
        fi
239
        ;;
240
      n)
241
        if [ $quiet = false ]; then
242
          printInfo "no log file will be generated\n"
243
        fi
244
        filepath=""
245
        ;;
246
      *) # sanity check (return error)
247
        printError "unexpected argument: $option\n"; return -1;;
248
    esac
249
  else
250
    if [ $quiet = false ]; then
251
      printInfo "log file set to $filepath\n"
252
    fi
253
  fi
254
255
  eval ${otherargs[1]}="$filepath"
256
257
  return 0
258
}
259
260
### check whether commands are available #######################################
261
# Checks whether the specified commands are available and can be executed.
262
#
263
# usage:      checkCommands [<command> <command> ...]
264
# arguments:  <command>
265
#                 Name of the command to check.
266
# return:     0
267
#                 All requested commands are available.
268
#             >0
269
#                 Number of requested commands that were not found.
270
#             -1
271
#                 No argument given.
272
#
273
function checkCommands {
274
  local status=0
275
276
  # return if no argument was specified
277
  if [ $# -eq 0 ]; then
278
    return -1
279
  fi
280
281
  # check all specified commands
282
  while [ $# -gt 0 ]; do
283
    command -v $1 &>/dev/null
284
    if [ $? -ne 0 ]; then
285
      printWarning "Command '$1' not available.\n"
286
      status=$((status + 1))
287
    fi
288
    shift 1
289
  done
290
291
  return $status
292
}