diff --git a/installer/ogdhcp_installer.sh b/installer/ogdhcp_installer.sh new file mode 100755 index 0000000..4212a91 --- /dev/null +++ b/installer/ogdhcp_installer.sh @@ -0,0 +1,336 @@ +#!/bin/bash + +##################################################################### +####### Script instalador Ogclient +####### Autor: Luis Gerardo Romero +##################################################################### + +function globalSetup () +{ + PROGRAMDIR=$(readlink -e "$(dirname "$0")") + PROGRAMNAME=$(basename "$0") + + # Comprobar si se ha descargado el paquete comprimido (REMOTE=0) o sólo el instalador (REMOTE=1). + OPENGNSYS_SERVER="opengnsys.es" + if [ -d "$PROGRAMDIR/../installer" ]; then + echo REMOTE=0 + REMOTE=0 + else + echo REMOTE=1 + REMOTE=1 + fi + BRANCH=$1 + if [[ -z $BRANCH ]]; then + BRANCH="main" + fi + GIT_REPO="ssh://git@ognproject.evlt.uma.es:21987/opengnsys/ogdhcp.git" + + # Directorios de instalación y destino de OpenGnsys. + WORKDIR=/tmp/ogdhcp_installer + INSTALL_TARGET=/opt/ogdhcp + PATH=$PATH:$INSTALL_TARGET/bin + + # Registro de incidencias. + OGLOGFILE=$INSTALL_TARGET/log/${PROGRAMNAME%.sh}.log + LOG_FILE=/tmp/$(basename $OGLOGFILE) + +} + +function checkDependencies() { + echoAndLog "Checking dependencies..." + + # Lista de dependencias + local DEPENDENCIES=(php php-cli php-fpm php-json php-pdo php-mysql php-zip php-gd php-mbstring php-curl php-xml php-pear php-bcmath composer unzip apache2 libapache2-mod-php) + + # Comprobar cada dependencia + for dep in "${DEPENDENCIES[@]}"; do + if ! dpkg -s $dep >/dev/null 2>&1; then + echoAndLog "$dep is not installed. Installing..." + sudo apt-get install -y $dep + else + echoAndLog "$dep is already installed." + fi + done + + echoAndLog "Dependencies checked." +} + +# Instalar dependencias para Symfony y Swagger +function install_symfony_swagger_dependencies() { + echoAndLog "Installing Symfony and Swagger dependencies..." + sudo apt-get update + sudo apt-get install -y php php-cli php-fpm php-json php-pdo php-mysql php-zip php-gd php-mbstring php-curl php-xml php-pear php-bcmath + sudo apt-get install -y composer + sudo apt-get install -y unzip + echoAndLog "Symfony and Swagger dependencies installed." +} + +# Instalar dependencias para Apache +function install_apache_dependencies() { + echoAndLog "Installing Apache dependencies..." + sudo apt-get update + sudo apt-get install -y apache2 libapache2-mod-php + echoAndLog "Apache dependencies installed." +} + + +# Función para instalar los paquetes necesarios para KEA-DHCP +install_kea() { + sudo apt-get install -y kea-dhcp4-server kea-dhcp6-server +} + +# Función para instalar PHP y las extensiones necesarias para Symfony +install_php() { + sudo apt-get install -y php php-cli php-fpm php-json php-pdo php-mysql php-zip php-gd php-mbstring php-curl php-xml php-pear php-bcmath +} + +# Función para instalar Composer +install_composer() { + curl -sS https://getcomposer.org/installer | php + sudo mv composer.phar /usr/local/bin/composer +} + +# Función para instalar Symfony +install_symfony() { + composer global require symfony + echo 'export PATH="$PATH:$HOME/.composer/vendor/bin"' >> ~/.bashrc + source ~/.bashrc +} + + +# Función para instalar Swagger UI +install_swagger() { + sudo apt-get install -y unzip + wget https://github.com/swagger-api/swagger-ui/archive/master.zip + unzip master.zip -d /var/www/html/ + sudo mv /var/www/html/swagger-ui-master /var/www/html/swagger-ui +} + +# Función para instalar el componente ogdhcp +install_ogdhcp() { + git clone + sudo mv ogdhcp /opt/ + cd /opt/ogdhcp + composer install +} + + +# Obtiene el código fuente del proyecto desde el repositorio de GitHub. +function downloadCode() +{ + if [ $# -ne 1 ]; then + errorAndLog "${FUNCNAME}(): invalid number of parameters" + exit 1 + fi + + local url="$1" + + echoAndLog "${FUNCNAME}(): downloading code from '$url'..." + + GIT_SSH_COMMAND="ssh -o StrictHostKeyChecking=accept-new" git archive --remote=$url --format zip --output opengnsys.zip --prefix=opengnsys/ $BRANCH && unzip opengnsys.zip + if [ $? -ne 0 ]; then + errorAndLog "${FUNCNAME}(): error getting OpenGnsys code from $url" + return 1 + fi + rm -f opengnsys.zip + echoAndLog "${FUNCNAME}(): code was downloaded" + return 0 +} + +# Crea la estructura base de la instalación de opengnsys +function createDirs() +{ + if [ $# -ne 1 ]; then + errorAndLog "${FUNCNAME}(): invalid number of parameters" + exit 1 + fi + + local path_opengnsys_base="$1" + + # Crear estructura de directorios. + echoAndLog "${FUNCNAME}(): creating directory paths in $path_opengnsys_base" + mkdir -p $path_opengnsys_base + mkdir -p $path_opengnsys_base/bin + mkdir -p $path_opengnsys_base/config + mkdir -p $path_opengnsys_base/docs # Swagger documentation + mkdir -p $path_opengnsys_base/public + mkdir -p $path_opengnsys_base/src + mkdir -p $path_opengnsys_base/templates + mkdir -p $path_opengnsys_base/var/{cache,log} + mkdir -p $path_opengnsys_base/vendor + if [ $? -ne 0 ]; then + errorAndLog "${FUNCNAME}(): error while creating dirs. Do you have write permissions?" + return 1 + fi + + # Crear usuario ficticio. + if id -u $OPENGNSYS_CLIENT_USER &>/dev/null; then + echoAndLog "${FUNCNAME}(): user \"$OPENGNSYS_CLIENT_USER\" is already created" + else + echoAndLog "${FUNCNAME}(): creating OpenGnsys user" + useradd $OPENGNSYS_CLIENT_USER 2>/dev/null + if [ $? -ne 0 ]; then + errorAndLog "${FUNCNAME}(): error creating OpenGnsys user" + return 1 + fi + fi + + # Mover el fichero de registro de instalación al directorio de logs. + echoAndLog "${FUNCNAME}(): moving installation log file" + mv $LOG_FILE $path_opengnsys_base/var/log && LOG_FILE=$path_opengnsys_base/var/log + chmod 600 $LOG_FILE + + echoAndLog "${FUNCNAME}(): directory paths created" + return 0 +} + + +function copyServerFiles () +{ + if [ $# -ne 1 ]; then + errorAndLog "${FUNCNAME}(): invalid number of parameters" + exit 1 + fi + + local path_opengnsys_base="$1" + + # Lista de ficheros y directorios origen y de directorios destino. + local SOURCES=( bin \ + config \ + public \ + src \ + templates \ + tests \ + vendor \ + .env \ + composer.json \ + composer.lock \ + phpunit.xml.dist \ + symfony.lock ) + local TARGETS=( bin \ + config \ + public \ + src \ + templates \ + tests \ + vendor \ + .env \ + composer.json \ + composer.lock \ + phpunit.xml.dist \ + symfony.lock ) + + if [ ${#SOURCES[@]} != ${#TARGETS[@]} ]; then + errorAndLog "${FUNCNAME}(): inconsistent number of array items" + exit 1 + fi + + # Copiar ficheros. + echoAndLog "${FUNCNAME}(): copying files to server directories" + + pushd $WORKDIR/ogdhcp + local i + for (( i = 0; i < ${#SOURCES[@]}; i++ )); do + if [ -f "${SOURCES[$i]}" ]; then + echoAndLog "Copying ${SOURCES[$i]} to $path_opengnsys_base/${TARGETS[$i]}" + cp -a "${SOURCES[$i]}" "${path_opengnsys_base}/${TARGETS[$i]}" + elif [ -d "${SOURCES[$i]}" ]; then + echoAndLog "Copying content of ${SOURCES[$i]} to $path_opengnsys_base/${TARGETS[$i]}" + cp -a "${SOURCES[$i]}"/* "${path_opengnsys_base}/${TARGETS[$i]}" + else + warningAndLog "Unable to copy ${SOURCES[$i]} to $path_opengnsys_base/${TARGETS[$i]}" + fi + done + + popd +} + + +##################################################################### +####### Algunas funciones útiles de propósito general: +##################################################################### + +function getDateTime() +{ + date "+%Y%m%d-%H%M%S" +} + +# Escribe a fichero y muestra por pantalla +function echoAndLog() +{ + local DATETIME=`getDateTime` + echo "$1" + echo "$DATETIME;$SSH_CLIENT;$1" >> $LOG_FILE +} + +# Escribe a fichero y muestra mensaje de error +function errorAndLog() +{ + local DATETIME=`getDateTime` + echo "ERROR: $1" + echo "$DATETIME;$SSH_CLIENT;ERROR: $1" >> $LOG_FILE +} + +# Escribe a fichero y muestra mensaje de aviso +function warningAndLog() +{ + local DATETIME=`getDateTime` + echo "Warning: $1" + echo "$DATETIME;$SSH_CLIENT;Warning: $1" >> $LOG_FILE +} + +########################################################################## +################################main###################################### + + +# Sólo ejecutable por usuario root +if [ "$(whoami)" != 'root' ]; then + echo "ERROR: this program must run under root privileges!!" + exit 1 +fi + + + +# Si es necesario, descarga el repositorio de código en directorio temporal +if [ $REMOTE -eq 1 ]; then + downloadCode $GIT_REPO + if [ $? -ne 0 ]; then + errorAndLog "Error while getting code from the repository" + exit 1 + fi +else + ln -fs "$(dirname $PROGRAMDIR)" opengnsys +fi + +globalSetup + +echoAndLog "OpenGnsys installation begins at $(date)" + +mkdir -p $WORKDIR +pushd $WORKDIR + +# Arbol de directorios de OpenGnsys. +createDirs ${INSTALL_TARGET} +if [ $? -ne 0 ]; then + errorAndLog "Error while creating directory paths!" + exit 1 +fi + +# Copiar ficheros de servicios OpenGnsys Server. +copyServerFiles ${INSTALL_TARGET} +if [ $? -ne 0 ]; then + errorAndLog "Error while copying the server files!" + exit 1 +fi + +sudo apt-get update +# install_kea +# install_php +# install_composer +# install_symfony +# install_swagger +# Ahora puedes clonar e instalar el componente ogDhcp +# git clone +# cd +# composer install +