source: installer/opengnsys_installer.sh @ ca239ad

918-git-images-111dconfigfileconfigure-oglivegit-imageslgromero-new-oglivemainmaint-cronmount-efivarfsmultivmmultivm-ogboot-installerogClonningEngineogboot-installer-jenkinsoglive-ipv6test-python-scriptsticket-301ticket-50ticket-50-oldticket-577ticket-585ticket-611ticket-612ticket-693ticket-700ubu24tplunification2use-local-agent-oglivevarios-instalacion
Last change on this file since ca239ad was befd4f9, checked in by Ramón M. Gómez <ramongomez@…>, 6 years ago

#892: Revert the removal of wakonlan installation dependency from commit 2b00219.

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