Explorar el Código

* Añadido ayuda()
* Añadido parser de opciones

Guzmán Castanedo Villalba hace 6 años
padre
commit
1fab433fda
Se han modificado 1 ficheros con 327 adiciones y 18 borrados
  1. 327 18
      install

+ 327 - 18
install

@@ -12,6 +12,68 @@
 # GPLv3 (https://www.gnu.org/licenses/gpl.html)			#
 #################################################################
 
+ayuda() {
+# Muestra ayuda al usuario y termina
+	echo -en "AYUDA AUTO-ELEARNING:\n"
+	echo -en "  Instala automáticamente una wiki (MediaWiki) y un campus virtual (Moodle).\n"
+	echo -en "  Para ello instala un entorno LEMP (GNU/Linux+Nginx+MySQL/MariaDB+PHP) o LAMP (GNU/Linux+Apache+MySQL/MariaD+PHP).\n"
+	echo -en "  Además instala certificados SSL/TLS válidos de Let's Encrypt (o auto-firmados) y genera copias de seguridad diariamente.\n"
+	echo -en "  Licencia: GPLv3 (Autor: Guzmán Castanedo Villalba [guzman@castanedo.es]).\n"
+	echo -en "\nSINOPSIS:\n"
+	echo -en "    sudo ./"$(basename $0)" (Forma 1)\n"
+	echo -en "    sudo ./"$(basename $0)" [OPCIONES] (Forma 2)\n"
+	echo -en "\nDESCRIPCIÓN:\n"
+	echo -en "  La primera forma permite instalarlo todo de forma INTERACTIVA (contestando a unas preguntas que saldrán por pantalla).\n"
+	echo -en "  La segunda forma permite hacer lo mismo de forma NO INTERACTIVA (indicando todas las opciones desde el terminal).\n"
+	echo -en "  Esta aplicación requiere de permisos de administrador (root).\n"
+	echo -en "\nCOMPATIBILIDAD:\n"
+	echo -en "  Esta aplicación es compatible con Ubuntu 18.04, 16.04, Debian 9, CentOS 7 y Fedora 28.\n"
+	echo -en "  Requiere de un sistema moderno que tenga instalado SystemD.\n"
+	echo -en "  Se irán añadiendo nuevas distribuciones en futuras versiones.\n"
+	echo -en "\nOPCIONES:\n"
+	echo -en "  -d, --dominio, --fqdn <dominio>: dominio principal del servidor (OBLIGATORIO)\n"
+	echo -en "  --lemp: activa servidor web Nginx (Por Defecto)\n"
+	echo -en "  --lamp: activa servidor web Apache2\n"
+	echo -en "  --mariadb: activa base de datos mariadb (Por Defecto)\n"
+	echo -en "  --mysql: activa base de datos mysql\n"
+	echo -en "    Sólo es posible para Ubuntu 18.04\n"
+	echo -en "  --password-sql <pass>: contraseña root de base de datos (OBLIGATORIO)\n"
+	echo -en "  --max-upload-size <size>: tamaño de subida permitido (Por Defecto: \"100M\")\n"
+	echo -en "  --lets-encrypt: activa certificados SSL/TLS de Let's Encrypt\n"
+	echo -en "  --auto-firmados: activa certificadaos SSL/TLS auto-firmados (sólo para pruebas)\n"
+	echo -en "\nOPCIONES MEDIA WIKI:\n"
+	echo -en "  --media-wiki: activa instalación de Media Wiki (Por Defecto)\n"
+	echo -en "    Si se activa esta opción --nombre-mw, --dominios-mw y -password-mw son OBLIGARIOS\n"
+	echo -en "  --no-media-wiki: desactiva instalación de Media Wiki\n"
+	echo -en "  --nombre-mw <nombre>: nombre de la wiki\n"
+	echo -en "  --dominios-mw <dominios>: dominios para Media Wiki\n"
+	echo -en "    Deben estar configuradas las DNS para que estos apunten a este servidor\n"
+	echo -en "    Se pueden indicar más de uno separándolos con espacios\n"
+	echo -en "  --password-mw <pass>: contraseña para usuario 'admin'\n"
+	echo -en "\nOPCIONES MOODLE:\n"
+	echo -en "  --moodle: activa instalación de Moodle (Por Defecto)\n"
+	echo -en "    Si se activa esta opción --nombre-mo, --nombre-corto-mo, --dominios-mo y -password-mo son OBLIGARIOS\n"
+	echo -en "  --no-moodle: desactiva instalación de Moodle\n"
+	echo -en "  --nombre-mo <nombre>: nombre del campus\n"
+	echo -en "  --nombre-corto-mo <nombre>: nombre corto del campus (una sola palabra)\n"
+	echo -en "  --dominio-mo <dominio>: dominio para Moodle\n"
+	echo -en "    Deben estar configuradas las DNS para que estos apunten a este servidor\n"
+	echo -en "    Sólo se puede indicar UN DOMINIO\n"
+	echo -en "  --password-mo <pass>: contraseña para usuario 'admin'\n"
+	echo -en "\nOTRAS OPCIONES:\n"
+	echo -en "  --php-info: activa info.php (sólo para pruebas)\n"
+	echo -en "  --no-php-info: desactiva info.php (Por Defecto)\n"
+	echo -en "  --backup: activa los backups automáticos (Por Defecto)\n"
+	echo -en "  --no-backup: desactiva los backups automáticos\n"
+	echo -en "\nEJEMPLOS:\n"
+	echo -en "  sudo "$0"\n"
+	echo -en "    Activa el programa en modo interactivo\n"
+	echo -en "  sudo "$0" -d ejemplo.com --lemp --mariadb --password-sql 123456 --media-wiki --nombre-mw \"Wiki de Ejemplo\" --dominios-mw \"ejemplo.com www.ejemplo.com wiki.ejemplo.com\" --password-mw qwerty --no-moodle\n"
+	echo -en "    Instala LEMP con mariadb y Media Wiki\n"
+	echo -en "  sudo "$0" -d ejemplo.com --lamp --mysql --password-sql 123456 --no-media-wiki --moodle --nombre-mo \"Campus Virtual\" --nombre-corto-mo EJEMPLO --dominio-mo moodle.ejemplo.com --password-mo qwerty\n"
+	echo -en "    Instala LAMP con MySQL y Moodle\n\n"
+}
+
 comprobarError() {
 # Permite comprobar si se ha producido un error y de serlo devuelve un código de error
 # comprobarError exitNum codeNum extraInfo
@@ -50,6 +112,39 @@ comprobarError() {
 		6)
 			error="$type $codeNum:\tError interno (selección SSL/TLS).\n"
 			;;
+		10)
+			error="$type $codeNum:\tOpción inesperada '$extraInfo'.\n"
+			;;
+		11)
+			error="$type $codeNum:\tDominio Principal no definido ('--hostname \"ejemplo.com\"').\n"
+			;;
+		12)
+			error="$type $codeNum:\tContraseña SQL no definida ('--password-sql \"pass\"').\n"
+			;;
+		13)
+			error="$type $codeNum:\tTamaño de subida no definido ('--max-upload-size \"100M\"').\n"
+			;;
+		14)
+			error="$type $codeNum:\tNombre Media Wiki no definida (--nombre-mw \"Wiki de Ejemplo\").\n"
+			;;
+		15)
+			error="$type $codeNum:\tDominios Media Wiki no definidos (--dominios-mw \"ejemplo.com wiki.ejemplo.com\").\n"
+			;;
+		16)
+			error="$type $codeNum:\tContraseña Media Wiki no definida (--password-mw \"pass\").\n"
+			;;
+		17)
+			error="$type $codeNum:\tNombre Moodle no definido (--nombre-mo \"Campus Virtual de Ejemplo\").\n"
+			;;
+		18)
+			error="$type $codeNum:\tNombre Corto Moodle no definido (--nombre-corto-mo \"Ejemplo\").\n"
+			;;
+		19)
+			error="$type $codeNum:\tDominio Moodle no definido (--dominio-mo \"moodle.ejemplo.com\").\n"
+			;;
+		20)
+			error="$type $codeNum:\tContraseña Moodle no definida (--password-mo \"pass\").\n"
+			;;
 		100)
 			error="$type $codeNum:\tError interno (selección del servidor web).\n"
 			;;
