source: installer/opengnsys_installer_devel_esxi.sh @ 124657d3

configure-oglivelgromero-new-oglivemainmount-efivarfsmultivmmultivm-ogboot-installerogClonningEngineoglive-ipv6test-python-scriptsticket-577ticket-585ticket-611ticket-612ticket-693ticket-700ubu24tplunification2use-local-agent-oglivevarios-instalacion
Last change on this file since 124657d3 was 26dd8f6, checked in by Natalia Serrano <natalia.serrano@…>, 13 months ago

refs #262 download files from a working server

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