[9f29ba6] | 1 | #!/bin/bash |
---|
| 2 | #/** |
---|
| 3 | #@file System.lib |
---|
[9f57de01] | 4 | #@brief Librería o clase System |
---|
[9f29ba6] | 5 | #@class System |
---|
| 6 | #@brief Funciones básicas del sistema. |
---|
[1ccd273] | 7 | #@version 1.1.0 |
---|
[9f29ba6] | 8 | #@warning License: GNU GPLv3+ |
---|
| 9 | #*/ |
---|
| 10 | |
---|
[2e15649] | 11 | |
---|
[9f29ba6] | 12 | #/** |
---|
[4bf0ddf] | 13 | # ogEcho [str_logtype ...] [str_loglevel] "str_message" ... |
---|
[9f57de01] | 14 | #@brief Muestra mensajes en consola y lo registra en fichero de incidencias. |
---|
[e7e3140] | 15 | #@param str_logtype tipo de registro de incidencias. |
---|
[42669ebf] | 16 | #@param str_loglevel nivel de registro de incidencias. |
---|
| 17 | #@param str_message mensaje (puede recibir más de 1 parámetro. |
---|
[9f57de01] | 18 | #@return Mensaje mostrado. |
---|
[e2923e1] | 19 | #@warning Si no se indica nivel de registro, solo muestra mensaje en pantalla. |
---|
[1ccd273] | 20 | #@warning Si DEBUG="no", no se registran mensajes de error. |
---|
[4bf0ddf] | 21 | #@note logfile = { log, command, session }; usa "log" si se indica nivel de registro. |
---|
| 22 | #@note loglevel = { help, info, warning, error } |
---|
[aae34f6] | 23 | #@note El nivel de ayuda \c (help) no se registra en el fichero de incidencias. |
---|
[ead38fb] | 24 | #@version 0.9 - Primera versión para OpenGnSys |
---|
[aae34f6] | 25 | #@author Ramon Gomez, ETSII Universidad de Sevilla |
---|
[9f57de01] | 26 | #@date 2009-07-23 |
---|
[4bf0ddf] | 27 | #@version 1.0.5 - Elegir fichero de log. |
---|
| 28 | #@author Ramon Gomez, ETSII Universidad de Sevilla |
---|
[9a2f946] | 29 | #@date 2014-03-17 |
---|
[1ccd273] | 30 | #@version 1.1.0 - Posibilidad de no registrar mensajes en ficheros. |
---|
| 31 | #@author Ramon Gomez, ETSII Universidad de Sevilla |
---|
| 32 | #@date 2015-11-10 |
---|
[9f29ba6] | 33 | #*/ |
---|
[9f57de01] | 34 | function ogEcho () { |
---|
[9f29ba6] | 35 | |
---|
[59f9ad2] | 36 | # Variables locales |
---|
[4bf0ddf] | 37 | local CONT=1 LOGS LOGLEVEL DATETIME |
---|
| 38 | |
---|
| 39 | # Selección de ficheros de rgistro de incidencias. |
---|
| 40 | while [ $CONT ]; do |
---|
| 41 | case "${1,,}" in |
---|
| 42 | log) LOGS="$LOGS $OGLOGFILE"; shift ;; |
---|
| 43 | command) LOGS="$LOGS $OGLOGCOMMAND"; shift ;; |
---|
| 44 | session) LOGS="$LOGS $OGLOGSESSION"; shift ;; |
---|
| 45 | *) CONT= ;; |
---|
| 46 | esac |
---|
| 47 | done |
---|
[9f57de01] | 48 | |
---|
[42669ebf] | 49 | # Selección del nivel de registro (opcional). |
---|
[4bf0ddf] | 50 | case "${1,,}" in |
---|
[d071d9b] | 51 | help) shift ;; |
---|
[e2923e1] | 52 | info) LOGLEVEL="$1"; shift ;; |
---|
| 53 | warning) LOGLEVEL="$1"; shift ;; |
---|
| 54 | error) LOGLEVEL="$1"; shift ;; |
---|
[d071d9b] | 55 | *) ;; |
---|
[9f57de01] | 56 | esac |
---|
[42669ebf] | 57 | |
---|
[cfeabbf] | 58 | if [ -n "$LOGLEVEL" ]; then |
---|
[4bf0ddf] | 59 | DATETIME=$(date +"%F %T") |
---|
[1ccd273] | 60 | # Registrar mensajes en fichero de log si la depuración no está desactivada. |
---|
| 61 | [ "${DEBUG,,}" != "no" ] && LOGS="$OGLOGFILE $LOGS" |
---|
| 62 | logger -s -t "OpenGnsys $LOGLEVEL" "$DATETIME $*" 2>&1 | tee -a $LOGS |
---|
[cfeabbf] | 63 | else |
---|
[4bf0ddf] | 64 | echo "$*" | tee -a $LOGS |
---|
[9f57de01] | 65 | fi |
---|
[9f29ba6] | 66 | } |
---|
| 67 | |
---|
| 68 | |
---|
| 69 | #/** |
---|
[9a2f946] | 70 | # ogExecAndLog str_logfile ... str_command ... |
---|
| 71 | #@brief Ejecuta un comando y guarda su salida en fichero de registro. |
---|
| 72 | #@param str_logfile fichero de registro (pueden ser varios). |
---|
| 73 | #@param str_command comando y comandos a ejecutar. |
---|
| 74 | #@return Salida de ejecución del comando. |
---|
| 75 | #@note str_logfile = { LOG, SESSION, COMMAND } |
---|
| 76 | #@version 1.0.6 - Primera versión para OpenGnSys |
---|
| 77 | #@author Ramon Gomez, ETSII Universidad de Sevilla |
---|
| 78 | #@date 2013-07-02 |
---|
| 79 | #*/ |
---|
| 80 | function ogExecAndLog () { |
---|
| 81 | |
---|
| 82 | # Variables locales |
---|
| 83 | local ISCOMMAND ISLOG ISSESSION COMMAND CONTINUE=1 FILES REDIREC |
---|
| 84 | |
---|
| 85 | # Si se solicita, mostrar ayuda. |
---|
| 86 | if [ "$*" == "help" ]; then |
---|
| 87 | ogHelp "$FUNCNAME str_logfile ... str_command ..." \ |
---|
| 88 | "$FUNCNAME COMMAND ls -al /" |
---|
| 89 | return |
---|
| 90 | fi |
---|
| 91 | |
---|
| 92 | # Procesar parámetros. |
---|
| 93 | while [ $CONTINUE ]; do |
---|
| 94 | case "${1,,}" in |
---|
| 95 | command) ISCOMMAND=1; shift ;; |
---|
| 96 | log) ISLOG=1; shift ;; |
---|
| 97 | session) ISSESSION=1; shift ;; |
---|
| 98 | *) COMMAND="$@" |
---|
| 99 | CONTINUE= ;; |
---|
| 100 | esac |
---|
| 101 | done |
---|
| 102 | # Error si no se recibe un comando que ejecutar. |
---|
| 103 | [ -n "$COMMAND" ] || ogRaiseError $OG_ERR_FORMAT || return $? |
---|
| 104 | |
---|
| 105 | # Componer lista de ficheros de registro. |
---|
[d32ebd8] | 106 | if [ $ISCOMMAND ]; then |
---|
| 107 | FILES="$OGLOGCOMMAND" |
---|
| 108 | > $FILES |
---|
| 109 | REDIREC="2>&1" |
---|
| 110 | fi |
---|
[9a2f946] | 111 | [ $ISLOG ] && FILES="$FILES $OGLOGFILE" |
---|
| 112 | [ $ISSESSION ] && FILES="$FILES $OGLOGSESSION" |
---|
| 113 | |
---|
| 114 | # Ejecutar comando. |
---|
[d32ebd8] | 115 | eval $COMMAND $REDIREC | tee -a $FILES |
---|
[1a2fa9d8] | 116 | # Salida de error del comando ejecutado. |
---|
| 117 | return ${PIPESTATUS[0]} |
---|
[9a2f946] | 118 | } |
---|
| 119 | |
---|
| 120 | |
---|
| 121 | #/** |
---|
[2851a93] | 122 | # ogGetCaller |
---|
| 123 | #@brief Devuelve nombre del programa o script ejecutor (padre). |
---|
| 124 | #@param No. |
---|
| 125 | #@return str_name - Nombre del programa ejecutor. |
---|
| 126 | #@version 0.10 - Primera versión para OpenGnSys. |
---|
| 127 | #@author Ramon Gomez, ETSII Universidad de Sevilla |
---|
| 128 | #@date 2011-01-17 |
---|
| 129 | #*/ |
---|
| 130 | function ogGetCaller () { |
---|
| 131 | |
---|
| 132 | # Obtener el nombre del programa o del script que ha llamado al proceso actual. |
---|
[299d11e] | 133 | basename "$(COLUMNS=200 ps hp $PPID -o args | \ |
---|
| 134 | awk '{if ($1~/bash/ && $2!="") { print $2; } |
---|
| 135 | else { sub(/^-/,"",$1); print $1; } }')" |
---|
[2851a93] | 136 | } |
---|
| 137 | |
---|
| 138 | |
---|
| 139 | #/** |
---|
| 140 | # ogHelp ["str_function" ["str_format" ["str_example" ... ]]] |
---|
| 141 | #@brief Muestra mensaje de ayuda para una función determinda. |
---|
| 142 | #@param str_function Nombre de la función. |
---|
| 143 | #@param str_format Formato de ejecución de la función. |
---|
| 144 | #@param str_example Ejemplo de ejecución de la función. |
---|
| 145 | #@return str_help - Salida de ayuda. |
---|
| 146 | #@note Si no se indican parámetros, la función se toma de la variable \c $FUNCNAME |
---|
| 147 | #@note La descripción de la función se toma de la variable compuesta por \c MSG_FUNC_$función incluida en el fichero de idiomas. |
---|
| 148 | #@note Pueden especificarse varios mensajes con ejemplos. |
---|
| 149 | #@version 0.9 - Primera versión para OpenGnSys. |
---|
| 150 | #@author Ramon Gomez, ETSII Universidad de Sevilla |
---|
| 151 | #@date 2009-07-27 |
---|
| 152 | #*/ |
---|
| 153 | function ogHelp () { |
---|
| 154 | |
---|
| 155 | # Variables locales. |
---|
| 156 | local FUNC MSG |
---|
| 157 | |
---|
| 158 | # Mostrar función, descripción y formato. |
---|
| 159 | FUNC="${1:-${FUNCNAME[${#FUNCNAME[*]}-1]}}" |
---|
| 160 | MSG="MSG_HELP_$FUNC" |
---|
| 161 | ogEcho help "$MSG_FUNCTION $FUNC: ${!MSG}" |
---|
| 162 | [ -n "$2" ] && ogEcho help " $MSG_FORMAT: $2" |
---|
| 163 | # Mostrar ejemplos (si existen). |
---|
| 164 | shift 2 |
---|
| 165 | while [ $# -gt 0 ]; do |
---|
| 166 | ogEcho help " $MSG_EXAMPLE: $1" |
---|
| 167 | shift |
---|
| 168 | done |
---|
| 169 | } |
---|
| 170 | |
---|
| 171 | |
---|
| 172 | #/** |
---|
[4bf0ddf] | 173 | # ogRaiseError [str_logtype ...] int_errcode ["str_errmessage" ...] |
---|
[9f57de01] | 174 | #@brief Devuelve el mensaje y el código de error correspondiente. |
---|
[e7e3140] | 175 | #@param str_logtype tipo de registro de incidencias. |
---|
[42669ebf] | 176 | #@param int_errcode código de error. |
---|
| 177 | #@param str_errmessage mensajes complementarios de error. |
---|
[3294b83] | 178 | #@return str_message - Mensaje de error, incluyendo las funciones relacionadas. |
---|
[9f57de01] | 179 | #@warning No definidas |
---|
[aae34f6] | 180 | #@note Mensajes internacionales del fichero de idiomas. |
---|
[ead38fb] | 181 | #@version 0.9 - Primera versión para OpenGnSys. |
---|
[aae34f6] | 182 | #@author Ramon Gomez, ETSII Universidad de Sevilla |
---|
[9f57de01] | 183 | #@date 2009-07-21 |
---|
[3294b83] | 184 | #@version 1.0.5 - Muestra en el mensaje todas las funciones relacionadas (separadas por <-). |
---|
| 185 | #@author Ramon Gomez, ETSII Universidad de Sevilla |
---|
| 186 | #@date 2014-03-17 |
---|
[9f29ba6] | 187 | #*/ |
---|
[9f57de01] | 188 | function ogRaiseError () { |
---|
[9f29ba6] | 189 | |
---|
[59f9ad2] | 190 | # Variables locales |
---|
[3294b83] | 191 | local CONT=1 LOGS MSG CODE FUNCS |
---|
[4bf0ddf] | 192 | |
---|
[39db3a1] | 193 | # Si se solicita, mostrar ayuda. |
---|
| 194 | if [ "$*" == "help" ]; then |
---|
| 195 | ogHelp "$FUNCNAME" "$FUNCNAME [str_logfile ...] int_errorcode str_errormessage" |
---|
| 196 | return |
---|
| 197 | fi |
---|
| 198 | |
---|
[4bf0ddf] | 199 | # Selección de rgistros de incidencias. |
---|
| 200 | while [ $CONT ]; do |
---|
| 201 | case "${1,,}" in |
---|
| 202 | log|command|session) LOGS="$LOGS $1"; shift ;; |
---|
| 203 | *) CONT= ;; |
---|
| 204 | esac |
---|
| 205 | done |
---|
[2e15649] | 206 | |
---|
[42669ebf] | 207 | # Obtener código y mensaje de error. |
---|
[4bf0ddf] | 208 | CODE="$1" |
---|
[a5df9b9] | 209 | case "$CODE" in |
---|
[315aaca] | 210 | $OG_ERR_FORMAT) MSG="$MSG_ERR_FORMAT \"$2\"" ;; |
---|
| 211 | $OG_ERR_NOTFOUND) MSG="$MSG_ERR_NOTFOUND \"$2\"" ;; |
---|
| 212 | $OG_ERR_OUTOFLIMIT) MSG="$MSG_ERR_OUTOFLIMIT \"$2\"" ;; |
---|
| 213 | $OG_ERR_PARTITION) MSG="$MSG_ERR_PARTITION \"$2\"" ;; |
---|
| 214 | $OG_ERR_LOCKED) MSG="$MSG_ERR_LOCKED \"$2\"" ;; |
---|
| 215 | $OG_ERR_CACHE) MSG="$MSG_ERR_CACHE \"$2\"" ;; |
---|
[4e1dc53] | 216 | $OG_ERR_NOGPT) MSG="$MSG_ERR_NOGPT \"$2\"" ;; |
---|
[cead9e3] | 217 | $OG_ERR_REPO) MSG="$MSG_ERR_REPO \"$2\"" ;; |
---|
[315aaca] | 218 | $OG_ERR_FILESYS) MSG="$MSG_ERR_FILESYS \"$2\"" ;; |
---|
| 219 | $OG_ERR_IMAGE) MSG="$MSG_ERR_IMAGE \"$2\"" ;; |
---|
| 220 | $OG_ERR_NOTOS) MSG="$MSG_ERR_NOTOS \"$2\"" ;; |
---|
| 221 | $OG_ERR_NOTEXEC) MSG="$MSG_ERR_NOTEXEC \"$2\"" ;; |
---|
[eb9424f] | 222 | $OG_ERR_NOTWRITE) MSG="$MSG_ERR_NOTWRITE \"$2\"" ;; |
---|
| 223 | $OG_ERR_NOTCACHE) MSG="$MSG_ERR_NOTCACHE \"$2\"" ;; |
---|
| 224 | $OG_ERR_CACHESIZE) MSG="$MSG_ERR_CACHESIZE \"$2\"" ;; |
---|
| 225 | $OG_ERR_REDUCEFS) MSG="$MSG_ERR_REDUCEFS \"$2\"" ;; |
---|
| 226 | $OG_ERR_EXTENDFS) MSG="$MSG_ERR_EXTENDFS \"$2\"" ;; |
---|
| 227 | $OG_ERR_IMGSIZEPARTITION) MSG="$MSG_ERR_IMGSIZEPARTITION \"$2\"" ;; |
---|
[167b8d5] | 228 | $OG_ERR_UPDATECACHE) MSG="$MSG_ERR_UPDATECACHE \"$2\"" ;; |
---|
[1a2fa9d8] | 229 | $OG_ERR_DONTFORMAT) MSG="$MSG_ERR_DONTFORMAT \"$2\"" ;; |
---|
[eb9424f] | 230 | $OG_ERR_UCASTSYNTAXT) MSG="$MSG_ERR_UCASTSYNTAXT \"$2\"" ;; |
---|
| 231 | $OG_ERR_UCASTSENDPARTITION) MSG="$MSG_ERR_UCASTSENDPARTITION \"$2\"" ;; |
---|
| 232 | $OG_ERR_UCASTSENDFILE) MSG="$MSG_ERR_UCASTSENDFILE \"$2\"" ;; |
---|
| 233 | $OG_ERR_UCASTRECEIVERPARTITION) MSG="$MSG_ERR_UCASTRECEIVERPARTITION \"$2\"" ;; |
---|
| 234 | $OG_ERR_UCASTRECEIVERFILE) MSG="$MSG_ERR_UCASTRECEIVERFILE \"$2\"" ;; |
---|
| 235 | $OG_ERR_MCASTSYNTAXT) MSG="$MSG_ERR_MCASTSYNTAXT \"$2\"" ;; |
---|
| 236 | $OG_ERR_MCASTSENDFILE) MSG="$MSG_ERR_MCASTSENDFILE \"$2\"" ;; |
---|
| 237 | $OG_ERR_MCASTRECEIVERFILE) MSG="$MSG_ERR_MCASTRECEIVERFILE \"$2\"" ;; |
---|
| 238 | $OG_ERR_MCASTSENDPARTITION) MSG="$MSG_ERR_MCASTSENDPARTITION \"$2\"" ;; |
---|
| 239 | $OG_ERR_MCASTRECEIVERPARTITION) MSG="$MSG_ERR_MCASTRECEIVERPARTITION \"$2\"" ;; |
---|
[4e1dc53] | 240 | $OG_ERR_PROTOCOLJOINMASTER) MSG="$MSG_ERR_PROTOCOLJOINMASTER \"$2\"" ;; |
---|
[1ee5d4d3] | 241 | $OG_ERR_DONTMOUNT_IMAGE) MSG="$MSG_ERR_DONTMOUNT_IMAGE \"$2\"" ;; |
---|
[cd1f048] | 242 | $OG_ERR_DONTUNMOUNT_IMAGE) MSG="$MSG_ERR_DONTUNMOUNT_IMAGE \"$2\"" ;; |
---|
[e27c4f4] | 243 | $OG_ERR_DONTSYNC_IMAGE) MSG="$MSG_ERR_DONTSYNC_IMAGE \"$2\"" ;; |
---|
[a4f7a1a0] | 244 | $OG_ERR_NOTDIFFERENT) MSG="$MSG_ERR_NOTDIFFERENT \"$2\"" ;; |
---|
[c4db9c1] | 245 | $OG_ERR_SYNCHRONIZING) MSG="$MSG_ERR_SYNCHRONIZING \"$2\"" ;; |
---|
[1cd64e6] | 246 | *) MSG="$MSG_ERR_GENERIC"; CODE=$OG_ERR_GENERIC ;; |
---|
[2e15649] | 247 | esac |
---|
| 248 | |
---|
[5962edd] | 249 | # Obtener lista de funciones afectadas, incluyendo el script que las llama. |
---|
[3294b83] | 250 | FUNCS="${FUNCNAME[@]:1}" |
---|
[5962edd] | 251 | FUNCS="${FUNCS/main/$(basename $0 2>/dev/null)}" |
---|
| 252 | |
---|
[7bb2f3f] | 253 | # Mostrar mensaje de error si es función depurable y salir con el código indicado. |
---|
| 254 | if [ $CODE == $OG_ERR_FORMAT ] || ogCheckStringInGroup "$FUNCS" "$NODEBUGFUNCTIONS" || ! ogCheckStringInGroup "${FUNCS%% *}" "$NODEBUGFUNCTIONS"; then |
---|
| 255 | ogEcho $LOGS error "${FUNCS// /<-}: $MSG" >&2 |
---|
| 256 | fi |
---|
[a5df9b9] | 257 | return $CODE |
---|
[9f29ba6] | 258 | } |
---|
| 259 | |
---|
| 260 | |
---|
[aae34f6] | 261 | #/** |
---|
[b1384da] | 262 | # ogIsRepoLocked |
---|
| 263 | #@brief Comprueba si el repositorio está siendo usado (tiene ficheros abiertos). |
---|
| 264 | #@param No. |
---|
[7685100] | 265 | #@return Código de salida: 0 - bloqueado, 1 - sin bloquear o error. |
---|
[b1384da] | 266 | #@version 0.10 - Primera versión para OpenGnSys. |
---|
| 267 | #@author Ramon Gomez, ETSII Universidad de Sevilla |
---|
| 268 | #@date 2011-01-17 |
---|
[7685100] | 269 | #@version 1.0.1 - Devolver falso en caso de error. |
---|
| 270 | #@author Ramon Gomez, ETSII Universidad de Sevilla |
---|
| 271 | #@date 2011-05-18 |
---|
[b1384da] | 272 | #*/ |
---|
[7685100] | 273 | function ogIsRepoLocked () |
---|
| 274 | { |
---|
[b1384da] | 275 | # Variables locales. |
---|
| 276 | local f FILES |
---|
| 277 | |
---|
[39db3a1] | 278 | # Si se solicita, mostrar ayuda. |
---|
| 279 | if [ "$*" == "help" ]; then |
---|
| 280 | ogHelp "$FUNCNAME" "$FUNCNAME" "if $FUNCNAME; then ...; fi" |
---|
| 281 | return |
---|
| 282 | fi |
---|
| 283 | |
---|
[b1384da] | 284 | # No hacer nada, si no está definido el punto de montaje del repositorio. |
---|
[7685100] | 285 | [ -z "$OGIMG" ] && return 1 |
---|
[b1384da] | 286 | |
---|
| 287 | # Comprobar si alguno de los ficheros abiertos por los procesos activos está en el |
---|
| 288 | # punto de montaje del repositorio de imágenes. |
---|
[697a9ee] | 289 | FILES=$(for f in /proc/[0-9]*/fd/*; do readlink -f "$f"; done | grep "^$OGIMG") # */ (comentario Doxygen) |
---|
[7685100] | 290 | test -n "$FILES" |
---|
[b1384da] | 291 | } |
---|
| 292 | |
---|
| 293 | |
---|
[1cd64e6] | 294 | function ogCheckProgram () |
---|
[914d834] | 295 | { |
---|
| 296 | # Si se solicita, mostrar ayuda. |
---|
| 297 | if [ "$*" == "help" ]; then |
---|
[1cd64e6] | 298 | ogHelp "$FUNCNAME \"str_program ...\"" \ |
---|
| 299 | "$FUNCNAME \"partimage partclone mbuffer\"" |
---|
[914d834] | 300 | return |
---|
| 301 | fi |
---|
| 302 | |
---|
| 303 | # Error si no se recibe 1 parámetro. |
---|
| 304 | [ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? |
---|
| 305 | |
---|
[1cd64e6] | 306 | local PERROR PLOG i |
---|
[914d834] | 307 | PERROR=0 |
---|
| 308 | PLOG=" " |
---|
| 309 | for i in `echo $1` |
---|
| 310 | do |
---|
| 311 | if [ ! `which $i` ] |
---|
| 312 | then |
---|
| 313 | PERROR=1 |
---|
| 314 | PLOG="$PLOG $i" |
---|
| 315 | fi |
---|
| 316 | done |
---|
| 317 | if [ "$PERROR" == "1" ] |
---|
| 318 | then |
---|
| 319 | ogRaiseError $OG_ERR_NOTEXEC "$PLOG" || return $? |
---|
| 320 | else |
---|
| 321 | return 0 |
---|
| 322 | fi |
---|
| 323 | } |
---|
[1cd64e6] | 324 | |
---|
[1a55e13] | 325 | |
---|
| 326 | |
---|
| 327 | #### PRUEBA |
---|
| 328 | function ogIsVirtualMachine() { |
---|
| 329 | case "$(dmidecode -s system-product-name)" in |
---|
| 330 | KVM|VirtualBox) |
---|
| 331 | return 1 ;; |
---|
| 332 | *) return 0 ;; |
---|
| 333 | esac |
---|
| 334 | } |
---|
| 335 | |
---|