summaryrefslogtreecommitdiffstats
path: root/client/shared/scripts/configureOs
blob: c251b0ffcb1bc6c835c6f61bcb768c87b9083410 (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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
#!/bin/bash

#/**
#         configureOs
#@brief   Script para realizar la configuracion del sistema operativo restaurado.
#@param 1 disco 
#@param 2 particion 
#@param 3 Repositorio (CACHE, REPO o dirección IP)
#@param 4 Nombre canónico de la imagen (sin extensión)
#@return  
#@TODO  comprobar que el tipo de particion corresponde con el sistema de archivos.
#@exception OG_ERR_FORMAT     # 1 formato incorrecto.
#@version 1.0.1 - Integracion cambio de nombre, extender fs, chequear particion activa
#@author  
#@date   2011-05-11
#@version 1.0.1 - Configura el sector de la particion y el gestor de windows para iniciarse desde cualquier particion.  
#@author Antonio J. Doblas Viso.    Universidad de Malaga.
#@date   2011-05-20
#@version 1.0.2 - Configura el sector de la particion y el gestor de linux para iniciarse desde cualquier particion.  
#@author Antonio J. Doblas Viso.    Universidad de Malaga.
#@date   2011-11-22
#@version 1.0.3 - Configura el chkdisk en el arranque de windows, segun variable OGWINCHKDISK del engine.cfg.  
#@author Antonio J. Doblas Viso.    Universidad de Malaga.
#@date   2011-12-23
#@version 1.0.4 - Inyecta el cliente para gestión del sistema operativo.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date   2012-04-11
#@version 1.0.5 - Postconfiguración para Mac OS X.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date   2013-10-11
#@version 1.1.0 - Postconfiguración para agente de sistema operativo basado en REST.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date   2016-08-16
#@version 1.0.6b - llamadas opcionales para mejoras varias. Descomentar la instruccion para su activacion. ogConfigureFstab  
#@author Antonio J. Doblas Viso.    Universidad de Malaga.
#@date   2016-11-03
#@version 1.1.1 - Equipos UEFI: cambia uuid de las particiones y restaura el cargador de arranque (Windows) (tickect #802)
#@author Irina Gomez, ETSII Universidad de Sevilla
#@date   2019-01-08
#*/ ##

# Carga el configurador del engine y los parámetros de red.
[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg
[ -f $DEVICECFG ] && source $DEVICECFG

PROG="$(basename $0)"

# Para Windows en equipos EFI son necesarios cuatro parámetros
OSTYPE="$(ogGetOsType $1 $2)"
if [ ogIsEfiActive -a "$OSTYPE" == "Windows" ]; then
    if [ $# -lt 4 ]; then
        ogRaiseError session $OG_ERR_FORMAT
        ogHelp "$PROG:" \
               "$PROG ndisco nparticion [ REPO|CACHE|IPSERVER ] [imagename]" \
               "$PROG 1 1" \
               "$PROG 1 2 REPO Windows  (UEFI)"
        exit $OG_ERR_FORMAT
    fi

    REPO="${3^^}"
    REPO=${REPO:-"REPO"}
    IMGNAME="$4"
    # Cambio de repositorio
    if [ "$REPO" == "$(ogGetIpAddress)" -o "$REPO" == "CACHE" ]; then
        REPO="CACHE"
    else
        ogCheckIpAddress "$REPO"
        if [ $? == 0 -o "$REPO" == "REPO"  ]; then
            # Si falla el cambio -> salimos con error repositorio no valido
            ogChangeRepo $REPO ${OGUNIT} || exit $(ogRaiseError $OG_ERR_NOTFOUND "$REPO $OGUNIT"; echo $?)
            REPO="REPO"
        fi
    fi
fi

# Si el sistema de archivos no esta extendido, ampliarlo al tamaño de su partición.
PARTSIZE=$(ogGetPartitionSize $1 $2) || exit $?
FSSIZE=$(ogGetFsSize $1 $2)
if [ $FSSIZE -lt $PARTSIZE ]; then
    echo "Extender sistema de archivos."
    ogExtendFs $1 $2
fi

# Si no existe partición activa, activar este sistema.
FLAGACTIVE=$(ogGetPartitionActive $1)
[ -z $FLAGACTIVE ] && ogSetPartitionActive $1 $2

# Si el sistema de archivos es de solo lectura, no hacer la post-configuración.
MNTDIR=$(ogMount $1 $2)
if ! ogIsWritable $1 $2; then
    echo "AVISO: sistema de archivos de solo lectura, no se ejecuta postconfiguración."
    exit
fi

# Nombre del cliente.
HOST="$(ogGetHostname)"

# Post-configuración personalizada para cada tipo de sistema operativo.
case "$OSTYPE" in 
    Windows)    # Postconfiguración de Windows.
        # Si es UEFI pongo el UUID de la partición del modelo
        if ogIsEfiActive; then
            echo ogRestoreUuidPartitions $REPO $IMGNAME $1 $2
            ogRestoreUuidPartitions $REPO $IMGNAME $1 $2
        fi
        # Cambiar nombre en sistemas Windows.
        HOST=${HOST:-"pc"}
        ogSetWindowsName $1 $2 "$HOST"
        # Configurar el boot sector de la partición Windows.
        ogFixBootSector $1 $2
        # Configurar el gestor de arranque de Windows XP/Vista/7.
        ogWindowsBootParameters $1 $2
        # Registrar en Windows que la partición indicada es su nueva unidad C:\
        ogWindowsRegisterPartition $1 $2 C $1 $2
        # Configurar nuevo agente OGAgent.
        ogConfigureOgagent $1 $2
        # Eliminar el antiguo cliente de Windows.
        if [ -n "$(ogGetPath $MNTDIR/windows/ogAdmWinClient.exe)$(ogGetPath $MNTDIR/winnt/ogAdmWinClient.exe)" ]; then
            ogInstallMiniSetup $1 $2 postconf.cmd
            ogUninstallWindowsClient $1 $2 postconf.cmd
        fi
        # Si es UEFI copio el cargador de arranque a la partición EFI
        if ogIsEfiActive; then
            echo ogRestoreEfiBootLoader $1 $2
            ogRestoreEfiBootLoader $1 $2
        fi
        ;;
    Linux)      # Postconfiguración de GNU/Linux.
        # Instalamos EFI Boot Loader
        if [ ogIsEfiActive ]; then
            # Cambio UUID del sistema de ficheros
            ogUuidChange $1 $2
            ogConfigureFstab $1 $2
        fi
        ## Instala (no configura) el codigo de arranque del Grub en la partición (no lo configura, se mantiene el original de la imagen)
        ogGrubInstallPartition $1 $2
        # Eliminar el antiguo cliente de Linux.
        [ -n "$(find $MNTDIR/usr/sbin $MNTDIR/sbin $MNTDIR/usr/local/sbin -name ogAdmLnxClient -print)" ] && ogUninstallLinuxClient $1 $2
        # Configurar nuevo agente OGAgent.
        ogConfigureOgagent $1 $2
        ;;
    MacOS)      # Postconfiguración de Mac OS X.
        # Fichero indicador de activación de postconfiguración.
        touch $MNTDIR/osxpostconf

        # Crear fichero de configuración del servicio de arranque.
        cat << EOT >$MNTDIR/Library/LaunchDaemons/es.opengnsys.postconfd.plist
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
	<dict>
		<key>Label</key>
		<string>es.opengnsys.postconfd.sh</string>
		<key>ProgramArguments</key>
		<array>
			<string>/var/root/postconfd.sh</string>
		</array>
		<key>RunAtLoad</key>
		<true/>
		<key>StandardOutPath</key>
		<string>/var/log/postconfd.log</string>
		<key>StandardErrorPath</key>
		<string>/var/log/postconfd.err</string>
		<key>Debug</key>
		<true/>
	</dict>
