source: installer/opengnsys_installer_devel_esxi.sh @ 96ee53a

lgromero-new-oglive
Last change on this file since 96ee53a was b9345db, checked in by lgromero <lgromero@…>, 6 months ago

refs #941 fix typo in oglive name

  • Property mode set to 100755
File size: 72.0 KB
RevLine 
[b4f6d4b]1#!/bin/bash
2
3#####################################################################
4####### Script instalador OpenGnsys
5####### Autor: Luis Guillén <lguillen@unizar.es>
6#####################################################################
7
8
9#####################################################################
10####### Funciones de configuración
11#####################################################################
[e404e82]12
[b4f6d4b]13MY_BRANCH=$1
14
[3513239]15# Devuelve en la variable PASSWORD la clave introducida por el usuario (o la indicada por defecto)
[b4f6d4b]16function enterPassword ()
17{
18        local PASSWORD2
19        local DEFAULT_PASSWORD="$1"
20
21        while : ; do
22                stty -echo
23                read -r PASSWORD
24                stty echo
25                if [ -z "$PASSWORD" ]; then
26                        # Si esta vacio ponemos el valor por defecto
27                        PASSWORD="${PASSWORD:-$DEFAULT_PASSWORD}"
28                        break
29                else
30                        if [ -n "${PASSWORD//[a-zA-Z0-9]/}" ]; then # Comprobamos que sea un valor alfanumerico
31                                echo -e "\\aERROR: Password must be alphanumeric, try again..."
32                        else
33                                echo -n -e "\\nConfirm password: "
34                                stty -echo
35                                read -r PASSWORD2
36                                stty echo
37                                if [ "$PASSWORD" == "$PASSWORD2" ]; then
38                                        break
39                                else
40                                        echo -e "\\aERROR: Passwords don't match, try again."
41                                fi
42                        fi
43                fi
44                echo -n -e "Please, enter a new password (${DEFAULT_PASSWORD}): "
45        done
46}
47
48# Recoge los datos de configuración introducidos por el usuario.
49function userData ()
50{
51        ####  AVISO: Puede editar configuración de acceso por defecto.
52        ####  WARNING: Edit default access configuration if you wish.
53        DEFAULT_MYSQL_ROOT_PASSWORD="passwordroot"      # Clave por defecto root de MySQL
54        DEFAULT_OPENGNSYS_DB_USER="usuog"               # Usuario por defecto de acceso a la base de datos
55        DEFAULT_OPENGNSYS_DB_PASSWD="passusuog"         # Clave por defecto de acceso a la base de datos
56        DEFAULT_OPENGNSYS_CLIENT_PASSWD="og"            # Clave por defecto de acceso del cliente
[b9345db]57        DEFAULT_OGLIVE="ogLive-noble-6.8.0-31-generic-amd64-r20240716_20241014.iso"     # Cliente ogLive
[edae476]58        DEFAULT_UDS_REST_URL="${DEFAULT_UDS_REST_URL:-https://uds.example.com/uds/rest/}"
59        DEFAULT_UDS_AUTHENTICATOR="${DEFAULT_UDS_AUTHENTICATOR:-Local users}"
60        DEFAULT_UDS_USER="${DEFAULT_UDS_USER:-user}"
61        DEFAULT_UDS_PASS="${DEFAULT_UDS_PASS:-pass}"
[b4f6d4b]62
63        echo -e "\\nOpenGnsys Installation"
64        echo "=============================="
65
[2af8621]66        if [[ ! $- =~ s ]]; then
[b4f6d4b]67                echo -e "\\nNot interactive mode: setting default configuration values.\\n"
68                MYSQL_ROOT_PASSWORD="$DEFAULT_MYSQL_ROOT_PASSWORD"
69                OPENGNSYS_DB_USER="$DEFAULT_OPENGNSYS_DB_USER"
70                OPENGNSYS_DB_PASSWD="$DEFAULT_OPENGNSYS_DB_PASSWD"
71                OPENGNSYS_CLIENT_PASSWD="$DEFAULT_OPENGNSYS_CLIENT_PASSWD"
72                OGLIVE="$DEFAULT_OGLIVE"
[545545d]73                UDS_REST_URL="$DEFAULT_UDS_REST_URL"
74                UDS_AUTHENTICATOR="$DEFAULT_UDS_AUTHENTICATOR"
75                UDS_USER="$DEFAULT_UDS_USER"
76                UDS_PASS="$DEFAULT_UDS_PASS"
[edae476]77                UDS_REST_URL="$DEFAULT_UDS_REST_URL"
78                UDS_AUTHENTICATOR="$DEFAULT_UDS_AUTHENTICATOR"
79                UDS_USER="$DEFAULT_UDS_USER"
80                UDS_PASS="$DEFAULT_UDS_PASS"
[b4f6d4b]81                return
82        fi
83
84        # Clave root de MySQL
85        echo -n -e "\\nEnter root password for MySQL (${DEFAULT_MYSQL_ROOT_PASSWORD}): "
86        enterPassword "$DEFAULT_MYSQL_ROOT_PASSWORD"
87        MYSQL_ROOT_PASSWORD="$PASSWORD"
88
89        # Usuario de acceso a la base de datos
90        while : ; do
91                echo -n -e "\\n\\nEnter username for OpenGnsys console (${DEFAULT_OPENGNSYS_DB_USER}): "
92                read -r OPENGNSYS_DB_USER
93                if [ -n "${OPENGNSYS_DB_USER//[a-zA-Z0-9]/}" ]; then # Comprobamos que sea un valor alfanumerico
94                        echo -e "\\aERROR: Must be alphanumeric, try again..."
95                else
96                        # Si esta vacio ponemos el valor por defecto
97                        OPENGNSYS_DB_USER="${OPENGNSYS_DB_USER:-$DEFAULT_OPENGNSYS_DB_USER}"
98                        break
99                fi
100        done
101
102        # Clave de acceso a la base de datos
103        echo -n -e "\\nEnter password for OpenGnsys console (${DEFAULT_OPENGNSYS_DB_PASSWD}): "
104        enterPassword "$DEFAULT_OPENGNSYS_DB_PASSWD"
105        OPENGNSYS_DB_PASSWD="$PASSWORD"
106
107        # Clave de acceso del cliente
108        echo -n -e "\\n\\nEnter root password for OpenGnsys client (${DEFAULT_OPENGNSYS_CLIENT_PASSWD}): "
109        enterPassword "$DEFAULT_OPENGNSYS_CLIENT_PASSWD"
110        OPENGNSYS_CLIENT_PASSWD="$PASSWORD"
111
112        # Selección de clientes ogLive para descargar.
113        while : ; do
114                echo -e "\\n\\nChoose ogLive client to install."
115                echo -e "1) Kernel 5.11, 64-bit, EFI-compatible"
116                echo -e "2) Kernel 3.2, 32-bit"
117                echo -e "3) Both"
118                echo -n -e "Please, type a valid number (1): "
119                read -r OPT
120                case "$OPT" in
121                        1|"")   OGLIVE="$DEFAULT_OGLIVE"
122                                break ;;
123                        2)      OGLIVE="ogLive-precise-3.2.0-23-generic-r5159.iso"
124                                break ;;
125                        3)      OGLIVE=" $DEFAULT_OGLIVE ogLive-precise-3.2.0-23-generic-r5159.iso";
126                                break ;;
127                        *)      echo -e "\\aERROR: unknown option, try again."
128                esac
129        done
130
[545545d]131        # URL de API REST de UDS
132        echo -n -e "\\nEnter UDS REST API URL (${DEFAULT_UDS_REST_URL}): "
[edae476]133        read -r -ei "${DEFAULT_UDS_REST_URL}" UDS_REST_URL
[545545d]134
135        # Autenticador de UDS
136        echo -n -e "\\nEnter UDS authenticator (${DEFAULT_UDS_AUTHENTICATOR}): "
137        enterPassword "$DEFAULT_UDS_AUTHENTICATOR"
138        UDS_AUTHENTICATOR="$PASSWORD"
139
140        # Usuario de UDS
141        echo -n -e "\\nEnter UDS username (${DEFAULT_UDS_USER}): "
[edae476]142        read -r -ei "${DEFAULT_UDS_USER}" UDS_USER
[545545d]143
144        # Contraseña de UDS
145        echo -n -e "\\nEnter UDS password (${DEFAULT_UDS_PASS}): "
146        enterPassword "$DEFAULT_UDS_PASS"
147        UDS_PASS="$PASSWORD"
148
149        unset PASSWORD
[b4f6d4b]150        echo -e "\\n=============================="
151}
152
153# Asigna valores globales de configuración para el script.
154function globalSetup ()
155{
156        PROGRAMDIR=$(readlink -e "$(dirname "$0")")
157        PROGRAMNAME=$(basename "$0")
158
159        # Comprobar si se ha descargado el paquete comprimido (REMOTE=0) o sólo el instalador (REMOTE=1).
[26dd8f6]160        OPENGNSYS_SERVER="ognproject.evlt.uma.es"
[b4f6d4b]161        DOWNLOADURL="https://$OPENGNSYS_SERVER/trac/downloads"
162        if [ -d "$PROGRAMDIR/../installer" ]; then
[11fbd77]163                echo REMOTE=0
[b4f6d4b]164                REMOTE=0
165        else
[11fbd77]166                echo REMOTE=1
[b4f6d4b]167                REMOTE=1
168        fi
[a8044f7]169        BRANCH=$1
170        if [[ -z $BRANCH ]]; then
[b4f6d4b]171                BRANCH="main"
[a8044f7]172        fi
[b4f6d4b]173        API_URL="https://api.github.com/repos/opengnsys/OpenGnsys"
[9e796a9]174        GIT_REPO="https://ognproject.evlt.uma.es/gitea/opengnsys/opengnsys.git"
[b4f6d4b]175
176        # Directorios de instalación y destino de OpenGnsys.
177        WORKDIR=/tmp/opengnsys_installer
178        INSTALL_TARGET=/opt/opengnsys
179        PATH=$PATH:$INSTALL_TARGET/bin
180
181        # Registro de incidencias.
182        OGLOGFILE=$INSTALL_TARGET/log/${PROGRAMNAME%.sh}.log
183        LOG_FILE=/tmp/$(basename $OGLOGFILE)
184
185        # Usuario del cliente para acceso remoto.
186        OPENGNSYS_CLIENT_USER="opengnsys"
187        # Nombre de la base datos y fichero SQL para su creación.
188        OPENGNSYS_DATABASE="ogAdmBD"
189        OPENGNSYS_DB_CREATION_FILE=opengnsys/admin/Database/${OPENGNSYS_DATABASE}.sql
[f605fae]190
[a8044f7]191        # Set Default net
[f605fae]192        DHCPNET=${DHCPNET:-"NONE"}
193        echo Default Network is $DHCPNET
[b4f6d4b]194}
195
196# Generar variables de configuración del instalador
197# Variables globales:
198# - OSDISTRIB, OSVERSION - tipo y versión de la distribución GNU/Linux
199# - DEPENDENCIES - array de dependencias que deben estar instaladas
200# - UPDATEPKGLIST, INSTALLPKGS, CHECKPKGS - comandos para gestión de paquetes
201# - INSTALLEXTRADEPS - instalar dependencias no incluidas en la distribución
202# - STARTSERVICE, ENABLESERVICE - iniciar y habilitar un servicio
203# - STOPSERVICE, DISABLESERVICE - parar y deshabilitar un servicio
204# - APACHESERV, APACHECFGDIR, APACHESITESDIR, APACHEUSER, APACHEGROUP - servicio y configuración de Apache
205# - APACHEENABLEMODS, APACHEENABLESSL, APACHEMAKECERT - habilitar módulos y certificado SSL
206# - APACHEENABLEOG, APACHEOGSITE, - habilitar sitio web de OpenGnsys
207# - PHPFPMSERV - servicio PHP FastCGI Process Manager para Apache
208# - INETDSERV - servicio Inetd
209# - DHCPSERV, DHCPCFGDIR - servicio y configuración de DHCP
210# - MYSQLSERV, TMPMYCNF - servicio MySQL y fichero temporal con credenciales de acceso
211# - MARIADBSERV - servicio MariaDB (sustituto de MySQL en algunas distribuciones)
212# - RSYNCSERV, RSYNCCFGDIR - servicio y configuración de Rsync
213# - SAMBASERV, SAMBACFGDIR - servicio y configuración de Samba
214# - TFTPSERV, TFTPCFGDIR - servicio y configuración de TFTP/PXE
215function autoConfigure()
216{
217# Detectar sistema operativo del servidor (compatible con fichero os-release y con LSB).
218if [ -f /etc/os-release ]; then
219        source /etc/os-release
220        OSDISTRIB="$ID"
221        OSVERSION="$VERSION_ID"
222else
223        OSDISTRIB=$(lsb_release -is 2>/dev/null)
224        OSVERSION=$(lsb_release -rs 2>/dev/null)
225fi
226# Convertir distribución a minúsculas y obtener solo el 1er número de versión.
227OSDISTRIB="${OSDISTRIB,,}"
228OSVERSION="${OSVERSION%%.*}"
229
230# Configuración según la distribución GNU/Linux (usar minúsculas).
231case "$OSDISTRIB" in
232        ubuntu|debian|linuxmint)
[4f57c14]233                DEPENDENCIES=( subversion apache2 php php-ldap php-fpm mariadb-server php-mysql isc-dhcp-server bittorrent tftp-hpa tftpd-hpa xinetd build-essential g++-multilib libmysqlclient-dev wget curl doxygen graphviz bittornado ctorrent samba rsync unzip netpipes debootstrap schroot squashfs-tools btrfs-tools procps arp-scan realpath php-curl gettext moreutils jq wakeonlan udpcast libev-dev libjansson-dev libssl-dev shim-signed grub-efi-amd64-signed gawk libdbi-dev libdbi1 libdbd-mysql liblz4-tool git stunnel4 )
[b4f6d4b]234                UPDATEPKGLIST="apt-get update"
235                INSTALLPKG="apt-get -y install --force-yes"
236                CHECKPKG="dpkg -s \$package 2>/dev/null | grep Status | grep -qw install"
237                if which service &>/dev/null; then
238                        STARTSERVICE="eval service \$service restart"
239                        STOPSERVICE="eval service \$service stop"
240                else
241                        STARTSERVICE="eval /etc/init.d/\$service restart"
242                        STOPSERVICE="eval /etc/init.d/\$service stop"
243                fi
244                ENABLESERVICE="eval update-rc.d \$service defaults"
245                DISABLESERVICE="eval update-rc.d \$service disable"
246                APACHESERV=apache2
247                APACHECFGDIR=/etc/apache2
248                APACHESITESDIR=sites-available
249                APACHEOGSITE=opengnsys
250                APACHEUSER="www-data"
251                APACHEGROUP="www-data"
252                APACHEENABLEMODS="a2enmod ssl rewrite proxy_fcgi fastcgi actions alias"
253                APACHEENABLESSL="a2ensite default-ssl"
254                APACHEENABLEOG="a2ensite $APACHEOGSITE"
255                APACHEMAKECERT="make-ssl-cert generate-default-snakeoil --force-overwrite"
256                DHCPSERV=isc-dhcp-server
257                DHCPCFGDIR=/etc/dhcp
258                INETDSERV=xinetd
259                INETDCFGDIR=/etc/xinetd.d
260                MYSQLSERV=mysql
261                MYSQLCFGDIR=/etc/mysql/mysql.conf.d
262                MARIADBSERV=mariadb
263                PHPFPMSERV=php-fpm
264                RSYNCSERV=rsync
265                RSYNCCFGDIR=/etc
266                SAMBASERV=smbd
267                SAMBACFGDIR=/etc/samba
268                TFTPCFGDIR=/var/lib/tftpboot
[c9459a1]269                LOCAL_CERTS_DIR=/usr/local/share/ca-certificates
270                UPDATE_CA_CMD=update-ca-certificates
271                STUNNEL_CAPATH=/etc/ssl/certs
[b4f6d4b]272                ;;
273        fedora|centos)
[4f57c14]274                DEPENDENCIES=( subversion httpd mod_ssl php-ldap php-fpm mariadb-server mysql-devel mysql-devel.i686 php-mysql dhcp tftp-server tftp xinetd binutils gcc gcc-c++ glibc-devel glibc-devel.i686 glibc-static glibc-static.i686 libstdc++-devel.i686 make wget curl doxygen graphviz ctorrent samba samba-client rsync unzip debootstrap schroot squashfs-tools python-crypto arp-scan procps-ng gettext moreutils jq net-tools udpcast libev-devel jansson-devel openssl-devel shim-x64 grub2-efi-x64 grub2-efi-x64-modules gawk libdbi-devel libdbi libdbi-dbd-mysql http://ftp.altlinux.org/pub/distributions/ALTLinux/5.1/branch/$(arch)/RPMS.classic/netpipes-4.2-alt1.$(arch).rpm )
[b4f6d4b]275                [ "$OSDISTRIB" == "centos" ] && UPDATEPKGLIST="yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-$OSVERSION.noarch.rpm http://rpms.remirepo.net/enterprise/remi-release-$OSVERSION.rpm"
276                INSTALLEXTRADEPS=( 'pushd /tmp; wget -t3 http://ftp.acc.umu.se/mirror/bittornado/BitTornado-0.3.18.tar.gz && tar xvzf BitTornado-0.3.18.tar.gz && cd BitTornado-CVS && python setup.py install && ln -fs btlaunchmany.py /usr/bin/btlaunchmany && ln -fs bttrack.py /usr/bin/bttrack; popd' )
277                INSTALLPKG="yum install -y libstdc++ libstdc++.i686"
278                CHECKPKG="rpm -q --quiet \$package"
279                SYSTEMD=$(which systemctl 2>/dev/null)
280                if [ -n "$SYSTEMD" ]; then
281                        STARTSERVICE="eval systemctl start \$service.service"
282                        STOPSERVICE="eval systemctl stop \$service.service"
283                        ENABLESERVICE="eval systemctl enable \$service.service"
284                        DISABLESERVICE="eval systemctl disable \$service.service"
285                else
286                        STARTSERVICE="eval service \$service start"
287                        STOPSERVICE="eval service \$service stop"
288                        ENABLESERVICE="eval chkconfig \$service on"
289                        DISABLESERVICE="eval chkconfig \$service off"
290                fi
291                APACHESERV=httpd
292                APACHECFGDIR=/etc/httpd/conf.d
293                APACHEOGSITE=opengnsys.conf
294                APACHEUSER="apache"
295                APACHEGROUP="apache"
296                APACHEREWRITEMOD="sed -i '/rewrite/s/^#//' $APACHECFGDIR/../*.conf"
297                DHCPSERV=dhcpd
298                DHCPCFGDIR=/etc/dhcp
299                INETDSERV=xinetd
300                INETDCFGDIR=/etc/xinetd.d
301                MYSQLSERV=mysqld
302                MYSQLCFGDIR=/etc/my.cnf.d
303                MARIADBSERV=mariadb
304                PHPFPMSERV=php-fpm
305                RSYNCSERV=rsync
306                RSYNCCFGDIR=/etc
307                SAMBASERV=smb
308                SAMBACFGDIR=/etc/samba
309                TFTPSERV=tftp
310                TFTPCFGDIR=/var/lib/tftpboot
[c9459a1]311                LOCAL_CERTS_DIR=/etc/pki/ca-trust/source/anchors
312                UPDATE_CA_CMD=update-ca-trust
313                STUNNEL_CAPATH=/etc/pki/tls/certs
[b4f6d4b]314                ;;
315        "")     echo "ERROR: Unknown Linux distribution, please install \"lsb_release\" command."
316                exit 1 ;;
317        *)      echo "ERROR: Distribution not supported by OpenGnsys."
318                exit 1 ;;
319esac
320
321# Fichero de credenciales de acceso a MySQL.
322TMPMYCNF=/tmp/.my.cnf.$$
323}
324
325
326# Modificar variables de configuración tras instalar paquetes del sistema.
327function autoConfigurePost()
328{
329local f MKNETDIR
330
331# Configuraciones específicas para Samba y TFTP en Debian 6.
332[ -z "$SYSTEMD" -a ! -e /etc/init.d/$SAMBASERV ] && SAMBASERV=samba
333[ ! -e $TFTPCFGDIR ] && TFTPCFGDIR=/srv/tftp
334
335# Preparar arranque en red con Grub.
336for f in grub-mknetdir grub2-mknetdir; do
337        if which $f &>/dev/null; then MKNETDIR=$f; fi
338done
339$MKNETDIR --net-directory=$TFTPCFGDIR --subdir=grub
340}
341
342
343# Cargar lista de paquetes del sistema y actualizar algunas variables de configuración
344# dependiendo de la versión instalada.
345function updatePackageList()
346{
347local DHCPVERSION PHP7VERSION
348
349# Si es necesario, actualizar la lista de paquetes disponibles.
350[ -n "$UPDATEPKGLIST" ] && eval $UPDATEPKGLIST
351
352# Configuración personallizada de algunos paquetes.
353case "$OSDISTRIB" in
354        ubuntu|linuxmint)       # Postconfiguación personalizada para Ubuntu.
355                # Configuración para DHCP v3.
356                DHCPVERSION=$(apt-cache show $(apt-cache pkgnames|egrep "dhcp.?-server$") | \
357                              awk '/Version/ {print substr($2,1,1);}' | \
358                              sort -n | tail -1)
359                if [ $DHCPVERSION = 3 ]; then
360                        DEPENDENCIES=( ${DEPENDENCIES[@]/isc-dhcp-server/dhcp3-server} )
361                        DHCPSERV=dhcp3-server
362                        DHCPCFGDIR=/etc/dhcp3
363                fi
364                # Configuración para PHP 7 en Ubuntu.
365                if [ -z "$(apt-cache pkgnames php7)" ]; then
366                        eval $INSTALLPKG software-properties-common
367                        add-apt-repository -y ppa:ondrej/php
368                        eval $UPDATEPKGLIST
369                        PHP7VERSION=$(apt-cache pkgnames php7 | sort | head -1)
370                        PHPFPMSERV="${PHP7VERSION}-fpm"
371                        DEPENDENCIES=( ${DEPENDENCIES[@]//php/$PHP7VERSION} )
372                fi
373                # Adaptar dependencias para libmysqlclient.
374                [ -z "$(apt-cache pkgnames libmysqlclient-dev)" ] && [ -n "$(apt-cache pkgnames libmysqlclient15)" ] && DEPENDENCIES=( ${DEPENDENCIES[@]//libmysqlclient-dev/libmysqlclient15} )
375                # Paquetes correctos en versiones nuevas.
376                [ -z "$(apt-cache pkgnames realpath)" ] && DEPENDENCIES=( ${DEPENDENCIES[@]//realpath/coreutils} )
377                [ -z "$(apt-cache pkgnames btrfs-tools)" ] && DEPENDENCIES=( ${DEPENDENCIES[@]//btrfs-tools/btrfs-progs} )
378                [ -z "$(apt-cache pkgnames bittorrent)" ] && DEPENDENCIES=( ${DEPENDENCIES[@]//bittorrent/} )
379                [ -z "$(apt-cache pkgnames bittornado)" ] && DEPENDENCIES=( ${DEPENDENCIES[@]//bittornado/} )
380                ;;
381        centos) # Postconfiguación personalizada para CentOS.
382                # Configuración para PHP 7.
383                PHP7VERSION=$(yum list -q php7\* 2>/dev/null | awk -F. '/^php/ {print $1; exit;}')
384                PHPFPMSERV="${PHP7VERSION}-${PHPFPMSERV}"
385                DEPENDENCIES=( ${PHP7VERSION} ${DEPENDENCIES[@]//php/$PHP7VERSION-php} )
386                # Cambios a aplicar a partir de CentOS 7.
387                if [ $OSVERSION -ge 7 ]; then
388                        # Sustituir MySQL por MariaDB.
389                        DEPENDENCIES=( ${DEPENDENCIES[*]/mysql-/mariadb-} )
390                        # Instalar ctorrent de EPEL para CentOS 6 (no disponible en CentOS 7).
391                        DEPENDENCIES=( ${DEPENDENCIES[*]/ctorrent/http://dl.fedoraproject.org/pub/epel/6/$(arch)/Packages/c/ctorrent-1.3.4-14.dnh3.3.2.el6.$(arch).rpm} )
392                fi
393                ;;
394        fedora) # Postconfiguación personalizada para Fedora.
395                # Incluir paquetes específicos.
396                DEPENDENCIES=( ${DEPENDENCIES[@]} btrfs-progs )
397                # Sustituir MySQL por MariaDB a partir de Fedora 20.
398                [ $OSVERSION -ge 20 ] && DEPENDENCIES=( ${DEPENDENCIES[*]/mysql-/mariadb-} )
399                ;;
400esac
401}
402
403
404#####################################################################
405####### Algunas funciones útiles de propósito general:
406#####################################################################
407
408function getDateTime()
409{
410        date "+%Y%m%d-%H%M%S"
411}
412
413# Escribe a fichero y muestra por pantalla
414function echoAndLog()
415{
416        local DATETIME=`getDateTime`
417        echo "$1"
418        echo "$DATETIME;$SSH_CLIENT;$1" >> $LOG_FILE
419}
420
421# Escribe a fichero y muestra mensaje de error
422function errorAndLog()
423{
424        local DATETIME=`getDateTime`
425        echo "ERROR: $1"
426        echo "$DATETIME;$SSH_CLIENT;ERROR: $1" >> $LOG_FILE
427}
428
429# Escribe a fichero y muestra mensaje de aviso
430function warningAndLog()
431{
432        local DATETIME=`getDateTime`
433        echo "Warning: $1"
434        echo "$DATETIME;$SSH_CLIENT;Warning: $1" >> $LOG_FILE
435}
436
437# Comprueba si el elemento pasado en $2 está en el array $1
438function isInArray()
439{
440        if [ $# -ne 2 ]; then
441                errorAndLog "${FUNCNAME}(): invalid number of parameters"
442                exit 1
443        fi
444
445        local deps
446        local is_in_array=1
447        local element="$2"
448
449        echoAndLog "${FUNCNAME}(): checking if $2 is in $1"
450        eval "deps=( \"\${$1[@]}\" )"
451
452        # Copia local del array del parámetro 1.
453        for (( i = 0 ; i < ${#deps[@]} ; i++ )); do
454                if [ "${deps[$i]}" = "${element}" ]; then
455                        echoAndLog "isInArray(): $element found in array"
456                        is_in_array=0
457                fi
458        done
459
460        if [ $is_in_array -ne 0 ]; then
461                echoAndLog "${FUNCNAME}(): $element NOT found in array"
462        fi
463
464        return $is_in_array
465}
466
467
468#####################################################################
469####### Funciones de manejo de paquetes Debian
470#####################################################################
471
472function checkPackage()
473{
474        package=$1
475        if [ -z $package ]; then
476                errorAndLog "${FUNCNAME}(): parameter required"
477                exit 1
478        fi
479        echoAndLog "${FUNCNAME}(): checking if package $package exists"
480        eval $CHECKPKG
481        if [ $? -eq 0 ]; then
482                echoAndLog "${FUNCNAME}(): package $package exists"
483                return 0
484        else
485                echoAndLog "${FUNCNAME}(): package $package doesn't exists"
486                return 1
487        fi
488}
489
490# Recibe array con dependencias
491# por referencia deja un array con las dependencias no resueltas
492# devuelve 1 si hay alguna dependencia no resuelta
493function checkDependencies()
494{
495        if [ $# -ne 2 ]; then
496                errorAndLog "${FUNCNAME}(): invalid number of parameters"
497                exit 1
498        fi
499
500        echoAndLog "${FUNCNAME}(): checking dependences"
501        uncompletedeps=0
502
503        # copia local del array del parametro 1
504        local deps
505        eval "deps=( \"\${$1[@]}\" )"
506
507        declare -a local_notinstalled
508
509        for (( i = 0 ; i < ${#deps[@]} ; i++ ))
510        do
511                checkPackage ${deps[$i]}
512                if [ $? -ne 0 ]; then
513                        local_notinstalled[$uncompletedeps]=$package
514                        let uncompletedeps=uncompletedeps+1
515                fi
516        done
517
518        # relleno el array especificado en $2 por referencia
519        for (( i = 0 ; i < ${#local_notinstalled[@]} ; i++ ))
520        do
521                eval "${2}[$i]=${local_notinstalled[$i]}"
522        done
523
524        # retorna el numero de paquetes no resueltos
525        echoAndLog "${FUNCNAME}(): dependencies uncompleted: $uncompletedeps"
526        return $uncompletedeps
527}
528
529# Recibe un array con las dependencias y lo instala
530function installDependencies()
531{
532        if [ $# -ne 1 ]; then
533                errorAndLog "${FUNCNAME}(): invalid number of parameters"
534                exit 1
535        fi
536        echoAndLog "${FUNCNAME}(): installing uncompleted dependencies"
537
538        # copia local del array del parametro 1
539        local deps
540        eval "deps=( \"\${$1[@]}\" )"
541
542        local string_deps=""
543        for (( i = 0 ; i < ${#deps[@]} ; i++ ))
544        do
545                string_deps="$string_deps ${deps[$i]}"
546        done
547
548        if [ -z "${string_deps}" ]; then
549                errorAndLog "${FUNCNAME}(): array of dependeces is empty"
550                exit 1
551        fi
552
553        OLD_DEBIAN_FRONTEND=$DEBIAN_FRONTEND            # Debian/Ubuntu
554        export DEBIAN_FRONTEND=noninteractive
555
556        echoAndLog "${FUNCNAME}(): now $string_deps will be installed"
557        eval $INSTALLPKG $string_deps
558        if [ $? -ne 0 ]; then
559                errorAndLog "${FUNCNAME}(): error installing dependencies"
560                return 1
561        fi
562
563        DEBIAN_FRONTEND=$OLD_DEBIAN_FRONTEND            # Debian/Ubuntu
564        test grep -q "EPEL temporal" /etc/yum.repos.d/epel.repo 2>/dev/null || mv -f /etc/yum.repos.d/epel.repo.rpmnew /etc/yum.repos.d/epel.repo 2>/dev/null   # CentOS/RedHat EPEL
565
566        echoAndLog "${FUNCNAME}(): dependencies installed"
567}
568
569# Hace un backup del fichero pasado por parámetro
570# deja un -last y uno para el día
571function backupFile()
572{
573        if [ $# -ne 1 ]; then
574                errorAndLog "${FUNCNAME}(): invalid number of parameters"
575                exit 1
576        fi
577
578        local file="$1"
579        local dateymd=`date +%Y%m%d`
580
581        if [ ! -f "$file" ]; then
582                warningAndLog "${FUNCNAME}(): file $file doesn't exists"
583                return 1
584        fi
585
586        echoAndLog "${FUNCNAME}(): making $file backup"
587
588        # realiza una copia de la última configuración como last
589        cp -a "$file" "${file}-LAST"
590
591        # si para el día no hay backup lo hace, sino no
592        if [ ! -f "${file}-${dateymd}" ]; then
593                cp -a "$file" "${file}-${dateymd}"
594        fi
595
596        echoAndLog "${FUNCNAME}(): $file backup success"
597}
598
599#####################################################################
600####### Funciones para el manejo de bases de datos
601#####################################################################
602
603# This function set password to root
604function mysqlSetRootPassword()
605{
606        if [ $# -ne 1 ]; then
607                errorAndLog "${FUNCNAME}(): invalid number of parameters"
608                exit 1
609        fi
610
611        local root_mysql="$1"
612        echoAndLog "${FUNCNAME}(): setting root password in MySQL server"
613        mysqladmin -u root password "$root_mysql"
614        if [ $? -ne 0 ]; then
615                errorAndLog "${FUNCNAME}(): error while setting root password in MySQL server"
616                return 1
617        fi
618        echoAndLog "${FUNCNAME}(): root password saved!"
619        return 0
620}
621
622# Si el servicio mysql esta ya instalado cambia la variable de la clave del root por la ya existente
623function mysqlGetRootPassword()
624{
625        local pass_mysql
626        local pass_mysql2
627        # Comprobar si MySQL está instalado con la clave de root por defecto.
628        if mysql -u root -p"$MYSQL_ROOT_PASSWORD" <<<"quit" 2>/dev/null; then
629                echoAndLog "${FUNCNAME}(): Using default mysql root password."
630        else
631                stty -echo
632                echo "There is a MySQL service already installed."
633                read -p "Enter MySQL root password: " pass_mysql
634                echo ""
635                read -p "Confrim password:" pass_mysql2
636                echo ""
637                stty echo
638                if [ "$pass_mysql" == "$pass_mysql2" ] ;then
639                        MYSQL_ROOT_PASSWORD="$pass_mysql"
640                        return 0
641                else
642                        echo "The keys don't match. Do not configure the server's key,"
643                        echo "transactions in the database will give error."
644                        return 1
645                fi
646        fi
647}
648
649# comprueba si puede conectar con mysql con el usuario root
650function mysqlTestConnection()
651{
652        if [ $# -ne 1 ]; then
653                errorAndLog "${FUNCNAME}(): invalid number of parameters"
654                exit 1
655        fi
656
657        local root_password="$1"
658        echoAndLog "${FUNCNAME}(): checking connection to mysql..."
659        # Componer fichero con credenciales de conexión a MySQL.
660        touch $TMPMYCNF
661        chmod 600 $TMPMYCNF
662        cat << EOT > $TMPMYCNF
663[client]
664user=root
665password=$root_password
666EOT
667        # Borrar el fichero temporal si termina el proceso de instalación.
668        trap "rm -f $TMPMYCNF" 0 1 2 3 6 9 15
669        # Comprobar conexión a MySQL.
670        echo "" | mysql --defaults-extra-file=$TMPMYCNF
671        if [ $? -ne 0 ]; then
672                errorAndLog "${FUNCNAME}(): connection to mysql failed, check root password and if daemon is running!"
673                return 1
674        else
675                echoAndLog "${FUNCNAME}(): connection success"
676                return 0
677        fi
678}
679
680# comprueba si la base de datos existe
681function mysqlDbExists()
682{
683        if [ $# -ne 1 ]; then
684                errorAndLog "${FUNCNAME}(): invalid number of parameters"
685                exit 1
686        fi
687
688        local database="$1"
689        echoAndLog "${FUNCNAME}(): checking if $database exists..."
690        echo "show databases" | mysql --defaults-extra-file=$TMPMYCNF | grep "^${database}$"
691        if [ $? -ne 0 ]; then
692                echoAndLog "${FUNCNAME}():database $database doesn't exists"
693                return 1
694        else
695                echoAndLog "${FUNCNAME}():database $database exists"
696                return 0
697        fi
698}
699
700# Comprueba si la base de datos está vacía.
701function mysqlCheckDbIsEmpty()
702{
703        if [ $# -ne 1 ]; then
704                errorAndLog "${FUNCNAME}(): invalid number of parameters"
705                exit 1
706        fi
707
708        local database="$1"
709        echoAndLog "${FUNCNAME}(): checking if $database is empty..."
710        num_tablas=`echo "show tables" | mysql --defaults-extra-file=$TMPMYCNF "${database}" | wc -l`
711        if [ $? -ne 0 ]; then
712                errorAndLog "${FUNCNAME}(): error executing query, check database and root password"
713                exit 1
714        fi
715
716        if [ $num_tablas -eq 0 ]; then
717                echoAndLog "${FUNCNAME}():database $database is empty"
718                return 0
719        else
720                echoAndLog "${FUNCNAME}():database $database has tables"
721                return 1
722        fi
723
724}
725
726# Importa un fichero SQL en la base de datos.
727# Parámetros:
728# - 1: nombre de la BD.
729# - 2: fichero a importar.
730# Nota: el fichero SQL puede contener las siguientes palabras reservadas:
731# - SERVERIP: se sustituye por la dirección IP del servidor.
732# - DBUSER: se sustituye por usuario de conexión a la BD definido en este script.
733# - DBPASSWD: se sustituye por la clave de conexión a la BD definida en este script.
734function mysqlImportSqlFileToDb()
735{
736        if [ $# -ne 2 ]; then
737                errorAndLog "${FNCNAME}(): invalid number of parameters"
738                exit 1
739        fi
740
741        local database="$1"
742        local sqlfile="$2"
743        local tmpfile=$(mktemp)
744        local i=0
745        local dev=""
746        local status
747
748        if [ ! -f $sqlfile ]; then
749                errorAndLog "${FUNCNAME}(): Unable to locate $sqlfile!!"
750                return 1
751        fi
752
753        echoAndLog "${FUNCNAME}(): importing SQL file to ${database}..."
754        chmod 600 $tmpfile
755        for dev in ${DEVICE[*]}; do
756                if [ "${DEVICE[i]}" == "$DEFAULTDEV" ]; then
757                        sed -e "s/SERVERIP/${SERVERIP[i]}/g" \
758                            -e "s/DBUSER/$OPENGNSYS_DB_USER/g" \
759                            -e "s/DBPASSWORD/$OPENGNSYS_DB_PASSWD/g" \
760                                $sqlfile > $tmpfile
761                fi
762                let i++
763        done
764        mysql --defaults-extra-file=$TMPMYCNF --default-character-set=utf8 "${database}" < $tmpfile
765        status=$?
766        rm -f $tmpfile
767        if [ $status -ne 0 ]; then
768                errorAndLog "${FUNCNAME}(): error while importing $sqlfile in database $database"
769                return 1
770        fi
771        echoAndLog "${FUNCNAME}(): file imported to database $database"
772        return 0
773}
774
775# Crea la base de datos
776function mysqlCreateDb()
777{
778        if [ $# -ne 1 ]; then
779                errorAndLog "${FUNCNAME}(): invalid number of parameters"
780                exit 1
781        fi
782
783        local database="$1"
784
785        echoAndLog "${FUNCNAME}(): creating database..."
786        mysqladmin --defaults-extra-file=$TMPMYCNF create $database
787        if [ $? -ne 0 ]; then
788                errorAndLog "${FUNCNAME}(): error while creating database $database"
789                return 1
790        fi
791        # Quitar modo ONLY_FULL_GROUP_BY de MySQL (ticket #730).
792        mysql --defaults-extra-file=$TMPMYCNF -e "SET GLOBAL sql_mode=(SELECT TRIM(BOTH ',' FROM REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')));"
793
794        echoAndLog "${FUNCNAME}(): database $database created"
795        return 0
796}
797
798# Comprueba si ya está definido el usuario de acceso a la BD.
799function mysqlCheckUserExists()
800{
801        if [ $# -ne 1 ]; then
802                errorAndLog "${FUNCNAME}(): invalid number of parameters"
803                exit 1
804        fi
805
806        local userdb="$1"
807
808        echoAndLog "${FUNCNAME}(): checking if $userdb exists..."
809        echo "select user from user where user='${userdb}'\\G" |mysql --defaults-extra-file=$TMPMYCNF mysql | grep user
810        if [ $? -ne 0 ]; then
811                echoAndLog "${FUNCNAME}(): user doesn't exists"
812                return 1
813        else
814                echoAndLog "${FUNCNAME}(): user already exists"
815                return 0
816        fi
817
818}
819
820# Crea un usuario administrativo para la base de datos
821function mysqlCreateAdminUserToDb()
822{
823        if [ $# -ne 3 ]; then
824                errorAndLog "${FUNCNAME}(): invalid number of parameters"
825                exit 1
826        fi
827
828        local database="$1"
829        local userdb="$2"
830        local passdb="$3"
831
832        echoAndLog "${FUNCNAME}(): creating admin user ${userdb} to database ${database}"
833
834        cat > $WORKDIR/create_${database}.sql <<EOF
835CREATE USER '${userdb}'@'localhost' IDENTIFIED BY '${passdb}';
836GRANT USAGE ON *.* TO '${userdb}'@'localhost';
837GRANT ALL PRIVILEGES ON ${database}.* TO '${userdb}'@'localhost' WITH GRANT OPTION;
838FLUSH PRIVILEGES;
839EOF
840        mysql --defaults-extra-file=$TMPMYCNF < $WORKDIR/create_${database}.sql
841        if [ $? -ne 0 ]; then
842                errorAndLog "${FUNCNAME}(): error while creating user in mysql"
843                rm -f $WORKDIR/create_${database}.sql
844                return 1
845        else
846                echoAndLog "${FUNCNAME}(): user created ok"
847                rm -f $WORKDIR/create_${database}.sql
848                return 0
849        fi
850}
851
852
853#####################################################################
854####### Funciones para la descarga de código
855#####################################################################
856
857# Obtiene el código fuente del proyecto desde el repositorio de GitHub.
858function downloadCode()
859{
860        if [ $# -ne 1 ]; then
861                errorAndLog "${FUNCNAME}(): invalid number of parameters"
862                exit 1
863        fi
864
865        local url="$1"
866
[85df22be]867        echoAndLog "${FUNCNAME}(): downloading code from '$url'..."
[b4f6d4b]868
[3875322]869        RETRIES=5
870        DELAY=4
871        COUNT=1
872        while [ $COUNT -lt $RETRIES ]; do
[afda65f]873                GIT_SSL_NO_VERIFY=1 git clone $url
[3875322]874                if [ $? -eq 0 ]; then
875                        RETRIES=0
876                        break
877                fi
878                let COUNT=$COUNT+1
879                sleep $DELAY
880        done
881
[b4f6d4b]882        if [ $? -ne 0 ]; then
883                errorAndLog "${FUNCNAME}(): error getting OpenGnsys code from $url"
884                return 1
885        fi
[735dbf4]886        rm -rf opengnsys/.git
[b4f6d4b]887        echoAndLog "${FUNCNAME}(): code was downloaded"
888        return 0
889}
890
891
892############################################################
893###  Detectar red
894############################################################
895
896# Convierte nº de bits (notación CIDR) en máscara de red (gracias a FriedZombie en openwrt.org).
897cidr2mask ()
898{
899        # Number of args to shift, 255..255, first non-255 byte, zeroes
900        set -- $[ 5 - ($1 / 8) ] 255 255 255 255 $[ (255 << (8 - ($1 % 8))) & 255 ] 0 0 0
901        [ $1 -gt 1 ] && shift $1 || shift
902        echo ${1-0}.${2-0}.${3-0}.${4-0}
903}
904
905# Obtener los parámetros de red de la interfaz por defecto.
906function getNetworkSettings()
907{
908        # Arrays globales definidas:
909        # - DEVICE:     nombres de dispositivos de red activos.
910        # - SERVERIP:   IPs locales del servidor.
911        # - NETIP:      IPs de redes.
912        # - NETMASK:    máscaras de red.
913        # - NETBROAD:   IPs de difusión de redes.
914        # - ROUTERIP:   IPs de routers.
915        # Otras variables globales:
916        # - DEFAULTDEV: dispositivo de red por defecto.
917        # - DNSIP:      IP del servidor DNS principal.
918
919        local i=0
920        local dev=""
[c9459a1]921
[b4f6d4b]922        echoAndLog "${FUNCNAME}(): Detecting network parameters."
[c9459a1]923        DEVICE=( $(ip -o link show up | awk '!/loopback/ {sub(/[:@].*/,"",$2); print $2}') )
[b4f6d4b]924        if [ -z "$DEVICE" ]; then
925                errorAndLog "${FUNCNAME}(): Network devices not detected."
926                exit 1
927        fi
928        for dev in ${DEVICE[*]}; do
929                SERVERIP[i]=$(ip -o addr show dev "$dev" | awk '$3~/inet$/ {sub (/\/.*/, ""); print ($4); exit;}')
930                if [ -n "${SERVERIP[i]}" ]; then
931                        NETMASK[i]=$( cidr2mask $(ip -o addr show dev "$dev" | awk '$3~/inet$/ {sub (/.*\//, "", $4); print ($4); exit;}') )
932                        NETBROAD[i]=$(ip -o addr show dev "$dev" | awk '$3~/inet$/ {print ($6); exit;}')
933                        NETIP[i]=$(ip route list proto kernel | awk -v d="$dev" '$3==d && /src/ {sub (/\/.*/,""); print $1; exit;}')
934                        ROUTERIP[i]=$(ip route list default | awk -v d="$dev" '$5==d {print $3; exit;}')
[a8044f7]935                        if [ $DHCPNET == ${NETIP[i]} ]; then
[f605fae]936                                DEFAULTDEV="$dev"
937                        else
938                                DEFAULTDEV=${DEFAULTDEV:-"$dev"}
939                        fi
[b4f6d4b]940                fi
941                let i++
942        done
943        DNSIP=$(systemd-resolve --status 2>/dev/null | awk '/DNS Servers:/ {print $3; exit;}')
944        [ -z "$DNSIP" ] && DNSIP=$(awk '/nameserver/ {print $2; exit;}' /etc/resolv.conf)
945        if [ -z "${NETIP[*]}" -o -z "${NETMASK[*]}" ]; then
946                errorAndLog "${FUNCNAME}(): Network not detected."
947                exit 1
948        fi
949
950        # Variables de ejecución de Apache
951        # - APACHE_RUN_USER
952        # - APACHE_RUN_GROUP
953        if [ -f $APACHECFGDIR/envvars ]; then
954                source $APACHECFGDIR/envvars
955        fi
956        APACHE_RUN_USER=${APACHE_RUN_USER:-"$APACHEUSER"}
957        APACHE_RUN_GROUP=${APACHE_RUN_GROUP:-"$APACHEGROUP"}
958
959        echoAndLog "${FUNCNAME}(): Default network device: $DEFAULTDEV."
960}
961
962
963############################################################
964### Esqueleto para el Servicio pxe y contenedor tftpboot ###
965############################################################
966
967function tftpConfigure()
968{
969        echoAndLog "${FUNCNAME}(): Configuring TFTP service."
970        # Habilitar TFTP y reiniciar Inetd.
971        if [ -n "$TFTPSERV" ]; then
972                if [ -f $INETDCFGDIR/$TFTPSERV ]; then
973                        perl -pi -e 's/disable.*/disable = no/' $INETDCFGDIR/$TFTPSERV
974                else
975                        service=$TFTPSERV
976                        $ENABLESERVICE; $STARTSERVICE
977                fi
978        fi
979        service=$INETDSERV
980        $ENABLESERVICE; $STARTSERVICE
981
982        # comprobamos el servicio tftp
983        sleep 1
984        testPxe
985}
986
987# Comprueba que haya conexión al servicio TFTP/PXE.
988function testPxe ()
989{
990        echoAndLog "${FUNCNAME}(): Checking TFTP service... please wait."
991        echo "test" >$TFTPCFGDIR/testpxe
992        tftp -v 127.0.0.1 -c get testpxe /tmp/testpxe && echoAndLog "TFTP service is OK." || errorAndLog "TFTP service is down."
993        rm -f $TFTPCFGDIR/testpxe /tmp/testpxe
994}
995
996
997########################################################################
998## Configuración servicio Samba
999########################################################################
1000
1001# Configurar servicios Samba.
1002function smbConfigure()
1003{
1004        echoAndLog "${FUNCNAME}(): Configuring Samba service."
1005
1006        backupFile $SAMBACFGDIR/smb.conf
1007
1008        # Copiar plantailla de recursos para OpenGnsys
1009        sed -e "s/OPENGNSYSDIR/${INSTALL_TARGET//\//\\/}/g" \
1010                $WORKDIR/opengnsys/server/etc/smb-og.conf.tmpl > $SAMBACFGDIR/smb-og.conf
1011        # Configurar y recargar Samba"
1012        perl -pi -e "s/WORKGROUP/OPENGNSYS/; s/server string \=.*/server string \= OpenGnsys Samba Server/" $SAMBACFGDIR/smb.conf
1013        if ! grep -q "smb-og" $SAMBACFGDIR/smb.conf; then
1014                echo "include = $SAMBACFGDIR/smb-og.conf" >> $SAMBACFGDIR/smb.conf
1015        fi
1016        service=$SAMBASERV
1017        $ENABLESERVICE; $STARTSERVICE
1018        if [ $? -ne 0 ]; then
1019                errorAndLog "${FUNCNAME}(): error while configure Samba"
1020                return 1
1021        fi
1022        # Crear clave para usuario de acceso a los recursos.
1023        echo -ne "$OPENGNSYS_CLIENT_PASSWD\n$OPENGNSYS_CLIENT_PASSWD\n" | smbpasswd -a -s $OPENGNSYS_CLIENT_USER
1024
1025        echoAndLog "${FUNCNAME}(): Added Samba configuration."
1026        return 0
1027}
1028
1029
1030########################################################################
1031## Configuración servicio Rsync
1032########################################################################
1033
1034# Configurar servicio Rsync.
1035function rsyncConfigure()
1036{
1037        echoAndLog "${FUNCNAME}(): Configuring Rsync service."
1038
1039        backupFile $RSYNCCFGDIR/rsyncd.conf
1040
1041        # Configurar acceso a Rsync.
1042        sed -e "s/CLIENTUSER/$OPENGNSYS_CLIENT_USER/g" \
1043                $WORKDIR/opengnsys/repoman/etc/rsyncd.conf.tmpl > $RSYNCCFGDIR/rsyncd.conf
1044        # Habilitar Rsync y reiniciar Inetd.
1045        if [ -n "$RSYNCSERV" ]; then
1046                if [ -f /etc/default/rsync ]; then
1047                        perl -pi -e 's/RSYNC_ENABLE=.*/RSYNC_ENABLE=inetd/' /etc/default/rsync
1048                fi
1049                if [ -f $INETDCFGDIR/rsync ]; then
1050                        perl -pi -e 's/disable.*/disable = no/' $INETDCFGDIR/rsync
1051                else
1052                        cat << EOT > $INETDCFGDIR/rsync
1053service rsync
1054{
1055        disable = no
1056        socket_type = stream
1057        wait = no
1058        user = root
1059        server = $(which rsync)
1060        server_args = --daemon
1061        log_on_failure += USERID
1062        flags = IPv6
1063}
1064EOT
1065                fi
1066                service=$RSYNCSERV $ENABLESERVICE
1067                service=$INETDSERV $STARTSERVICE
1068        fi
1069
1070        echoAndLog "${FUNCNAME}(): Added Rsync configuration."
1071        return 0
1072}
1073
1074
1075########################################################################
1076## Configuración servicio DHCP
1077########################################################################
1078
1079# Configurar servicios DHCP.
1080function dhcpConfigure()
1081{
1082        echoAndLog "${FUNCNAME}(): Sample DHCP configuration."
1083
1084        local errcode=0
1085        local i=0
1086        local dev=""
1087
1088        backupFile $DHCPCFGDIR/dhcpd.conf
1089        for dev in ${DEVICE[*]}; do
1090                if [ -n "${SERVERIP[i]}" ]; then
1091                        backupFile $DHCPCFGDIR/dhcpd-$dev.conf
1092                        sed -e "s/SERVERIP/${SERVERIP[i]}/g" \
1093                            -e "s/NETIP/${NETIP[i]}/g" \
1094                            -e "s/NETMASK/${NETMASK[i]}/g" \
1095                            -e "s/NETBROAD/${NETBROAD[i]}/g" \
1096                            -e "s/ROUTERIP/${ROUTERIP[i]}/g" \
1097                            -e "s/DNSIP/$DNSIP/g" \
1098                            $WORKDIR/opengnsys/server/etc/dhcpd.conf.tmpl > $DHCPCFGDIR/dhcpd-$dev.conf || errcode=1
1099                fi
1100                let i++
1101        done
1102        if [ $errcode -ne 0 ]; then
1103                errorAndLog "${FUNCNAME}(): error while configuring DHCP server"
1104                return 1
1105        fi
1106        ln -f $DHCPCFGDIR/dhcpd-$DEFAULTDEV.conf $DHCPCFGDIR/dhcpd.conf
1107        service=$DHCPSERV
1108        $ENABLESERVICE; $STARTSERVICE
1109        echoAndLog "${FUNCNAME}(): Sample DHCP configured in \"$DHCPCFGDIR\"."
1110        return 0
1111}
1112
1113
1114#####################################################################
1115####### Funciones específicas de la instalación de Opengnsys
1116#####################################################################
1117
1118# Copiar ficheros del OpenGnsys Web Console.
1119function installWebFiles()
1120{
1121        local COMPATDIR f
1122        local SLIMFILE="slim-2.6.1.zip"
1123        local SWAGGERFILE="swagger-ui-2.2.5.zip"
1124
1125        echoAndLog "${FUNCNAME}(): Installing web files..."
1126        # Copiar ficheros.
1127        cp -a $WORKDIR/opengnsys/admin/WebConsole/* $INSTALL_TARGET/www   #*/ comentario para Doxygen.
1128        if [ $? != 0 ]; then
1129                errorAndLog "${FUNCNAME}(): Error copying web files."
1130                exit 1
1131        fi
1132
1133        # Descomprimir librerías: Slim y Swagger-UI.
1134        unzip -o $WORKDIR/opengnsys/admin/$SLIMFILE -d $INSTALL_TARGET/www/rest
1135        unzip -o $WORKDIR/opengnsys/admin/$SWAGGERFILE -d $INSTALL_TARGET/www/rest
1136
1137        # Compatibilidad con dispositivos móviles.
1138        COMPATDIR="$INSTALL_TARGET/www/principal"
1139        for f in acciones administracion aula aulas hardwares imagenes menus repositorios softwares; do
1140                sed 's/clickcontextualnodo/clicksupnodo/g' $COMPATDIR/$f.php > $COMPATDIR/$f.device.php
1141        done
1142        cp -a $COMPATDIR/imagenes.device.php $COMPATDIR/imagenes.device4.php
1143        # Acceso al manual de usuario
1144        ln -fs ../doc/userManual $INSTALL_TARGET/www/userManual
1145        # Ficheros de log de la API REST.
1146        touch $INSTALL_TARGET/log/{ogagent,remotepc,rest}.log
1147
1148        echoAndLog "${FUNCNAME}(): Web files installed successfully."
1149}
1150
[c9459a1]1151function configurePHPvars()
1152{
1153    OGADMSRV_HOSTNAME=$1
1154    OGADMSRV_PORT=$2
1155    sed "s/__OGADMSRV_HOSTNAME__/$OGADMSRV_HOSTNAME/; s/__OGADMSRV_PORT__/$OGADMSRV_PORT/" <$WORKDIR/opengnsys/server/etc/php-vars.php.tmpl >$INSTALL_TARGET/etc/php-vars.php
1156}
1157
[b4f6d4b]1158# Copiar ficheros en la zona de descargas de OpenGnsys Web Console.
1159function installDownloadableFiles()
1160{
1161        local VERSIONFILE OGVERSION FILENAME TARGETFILE
1162
1163        # Obtener versión a descargar.
1164        VERSIONFILE="$INSTALL_TARGET/doc/VERSION.json"
1165        OGVERSION="$(jq -r ".ogagent // \"$INSTVERSION\"" $VERSIONFILE 2>/dev/null || echo "$INSTVERSION")"
1166        FILENAME="ogagentpkgs-$OGVERSION.tar.gz"
1167        TARGETFILE=$WORKDIR/$FILENAME
1168
1169        # Descargar archivo comprimido, si es necesario.
1170        if [ -s $PROGRAMDIR/$FILENAME ]; then
1171                echoAndLog "${FUNCNAME}(): Moving $PROGRAMDIR/$FILENAME file to $(dirname $TARGETFILE)"
1172                mv $PROGRAMDIR/$FILENAME $TARGETFILE
1173        else
1174                echoAndLog "${FUNCNAME}(): Downloading $FILENAME"
[9d0f5c5]1175                curl --stderr - --insecure --retry 5 --retry-delay 5 --max-time 30 $DOWNLOADURL/$FILENAME -o $TARGETFILE
[b4f6d4b]1176        fi
1177        if [ ! -s $TARGETFILE ]; then
1178                errorAndLog "${FUNCNAME}(): Cannot download $FILENAME"
1179                return 1
1180        fi
1181
1182        # Descomprimir fichero en zona de descargas.
1183        tar xvzf $TARGETFILE -C $INSTALL_TARGET/www/descargas
1184        if [ $? != 0 ]; then
1185                errorAndLog "${FUNCNAME}(): Error uncompressing archive."
1186                exit 1
1187        fi
1188}
1189
1190# Configuración específica de Apache.
1191function installWebConsoleApacheConf()
1192{
1193        if [ $# -ne 2 ]; then
1194                errorAndLog "${FUNCNAME}(): invalid number of parameters"
1195                exit 1
1196        fi
1197
1198        local path_opengnsys_base="$1"
1199        local path_apache2_confd="$2"
1200        local CONSOLEDIR=${path_opengnsys_base}/www
1201        local sockfile
1202
1203        if [ ! -d $path_apache2_confd ]; then
1204                errorAndLog "${FUNCNAME}(): path to apache2 conf.d can not found, verify your server installation"
1205                return 1
1206        fi
1207
1208        mkdir -p $path_apache2_confd/{sites-available,sites-enabled}
1209
1210        echoAndLog "${FUNCNAME}(): creating apache2 config file.."
1211
1212        # Avtivar PHP-FPM.
1213        echoAndLog "${FUNCNAME}(): configuring PHP-FPM"
1214        service=$PHPFPMSERV
1215        $ENABLESERVICE; $STARTSERVICE
1216        sockfile=$(find /run/php -name "php*.sock" -type s -print 2>/dev/null | tail -1)
1217
1218        # Activar módulos de Apache.
1219        $APACHEENABLEMODS
1220        # Activar HTTPS.
1221        $APACHEENABLESSL
1222        $APACHEMAKECERT
1223        # Genera configuración de consola web a partir del fichero plantilla.
1224        if [ -n "$(apachectl -v | grep "2\.[0-2]")" ]; then
1225                # Configuración para versiones anteriores de Apache.
1226                sed -e "s,CONSOLEDIR,$CONSOLEDIR,g" \
1227                        $WORKDIR/opengnsys/server/etc/apache-prev2.4.conf.tmpl > $path_apache2_confd/$APACHESITESDIR/${APACHEOGSITE}
1228        else
1229                # Configuración específica a partir de Apache 2.4
1230                if [ -n "$sockfile" ]; then
1231                        sed -e "s,CONSOLEDIR,$CONSOLEDIR,g" \
1232                            -e "s,proxy:fcgi:.*,proxy:unix:${sockfile%% *}|fcgi://localhost\",g" \
1233                                $WORKDIR/opengnsys/server/etc/apache.conf.tmpl > $path_apache2_confd/$APACHESITESDIR/${APACHEOGSITE}.conf
1234                else
1235                        sed -e "s,CONSOLEDIR,$CONSOLEDIR,g" \
1236                                $WORKDIR/opengnsys/server/etc/apache.conf.tmpl > $path_apache2_confd/$APACHESITESDIR/${APACHEOGSITE}.conf
1237                fi
1238        fi
1239        $APACHEENABLEOG
1240        if [ $? -ne 0 ]; then
1241                errorAndLog "${FUNCNAME}(): config file can't be linked to apache conf, verify your server installation"
1242                return 1
1243        fi
1244        echoAndLog "${FUNCNAME}(): config file created and linked, restarting apache daemon"
1245        service=$APACHESERV
1246        $ENABLESERVICE; $STARTSERVICE
1247        return 0
1248}
1249
1250
1251# Crear documentación Doxygen para la consola web.
1252function makeDoxygenFiles()
1253{
1254        echoAndLog "${FUNCNAME}(): Making Doxygen web files..."
1255        $WORKDIR/opengnsys/installer/ogGenerateDoc.sh \
1256                        $WORKDIR/opengnsys/client/engine $INSTALL_TARGET/www
1257        if [ ! -d "$INSTALL_TARGET/www/html" ]; then
1258                errorAndLog "${FUNCNAME}(): unable to create Doxygen web files."
1259                return 1
1260        fi
1261        mv "$INSTALL_TARGET/www/html" "$INSTALL_TARGET/www/api"
1262        echoAndLog "${FUNCNAME}(): Doxygen web files created successfully."
1263}
1264
1265
1266# Crea la estructura base de la instalación de opengnsys
1267function createDirs()
1268{
1269        if [ $# -ne 1 ]; then
1270                errorAndLog "${FUNCNAME}(): invalid number of parameters"
1271                exit 1
1272        fi
1273
1274        local path_opengnsys_base="$1"
1275
1276        # Crear estructura de directorios.
1277        echoAndLog "${FUNCNAME}(): creating directory paths in $path_opengnsys_base"
1278        mkdir -p $path_opengnsys_base
1279        mkdir -p $path_opengnsys_base/bin
1280        mkdir -p $path_opengnsys_base/client/{cache,images,log}
1281        mkdir -p $path_opengnsys_base/doc
1282        mkdir -p $path_opengnsys_base/etc
1283        mkdir -p $path_opengnsys_base/lib
1284        mkdir -p $path_opengnsys_base/log/clients
1285        ln -fs $path_opengnsys_base/log /var/log/opengnsys
1286        mkdir -p $path_opengnsys_base/sbin
1287        mkdir -p $path_opengnsys_base/www
1288        mkdir -p $path_opengnsys_base/images/groups
1289        mkdir -p $TFTPCFGDIR
1290        ln -fs $TFTPCFGDIR $path_opengnsys_base/tftpboot
1291        mkdir -p $path_opengnsys_base/tftpboot/{menu.lst,grub}
1292        if [ $? -ne 0 ]; then
1293                errorAndLog "${FUNCNAME}(): error while creating dirs. Do you have write permissions?"
1294                return 1
1295        fi
1296
1297        # Crear usuario ficticio.
1298        if id -u $OPENGNSYS_CLIENT_USER &>/dev/null; then
1299                echoAndLog "${FUNCNAME}(): user \"$OPENGNSYS_CLIENT_USER\" is already created"
1300        else
1301                echoAndLog "${FUNCNAME}(): creating OpenGnsys user"
1302                useradd $OPENGNSYS_CLIENT_USER 2>/dev/null
1303                if [ $? -ne 0 ]; then
1304                        errorAndLog "${FUNCNAME}(): error creating OpenGnsys user"
1305                        return 1
1306                fi
1307        fi
1308
1309        # Mover el fichero de registro de instalación al directorio de logs.
1310        echoAndLog "${FUNCNAME}(): moving installation log file"
1311        mv $LOG_FILE $OGLOGFILE && LOG_FILE=$OGLOGFILE
1312        chmod 600 $LOG_FILE
1313
1314        echoAndLog "${FUNCNAME}(): directory paths created"
1315        return 0
1316}
1317
1318# Copia ficheros de configuración y ejecutables genéricos del servidor.
1319function copyServerFiles ()
1320{
1321        if [ $# -ne 1 ]; then
1322                errorAndLog "${FUNCNAME}(): invalid number of parameters"
1323                exit 1
1324        fi
1325
1326        local path_opengnsys_base="$1"
1327
1328        # Lista de ficheros y directorios origen y de directorios destino.
1329        local SOURCES=( server/tftpboot \
1330                        /usr/lib/shim/shimx64.efi.signed \
1331                        /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed \
1332                        server/bin \
1333                        repoman/bin \
1334                        server/lib \
1335                        admin/Sources/Services/ogAdmServerAux
1336                        admin/Sources/Services/ogAdmRepoAux
1337                        installer/opengnsys_uninstall.sh \
1338                        installer/opengnsys_update.sh \
1339                        installer/opengnsys_export.sh \
1340                        installer/opengnsys_import.sh \
1341                        doc )
1342        local TARGETS=( tftpboot \
1343                        tftpboot \
1344                        tftpboot/grubx64.efi \
1345                        bin \
1346                        bin \
1347                        lib \
1348                        sbin \
1349                        sbin \
1350                        lib \
1351                        lib \
1352                        lib \
1353                        lib \
1354                        doc )
1355
1356        if [ ${#SOURCES[@]} != ${#TARGETS[@]} ]; then
1357                errorAndLog "${FUNCNAME}(): inconsistent number of array items"
1358                exit 1
1359        fi
1360
1361        # Copiar ficheros.
1362        echoAndLog "${FUNCNAME}(): copying files to server directories"
1363
1364        pushd $WORKDIR/opengnsys
1365        local i
1366        for (( i = 0; i < ${#SOURCES[@]}; i++ )); do
1367                if [ -f "${SOURCES[$i]}" ]; then
1368                        echoAndLog "Copying ${SOURCES[$i]} to $path_opengnsys_base/${TARGETS[$i]}"
1369                        cp -a "${SOURCES[$i]}" "${path_opengnsys_base}/${TARGETS[$i]}"
1370                elif [ -d "${SOURCES[$i]}" ]; then
1371                        echoAndLog "Copying content of ${SOURCES[$i]} to $path_opengnsys_base/${TARGETS[$i]}"
1372                        cp -a "${SOURCES[$i]}"/* "${path_opengnsys_base}/${TARGETS[$i]}"
1373                else
1374                        warningAndLog "Unable to copy ${SOURCES[$i]} to $path_opengnsys_base/${TARGETS[$i]}"
1375                fi
1376        done
1377
1378        popd
1379}
1380
1381####################################################################
[c9459a1]1382### Funciones de TLS
1383####################################################################
1384
1385CA_DIR=/root/CA
1386OG_BASEDIR=/opt/opengnsys
1387
1388function gatherCertsInfo()
1389{
1390    ERRORS=0
[11fbd77]1391    ## BUG cuando REMOTE=1, $WORKDIR/opengnsys es el contenido del zip (producido al vuelo con 'git archive'), y naturalmente no contiene ./user-certs
1392    ##     este código debe buscar los certificados en otro sitio adicional
[c9459a1]1393    if [ -f $WORKDIR/opengnsys/user-certs/ca.crt.pem ]; then
1394        echoAndLog "CA provided by the user, checking presence of all certificates"
1395
1396        TLS_DATA_CA_CERTFILE=$WORKDIR/opengnsys/user-certs/ca.crt.pem
1397        TLS_DATA_OGADMSRV_CERTFILE=$WORKDIR/opengnsys/user-certs/ogAdmSrv.crt.pem
1398        TLS_DATA_OGADMSRV_KEYFILE=$WORKDIR/opengnsys/user-certs/ogAdmSrv.key.pem
1399        TLS_DATA_WEBCONSOLE_CERTFILE=$WORKDIR/opengnsys/user-certs/WebConsole.crt.pem
1400        TLS_DATA_WEBCONSOLE_KEYFILE=$WORKDIR/opengnsys/user-certs/WebConsole.key.pem
1401
1402        ## el usuario tiene que facilitar todos los certificados
1403        ## si falta alguno, no podemos generarlo aquí porque habría que tener la privkey de la CA, y el usuario no nos la debe dar
1404        if [ ! -f $TLS_DATA_OGADMSRV_CERTFILE   ]; then errorAndLog "ogAdmSrv certificate not found";   ERRORS=1; fi
1405        if [ ! -f $TLS_DATA_OGADMSRV_KEYFILE    ]; then errorAndLog "ogAdmSrv privkey not found";       ERRORS=1; fi
1406        if [ ! -f $TLS_DATA_WEBCONSOLE_CERTFILE ]; then errorAndLog "WebConsole certificate not found"; ERRORS=1; fi
1407        if [ ! -f $TLS_DATA_WEBCONSOLE_KEYFILE  ]; then errorAndLog "WebConsole privkey not found";     ERRORS=1; fi
1408
1409        if [ $ERRORS -eq 0 ]; then
1410            ## validar que las privkeys no tengan contraseña para que opengnsys pueda arrancar de forma desatendida
1411            if ! openssl rsa -in $TLS_DATA_OGADMSRV_KEYFILE   -passin pass:42 -noout; then errorAndLog "ogAdmSrv privkey is encrypted";   ERRORS=1; fi
1412            if ! openssl rsa -in $TLS_DATA_WEBCONSOLE_KEYFILE -passin pass:42 -noout; then errorAndLog "WebConsole privkey is encrypted"; ERRORS=1; fi
1413
1414            if [ $ERRORS -eq 0 ]; then
1415                # obtener los subject de cada certificado
1416                # la salida de openssl es tal que "subject=C = ES, ST = Madrid, L = Madrid, CN = test.example.org"
1417                # con el sed cocinamos la salida
1418                # además añadimos un / al principio para que el CN final sea correcto: "/C=ES/ST=Madrid/L=Madrid/CN=test.opengnsys.local"
1419                TLS_DATA_CA_SUBJ=/$(        openssl x509 -in $TLS_DATA_CA_CERTFILE         -subject -noout |sed 's/^subject=//; s/ *//g; s/,/\//g')
1420                TLS_DATA_OGADMSRV_SUBJ=/$(  openssl x509 -in $TLS_DATA_OGADMSRV_CERTFILE   -subject -noout |sed 's/^subject=//; s/ *//g; s/,/\//g')
1421                TLS_DATA_WEBCONSOLE_SUBJ=/$(openssl x509 -in $TLS_DATA_WEBCONSOLE_CERTFILE -subject -noout |sed 's/^subject=//; s/ *//g; s/,/\//g')
1422
1423                # obtener CN a partir del subject
1424                TLS_DATA_CA_CN=$(         echo $TLS_DATA_CA_SUBJ         |sed 's/.*CN=\([^/$]*\).*/\1/')
1425                TLS_DATA_OGADMSRV_CN=$(   echo $TLS_DATA_OGADMSRV_SUBJ   |sed 's/.*CN=\([^/$]*\).*/\1/')
1426                TLS_DATA_WEBCONSOLE_CN=$( echo $TLS_DATA_WEBCONSOLE_SUBJ |sed 's/.*CN=\([^/$]*\).*/\1/')
1427
1428                # los CN de los componentes que aceptan conexiones deberían resolver a una IP
1429                if ! nslookup $TLS_DATA_OGADMSRV_CN &>/dev/null; then errorAndLog "ogAdmSrv CN doesn't resolve to an IP"; ERRORS=1; fi
1430
1431                if [ $ERRORS -eq 0 ]; then
1432                    echoAndLog "Provided CA and certs are ok"
1433                fi
1434            fi
1435        fi
1436    fi
1437
[11fbd77]1438    ## aquí también hay que tener en cuenta el sitio adicional para los user-certs
1439    if [ ! -f $WORKDIR/opengnsys/user-certs/ca.crt.pem -o $ERRORS -eq 1 ]; then
[c9459a1]1440        echoAndLog "CA and certs not provided by the user or issues found, we will generate a new CA and all certs"
1441
1442        TLS_DATA_CA_CN=ca.opengnsys.local
1443        TLS_DATA_CA_SUBJ=/CN=ca.opengnsys.local
1444        TLS_DATA_CA_CERTFILE=$CA_DIR/certs/ca.crt.pem
1445        TLS_DATA_CA_EXPIRY=7300           # this variable is used later to make some decisions
1446
1447        TLS_DATA_OGADMSRV_CN=ogAdmSrv.opengnsys.local
1448        TLS_DATA_OGADMSRV_SUBJ=/CN=ogAdmSrv.opengnsys.local
1449        TLS_DATA_OGADMSRV_CERTFILE=$CA_DIR/certs/ogAdmSrv.crt.pem
1450        TLS_DATA_OGADMSRV_KEYFILE=$CA_DIR/private/ogAdmSrv.key.pem
1451        TLS_DATA_OGADMSRV_EXPIRY=375
1452
1453        TLS_DATA_WEBCONSOLE_CN=WebConsole.opengnsys.local
1454        TLS_DATA_WEBCONSOLE_SUBJ=/CN=WebConsole.opengnsys.local
1455        TLS_DATA_WEBCONSOLE_CERTFILE=$CA_DIR/certs/WebConsole.crt.pem
1456        TLS_DATA_WEBCONSOLE_KEYFILE=$CA_DIR/private/WebConsole.key.pem
1457        TLS_DATA_WEBCONSOLE_EXPIRY=375
1458    fi
1459
1460    # otras cosas de TLS no cubiertas arriba por no estar relacionadas con los certificados
1461    TLS_DATA_OGADMSRV_LISTEN_PORT=48888
1462
1463    return 0
1464}
1465
1466function _genCA ()
1467{
1468    SUBJ=$1
1469    EXPIRY_DAYS=$2
[9d0f5c5]1470    openssl genrsa -out private/ca.key.pem 4096 2>/dev/null
[c9459a1]1471    openssl req -config openssl.cnf -key private/ca.key.pem -new -x509 -days $EXPIRY_DAYS -sha256 -subj $SUBJ -out certs/ca.crt.pem
1472
1473    return 0
1474}
1475
1476function _genCert ()
1477{
1478    COMPONENT=$1
1479    SUBJ=$2
1480    EXPIRY_DAYS=$3
1481
[9d0f5c5]1482    openssl genrsa -out private/$COMPONENT.key.pem 2048 2>/dev/null
[c9459a1]1483    openssl req -config openssl.cnf -key private/$COMPONENT.key.pem -new -sha256 -subj $SUBJ -out csr/$COMPONENT.csr.pem
1484    openssl ca -config openssl.cnf -batch -days $EXPIRY_DAYS -notext -md sha256 -in csr/$COMPONENT.csr.pem -out certs/$COMPONENT.crt.pem
1485
1486    return 0
1487}
1488
1489function genAllCerts ()
1490{
1491    mkdir -p $CA_DIR
1492    pushd $CA_DIR
1493    cat >openssl.cnf <<EOF
1494[ca]
1495default_ca = CA_default
1496
1497[CA_default]
1498dir                    = $CA_DIR
1499certs                  = $CA_DIR/certs
1500new_certs_dir          = $CA_DIR/newcerts
1501database               = $CA_DIR/index.txt
1502serial                 = $CA_DIR/serial
1503default_md             = sha256
1504policy                 = policy_loose
1505
1506private_key            = $CA_DIR/private/ca.key.pem
1507certificate            = $CA_DIR/certs/ca.crt.pem
1508
1509[policy_loose]
1510countryName            = optional
1511stateOrProvinceName    = optional
1512localityName           = optional
1513organizationName       = optional
1514organizationalUnitName = optional
1515commonName             = supplied
1516emailAddress           = optional
1517
1518[req]
1519default_bits           = 2048
1520distinguished_name     = req_distinguished_name
1521default_md             = sha256
1522
1523[req_distinguished_name]
1524countryName            = Country Name (2 letter code)
1525EOF
1526    mkdir certs csr newcerts private
1527    chmod 0700 private
1528    touch index.txt index.txt.attr
1529    echo 1000 >serial
1530
1531    _genCA              $TLS_DATA_CA_SUBJ         $TLS_DATA_CA_EXPIRY
1532    _genCert ogAdmSrv   $TLS_DATA_OGADMSRV_SUBJ   $TLS_DATA_OGADMSRV_EXPIRY
1533    _genCert WebConsole $TLS_DATA_WEBCONSOLE_SUBJ $TLS_DATA_WEBCONSOLE_EXPIRY
1534
1535    popd
1536    return 0
1537}
1538
1539function installAllCerts ()
1540{
1541    mkdir -p $OG_BASEDIR/etc/ssl
1542
1543    ## CA cert goes to the OS store
1544    cp $TLS_DATA_CA_CERTFILE $LOCAL_CERTS_DIR/opengnsys-ca.crt
1545
1546    ## ogAdmSrv cert & key go to the application store
1547    cp $TLS_DATA_OGADMSRV_CERTFILE $TLS_DATA_OGADMSRV_KEYFILE $OG_BASEDIR/etc/ssl/
1548    ## certs of ogAdmSrv clients go to the OS store (stunnel seems to require this)
1549    cp $TLS_DATA_WEBCONSOLE_CERTFILE $LOCAL_CERTS_DIR/opengnsys-WebConsole.crt
1550
1551    ## WebConsole cert & key go to the application store
1552    cp $TLS_DATA_WEBCONSOLE_CERTFILE $TLS_DATA_WEBCONSOLE_KEYFILE $OG_BASEDIR/etc/ssl/
1553
1554    $UPDATE_CA_CMD
[ee47fac]1555    chmod 0640              $OG_BASEDIR/etc/ssl/*
1556    chown stunnel4:www-data $OG_BASEDIR/etc/ssl/*
[c9459a1]1557
1558    return 0
1559}
1560
1561# si generamos nuestros propios certificados, los CNs tienen que resolver a alguna IP
1562# no podemos dar por hecho que algún servidor DNS por ahí fuera resuelva los CNs que hemos generado al instalar
1563function makeCommonNamesResolvable ()
1564{
1565    # ogAdmSrv
1566        local i=0
1567        for dev in ${DEVICE[*]}; do
1568            echoAndLog "${FUNCNAME}(): evaluating dev (${DEVICE[i]}) against defaultdev ($DEFAULTDEV)"
1569                if [ "${DEVICE[i]}" == "$DEFAULTDEV" ]; then
1570            ETC_HOSTS_IP=${SERVERIP[i]}
1571                echoAndLog "${FUNCNAME}(): will use dev (${DEVICE[i]}) IP ($ETC_HOSTS_IP)"
1572            break
1573                fi
1574                let i++
1575        done
1576
1577    if [ -z $ETC_HOSTS_IP ]; then
1578            echoAndLog "${FUNCNAME}(): Don't know what IP address to add to /etc/hosts for ogAdmSrv"
1579    else
1580        echo "$ETC_HOSTS_IP  $TLS_DATA_OGADMSRV_CN" >>/etc/hosts
1581    fi
1582
1583    return 0
1584}
1585
1586function configureStunnel ()
1587{
1588        local i=0
1589        for dev in ${DEVICE[*]}; do
1590            echoAndLog "${FUNCNAME}(): evaluating dev (${DEVICE[i]}) against defaultdev ($DEFAULTDEV)"
1591                if [ "${DEVICE[i]}" == "$DEFAULTDEV" ]; then
1592            LISTEN_IP=${SERVERIP[i]}
1593                echoAndLog "${FUNCNAME}(): will use dev (${DEVICE[i]}) IP ($LISTEN_IP)"
1594            break
1595                fi
1596                let i++
1597        done
1598
1599    if [ -z $LISTEN_IP ]; then
1600            echoAndLog "${FUNCNAME}(): Don't know what IP address to listen on"
1601        return 1
1602    fi
1603
1604    cat >/etc/stunnel/ogAdmSrv.conf <<EOF
1605setuid = stunnel4
1606setgid = stunnel4
1607pid = /var/run/stunnel4/ogAdmSrv.pid
1608
1609[ogAdmSrv]
1610accept = $LISTEN_IP:$TLS_DATA_OGADMSRV_LISTEN_PORT
1611connect = 127.0.0.1:8888
1612cert = $OG_BASEDIR/etc/ssl/ogAdmSrv.crt.pem
1613key = $OG_BASEDIR/etc/ssl/ogAdmSrv.key.pem
1614capath = $STUNNEL_CAPATH
1615requireCert = yes
1616verifyPeer = yes
1617verifyChain = yes
1618EOF
1619
1620    sed -i -e '/^ENABLED=/s/0/1/' /etc/default/stunnel4
1621    service=stunnel4
1622    $STARTSERVICE
1623    return 0
1624}
1625
1626
1627####################################################################
[b4f6d4b]1628### Funciones de compilación de código fuente de servicios
1629####################################################################
1630
1631# Compilar los servicios de OpenGnsys
1632function servicesCompilation ()
1633{
1634        local hayErrores=0
1635
1636        # Compilar OpenGnsys Server
1637        echoAndLog "${FUNCNAME}(): Compiling OpenGnsys Admin Server"
1638        pushd $WORKDIR/opengnsys/admin/Sources/Services/ogAdmServer
1639        make && mv ogAdmServer $INSTALL_TARGET/sbin
1640        if [ $? -ne 0 ]; then
1641                echoAndLog "${FUNCNAME}(): error while compiling OpenGnsys Admin Server"
1642                hayErrores=1
1643        fi
1644        popd
1645        # Compilar OpenGnsys Agent
1646        echoAndLog "${FUNCNAME}(): Compiling OpenGnsys Agent"
1647        pushd $WORKDIR/opengnsys/admin/Sources/Services/ogAdmAgent
1648        make && mv ogAdmAgent $INSTALL_TARGET/sbin
1649        if [ $? -ne 0 ]; then
1650                echoAndLog "${FUNCNAME}(): error while compiling OpenGnsys Agent"
1651                hayErrores=1
1652        fi
1653        popd
1654        # Compilar OpenGnsys Client
1655        echoAndLog "${FUNCNAME}(): Compiling OpenGnsys Admin Client"
1656        pushd $WORKDIR/opengnsys/admin/Sources/Clients/ogAdmClient
1657        make && mv ogAdmClient ../../../../client/shared/bin
1658        if [ $? -ne 0 ]; then
1659                echoAndLog "${FUNCNAME}(): error while compiling OpenGnsys Admin Client"
1660                hayErrores=1
1661        fi
1662        popd
1663
1664        return $hayErrores
1665}
1666
1667####################################################################
1668### Funciones de copia de la Interface de administración
1669####################################################################
1670
1671# Copiar carpeta de Interface
1672function copyInterfaceAdm ()
1673{
1674        local hayErrores=0
1675
1676        # Crear carpeta y copiar Interface
1677        echoAndLog "${FUNCNAME}(): Copying Administration Interface Folder"
1678        cp -ar $WORKDIR/opengnsys/admin/Interface $INSTALL_TARGET/client/interfaceAdm
1679        if [ $? -ne 0 ]; then
1680                echoAndLog "${FUNCNAME}(): error while copying Administration Interface Folder"
1681                hayErrores=1
1682        fi
1683
1684        return $hayErrores
1685}
1686
1687
1688####################################################################
1689### Funciones instalacion cliente opengnsys
1690####################################################################
1691
1692function copyClientFiles()
1693{
1694        local errstatus=0
1695
1696        echoAndLog "${FUNCNAME}(): Copying OpenGnsys Client files."
1697        cp -a $WORKDIR/opengnsys/client/shared/* $INSTALL_TARGET/client
1698        if [ $? -ne 0 ]; then
1699                errorAndLog "${FUNCNAME}(): error while copying client estructure"
1700                errstatus=1
1701        fi
1702
1703        echoAndLog "${FUNCNAME}(): Copying OpenGnsys Cloning Engine files."
1704        mkdir -p $INSTALL_TARGET/client/lib/engine/bin
1705        cp -a $WORKDIR/opengnsys/client/engine/*.lib* $INSTALL_TARGET/client/lib/engine/bin
1706        if [ $? -ne 0 ]; then
1707                errorAndLog "${FUNCNAME}(): error while copying engine files"
1708                errstatus=1
1709        fi
1710
1711        if [ $errstatus -eq 0 ]; then
1712                echoAndLog "${FUNCNAME}(): client copy files success."
1713        else
1714                errorAndLog "${FUNCNAME}(): client copy files with errors"
1715        fi
1716
1717        return $errstatus
1718}
1719
1720
1721# Crear certificados para la firma de cargadores de arranque.
1722function createCerts ()
1723{
1724        local SSLCFGDIR=$INSTALL_TARGET/client/etc/ssl
1725        echoAndLog "${FUNCNAME}(): creating certificate files"
1726        mkdir -p $SSLCFGDIR/{certs,private}
1727        openssl req -new -x509 -newkey rsa:2048 -keyout $SSLCFGDIR/private/opengnsys.key -out $SSLCFGDIR/certs/opengnsys.crt -nodes -days 3650 -subj "/CN=OpenGnsys/"
1728        openssl x509 -in $SSLCFGDIR/certs/opengnsys.crt -out $SSLCFGDIR/certs/opengnsys.cer -outform DER
1729        echoAndLog "${FUNCNAME}(): certificate successfully created"
1730}
1731
1732
1733# Crear cliente OpenGnsys.
1734function clientCreate()
1735{
1736        if [ $# -ne 1 ]; then
1737                errorAndLog "${FUNCNAME}(): invalid number of parameters"
1738                exit 1
1739        fi
1740
1741        local FILENAME="$1"
1742        local TARGETFILE=$INSTALL_TARGET/lib/$FILENAME
1743
1744        # Descargar cliente, si es necesario.
1745        if [ -s $PROGRAMDIR/$FILENAME ]; then
1746                echoAndLog "${FUNCNAME}(): Moving $PROGRAMDIR/$FILENAME file to $(dirname $TARGETFILE)"
1747                mv $PROGRAMDIR/$FILENAME $TARGETFILE
1748        else
1749                echoAndLog "${FUNCNAME}(): Downloading $FILENAME"
1750                oglivecli download $FILENAME
1751        fi
1752        if [ ! -s $TARGETFILE ]; then
1753                errorAndLog "${FUNCNAME}(): Error loading $FILENAME"
1754                return 1
1755        fi
1756
1757        # Montar imagen, copiar cliente ogclient y desmontar.
1758        echoAndLog "${FUNCNAME}(): Installing ogLive Client"
1759        echo -ne "$OPENGNSYS_CLIENT_PASSWD\n$OPENGNSYS_CLIENT_PASSWD\n" | \
1760                        oglivecli install $FILENAME
1761
1762        echoAndLog "${FUNCNAME}(): Client generation success"
1763}
1764
1765
1766# Configuración básica de servicios de OpenGnsys
1767function openGnsysConfigure()
1768{
1769        local i=0
1770        local dev=""
1771        local CONSOLEURL
1772
1773        echoAndLog "${FUNCNAME}(): Copying init files."
1774        cp -a $WORKDIR/opengnsys/admin/Sources/Services/opengnsys.init /etc/init.d/opengnsys
1775        cp -a $WORKDIR/opengnsys/admin/Sources/Services/opengnsys.default /etc/default/opengnsys
1776        # Deshabilitar servicios de BitTorrent si no están instalados.
1777        if [ ! -e /usr/bin/bttrack ]; then
1778                sed -i 's/RUN_BTTRACKER="yes"/RUN_BTTRACKER="no"/; s/RUN_BTSEEDER="yes"/RUN_BTSEEDER="no"/' \
1779                        /etc/default/opengnsys
1780        fi
1781        echoAndLog "${FUNCNAME}(): Creating cron files."
1782        echo "* * * * *   root   [ -x $INSTALL_TARGET/bin/torrent-creator ] && $INSTALL_TARGET/bin/torrent-creator" > /etc/cron.d/torrentcreator
1783        echo "5 * * * *   root   [ -x $INSTALL_TARGET/bin/torrent-tracker ] && $INSTALL_TARGET/bin/torrent-tracker" > /etc/cron.d/torrenttracker
1784        echo "* * * * *   root   [ -x $INSTALL_TARGET/bin/deletepreimage ] && $INSTALL_TARGET/bin/deletepreimage" > /etc/cron.d/imagedelete
1785        echo "* * * * *   root   [ -x $INSTALL_TARGET/bin/ogagentqueue.cron ] && $INSTALL_TARGET/bin/ogagentqueue.cron" > /etc/cron.d/ogagentqueue
[8d4ee19]1786        echo "*/5 * * * * root   cd $INSTALL_TARGET/www && php uds-set-service-pool.php" > /etc/cron.d/uds-set-service-pool
[b4f6d4b]1787
1788        echoAndLog "${FUNCNAME}(): Creating logrotate configuration files."
1789        sed -e "s/OPENGNSYSDIR/${INSTALL_TARGET//\//\\/}/g" \
1790                $WORKDIR/opengnsys/server/etc/logrotate.tmpl > /etc/logrotate.d/opengnsysServer
1791
1792        sed -e "s/OPENGNSYSDIR/${INSTALL_TARGET//\//\\/}/g" \
1793                $WORKDIR/opengnsys/repoman/etc/logrotate.tmpl > /etc/logrotate.d/opengnsysRepo
1794
1795        echoAndLog "${FUNCNAME}(): Creating OpenGnsys config files."
1796        for dev in ${DEVICE[*]}; do
1797                if [ -n "${SERVERIP[i]}" ]; then
1798                        sed -e "s/SERVERIP/${SERVERIP[i]}/g" \
1799                            -e "s/DBUSER/$OPENGNSYS_DB_USER/g" \
1800                            -e "s/DBPASSWORD/$OPENGNSYS_DB_PASSWD/g" \
1801                            -e "s/DATABASE/$OPENGNSYS_DATABASE/g" \
1802                                $WORKDIR/opengnsys/admin/Sources/Services/ogAdmServer/ogAdmServer.cfg > $INSTALL_TARGET/etc/ogAdmServer-$dev.cfg
1803                        sed -e "s/SERVERIP/${SERVERIP[i]}/g" \
1804                                $WORKDIR/opengnsys/repoman/etc/ogAdmRepo.cfg.tmpl > $INSTALL_TARGET/etc/ogAdmRepo-$dev.cfg
1805                        sed -e "s/SERVERIP/${SERVERIP[i]}/g" \
1806                            -e "s/DBUSER/$OPENGNSYS_DB_USER/g" \
1807                            -e "s/DBPASSWORD/$OPENGNSYS_DB_PASSWD/g" \
1808                            -e "s/DATABASE/$OPENGNSYS_DATABASE/g" \
1809                                $WORKDIR/opengnsys/admin/Sources/Services/ogAdmAgent/ogAdmAgent.cfg > $INSTALL_TARGET/etc/ogAdmAgent-$dev.cfg
1810                        CONSOLEURL="https://${SERVERIP[i]}/opengnsys"
1811                        sed -e "s/SERVERIP/${SERVERIP[i]}/g" \
1812                            -e "s/DBUSER/$OPENGNSYS_DB_USER/g" \
1813                            -e "s/DBPASSWORD/$OPENGNSYS_DB_PASSWD/g" \
1814                            -e "s/DATABASE/$OPENGNSYS_DATABASE/g" \
1815                            -e "s/OPENGNSYSURL/${CONSOLEURL//\//\\/}/g" \
1816                                $INSTALL_TARGET/www/controlacceso.php > $INSTALL_TARGET/www/controlacceso-$dev.php
1817                        sed -e "s/SERVERIP/${SERVERIP[i]}/g" \
1818                            -e "s/OPENGNSYSURL/${CONSOLEURL//\//\\/}/g" \
1819                                $WORKDIR/opengnsys/admin/Sources/Clients/ogAdmClient/ogAdmClient.cfg > $INSTALL_TARGET/client/etc/ogAdmClient-$dev.cfg
1820                        if [ "$dev" == "$DEFAULTDEV" ]; then
1821                                OPENGNSYS_CONSOLEURL="$CONSOLEURL"
1822                        fi
1823                fi
1824                let i++
1825        done
1826        ln -f $INSTALL_TARGET/etc/ogAdmServer-$DEFAULTDEV.cfg $INSTALL_TARGET/etc/ogAdmServer.cfg
1827        ln -f $INSTALL_TARGET/etc/ogAdmRepo-$DEFAULTDEV.cfg $INSTALL_TARGET/etc/ogAdmRepo.cfg
1828        ln -f $INSTALL_TARGET/etc/ogAdmAgent-$DEFAULTDEV.cfg $INSTALL_TARGET/etc/ogAdmAgent.cfg
1829        ln -f $INSTALL_TARGET/client/etc/ogAdmClient-$DEFAULTDEV.cfg $INSTALL_TARGET/client/etc/ogAdmClient.cfg
1830        ln -f $INSTALL_TARGET/www/controlacceso-$DEFAULTDEV.php $INSTALL_TARGET/www/controlacceso.php
[0b03ab9]1831
[0203f26]1832        sed -e "s%__UDSRESTURL__%$UDS_REST_URL%g" \
1833            -e "s%__UDSAUTH__%$UDS_AUTHENTICATOR%g" \
1834            -e "s%__UDSUSER__%$UDS_USER%g" \
1835            -e "s%__UDSPASS__%$UDS_PASS%g" \
[0b03ab9]1836                <$INSTALL_TARGET/www/includes/uds.php |sponge $INSTALL_TARGET/www/includes/uds.php
[7035b7dc]1837        chmod 0640 $INSTALL_TARGET/www/includes/uds.php
[b4f6d4b]1838
1839        # Configuración del motor de clonación.
1840        # - Zona horaria del servidor.
1841        TZ=$(timedatectl status|awk -F"[:()]" '/Time.*zone/ {print $2}')
1842        cat << EOT >> $INSTALL_TARGET/client/etc/engine.cfg
1843# OpenGnsys Server timezone.
1844TZ="${TZ// /}"
1845EOT
1846
1847        # Revisar permisos generales.
1848        if [ -x $INSTALL_TARGET/bin/checkperms ]; then
1849                echoAndLog "${FUNCNAME}(): Checking permissions."
1850                OPENGNSYS_DIR="$INSTALL_TARGET" OPENGNSYS_USER="$OPENGNSYS_CLIENT_USER" APACHE_USER="$APACHE_RUN_USER" APACHE_GROUP="$APACHE_RUN_GROUP" checkperms
1851        fi
1852
1853        # Evitar inicio de duplicado en Ubuntu 14.04 (Upstart y SysV Init).
1854        if [ -f /etc/init/${MYSQLSERV}.conf -a -n "$(which initctl 2>/dev/null)" ]; then
1855                service=$MYSQLSERV
1856                $DISABLESERVICE
1857        fi
1858
1859        # Actualizar tokens de autenticación e iniciar los servicios.
1860        service="opengnsys"
1861        $ENABLESERVICE
1862        if [ -x $INSTALL_TARGET/bin/settoken ]; then
1863                echoAndLog "${FUNCNAME}(): Setting authentication tokens and starting OpenGnsys services."
1864                $INSTALL_TARGET/bin/settoken "$OPENGNSYS_DB_USER"
1865                $INSTALL_TARGET/bin/settoken -f
1866        else
1867                echoAndLog "${FUNCNAME}(): Starting OpenGnsys services."
1868                $STARTSERVICE
1869        fi
1870}
1871
1872
1873#####################################################################
1874#######  Función de resumen informativo de la instalación
1875#####################################################################
1876
1877function installationSummary()
1878{
1879        local VERSIONFILE REVISION
1880
1881        # Crear fichero de versión y revisión, si no existe.
1882        VERSIONFILE="$INSTALL_TARGET/doc/VERSION.json"
1883        [ -f $VERSIONFILE ] || echo '{ "project": "OpenGnsys" }' >$VERSIONFILE
1884        # Incluir datos de revisión, si se está instalando desde el repositorio
1885        # de código o si no está incluida en el fichero de versión.
1886        if [ $REMOTE -eq 1 ] || [ -z "$(jq -r '.release' $VERSIONFILE)" ]; then
[3513239]1887                # Revisión: rAñoMesDía.Gitcommit (8 caracteres de fecha y 7 primeros de commit).
[b4f6d4b]1888                RELEASE=$(curl -s "$API_URL/branches/$BRANCH" | jq -r '"r" + (.commit.commit.committer.date | split("-") | join("")[:8]) + "." + (.commit.sha[:7])' 2>/dev/null)
1889                # Obtener revisión para etiqueta de versión en vez de rama de código.
1890                [ -z "$RELEASE" ] && RELEASE=$(curl -s $(curl -s "$API_URL/tags" | jq -r ".[] | select(.name==\"$BRANCH\").commit.url" 2>/dev/null) | jq -r '"r" + (.commit.committer.date | split("-") | join("")[:8]) + "." + .sha[:7]' 2>/dev/null)
1891                jq ".release=\"$RELEASE\"" $VERSIONFILE | sponge $VERSIONFILE
1892        fi
1893        VERSION="$(jq -r '[.project, .version, .codename, .release] | join(" ")' $VERSIONFILE 2>/dev/null)"
1894
1895        # Mostrar información.
1896        echo
1897        echoAndLog "OpenGnsys Installation Summary"
1898        echo       "=============================="
1899        echoAndLog "Project version:                  $VERSION"
1900        echoAndLog "Installation directory:           $INSTALL_TARGET"
1901        echoAndLog "Installation log file:            $LOG_FILE"
1902        echoAndLog "Repository directory:             $INSTALL_TARGET/images"
1903        echoAndLog "DHCP configuration directory:     $DHCPCFGDIR"
1904        echoAndLog "TFTP configuration directory:     $TFTPCFGDIR"
1905        echoAndLog "Installed ogLive client:          $(oglivecli list | awk '{print $2}')"
1906        echoAndLog "Samba configuration directory:    $SAMBACFGDIR"
1907        echoAndLog "Web Console URL:                  $OPENGNSYS_CONSOLEURL"
1908        echoAndLog "Web Console access data:          entered by the user"
1909        if grep -q "^RUN_BTTRACK.*no" /etc/default/opengnsys; then
1910                echoAndLog "BitTorrent service is disabled."
1911        fi
1912        echo
1913        echoAndLog "Post-Installation Instructions:"
1914        echo       "==============================="
1915        echoAndLog "You can improve server security by configuring firewall and SELinux,"
1916        echoAndLog "   running \"$INSTALL_TARGET/lib/security-config\" script as root."
1917        echoAndLog "It's strongly recommended to synchronize this server with an NTP server."
1918        echoAndLog "Review or edit all configuration files."
1919        echoAndLog "Insert DHCP configuration data and restart service."
1920        echoAndLog "Optional: If you want to use BURG as boot manager, run"
1921        echoAndLog "   \"curl $DOWNLOADURL/burg.tgz -o $INSTALL_TARGET/client/lib/burg.tgz\" as root."
1922        echoAndLog "Optional: Log-in as Web Console admin user."
1923        echoAndLog " - Review default Organization data and assign access to users."
1924        echoAndLog "Log-in as Web Console organization user."
1925        echoAndLog " - Insert OpenGnsys data (labs, computers, menus, etc)."
1926echo
1927}
1928
1929
1930
1931#####################################################################
1932####### Proceso de instalación de OpenGnsys
1933#####################################################################
1934
1935# Sólo ejecutable por usuario root
1936if [ "$(whoami)" != 'root' ]; then
1937        echo "ERROR: this program must run under root privileges!!"
1938        exit 1
1939fi
1940
1941globalSetup $MY_BRANCH
1942# Comprobar instalación previa.
1943if cat $INSTALL_TARGET/doc/VERSION.* &>/dev/null; then
1944        echo "ERROR: OpenGnsys is already installed. Run \"$INSTALL_TARGET/lib/opengnsys_update.sh\" as root to update."
1945        exit 2
1946fi
1947
1948echoAndLog "OpenGnsys installation begins at $(date)"
1949# Introducir datos de configuración y establecer variables globales.
1950userData
1951
1952mkdir -p $WORKDIR
1953pushd $WORKDIR
1954
1955# Detectar datos iniciales de auto-configuración del instalador.
1956autoConfigure
1957
1958# Detectar parámetros de red y comprobar si hay conexión.
1959getNetworkSettings
1960if [ $? -ne 0 ]; then
1961        errorAndLog "Error reading default network settings."
1962        exit 1
1963fi
1964
1965# Detener servicios de OpenGnsys, si están activos previamente.
1966[ -f /etc/init.d/opengnsys ] && /etc/init.d/opengnsys stop
1967
1968# Actualizar repositorios
1969updatePackageList
1970
1971# Instalación de dependencias (paquetes de sistema operativo).
1972declare -a notinstalled
1973checkDependencies DEPENDENCIES notinstalled
1974if [ $? -ne 0 ]; then
1975        installDependencies notinstalled
1976        if [ $? -ne 0 ]; then
1977                echoAndLog "Error while installing some dependeces, please verify your server installation before continue"
1978                exit 1
1979        fi
1980fi
1981if [ -n "$INSTALLEXTRADEPS" ]; then
1982        echoAndLog "Installing extra dependencies"
1983        for (( i=0; i<${#INSTALLEXTRADEPS[*]}; i++ )); do
1984                eval ${INSTALLEXTRADEPS[i]}
1985        done
1986fi
1987
1988# Detectar datos de auto-configuración después de instalar paquetes.
1989autoConfigurePost
1990
1991# Arbol de directorios de OpenGnsys.
1992createDirs ${INSTALL_TARGET}
1993if [ $? -ne 0 ]; then
1994        errorAndLog "Error while creating directory paths!"
1995        exit 1
1996fi
1997
1998# Si es necesario, descarga el repositorio de código en directorio temporal
1999if [ $REMOTE -eq 1 ]; then
2000        downloadCode $GIT_REPO
2001        if [ $? -ne 0 ]; then
2002                errorAndLog "Error while getting code from the repository"
2003                exit 1
2004        fi
2005else
2006        ln -fs "$(dirname $PROGRAMDIR)" opengnsys
2007fi
2008
[c9459a1]2009# TLS
2010gatherCertsInfo
2011if [ $? -ne 0 ]; then
2012        errorAndLog 'Not all required certificates have been provided, or privkey or DNS issues'
2013        exit 1
2014fi
2015[ $TLS_DATA_CA_EXPIRY ] && genAllCerts                  ## el usuario no nos ha dado sus certificados: generamos unos
2016installAllCerts
2017[ $TLS_DATA_CA_EXPIRY ] && makeCommonNamesResolvable    ## el usuario no nos ha dado sus certificados: configuramos resolución de nombres en /etc/hosts
2018configureStunnel
2019if [ $? -ne 0 ]; then
2020        errorAndLog 'Error while setting stunnel up'
2021        exit 1
2022fi
2023
[b4f6d4b]2024# Compilar código fuente de los servicios de OpenGnsys.
2025servicesCompilation
2026if [ $? -ne 0 ]; then
2027        errorAndLog "Error while compiling OpenGnsys services"
2028        exit 1
2029fi
2030
2031# Copiar carpeta Interface entre administración y motor de clonación.
2032copyInterfaceAdm
2033if [ $? -ne 0 ]; then
2034        errorAndLog "Error while copying Administration Interface"
2035        exit 1
2036fi
2037
2038# Configuración de TFTP.
2039tftpConfigure
2040
2041# Configuración de Samba.
2042smbConfigure
2043if [ $? -ne 0 ]; then
2044        errorAndLog "Error while configuring Samba server!"
2045        exit 1
2046fi
2047
2048# Configuración de Rsync.
2049rsyncConfigure
2050
2051# Configuración ejemplo DHCP.
2052dhcpConfigure
2053if [ $? -ne 0 ]; then
2054        errorAndLog "Error while copying your dhcp server files!"
2055        exit 1
2056fi
2057
2058# Copiar ficheros de servicios OpenGnsys Server.
2059copyServerFiles ${INSTALL_TARGET}
2060if [ $? -ne 0 ]; then
2061        errorAndLog "Error while copying the server files!"
2062        exit 1
2063fi
2064INSTVERSION=$(jq -r '.version' $INSTALL_TARGET/doc/VERSION.json)
2065
2066# Instalar base de datos de OpenGnsys Admin.
2067isInArray notinstalled "mysql-server" || isInArray notinstalled "mariadb-server"
2068if [ $? -eq 0 ]; then
2069        # Enable database manager (MySQL, if missing, MariaDB).
2070        service=$MYSQLSERV
2071        $ENABLESERVICE
2072        if [ $? != 0 ]; then
2073                service=$MARIADBSERV
2074                $ENABLESERVICE
2075        fi
2076        # Start database manager.
2077        $STARTSERVICE
2078        # Asignar clave del usuario "root".
2079        mysqlSetRootPassword "${MYSQL_ROOT_PASSWORD}"
2080else
2081        # Si ya está instalado el gestor de bases de datos, obtener clave de "root".
2082        mysqlGetRootPassword
2083fi
2084
2085# Copy MySQL configuration template
2086cp $WORKDIR/opengnsys/server/etc/mysqld-og.cnf $MYSQLCFGDIR 2>/dev/null
2087# Restart database manager.
2088$STARTSERVICE
2089
2090mysqlTestConnection "${MYSQL_ROOT_PASSWORD}"
2091if [ $? -ne 0 ]; then
2092        errorAndLog "Error while connection to mysql"
2093        exit 1
2094fi
2095mysqlDbExists ${OPENGNSYS_DATABASE}
2096if [ $? -ne 0 ]; then
2097        echoAndLog "Creating Web Console database"
2098        mysqlCreateDb ${OPENGNSYS_DATABASE}
2099        if [ $? -ne 0 ]; then
2100                errorAndLog "Error while creating Web Console database"
2101                exit 1
2102        fi
2103else
2104        echoAndLog "Web Console database exists, ommiting creation"
2105fi
2106
2107mysqlCheckUserExists ${OPENGNSYS_DB_USER}
2108if [ $? -ne 0 ]; then
2109        echoAndLog "Creating user in database"
2110        mysqlCreateAdminUserToDb ${OPENGNSYS_DATABASE} ${OPENGNSYS_DB_USER} "${OPENGNSYS_DB_PASSWD}"
2111        if [ $? -ne 0 ]; then
2112                errorAndLog "Error while creating database user"
2113                exit 1
2114        fi
2115
2116fi
2117
2118mysqlCheckDbIsEmpty ${OPENGNSYS_DATABASE}
2119if [ $? -eq 0 ]; then
2120        echoAndLog "Creating tables..."
2121        if [ -f $WORKDIR/$OPENGNSYS_DB_CREATION_FILE ]; then
2122                mysqlImportSqlFileToDb ${OPENGNSYS_DATABASE} $WORKDIR/$OPENGNSYS_DB_CREATION_FILE
2123        else
2124                errorAndLog "Unable to locate $WORKDIR/$OPENGNSYS_DB_CREATION_FILE!!"
2125                exit 1
2126        fi
2127else
2128        # Si existe fichero ogBDAdmin-VersLocal-VersRepo.sql; aplicar cambios.
2129        REPOVERSION=$(jq -r '.version' $WORKDIR/opengnsys/doc/VERSION.json)
2130        OPENGNSYS_DB_UPDATE_FILE="opengnsys/admin/Database/$OPENGNSYS_DATABASE-$INSTVERSION-$REPOVERSION.sql"
2131        if [ -f $WORKDIR/$OPENGNSYS_DB_UPDATE_FILE ]; then
2132                echoAndLog "Updating tables from version $INSTVERSION to $REPOVERSION"
2133                mysqlImportSqlFileToDb ${OPENGNSYS_DATABASE} $WORKDIR/$OPENGNSYS_DB_UPDATE_FILE
2134        else
2135                echoAndLog "Database unchanged."
2136        fi
2137fi
2138# Eliminar fichero temporal con credenciales de acceso a MySQL.
2139rm -f $TMPMYCNF
2140
2141# Copiando páqinas web.
2142installWebFiles
[c9459a1]2143# Configurar variables de PHP
2144configurePHPvars $TLS_DATA_OGADMSRV_CN $TLS_DATA_OGADMSRV_LISTEN_PORT
[b4f6d4b]2145# Descargar/descomprimir archivos descargables.
2146installDownloadableFiles
2147# Generar páqinas web de documentación de la API
2148makeDoxygenFiles
2149
2150# Creando configuración de Apache.
2151installWebConsoleApacheConf $INSTALL_TARGET $APACHECFGDIR
2152if [ $? -ne 0 ]; then
2153        errorAndLog "Error configuring Apache for OpenGnsys Admin"
2154        exit 1
2155fi
2156
2157popd
2158
2159# Crear la estructura de los accesos al servidor desde el cliente (shared)
2160copyClientFiles
2161if [ $? -ne 0 ]; then
2162        errorAndLog "Error creating client structure"
2163fi
2164
2165# Crear certificado para firmar cargadores
2166createCerts
2167
2168# Crear la estructura del cliente de OpenGnsys.
2169for i in $OGLIVE; do
2170        if ! clientCreate "$i"; then
2171                errorAndLog "Error creating client $i"
2172                exit 1
2173        fi
2174done
2175
2176# Configuración de servicios de OpenGnsys
2177openGnsysConfigure
2178
2179# Mostrar sumario de la instalación e instrucciones de post-instalación.
2180installationSummary
2181
2182rm -rf $WORKDIR
2183echoAndLog "OpenGnsys installation finished at $(date)"
2184exit 0
2185
Note: See TracBrowser for help on using the repository browser.