summaryrefslogtreecommitdiffstats
path: root/client/shared/scripts/restoreGitImage
blob: 1817108e786fb4916de6a4ee2b4089ecfb85ec95 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#!/bin/bash
#/**
#@file    restoreGitImage
#@brief   Script de ejemplo para restaurar una imagen.
#@param   $1 Repositorio (CACHE, REPO o dirección IP)
#@param   $2 Nombre canónico de la imagen (sin extensión)
#@param   $3 Número de disco
#@param   $4 Número de particion
#@param   $5 Protocolo (GIT)
#@param   $6 Opciones del protocolo [str_modo_git:str_modo_acl] str_modo_git=clone|checkout str_modo_acl:total|sync
#@exception OG_ERR_FORMAT   1 formato incorrecto.
#@exception OG_ERR_NOTFOUND  2 cambio de repositorio: repositorio no encontrado
#@exception OG_ERR_NOTFOUND  2 fichero de imagen o partición no detectados.
#@exception $OG_ERR_MCASTRECEIVERFILE  57 Error en la recepción Multicast de un fichero
#@exception $OG_ERR_PROTOCOLJOINMASTER 60 Error en la conexión de una sesión Unicast|Multicast con el Master
#@version 1.2 - Primera versión. Se parte de los script de UGR y de restoreImage de OpenGnsys
#@date    2020/01/08
#**/

TIME1=$SECONDS
PROG="$(basename $0)"

# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
    ogHelp "$PROG" "$PROG CACHE imagen ndisk npart GIT [ git_mode:acl_mode ]" \
           "$PROG CACHE Ubuntu20 1 2 GIT clone:total" \
           "$PROG CACHE Windows20 1 1 GIT checkout:user"
   exit 0
fi

# Controlamos el número de parámetros.
if [ $# -lt 4 ]; then
    ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG CACHE imagen ndisco nparticion GIT [ git_mode:acl_mode ]"
    exit $?
fi

#Load engine configurator from engine.cfg file.
#Carga el configurador del engine desde el fichero engine.cfg
[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg

# Clear temporary file used as log track by httpdlog
# Limpia los ficheros temporales usados como log de seguimiento para httpdlog
echo " " > $OGLOGCOMMAND
ogCheckStringInGroup "$(ogGetCaller)" "deployGitImage restoreGitImageCustom" || echo -n "" > $OGLOGSESSION; 

ogEcho log session "[1] $MSG_SCRIPTS_START $0 $*"

# Procesar parámetros de entrada
REPO="${1^^}"
IMGNAME="$2"
DISK="$3"
PART="$4"
PROTOOPT="${6:-clone:total}"
GITMODE=${PROTOOPT%:*}
ACLMODE=${PROTOOPT#*:}

# El protocolo tiene que se GIT
[ "${5^^}" == "GIT" ] || ogRaiseError $OG_ERR_FORMAT "único protocolo permitido GIT" || exit $?

# Comprobamos que el modo de Git es correcto
ogCheckStringInGroup "$GITMODE" "clone checkout" || ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: str_git_mode:clone|checkout" || exit $?

# Si es una ip y es igual a la del equipo restaura desde cache
[ "$REPO" == "$(ogGetIpAddress)" ] && REPO="CACHE"
[ "$REPO" == "CACHE" ] || ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT Solo permitido desde cache" || exit $?

# Comprobamos que la partición se pueda montar. Si no modo total (formateo)
MNTDIR=$(ogMount $DISK $PART) || GITMODE="clone"

TIME2=$SECONDS
if [ "$GITMODE" == "checkout" ]; then
    # comprobamos que la partición contenga la imagen. Si no modo clone
    cd $MNTDIR
    git branch| grep "[ *] ${IMGNAME}$" &>/dev/null

    if [ $? -eq 0 ]; then
        # Revertimos la partición a la situación inicial de git
        ogEcho log session "ogSyncLocalGitImage  $DISK $PART"
	ogSyncLocalGitImage $DISK $PART
    else
        GITMODE="clone"
    fi
fi

if [ "$GITMODE" == "clone" ]; then
    # Comprobar que exista la imagen la cache
    ogExistGitImage CACHE "$IMGNAME" || ogRaiseError session $OG_ERR_NOTFOUND "CACHE $IMGNAME" || exit

    # Las ACL se deben restaurar completas
    ACLMODE="total"

    # Procesar protocolos de transferencia.
    ogGitConfig

    # Restauramos datos (formatea la partición)
    ogEcho log session "ogRestoreLocalGitImage $IMGNAME $DISK $PART"
    ogExecAndLog command ogRestoreLocalGitImage $IMGNAME $DISK $PART || exit $?
fi
TIME2=$[SECONDS-TIME2]
ogEcho log session "   [ ]  $MSG_SCRIPTS_TIME_PARTIAL ogSyncLocalGitImage/ogRestoreLocalGitImage $[TIME2/60]m $[TIME2%60]s"

TIME3=$SECONDS
# Restauramos ACL
# Nota: al restaurar las acl da falsos errores, no podemos controlar el error.
ogEcho log session "ogRestoreGitAcl $IMGNAME $DISK $PART $ACLMODE"
ogExecAndLog command ogRestoreGitAcl $IMGNAME $DISK $PART $ACLMODE
TIME3=$[SECONDS-TIME3]
ogEcho log session "   [ ]  $MSG_SCRIPTS_TIME_PARTIAL ogRestoreGitAcl $[TIME3/60]m $[TIME3%60]s"

TIME=$[SECONDS-TIME1]
ogEcho log session "[100] Duracion de la operacion $[TIME/60]m $[TIME%60]s"