</plist>
EOT

        # Programa de inicio que será ejecutado en el arranque de Mac OS X.
        cat << EOT >$MNTDIR/var/root/postconfd.sh
#!/bin/bash
# postconfd - ejecución de scripts de inicio.

# Ejecutar postconfiguración si existe el fichero indicador.
if [ -e /osxpostconf ]; then
	# Tomar nombre del equipo.
	HOST="$HOST"
	if [ -z "\$HOST" ]; then
		# Si no hay nombre asociado, activar la red para obtener datos del DHCP.
		source /etc/rc.common
		CheckForNetwork
		while [ "\$NETWORKUP" != "-YES-" ]; do
			sleep 5
			NETWORKUP=
			CheckForNetwork
		done
		# Componer nombre del equipo a partir de datos del DHCP.
		IP=\$(ifconfig en0 inet | awk '{if (\$1=="inet") print \$2}')
		HOST="mac-\$(echo \${IP//./-} | cut -f3-4 -d-)"
	fi
	# Asignar nombre del equipo.
	scutil --set ComputerName "\$HOST"
	scutil --set LocalHostName "\$HOST"
	scutil --set HostName "\$HOST"
	hostname "\$HOST"
	# Descromprimir ficheros de versión para obtener inventario de aplicaciones.
	find /Applications -type d -name "*.app" -prune -exec \
	     ditto --nopreserveHFSCompression "{}/Contents/version.plist" "{}/Contents/version.plist.uncompress"
	rm -f /osxpostconf    # Borrar fichero indicador de psotconfiguración
fi
EOT
        # Dar permiso de ejecución.
        chmod 700 $MNTDIR/var/root/postconfd.sh
        # Configurar nuevo agente OGAgent de sistema operativo.
        ogConfigureOgagent $1 $2
        ;;
esac
exit 0