@@ -556,11 +651,7 @@ instalacionExpress() {
 			mySQLOn=true
 			dbType="mariadb"
 			;;
-		ubuntu)
-			mariaDBOn=true
-			dbType="mariadb"
-			;;
-		centos|fedora)
+		ubuntu|centos|fedora)
 			mariaDBOn=true
 			dbType="mariadb"
 			;;
@@ -571,12 +662,6 @@ instalacionExpress() {
 	mediaWikiOn=true
 	moodleOn=true
 	backupOn=true
-	# Preguntas mínimas
-	establecerFQDN
-	leerSQLPasswd
-	mostrarMediaWiki
-	mostrarMoodle
-	mostrarConfirmacion
 }
 
 mostrarBienvenida() {
@@ -597,7 +682,12 @@ mostrarExpress() {
 	case $express in
 		Express)
 			instalacionExpress
-			# DECIDIR QUÉ OPCIONES SON LAS MÍNIMAS
+			# Preguntas mínimas
+			establecerFQDN
+			leerSQLPasswd
+			mostrarMediaWiki
+			mostrarMoodle
+			mostrarConfirmacion
 			;;
 		Avanzada)
 			mostrarAvanzada
@@ -774,7 +864,7 @@ mostrarMoodle() {
 			serverName=$dominio
 		else
 			# Dominios Secundarios (ServerAlias)
-			aliasMeoodle=$aliasMoodle" "$dominio
+			aliasMoodle=$aliasMoodle" "$dominio
 		fi
 		cont=$((cont + 1))
 	done
@@ -1965,11 +2055,230 @@ configurarBackups() {
 	OSInfo
 	comprobarDependencias
 
-# Bienvenida
-	mostrarBienvenida
-	
-# Selección de componentes (express vs avanzada)
-	mostrarExpress
+# Leer opciones
+	which getopt 2>/dev/null
+	if [ $? -eq 0 ] && [ $# -ne 0 ];then
+		# Configuración por defecto (opciones de Express)
+		instalacionExpress
+		# Leer opciones
+		TEMP=$(getopt -q -o hd: --longoptions help,dominio:,fqdn:,lamp,lemp,mariadb,mysql,password-sql:,max-upload-size:,letsencrypt,auto-firmados,media-wiki,no-media-wiki,nombre-mw:,dominios-mw:,password-mw:,moodle,no-moodle,nombre-mo:,nombre-corto-mo:,dominio-mo:,password-mo:,php-info,no-php-info,backup,no-backup --name $(basename $0) -- $@)
+		eval set -- $TEMP
+		unset TEMP
+		while true; do
+			case $1 in
+				-h|--help)
+					ayuda
+					exit 0
+					;;
+				-d|--dominio|--fqdn)
+					hostname=$2
+					shift 2
+					;;
+				--lamp)
+					apacheOn=true
+					shift
+					;;
+				--lemp)
+					nginxOn=true
+					shift
+					;;
+				--mariadb)
+					case $ID in
+						debian)
+							mySQLOn=true
+							dbType="mariadb"
+							;;
+						ubuntu|centos|fedora)
+							mariaDBOn=true
+							dbType="mariadb"
+					esac
+					shift
+					;;
+				--mysql)
+					if [ $ID = "ubuntu" ] && [ $VERSION = "18.04" ];then
+						mySQLOn=true
+						dbType="mysqli"
+					else
+						# No está soportado
+						ayuda
+						comprobarError 1 205
+					fi
+					shift
+					;;
+				--password-sql)
+					sqlPasswd=$2
+					shift 2
+					;;
+				--max-upload-size)
+					maxUpload=$2
+					shift 2
+					;;
+				--lets-encrypt)
+					sslOn=true
+					letsEncryptOn=true
+					shift
+					;;
+				--auto-firmados)
+					sslOn=true
+					letsEncryptOn=false
+					shift
+					;;
+				--media-wiki)
+					mediaWikiOn=true
+					shift
+					;;
+				--no-media-wiki)
+					mediaWikiOn=false
+					shift
+					;;
+				--nombre-mw)
+					nombreMediaWiki=$2
+					shift 2
+					;;
+				--dominios-mw)
+					dominioMediaWiki=$2
+					cont=1
+					serverName=""
+					aliasMediaWiki=""
+					for dominio in $dominioMediaWiki;do
+						if [ $cont -eq 1 ];then
+							# Dominio Principal (ServerName)
+							serverName=$dominio
+						else
+							# Dominios Secundarios (ServerAlias)
+							aliasMediaWiki=$aliasMediaWiki" "$dominio
+						fi
+						cont=$((cont + 1))
+					done
+					dominioMediaWiki=$serverName
+					unset cont serverName dominio
+					shift 2
+					;;
+				--password-mw)
+					passwdMediaWiki=$2
+					shift 2
+					;;
+				--moodle)
+					moodleOn=true
+					shift
+					;;
+				--no-moodle)
+					moodleOn=false
+					shift
+					;;
+				--nombre-mo)
+					nombreMoodle=$2
+					shift 2
+					;;
+				--nombre-corto-mo)
+					nombreCortoMoodle=$(echo $2 | cut -d ' ' -f 1)
+					shift 2
+					;;
+				--dominio-mo)
+					dominioMoodle=$2
+					cont=1
+					serverName=""
+					aliasMoodle=""
+					for dominio in $dominioMoodle;do
+						if [ $cont -eq 1 ];then
+							# Dominio Principal (ServerName)
+							serverName=$dominio
+						else
+							# Dominios Secundarios (ServerAlias)
+							aliasMoodle=$aliasMoodle" "$dominio
+						fi
+						cont=$((cont + 1))
+					done
+					dominioMoodle=$serverName
+					unset cont ServerName dominio aliasMoodle
+					shift 2
+					;;
+				--password-mo)
+					passwdMoodle=$2
+					shift 2
+					;;
+				--php-info)
+					infoPHPOn=true
+					shift
+					;;
+				--no-php-info)
+					infoPHPOn=false
+					shift
+					;;
+				--backup)
+					backupOn=true
+					shift
+					;;
+				--no-backup)
+					backupOn=false
+					shift
+					;;
+				--)
+					#Ultimo
+					shift
+					break
+					;;
+				*)
+					# Inesperado
+					ayuda
+					comprobarError 1 10 $1
+					;;
+			esac
+		done
+		# Comprobar si los datos son correctos
+		if [ -z "$hostname" ];then
+			ayuda
+			comprobarError 1 10
+		else
+			hostnamectl set-hostname $hostname >/dev/null 2>&1
+		fi
+		if [ -z "$sqlPasswd" ];then
+			ayuda
+			comprobarError 1 11
+		fi
+		if [ -z "$maxUpload" ];then
+			ayuda
+			comprobarError 1 12
+		fi
+		if [ $mediaWikiOn = true ];then
+			if [ -z $nombreMediaWiki ];then
+				ayuda
+				comprobarError 1 13
+			fi
+			if [ -z $dominioMediaWiki ];then
+				ayuda
+				comprobarError 1 14
+			fi
+			if [ -z $passwdMediaWiki ];then
+				ayuda
+				comprobarError 1 15
+			fi
+		fi
+		if [ $moodleOn = true ];then
+			if [ -z $nombreMoodle ];then
+				ayuda
+				comprobarError 1 16
+			fi
+			if [ -z $nombreCortoMoodle ];then
+				ayuda
+				comprobarError 1 17
+			fi
+			if [ -z $dominioMoodle ];then
+				ayuda
+				comprobarError 1 18
+			fi
+			if [ -z $passwdMoodle ];then
+				ayuda
+				comprobarError 1 19
+			fi
+		fi
+	else
+		# Preguntas interactivas
+		# Bienvenida
+		mostrarBienvenida
+		# Selección de componentes (express vs avanzada)
+		mostrarExpress
+	fi
 
 # Instalación Servidor Web
 	if [ $apacheOn = true ]; then