source: installer/opengnsys_installer_devel_esxi.sh @ 9f4584f

configure-oglivelgromero-new-oglivemainmaint-cronmount-efivarfsmultivmmultivm-ogboot-installerogClonningEngineogboot-installer-jenkinsoglive-ipv6test-python-scriptsticket-301ticket-50ticket-50-oldticket-577ticket-585ticket-611ticket-612ticket-693ticket-700ubu24tplunification2use-local-agent-oglivevarios-instalacion
Last change on this file since 9f4584f was 9f4584f, checked in by Natalia Serrano <natalia.serrano@…>, 19 months ago

Install new TLS certs or use those provided by the user

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