123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457 |
- #!/bin/bash
- #################################################################
- # auto-elearning #
- # Instala automáticamente una Wiki (MediaWiki) y un Campus #
- # Virtual (Moodle). #
- # Para ello instala un entorno LEMP (GNU/Linux+Nginx+MySQL/ #
- # MariaDB+PHP) o LAMP (GNU/Linux+Apache+MySQL/MariaDB+PHP). #
- # Además instala certificados SSL/TLS válidos de Let's Encrypt #
- # (o auto-firmados) y genera copias de seguridad diariamente. #
- # #
- # Guzman Castanedo Villalba (guzman@castanedo.es) Junio 2018 #
- # 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 " --no-https, --no-ssl: desactiva HTTPS\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
- # 1xx: Servidor Web
- # 2xx: Base de Datos
- # 3xx: PHP
- # 4xx: SSL/TLS
- # 5xx: MediaWiki
- # 6xx: Moodle
- # 7xx: Backup automático
- # 8xx: Dependencias
- # 9xx: Servicios & Firewall
-
- type="ERROR"
- exitNum=$1
- shift
- codeNum=$1
- shift
- extraInfo=$@
- case $codeNum in
- 1)
- error="$type $codeNum:\tInstalación interrumpida por el usuario.\n"
- ;;
- 2)
- error="$type $codeNum:\tError interno (selección express).\n"
- ;;
- 3)
- error="$type $codeNum:\tError interno (selección avanzada).\n"
- ;;
- 4)
- error="\n$type $codeNum:\tEl archivo '"$(realpath $extraInfo)"' no existe.\n"
- ;;
- 5)
- error="\n$type $codeNum:\tEl directorio '"$(realpath $extraInfo)"' no existe.\n"
- ;;
- 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"
- ;;
- 101)
- error="\n$type $codeNum:\tError al instalar Apache2.\nDetalles:\n$extraInfo\n"
- ;;
- 102)
- error="\n$type $codeNum:\tError al instalar Nginx.\nDetalles:\n$extraInfo\n"
- ;;
- 103)
- error="\n$type $codeNum:\tError al nstalar repositorio 'epel-release'.\nDetalles:\n$extraInfo\n"
- ;;
- 104)
- error="\n$type $codeNum:\tError interno (instalación Apache2).\n"
- ;;
- 105)
- error="\n$type $codeNum:\tError interno (instalación Nginx).\n"
- ;;
- 106)
- type="WARNING"
- error="\n$type $codeNum:\tImposible instalar 'info.php'.\n"
- ;;
- 107)
- error="\n$type $codeNum:\tError al configurar Nginx.\n"
- ;;
- 108)
- error="\n$type $codeNum:\tError al configurar Apache2.\n"
- ;;
- 200)
- error="$type $codeNum:\tError interno (selección de base de datos).\n"
- ;;
- 201)
- error="\n$type $codeNum:\tError al instalar MySQL.\nDetalles:\n$extraInfo\n"
- ;;
- 202)
- error="\n$type $codeNum:\tError al instalar MariaDB.\nDetalles:\n$extraInfo\n"
- ;;
- 203)
- error="\n$type $codeNum:\tError interno (instalación MySQL).\n"
- ;;
- 204)
- error="\n$type $codeNum:\tError interno (instalación MariaDB).\n"
- ;;
- 205)
- error="\n$type $codeNum:\t$DIST no incluye MySQL en sus repositorios.\n"
- ;;
- 206)
- type="WARNING"
- error="\n$type $codeNum:\tUsuario 'root' ya dispone de contraseña."
- ;;
- 207)
- error="\n$type $codeNum:\tImposible cambiar la contraseña de 'root'."
- ;;
- 208)
- error="\n$type $codeNum:\tImposible desactivar acceso 'root' desde el exterior."
- ;;
- 209)
- error="\n$type $codeNum:\tImposible eliminar usuarios anónimos."
- ;;
- 210)
- type="WARNING"
- error="\n$type $codeNum:\tImposible eliminar bases de datos de pruebas."
- ;;
- 211)
- type="WARNING"
- error="\n$type $codeNum:\tImposible eliminar los permisos de las bases de datos de pruebas."
- ;;
- 212)
- error="\n$type $codeNum:\tImposible recargar base de datos."
- ;;
- 213)
- error="\n$type $codeNum:\tImposible configurar SQL.\n"
- ;;
- 214)
- type="WARNING"
- error="\n$type $codeNum:\tSQL ya está configurado."
- ;;
- 300)
- error="\n$type $codeNum:\tError interno (instalación PHP-7).\n"
- ;;
- 301)
- error="\n$type $codeNum:\tError interno (Web Server no seleccionado).\n"
- ;;
- 302)
- error="\n$type $codeNum:\tError al instalar PHP-7.\nDetalles:\n$extraInfo\n"
- ;;
- 303)
- error="\n$type $codeNum:\tError al instalar Repositorio Remi.\nDetalles:\n$extraInfo\n"
- ;;
- 304)
- error="\n$type $codeNum:\tSistema Operativo no compatible con PHP-7 ($OS $DIST $REV).\n"
- ;;
- 305)
- error="\n$type $codeNum:\tImposible configurar PHP-7.\n"
- ;;
- 401)
- error="\n$type $codeNum:\tError al instalar 'certbot' (Let's Encrypt).\n"
- ;;
- 402)
- error="\n$type $codeNum:\tImposible generar Certificados Autofirmados.\n"
- ;;
- 403)
- error="\n$type $codeNum:\tImposible generar claves de intercambio Diffie-Hellman.\n"
- ;;
- 404)
- error="\n$type $codeNum:\tImposible generar Certificados Let's Encrypt.\n"
- ;;
- 501)
- error="\n$type $codeNum:\tImposible descargar MediaWiki-1.31.0.\n"
- ;;
- 502)
- error="\n$type $codeNum:\tImposible configurar MediaWiki-1.31.0.\n"
- ;;
- 503)
- type="WARNING"
- error="\n$type $codeNum:\tYa existe una copia configurada de MediaWiki en el dominio: '$extraInfo'."
- ;;
- 601)
- error="\n$type $codeNum:\tImposible descargar Moodle-3.5.1.\n"
- ;;
- 602)
- error="\n$type $codeNum:\tImposible configurar Moodle-3.5.1.\n"
- ;;
- 603)
- type="WARNING"
- error="\n$type $codeNum:\tYa existe una copia configurada de Moodle en el dominio: '$extraInfo'."
- ;;
- 604)
- error="\n$type $codeNum:\tImposible configurar SELinux.\n"
- ;;
- 605)
- error="\n$type $codeNum:\tImposible instalar 'policycoreutils-python'.Detalles:\n$extraInfo\n"
- ;;
- 701)
- type="WARNING"
- error="\n$tupe $codeNum:\tImposible configurar actualizaciones automáticas.\n"
- ;;
- 800)
- error="$type $codeNum:\tEs necesario ser root ('sudo $0').\n"
- ;;
- 801)
- error="$type $codeNum:\t'whiptail' no instalado.\n"
- ;;
- 802)
- error="$type $codeNum:\t'hostnamectl' no instalado.\n"
- ;;
- 803)
- error="$type $codeNum:\t'apt-get' no instalado.\n"
- ;;
- 804)
- error="$type $codeNum:\t'yum' no instalado.\n"
- ;;
- 805)
- error="\n$type $codeNum:\tImposible actualizar repositorio\nDetalles:\n$extraInfo.\n"
- ;;
- 806)
- error="$type $codeNum:\t'ufw' no instalado.\nDetalles:\n$extraInfo\n"
- ;;
- 807)
- error="$type $codeNum:\t'firewall-cmd' no instalado.\n"
- ;;
- 808)
- error="$type $codeNum:\t'tput' no instalado.\nDetalles:\n$extraInfo\n"
- ;;
- 809)
- error="$type $codeNum:\t'sed' no instalado.\nDetalles:\n$extraInfo\n"
- ;;
- 810)
- error="$type $codeNum:\t'curl' no instalado.\nDetalles:\n$extraInfo\n"
- ;;
- 811)
- error="$type $codeNum:\t'tar' no instalado.\nDetalles:\n$extraInfo\n"
- ;;
- 812)
- error="$type $codeNum:\t'gzip' no instalado.\nDetalles:\n$extraInfo\n"
- ;;
- 813)
- error="$type $codeNum:\t'bzip2' no instalado.\nDetalles:\n$extraInfo\n"
- ;;
- 814)
- error="$type $codeNum:\t'xz' no instalado.\nDetalles:\n$extraInfo\n"
- ;;
- 815)
- error="$type $codeNum:\t'openssl' no instalado.\nDetalles:\n$extraInfo\n"
- ;;
- 816)
- error="$type $codeNum:\t'find' no instalado.\n"
- ;;
- 817)
- error="$type $codeNum:\tLa Distribución '$OS $DIST $REV' no está soportada.\nSoportadas: Ubuntu 16.04, 18.04, Debian 9, CentOS 7 y Fedora 28.\n"
- ;;
- 900)
- error="$type $codeNum:\tError interno (habilitar servicio).\n"
- ;;
- 901)
- error="$type $codeNum:\tImposible encender servicio '$extraInfo'.\n"
- ;;
- 902)
- error="$type $codeNum:\tImposible habilitar servicio '$extraInfo' durante el arranque.\n"
- ;;
- 903)
- error="$type $codeNum:\tError interno (deshabilitar servicio).\n"
- ;;
- 904)
- error="$type $codeNum:\tImposible parar servicio '$extraInfo'.\n"
- ;;
- 905)
- error="$type $codeNum:\tImposible deshabilitar servicio '$extraInfo' durante el arranque.\n"
- ;;
- 906)
- type="WARNING"
- error="\n$type $codeNum:\tImposible añadir regla al cortafuegos ('$extraInfo').\n"
- ;;
- 907)
- type="WARNING"
- error="\n$type $codeNum:\tImposible encender cortafuegos.\n"
- ;;
- 908)
- error="\n$type $codeNum:\tError interno (instalar Virtual Host).\n"
- ;;
- 909)
- error="\n$type $codeNum:\tVirtual Host '$extraInfo' no existe.\n"
- ;;
- 910)
- error="\n$type $codeNum:\tImposible copiar Virtual Host '$extraInfo'.\n"
- ;;
- 911)
- error="\n$type $codeNum:\tImposible activar Virtual Host '$extraInfo'.\n"
- ;;
- 912)
- error="\n$type $codeNum:\tError interno (recargar servicio).\n"
- ;;
- 913)
- error="\n$type $codeNum:\tImposible recargar servicio '$extraInfo'.\n"
- ;;
- *)
- error="ERROR 13:\tError interno (comprobación de errores)\n"
- exitNum=1
- codeNum=13
- ;;
- esac
- if [ $exitNum -ne 0 ];then
- echo -en "$error" | tee -a $logFile
- if [ $type = "ERROR" ];then
- exit $codeNum
- fi
- fi
- unset error exitNum codeNum type
- }
- OSInfo() {
- # Detecta el OS en el que se está ejecutando el programa, así como su versión
- # Sólo continuará si se trata de una distribución compatible
- echo -en "Detectando SO..." >> $logFile
- OS=$(uname -s)
- if [ $OS = "Linux" ]; then
- OS="GNU/Linux"
- if [ -f /etc/os-release ]; then
- DIST=$(grep ^NAME= /etc/os-release | cut -d = -f 2 | cut -d '"' -f 2)
- REV=$(grep ^VERSION= /etc/os-release | cut -d = -f 2 | cut -d '"' -f 2)
- ID=$(grep ^ID= /etc/os-release | cut -d = -f 2 | cut -d '"' -f 2)
- VERSION=$(grep ^VERSION_ID= /etc/os-release | cut -d = -f 2 | cut -d '"' -f 2)
- for i in $ID; do
- case $i in
- debian)
- case $VERSION in
- 9)
- # Debian 9 Soportado
- ;;
- *)
- comprobarError 1 817
- ;;
- esac
- break
- ;;
- ubuntu)
- case $VERSION in
- 18.04)
- # Ubuntu 18.04 Soportado
- ;;
- 16.04)
- # Ubuntu 16.04 Soportado
- ;;
- *)
- comprobarError 1 817
- ;;
- esac
- break
- ;;
- rhel|centos)
- case $VERSION in
- 7)
- # CentOS 7 Soportado
- ;;
- *)
- comprobarError 1 817
- ;;
- esac
- break
- ;;
- fedora)
- case $VERSION in
- 28)
- # Fedora 28 Soportado
- ;;
- *)
- comprobarError 1 817
- ;;
- esac
- break
- ;;
- *)
- comprobarError 1 817
- ;;
- esac
- done
- else
- # Other Linux (No Soportado)
- comprobarError 1 817
- fi
- else
- # UNIX, OS X, ... (No Soportado)
- comprobarError 1 817
- fi
- echo -en " $OS $DIST $REV\n" >> $logFile
- HDInfo=$(df -h | head -1)"\n"$(df -h | grep ^/dev/sd)"\n"$(df -h | grep ^/dev/mapper)
- echo -en "$HDInfo\n" >> $logFile
- }
- comprobarRoot() {
- # Comprueba si se está ejecutando con privilegios de root
- comprobarError $(id -u) 800
- }
- comprobarDependencias() {
- # Comprueba si están instalados todos los programas necesarios.
- # En la mayoría de los casos, trata de instalarlos.
- # Comprobamos whiptail
- which whiptail > /dev/null 2>&1
- comprobarError $? 801
- # Comprobamos hostnamectl
- which hostnamectl > /dev/null 2>&1
- comprobarError $? 802
- which find > /dev/null 2>&1
- comprobarError $? 816
- case $ID in
- debian|ubuntu)
- # Comprobamos apt-get
- which apt-get > /dev/null 2>&1
- comprobarError $? 803
- # Actualizamos base de datos del repositorio
- echo -en "Actualizando repositorio APT..." | tee -a $logFile
- result=$(apt-get -q -y update 2>&1)
- comprobarError $? 805 $result
- echo -en " OK.\n" | tee -a $logFile
- # Comprobamos Firewall (ufw)
- which ufw > /dev/null 2>&1
- if [ $? -ne 0 ];then
- result=$(apt-get -q -y install ufw 2>&1)
- comprobarError $? 806 $result
- fi
- # Comprobamos tput
- which tput > /dev/null 2>&1
- if [ $? -ne 0 ];then
- result=$(apt-get -q -y install ncurses-bin 2>&1)
- comprobarError $? 808 $result
- fi
- # Comprobar sed
- which sed > /dev/null 2>&1
- if [ $? -ne 0 ];then
- result=$(apt-get -q -y install sed 2>&1)
- comprobarError $? 809 $result
- fi
- # Comprobar curl
- which curl > /dev/null 2>&1
- if [ $? -ne 0 ];then
- result=$(apt-get -q -y install curl 2>&1)
- comprobarError $? 810 $result
- fi
- # Comprobamos tar, gzip, bzip2 y xz
- which tar > /dev/null 2>&1
- if [ $? -ne 0 ];then
- result=$(apt-get -q -y install tar 2>&1)
- comprobarError $? 811 $result
- fi
- which gzip > /dev/null 2>&1
- if [ $? -ne 0 ];then
- result=$(apt-get -q -y install gzip 2>&1)
- comprobarError $? 812 $result
- fi
- which bzip2 > /dev/null 2>&1
- if [ $? -ne 0 ];then
- result=$(apt-get -q -y install bzip2 2>&1)
- comprobarError $? 813 $result
- fi
- which xz > /dev/null 2>&1
- if [ $? -ne 0 ];then
- result=$(apt-get -q -y install xz-utils 2>&1)
- comprobarError $? 814 $result
- fi
- # Comprobamos openssl
- which openssl > /dev/null 2>&1
- if [ $? -ne 0 ];then
- result=$(apt-get -q -y install openssl 2>&1)
- comprobarError $? 815 $result
- fi
- ;;
- centos|fedora)
- # Comprobamos yum
- which yum > /dev/null 2>&1
- comprobarError $? 804
- # Actualizamos base de datos del repositorio
- echo -en "Actualizando repositorio YUM..." | tee -a $logFile
- result=$(yum -y makecache 2>&1)
- comprobarError $? 805 $result
- echo -en " OK.\n" | tee -a $logFile
- # Comprobamos Firewall (firewall-cmd)
- which firewall-cmd > /dev/null 2>&1
- comprobarError $? 807
- # Comprobamos tput
- which tput > /dev/null 2>&1
- if [ $? -ne 0 ];then
- result=$(yum -y install ncurses 2>&1)
- comprobarError $? 808 $result
- fi
- # Comprobar sed
- which sed > /dev/null 2>&1
- if [ $? -ne 0 ];then
- result=$(yum -y install sed 2>&1)
- comprobarError $? 809 $result
- fi
- # Comprobar curl
- which curl > /dev/null 2>&1
- if [ $? -ne 0 ];then
- result=$(yum -y install curl 2>&1)
- comprobarError $? 810 $result
- fi
- # Comprobamos tar, gzip, bzip2 y xz
- which tar > /dev/null 2>&1
- if [ $? -ne 0 ];then
- result=$(yum -y install tar 2>&1)
- comprobarError $? 811 $result
- fi
- which gzip > /dev/null 2>&1
- if [ $? -ne 0 ];then
- result=$(yum -y install gzip 2>&1)
- comprobarError $? 812 $result
- fi
- which bzip2 > /dev/null 2>&1
- if [ $? -ne 0 ];then
- result=$(yum -y install bzip2 2>&1)
- comprobarError $? 813 $result
- fi
- which xz > /dev/null 2>&1
- if [ $? -ne 0 ];then
- result=$(yum -y install xz 2>&1)
- comprobarError $? 814 $result
- fi
- # Comprobamos openssl
- which openssl > /dev/null 2>&1
- if [ $? -ne 0 ];then
- result=$(yum -y install openssl 2>&1)
- comprobarError $? 815 $result
- fi
- ;;
- esac
- }
- inicializarVariables() {
- # Inicializa las variables que necesitan de un estado previo
- apacheOn=false
- nginxOn=false
- mySQLOn=false
- mariaDBOn=false
- phpOn=false
- sslOn=false
- letsEncryptOn=false
- mediaWikiOn=false
- moodleOn=false
- infoPHPOn=false
- backupOn=false
- hostname=""
- logFile="./."$(basename $0)".log"
- maxUpload="100M"
- webServerName=""
- webServerUser=""
- webServerGroup=""
- sqlServerName=""
- dbType=""
- phpFPMName=""
- nombreMediaWiki=""
- dominioMediaWiki=""
- passwdMediaWiki=""
- nombreMoodle=""
- nombreCortoMoodle=""
- dominioMoodle=""
- passwdMoodle=""
- }
- instalacionExpress() {
- # Permite una instalación rápida, haciendo el menor número de preguntas
- # Defecto: Nginx + MariaDB + PHP + Let's Encrypt + MediaWiki + Moodle + Backup
- nginxOn=true
- case $ID in
- debian)
- mySQLOn=true
- dbType="mariadb"
- ;;
- ubuntu|centos|fedora)
- mariaDBOn=true
- dbType="mariadb"
- ;;
- esac
- phpOn=true
- sslOn=true
- letsEncryptOn=true
- mediaWikiOn=true
- moodleOn=true
- backupOn=true
- }
- mostrarBienvenida() {
- # Pantalla de bienvenida y muestra SO y estado de los discos
- ANCHO=$(tput cols)
- ALTO=$(tput lines)
- whiptail --title "INSTALACION AUTO-ELEARNING" --yesno "Este script automatiza completamente la instalación de una WIKI y un CAMPUS VIRTUAL.\nPara ello instala un servidor LAMP o LEMP, MediaWiki, Moodle y configura todo lo necesario.\n\nInformación del sistema:\nOS: $OS $DIST $REV\n$HDInfo" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --yes-button "Continuar" --no-button "Salir"
- comprobarError $? 1
- }
- mostrarExpress() {
- # Pantalla de elección entre instalación express o avanzada
- express=$(whiptail --title "INSTALACION EXPRESS" --radiolist "<ESPACIO>: seleccionar <TAB>: cambiar <FLECHAS>: moverse\n\nLa instalación express instala Nginx, MariaDB, PHP-7, Let's Encrypt, MediaWiki, Moodle y backups automáticos.\nSeleccione el tipo de instalación que desee:" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) 2 \
- "Express" "Instalación rápida" ON \
- "Avanzada" "Permite escoger todas las opciones disponibles" OFF \
- --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
- comprobarError $? 1
- case $express in
- Express)
- instalacionExpress
- # Preguntas mínimas
- establecerFQDN
- leerSQLPasswd
- mostrarMediaWiki
- mostrarMoodle
- mostrarConfirmacion
- ;;
- Avanzada)
- mostrarAvanzada
- ;;
- *)
- comprobarError 1 2
- ;;
- esac
- unset express
- }
- mostrarAvanzada() {
- # Pantalla que permite instalar un servidor LAMP o LEMP
- webServer=$(whiptail --title "INSTALACION AVANZADA" --radiolist "<ESPACIO>: seleccionar <TAB>: cambiar <FLECHAS>: moverse\n\nEscoge el tipo de SERVIDOR WEB a instalar:" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) 2 \
- "LEMP" "GNU/Linux + (E)Nginx + MySQL/MariaDB + PHP-7" ON \
- "LAMP" "GNU/Linux + Apache + MySQL/MariaDB + PHP-7" OFF \
- --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
- comprobarError $? 1
- for i in $webServer; do
- case $i in
- LEMP)
- nginxOn=true
- ;;
- LAMP)
- apacheOn=true
- ;;
- *)
- comprobarError 1 100
- ;;
- esac
- done
- # Opciones comunes
- establecerFQDN
- mostrarDatabase
- phpOn=true
- establecerMaxUpload
- mostrarComponentes
- mostrarConfirmacion
- unset webServer
- }
- leerSQLPasswd() {
- # Pantalla para leer la contraseña para el usuario root de SQL
- control=false
- error=""
- # Leemos la contreseña (stdin) y confirmamos
- while [ $control = false ]; do
- sqlPasswd=$(whiptail --title "CONTRASEÑA SQL" --passwordbox "$error""Introduzca la CONTRASEÑA para el usuario 'root' de la base de datos:" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --ok-button "Continuar" --nocancel 3>&1 1>&2 2>&3)
- comprobarError $? 1
- sqlPasswd2=$(whiptail --title "CONTRASEÑA SQL" --passwordbox "Confirme la CONTRASEÑA:" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --ok-button "Continuar" --nocancel 3>&1 1>&2 2>&3)
- comprobarError $? 1
- if [ -z "$sqlPasswd" ] || [ -z "$sqlPasswd2" ]; then
- error="ERROR: LA CONTRASEÑA NO PUEDE ESTAR VACIA.\n"
- elif [ $sqlPasswd != $sqlPasswd2 ];then
- error="ERROR: LAS CONTRASEÑAS NO COINCIDEN.\n"
- else
- control=true
- fi
- done
- unset control error sqlPasswd2
- }
- establecerFQDN() {
- # Configura el FQDN (dominio principal del servidor)
- while [ -z "$hostname" ]; do
- hostname=$(whiptail --title "FQDN" --inputbox "El nombre de DOMINIO PRINCIPAL (FQDN) de este servidor es:\n"$(hostname)"\n\n¿Quieres cambiarlo por otro?" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --ok-button "Cambiar" --cancel-button "No Cambiar" 3>&1 1>&2 2>&3)
- if [ $? -eq 0 ] && [ ! -z "$hostname" ]; then
- hostnamectl set-hostname $hostname
- else
- hostname=$(hostname)
- fi
- done
- echo -en "Hostname: $hostname\n" >> $logFile
- }
- mostrarDatabase() {
- # Pantalla que permite escoger entre instalar MariaDB o MySQL
- case $ID in
- debian)
- whiptail --title "BASE DE DATOS" --yesno "Para su distribucion $OS $DIST $REV, sólo está disponible la base de datos MariaDB." $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --yes-button "Continuar" --no-button "Salir"
- comprobarError $? 1
- # Excepción: aunque es MariaDB (se instala con el nombre de mysql-server)
- mySQLOn=true
- dbType="mariadb"
- ;;
- ubuntu)
- case $VERSION in
- 18.04)
- database=$(whiptail --title "BASE DE DATOS" --radiolist "<ESPACIO>: seleccionar <TAB>: cambiar <FLECHAS>: moverse\n\nEscoge la BASE DE DATOS que quieres usar:" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) 2 \
- "MariaDB" "Instalar la base de datos MariaDB (fork de MySQL)" ON \
- "MySQL" "Instalar la base de datos MySQL (uso no comercial)" OFF \
- --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
- comprobarError $? 1
- case $database in
- MariaDB)
- mariaDBOn=true
- dbType="mariadb"
- ;;
- MySQL)
- mySQLOn=true
- dbType="mysqli"
- ;;
- *)
- comprobarError 1 200
- ;;
- esac
- ;;
- 16.04)
- # Ubuntu 16.04 presenta un bug en MySQL (así que lo deshabilitamos)
- whiptail --title "BASE DE DATOS" --yesno "Para su distribucion $OS $DIST $REV, sólo está disponible la base de datos MariaDB." $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --yes-button "Continuar" --no-button "Salir"
- comprobarError $? 1
- mariaDBOn=true
- dbType="mariadb"
- ;;
- esac
- ;;
- centos|fedora)
- whiptail --title "BASE DE DATOS" --yesno "Para su distribucion $OS $DIST $REV, sólo está disponible la base de datos MariaDB." $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --yes-button "Continuar" --no-button "Salir"
- comprobarError $? 1
- mariaDBOn=true
- dbType="mariadb"
- ;;
- *)
- comprobarError 1 200
- ;;
- esac
- # Otras opciones (contraseña)
- leerSQLPasswd
- }
- establecerMaxUpload() {
- # Pantalla para establecer el máximo de subida al servidor (vía PHP)
- control=false
- error=""
- while [ $control = false ];do
- maxUpload2=$(whiptail --title "PHP MAX UPLOAD" --inputbox "$error""Introduzca el TAMAÑO MAXIMO permitido de los ficheros subidos al servidor:\n(<K:Kilobyte> <M:Megabyte> <G:Gigabyte>)" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) $maxUpload --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
- comprobarError $? 1
- if [ -z "$maxUpload2" ];then
- error="ERROR: NO PUEDES DEJAR ESTE PARÁMETRO VACIO.\n"
- else
- control=true
- fi
- done
- maxUpload=$maxUpload2
- unset control maxUpload2
- }
- mostrarComponentes() {
- # Pantalla de elección de componentes (SSL/TLS, MediaWiki, Moodle, InfoPHP y Backup)
- componentes=$(whiptail --title "INSTALACION AVANZADA" --checklist "<ESPACIO>: seleccionar <TAB>: cambiar <FLECHAS>: moverse\n\nEscoja los componentes a instalar:" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) 5 \
- "SSL/TLS" "Instalar certificados para activar HTTPS" ON \
- "MediaWiki" "Instalar wiki con MediaWiki" ON \
- "Moodle" "Instalar campus virtual con Moodle" ON \
- "InfoPHP" "Instalar info.php (sólo para pruebas)" OFF \
- "Backup" "Programar backups automáticos" ON \
- --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
- comprobarError $? 1
- for i in $componentes; do
- case $i in
- \"SSL/TLS\")
- # 2 Opciones: Let's Encrypt o Autofirmado
- mostrarSSL
- ;;
- \"MediaWiki\")
- mediaWikiOn=true
- mostrarMediaWiki
- ;;
- \"Moodle\")
- moodleOn=true
- mostrarMoodle
- ;;
- \"InfoPHP\")
- infoPHPOn=true
- ;;
- \"Backup\")
- backupOn=true
- ;;
- *)
- comprobarError 1 3
- ;;
- esac
- done
- unset componentes
- }
- mostrarSSL() {
- # Pantalla que permite seleccionar el tipo de certificados
- ssl=$(whiptail --title "INSTALACION SSL/TLS" --radiolist "<ESPACIO>: seleccionar <TAB>: cambiar <FLECHAS>: moverse\n\nEscoja el tipo de Certificado SSL/TLS a instalar:" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) 2 \
- "LetsEncrypt" "Compatible con todos los navegadores" ON \
- "Auto-Firmado" "Certificados auto-firmados (sólo para pruebas)" OFF \
- --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
- comprobarError $? 1
- for i in $ssl; do
- case $i in
- LetsEncrypt)
- sslOn=true
- letsEncryptOn=true
- ;;
- Auto-Firmado)
- sslOn=true
- ;;
- *)
- comprobarError 1 6
- ;;
- esac
- done
- unset ssl
- }
- mostrarMediaWiki(){
- # Pantalla que pregunta sobre las opciones necesarias para configurar MediaWiki
- # Introducir nombre wiki
- while [ -z "$nombreMediaWiki" ]; do
- nombreMediaWiki=$(whiptail --title "CONFIGURACION MEDIAWIKI" --inputbox "Introduzca el NOMBRE de la Wiki:" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
- comprobarError $? 1
- done
- # Introducir dominio
- while [ -z "$dominioMediaWiki" ]; do
- dominioMediaWiki=$(whiptail --title "CONFIGURACION MEDIAWIKI" --inputbox "Introduzca el DONIMIO/SUBDOMINIO de la Wiki.\nTenga en cuenta que el dominio debe de apuntar a la dirección IP de la máquina mediante un registro DNS.\nSi quiere introducir varios dominios sepárelos con espacios.\nEl primero será el principal.\nPor ejemplo: 'www.$hostname $hostname wiki.$hostname'" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) wiki.$hostname --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
- comprobarError $? 1
- done
- 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
- # Introducir contraseña
- control=false
- error=""
- while [ $control = false ]; do
- passwdMediaWiki=$(whiptail --title "CONFIGURACION MEDIAWIKI" --passwordbox "$error""Introduzca la CONTRASEÑA para el usuario administrador 'admin':" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --ok-button "Continuar" --nocancel 3>&1 1>&2 2>&3)
- comprobarError $? 1
- passwdMediaWiki2=$(whiptail --title "CONFIGURACION MEDIAWIKI" --passwordbox "Confirme la CONTRASEÑA:" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --ok-button "Continuar" --nocancel 3>&1 1>&2 2>&3)
- comprobarError $? 1
- if [ -z "$passwdMediaWiki" ] || [ -z "$passwdMediaWiki2" ]; then
- error="ERROR: LA CONTRASEÑA NO PUEDE ESTAR VACIA.\n"
- elif [ $passwdMediaWiki != $passwdMediaWiki2 ];then
- error="ERROR: LAS CONTRASEÑAS NO COINCIDEN.\n"
- else
- control=true
- fi
- done
- unset control error passwdMediaWiki2 dominio cont serverName
- }
- mostrarMoodle() {
- # Pantalla que pregunta sobre las opciones necesarias para configurar Moodle
- # Introducir Nombre Moodle
- while [ -z "$nombreMoodle" ]; do
- nombreMoodle=$(whiptail --title "CONFIGURACION MOODLE" --inputbox "Introduzca el NOMBRE COMPLETO del campus virtual.\nPor ejemplo: 'Campus Virtual Ejemplo'." $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
- comprobarError $? 1
- done
- # Introducir Nombre Corto Moodle
- while [ -z "$nombreCortoMoodle" ]; do
- nombreCortoMoodle=$(whiptail --title "CONFIGURACION MOODLE" --inputbox "Introduzca el NOMBRE CORTO del campus virtual.\nPor ejemplo: 'Ejemplo'." $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
- comprobarError $? 1
- done
- nombreCortoMoodle=$(echo $nombreCortoMoodle | cut -d ' ' -f 1)
- # Introducir dominio
- while [ -z "$dominioMoodle" ]; do
- dominioMoodle=$(whiptail --title "CONFIGURACION MOODLE" --inputbox "Introduzca el DOMINIO/SUBDOMINIO del campus virtual.\nTenga en cuenta que el dominio debe de apuntar a la dirección IP de la máquina mediante un registro DNS.\nMoodle SÓLO permite un ÚNICO DOMINIO." $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) moodle.$hostname --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
- comprobarError $? 1
- done
- 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
- # Introducir contraseña
- control=false
- error=""
- while [ $control = false ]; do
- passwdMoodle=$(whiptail --title "CONFIGURACION MOODLE" --passwordbox "$error""Introduzca la CONTRASEÑA para el usuario administrador 'admin':" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --ok-button "Continuar" --nocancel 3>&1 1>&2 2>&3)
- comprobarError $? 1
- passwdMoodle2=$(whiptail --title "CONFIGURACION MOODLE" --passwordbox "Confirme la CONTRASEÑA:" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --ok-button "Continuar" --nocancel 3>&1 1>&2 2>&3)
- comprobarError $? 1
- if [ -z "$passwdMoodle" ] || [ -z "$passwdMoodle2" ]; then
- error="ERROR: LA CONTRASEÑA NO PUEDE ESTAR VACIA.\n"
- elif [ $passwdMoodle != $passwdMoodle2 ];then
- error="ERROR: LAS CONTRASEÑAS NO COINCIDEN.\n"
- else
- control=true
- fi
- done
- unset control error passwdMoodle2 dominio cont serverName aliasMoodle
- }
- mostrarConfirmacion() {
- # Pantalla que presenta una confirmación antes de realizar la instalación
- whiptail --title "INSTALACION" --yesno "ESTA TODO LISTO PARA LA INSTALACION.\nNO SE OLVIDE DE GUARDAR LAS CONFIGURACIONES EN UN LUGAR SEGURO, YA QUE SERÁN IMPORTANTES POR SI DESEA REALIZAR ALGÚN CAMBIO EN EL FUTURO.\n¿DESEA CONTINUAR?" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --yes-button "Instalar" --no-button "Salir"
- comprobarError $? 1
- }
- instalarApache() {
- # Instala Apache2
- case $ID in
- debian|ubuntu)
- webServerName="apache2"
- result=$(apt-get -q -y install apache2 2>&1)
- comprobarError $? 101 $result
- ;;
- centos|fedora)
- webServerName="httpd"
- result=$(yum -y install httpd 2>&1)
- comprobarError $? 101 $result
- if [ $sslOn = true ];then
- # Instalamos módulo mod_ssl (no se instala por defecto)
- result=$(yum -y install mod_ssl 2>&1)
- comprobarError $? 101 $result
- fi
- ;;
- *)
- comprobarError 1 104
- ;;
- esac
- deshabilitarServicio $webServerName
- }
- configurarApache() {
- # Configura Apache2
- case $ID in
- debian|ubuntu)
- apacheConfFile="./etc/apache2/apache2.conf"
- if [ ! -f $apacheConfFile ];then
- comprobarError 1 4 $apacheConfFile
- fi
- cp -f $apacheConfFile /etc/$webServerName/apache2.conf 2>/dev/null
- comprobarError $? 108
- webServerUser=$(grep ^User /etc/$webServerName/apache2.conf | cut -d ' ' -f 2)
- webServerGroup=$(grep ^Group /etc/$webServerName/apache2.conf | cut -d ' ' -f 2)
- if [ ! -L /etc/$webServerName/logs ];then
- ln -s /var/log/apache2 /etc/$webServerName/logs 2>/dev/null
- comprobarError $? 108
- fi
- # Activamos mod_rewrite (no viene activado por defecto)
- a2enmod rewrite >/dev/null 2>&1
- comprobarError $? 108
- # Activamos mod_ssl y mod_headers (no viene activado por defecto)
- if [ $sslOn = true ];then
- a2enmod ssl >/dev/null 2>&1
- comprobarError $? 108
- a2enmod headers >/dev/null 2>&1
- comprobarError $? 108
- fi
- unset apacheConfFile
- ;;
- centos|fedora)
- apacheConfFile="./etc/apache2/conf/httpd.conf"
- sslConfFile="./etc/apache2/conf.d/ssl.conf"
- welcomeConfFile="/etc/apache2/conf.d/welcome.conf"
- if [ ! -f $apacheConfFile ];then
- comprobarError 1 4 $apacheConfFile
- fi
- cp -f $apacheConfFile /etc/$webServerName/conf/httpd.conf 2>/dev/null
- comprobarError $? 108
- # Desactivamos Mensaje de Bienvenida
- if [ -f $welcomeConfFile ];then
- sed -i -e 's/^/#/' $welcomeConfFile
- comprobarError $? 108
- fi
- # Configuramos mod_ssl
- if [ $sslOn = true ];then
- if [ ! -f $sslConfFile ];then
- comprobarError 1 4 $sslConfFile
- fi
- cp -f $sslConfFile /etc/$webServerName/conf.d/ssl.conf 2>/dev/null
- comprobarError $? 108
- fi
- webServerUser=$(grep ^User /etc/$webServerName/conf/httpd.conf | cut -d ' ' -f 2)
- webServerGroup=$(grep ^Group /etc/$webServerName/conf/httpd.conf | cut -d ' ' -f 2)
- unset apacheConfFile sslConfFile welcomeConfFile
- ;;
- *)
- comprobarError 1 108
- ;;
- esac
- # Creamos directorios sites-available y sites-enabled
- if [ ! -d "/etc/$webServerName/sites-available" ];then
- mkdir "/etc/$webServerName/sites-available" 2>/dev/null
- comprobarError $? 5 "/etc/$webServerName/sites-available"
- fi
- if [ ! -d "/etc/$webServerName/sites-enabled" ]; then
- mkdir "/etc/$webServerName/sites-enabled" 2>/dev/null
- comprobarError $? 5 "/etc/$webServerName/sites-enabled"
- else
- # Eliminar Virtual Host por defecto
- if [ -f /etc/$webServerName/sites-enabled/000-default.conf ];then
- rm -f /etc/$webServerName/sites-enabled/000-default.conf 2>/dev/null
- fi
- fi
- }
- instalarNginx() {
- # Instala Nginx
- webServerName="nginx"
- case $ID in
- ubuntu|debian)
- result=$(apt-get -q -y install nginx 2>&1)
- comprobarError $? 102 $result
- ;;
- centos)
- # CentOS requiere un repositorio extra ('epel-release')
- result=$(yum -y install epel-release)
- comprobarError $? 103 $result
- result=$(yum -y install nginx 2>&1)
- comprobarError $? 102 $result
- ;;
- fedora)
- result=$(yum -y install nginx 2>&1)
- comprobarError $? 102 $result
- ;;
- *)
- comprobarError 1 105
- ;;
- esac
- deshabilitarServicio $webServerName
- }
- configurarNginx() {
- # Configura Nginx
- rm -Rf "/etc/$webServerName/!(sites-available|sites-enabled)" 2>/dev/null
- comprobarError $? 107
- nginxConfFile="./etc/$webServerName"
- if [ -d "$nginxConfFile" ];then
- cp -Rf $nginxConfFile/* /etc/$webServerName/ 2>/dev/null
- comprobarError $? 107
- else
- comprobarError 1 5 "$nginxConfFile"
- fi
- # Creamos directorios sites-available y sites-enabled
- if [ ! -d "/etc/$webServerName/sites-available" ];then
- mkdir "/etc/$webServerName/sites-available" 2>/dev/null
- comprobarError $? 5 "/etc/$webServerName/sites-available"
- fi
- if [ ! -d "/etc/$webServerName/sites-enabled" ]; then
- mkdir "/etc/$webServerName/sites-enabled" 2>/dev/null
- comprobarError $? 5 "/etc/$webServerName/sites-enabled"
- else
- # Eliminar Virtual Host por defecto
- if [ -f /etc/$webServerName/sites-enabled/default ];then
- rm -f /etc/$webServerName/sites-enabled/default 2>/dev/null
- fi
- fi
- # Configuramos Usuario y Grupo
- case $ID in
- debian|ubuntu)
- webServerUser="www-data"
- webServerGroup=$webServerUser
- ;;
- centos|fedora)
- webServerUser="nginx"
- webServerGroup=$webServerUser
- ;;
- esac
- sed -i '/user /c\user '$webServerUser';' /etc/$webServerName/nginx.conf
- comprobarError $? 107
- sed -i '/client_max_body_size /c\client_max_body_size '"$maxUpload"';' /etc/$webServerName/nginx.conf
- comprobarError $? 107
- unset nginxConfFile
- }
- instalarVirtualHost() {
- # Configuramos un Virtual Host para Apache o Nginx
- # Uso: instalarVirtualHost $root $virtualHost $dominio $alias
- if [ $# -ge 3 ];then
- rootVirtualHost=$(realpath $1)
- shift
- virtualHostFile=$(realpath $1)
- shift
- dominioVirtualHost=$1
- virtualHostName=$dominioVirtualHost".conf"
- shift
- aliasVirtualHost=$@
- else
- comprobarError 1 908
- fi
- if [ ! -f $virtualHostFile ];then
- comprobarError 1 909 $virtualHostName
- fi
- if [ $apacheOn = true ];then
- # Configuramos root, dominio y logs
- sed -i '/ServerName /c\\tServerName '"$dominioVirtualHost" $virtualHostFile
- comprobarError $? 908
- if [ ! -z "$aliasVirtualHost" ];then
- sed -i '/ServerName /a\\tServerAlias '"$aliasVirtualHost" $virtualHostFile
- comprobarError $? 908
- fi
- sed -i '/DocumentRoot /c\\tDocumentRoot '"$rootVirtualHost" $virtualHostFile
- comprobarError $? 908
- sed -i '/ErrorLog /c\\tErrorLog logs/'"$dominioVirtualHost"'-error.log' $virtualHostFile
- comprobarError $? 908
- sed -i '/CustomLog /c\\tCustomLog logs/'"$dominioVirtualHost"'-access.log common' $virtualHostFile
- comprobarError $? 908
- if [ $sslOn = true ];then
- sed -i '/SSLCertificateFile /c\\tSSLCertificateFile ssl/'"$dominioVirtualHost"'.crt' $virtualHostFile
- comprobarError $? 908
- sed -i '/SSLCertificateKeyFile /c\\tSSLCertificateKeyFile ssl/'"$dominioVirtualHost"'.key' $virtualHostFile
- comprobarError $? 908
- fi
- elif [ $nginxOn = true ];then
- # Configuramos root, dominio, logs y php-fpm.sock
- sed -i '/root /c\\troot '$rootVirtualHost';' "$virtualHostFile"
- comprobarError $? 908
- sed -i '/server_name /c\\tserver_name '"$dominioVirtualHost"' '"$aliasVirtualHost"';' $virtualHostFile
- comprobarError $? 908
- sed -i '/access_log /c\\taccess_log /var/log/nginx/'"$dominioVirtualHost"'-access.log;' $virtualHostFile
- comprobarError $? 908
- sed -i '/error_log /c\\terror_log /var/log/nginx/'"$dominioVirtualHost"'-error.log;' $virtualHostFile
- comprobarError $? 908
- socket=$(find /var/run/ -type s -name 'php*.sock')
- sed -i '/fastcgi_pass /c\\t\tfastcgi_pass unix:'"$socket"';' $virtualHostFile
- comprobarError $? 908
- if [ $sslOn = true ];then
- sed -i '/ssl_certificate /c\\tssl_certificate ssl/'"$dominioVirtualHost"'.crt;' $virtualHostFile
- comprobarError $? 908
- sed -i '/ssl_certificate_key /c\\tssl_certificate_key ssl/'"$dominioVirtualHost"'.key;' $virtualHostFile
- comprobarError $? 908
- fi
- fi
- # Copiamos Virtual Host
- cp -f $virtualHostFile "/etc/$webServerName/sites-available/$virtualHostName" >> $logFile 2>&1
- comprobarError $? 910
- if [ -f "/etc/$webServerName/sites-enabled/$virtualHostName" ];then
- rm -f /etc/$webServerName/sites-enabled/$virtualHostName 2>/dev/null
- comprobarError 911 $virtualHostName
- fi
- # Habilitamos Virtual Host
- ln -s "/etc/$webServerName/sites-available/$virtualHostName" "/etc/$webServerName/sites-enabled/$virtualHostName" >> $logFile 2>&1
- comprobarError $? 911 $virtualHostName
- # Recargamos servicio
- recargarServicio $webServerName
- unset rootVirtualHost dominioVirtualHost virtualHostFile virtualHostName aliasVirtualHost socket
- }
- establecerSQLPasswd() {
- # Establecemos SQL root passwd y securizamos BD (mysql_secure_installation)
- # Comprobamos si ya tiene una contraseña asignada
- mysql -e "FLUSH PRIVILEGES" >> $logFile 2>&1
- if [ $? -eq 0 ];then
- # Establecemos contraseña del usuario root (y desactivamos posibles plugins para forzar login por contraseña)
- mysql -e "UPDATE mysql.user SET plugin = '', Password = PASSWORD('$sqlPasswd') WHERE User = 'root'" >> $logFile 2>&1
- if [ $? -ne 0 ];then
- # Lo intentamos de otra forma (para versiones modernas de mysql)
- mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '$sqlPasswd'" >> $logFile 2>&1
- comprobarError $? 207
- fi
- # Aplicamos el cambio de contraseña
- mysql -e "FLUSH PRIVILEGES" >> $logFile 2>&1
- # Desactivamos acceso root desde el exterior (solo localhost)
- mysql -u root --password=$sqlPasswd -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1')" >> $logFile 2>&1
- comprobarError $? 208
- # Eliminamos todos los usuarios anónimos
- mysql -u root --password=$sqlPasswd -e "DELETE FROM mysql.user WHERE User=''" >> $logFile 2>&1
- comprobarError $? 209
- # Eliminamos bases de datos 'test'
- mysql -u root --password=$sqlPasswd -e "DROP DATABASE IF EXISTS test" >> $logFile 2>&1
- comprobarError $? 210
- # Eliminamos privilegios de la base de datos 'test'
- mysql -u root --password=$sqlPasswd -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'" >> $logFile 2>&1
- comprobarError $? 211
- # Aplicamos los cambios
- mysql -u root --password=$sqlPasswd -e "FLUSH PRIVILEGES" >> $logFile 2>&1
- comprobarError $? 212
- else
- comprobarError 1 206
- fi
- }
- instalarMySQL() {
- # Instala MySQL (sólo para Debian)
- sqlServerName="mysql"
- case $ID in
- debian|ubuntu)
- result=$(apt-get -q -y install mysql-server mysql-client 2>&1)
- comprobarError $? 201 $result
- ;;
- centos|fedora)
- # MySQL no disponible en RHEL.
- # No se instalará MySQL en distribuciones RHEL
- comprobarError 1 205
- ;;
- *)
- comprobarError 1 203
- ;;
- esac
- deshabilitarServicio $sqlServerName
- }
- instalarMariaDB() {
- # Instala MariaDB
- sqlServerName="mariadb"
- case $ID in
- debian)
- result=$(apt-get -q -y install mariadb-server mariadb-client 2>&1)
- comprobarError $? 202 $result
- ;;
- ubuntu)
- case $VERSION in
- 16.04)
- sqlServerName="mysql"
- ;;
- esac
- result=$(apt-get -q -y install mariadb-server mariadb-client 2>&1)
- comprobarError $? 202 $result
- ;;
- centos|fedora)
- result=$(yum -y install mariadb-server mariadb 2>&1)
- comprobarError $? 202 $result
- ;;
- *)
- comprobarError 1 204
- ;;
- esac
- deshabilitarServicio $sqlServerName
- }
- configurarSQL() {
- # Configura BarracudaFS en mysql (necesario para Moodle)
- # Configura MariaDB o MySQL
- case $ID in
- debian|ubuntu)
- sqlConfFile="/etc/mysql/my.cnf"
- ;;
- centos|fedora)
- sqlConfFile="/etc/my.cnf"
- ;;
- *)
- comprobarError 1 213
- ;;
- esac
- if [ ! -f $sqlConfFile ];then
- comprobarError 1 213
- fi
- grep "# Configuration for Moodle" $sqlConfFile >/dev/null 2>&1
- if [ $? -ne 0 ];then
- # Establecemos UTF8 (codificación de caracteres) y Barracuda (sistema de ficheros)
- echo -en "\n# Configuration for Moodle\n" >> $sqlConfFile
- echo -en "[client]\n" >> $sqlConfFile
- echo -en "default-character-set = utf8mb4\n\n" >> $sqlConfFile
- echo -en "[mysqld]\n" >> $sqlConfFile
- echo -en "innodb_file_format = Barracuda\n" >> $sqlConfFile
- echo -en "innodb_file_per_table = 1\n" >> $sqlConfFile
- echo -en "innodb_large_prefix\n\n" >> $sqlConfFile
- echo -en "character-set-server = utf8mb4\n" >> $sqlConfFile
- echo -en "collation-server = utf8mb4_unicode_ci\n" >> $sqlConfFile
- echo -en "skip-character-set-client-handshake\n\n" >> $sqlConfFile
- echo -en "[mysql]\n" >> $sqlConfFile
- echo -en "default-character-set = utf8mb4\n" >> $sqlConfFile
- else
- comprobarError 1 214
- fi
- unset sqlConfFile
- }
- instalarPHP() {
- # Instalamos PHP-7 y los módulos PHP que necesitan MediaWiki y Moodle
- case $ID in
- debian)
- phpFPMName="php7.0-fpm"
- if [ $apacheOn = true ]; then
- result=$(apt-get -q -y install php libapache2-mod-php php-mysql php-intl php-mbstring php-xml php-apcu php-gd php-curl php-zip php-soap php-xmlrpc 2>&1)
- comprobarError $? 302 $result
- elif [ $nginxOn = true ];then
- result=$(apt-get -q -y install php-fpm php-mysql php-intl php-mbstring php-xml php-apcu php-gd php-curl php-zip php-soap php-xmlrpc 2>&1)
- comprobarError $? 302 $result
- deshabilitarServicio $phpFPMName
- else
- comprobarError 1 301
- fi
- ;;
- ubuntu)
- case $VERSION in
- 18.04)
- phpFPMName="php7.2-fpm"
- ;;
- 16.04)
- phpFPMName="php7.0-fpm"
- ;;
- esac
- if [ $apacheOn = true ]; then
- result=$(apt-get -q -y install php libapache2-mod-php php-mysql php-intl php-mbstring php-xml php-apcu php-gd php-curl php-zip php-soap php-xmlrpc 2>&1)
- comprobarError $? 302 $result
- elif [ $nginxOn = true ];then
- result=$(apt-get -q -y install php-fpm php-mysql php-intl php-mbstring php-xml php-apcu php-gd php-curl php-zip php-soap php-xmlrpc 2>&1)
- comprobarError $? 302 $result
- deshabilitarServicio $phpFPMName
- else
- comprobarError 1 301
- fi
- ;;
- centos)
- phpFPMName="php-fpm"
- # Necesitamos un repositorio adicional para PHP-7 (EPEL-RELEASE) sólo en CentOS
- result=$(yum -y install epel-release yum-utils 2>&1)
- comprobarError $? 103 $result
- # Necesitamos un repositorio adicional para PHP-7 (REMI-RELEASE)
- if [ ! -f /etc/yum.repos.d/remi-php72.repo ];then
- result=$(yum -y install "http://remi.mirrors.cu.be/enterprise/remi-release-7.rpm" 2>&1)
- comprobarError $? 303 $result
- fi
- # Activamos repositorio remi-php72
- result=$(yum-config-manager --enable remi-php72 2>&1)
- comprobarError $? 303 $result
- # Instalamos PHP-7.2
- if [ $apacheOn = true ];then
- result=$(yum -y install php php-mysql php-intl php-mbstring php-mcrypt php-xml php-pecl-apcu php-gd php-pear-Net-Curl php-pecl-zip php-soap php-xmlrpc 2>&1)
- comprobarError $? 302 $result
- elif [ $nginxOn = true ];then
- result=$(yum -y install php php-fpm php-mysql php-intl php-mbstring php-mcrypt php-xml php-pecl-apcu php-gd php-pear-Net-Curl php-pecl-zip php-soap php-xmlrpc 2>&1)
- comprobarError $? 302 $result
- deshabilitarServicio $phpFPMName
- else
- comprobarError 1 301
- fi
- ;;
- fedora)
- phpFPMName="php-fpm"
- # Instalamos PHP-7.2
- if [ $apacheOn = true ];then
- result=$(yum -y install php php-mysqlnd php-intl php-mbstring php-pecl-mcrypt php-xml php-pecl-apcu php-gd php-pear-Net-Curl php-pecl-zip php-soap php-xmlrpc php-json 2>&1)
- comprobarError $? 302 $result
- elif [ $nginxOn = true ];then
- result=$(yum -y install php php-fpm php-mysqlnd php-intl php-mbstring php-pecl-mcrypt php-xml php-pecl-apcu php-gd php-pear-Net-Curl php-pecl-zip php-soap php-xmlrpc php-json 2>&1)
- comprobarError $? 302 $result
- deshabilitarServicio $phpFPMName
- else
- comprobarError 1 301
- fi
- ;;
- *)
- comprobarError 1 300
- ;;
- esac
- }
- configurarPHP() {
- # Configura PHP para segurizarlo y establecer máximo de subida.
- case $ID in
- debian)
- phpConfFile="./etc/php/php.ini.debian"
- phpDest="/etc/php/7.0/cli/php.ini"
- ;;
- ubuntu)
- phpConfFile="./etc/php/php.ini.debian"
- case $VERSION in
- 18.04)
- phpDest="/etc/php/7.2/cli/php.ini"
- ;;
- 16.04)
- phpDest="/etc/php/7.0/cli/php.ini"
- ;;
- esac
- ;;
- centos|fedora)
- phpConfFile="./etc/php/php.ini.rhel"
- phpDest="/etc/php.ini"
- ;;
- *)
- comprobarError 1 305
- ;;
- esac
- if [ ! -f $phpConfFile ];then
- comprobarError 1 4 "$phpConfFile"
- fi
- # Copiamos configuración
- cp -f $phpConfFile $phpDest 2>/dev/null
- comprobarError $? 305
- # Configuramos cgi.fix_pathinfo
- sed -i '/cgi.fix_pathinfo=/c\cgi.fix_pathinfo=0' $phpDest
- comprobarError $? 305
- # Configuramos post_max_size
- sed -i '/post_max_size =/c\post_max_size = '$maxUpload $phpDest
- comprobarError $? 305
- # Configuramos upload_max_filesize
- sed -i '/upload_max_filesize =/c\upload_max_filesize = '$maxUpload $phpDest
- comprobarError $? 305
- # Configurar php-fpm (sólo en RHEL con Nginx)
- case $ID in
- centos|fedora)
- if [ $nginxOn = true ];then
- # Configurar Socket UNIX
- phpConfFile="./etc/php/php-fpm.d/www.conf"
- phpDest="/etc/php-fpm.d/www.conf"
- if [ ! -f $phpConfFile ];then
- comprobarError $? 4 "$phpConfFile"
- fi
- cp -f $phpConfFile $phpDest 2>/dev/null
- comprobarError $? 305
- # Configurar Permisos /var/lib/php
- chown -R $webServerUser:$webServerGroup /var/lib/php/
- comprobarError $? 305
- fi
- ;;
- esac
-
- unset phpConfFile phpDest
- }
- instalarLetsEncrypt() {
- # Instala certbot (para certificados Let's Encrypt)
- # Comprobamos si cerbot está instalado
- which certbot > /dev/null 2>&1
- if [ $? -ne 0 ];then
- # Descargar Let's Encrypt, hacer ejecutable e instalar
- curl -o ./var/certbot https://dl.eff.org/certbot-auto 2>/dev/null
- comprobarError $? 401
- chmod 755 ./var/certbot 2>/dev/null
- comprobarError $? 401
- cp -f ./var/certbot /usr/bin/certbot 2>/dev/null
- comprobarError $? 401
- # Configurar /etc/cron.d/certbot para renovar automáticamente los certificados
- echo -en "# /etc/cron.d/certbot: certbot autorenew the certificates twice a day\n" > /etc/cron.d/certbot
- echo -en "SHELL=/bin/sh\n" >> /etc/cron.d/certbot
- echo -en "PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin\n\n" >> /etc/cron.d/certbot
- echo -en "# Job start twice per day (4am & 2pm) in a random minute\n" >> /etc/cron.d/certbot
- echo -en "0 4,14 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew\n" >> /etc/cron.d/certbot
- fi
- }
- generarCertLetsEncrypt() {
- # Generar Certificados SEGUROS Let's Encrypt
- dominios=""
- if [ $apacheOn = true ];then
- # Usamos plugin para apache
- if [ $mediaWikiOn = true ];then
- if [ ! -z "$aliasMediaWiki" ];then
- dominios=$dominioMediaWiki$(echo "$aliasMediaWiki" | sed -e 's/ /,/g')
- else
- dominios=$dominioMediaWiki
- fi
- certbot -n --agree-tos --email "admin@$hostname" --apache --domains "$dominios" >> $logFile 2>&1
- comprobarError $? 404
- fi
- if [ $moodleOn = true ];then
- certbot -n --agree-tos --email "admin@$hostname" --apache --domains "$dominioMoodle" >> $logFile 2>&1
- comprobarError $? 404
- fi
- elif [ $nginxOn = true ];then
- # Usamos plugin para nginx
- if [ $mediaWikiOn = true ];then
- if [ ! -z "$aliasMediaWiki" ];then
- dominios=$dominioMediaWiki$(echo "$aliasMediaWiki" | sed -e 's/ /,/g')
- else
- dominios=$dominioMediaWiki
- fi
- certbot -n --agree-tos --email "admin@$hostname" --nginx --domains "$dominios" >> $logFile 2>&1
- comprobarError $? 404
- fi
- if [ $moodleOn = true ];then
- certbot -n --agree-tos --email "admin@$hostname" --nginx --domains "$dominioMoodle" >> $logFile 2>&1
- comprobarError $? 404
- fi
- else
- comprobarError 1 404
- fi
- unset dominios
- }
- generarCertAutofirmado() {
- # Genera certificados autofirmados
- # Estos certificados no son seguros, pero valen para pruebas o como paso intermedio para obtener los válidos
- # Uso: generarCertAutofirmado $dominio
- dominio=$1
- sslDir="/etc/$webServerName/ssl"
- keyFile="$sslDir/$dominio.key"
- reqFile="$sslDir/$dominio.csr"
- certFile="$sslDir/$dominio.crt"
- dhParamFile="$sslDir/dhparam.pem"
- if [ ! -d "$sslDir" ];then
- mkdir "$sslDir" 2>/dev/null
- comprobarError $? 5 "$sslDir"
- fi
- # Generamos clave privada RSA de 2048 bits
- openssl genrsa -out "$keyFile" 2048 >/dev/null 2>&1
- comprobarError $? 402
- # Generamos petición de firma
- echo -en "ES\nMadrid\nMadrid\n$dominio\n$dominio\n$dominio\nadmin@$dominio\n\n\n" | openssl req -new -key "$keyFile" -out "$reqFile" >/dev/null 2>&1
- comprobarError $? 402
- # Autofirmados clave para 2 años (730 días)
- openssl x509 -req -days 730 -in "$reqFile" -signkey "$keyFile" -out "$certFile" >/dev/null 2>&1
- comprobarError $? 402
- # Eliminamos petición
- rm -f $reqFile
- comprobarError $? 402
- # Añadimos clave Diffie-Hellman al certificado
- if [ -f "$dhParamFile" ];then
- cat "$dhParamFile" >> $certFile
- comprobarError $? 402
- fi
- # Cambiamos permisos
- chmod 644 $certFile
- comprobarError $? 402
- chmod 400 $keyFile
- comprobarError $? 402
- unset dominio sslDir keyFile reqFile certFile dhParamFile
- }
- generarDHParam() {
- # Genera clave de intercambio Diffie-Hellman y lo configuramos
- # Esto aumenta notablemente la seguridad de SSL/TLS
- sslDir="/etc/$webServerName/ssl"
- dhParamFile="$sslDir/dhparam.pem"
- nginxConfFile="/etc/$webServerName/nginx.conf"
- if [ ! -d "$sslDir" ];then
- mkdir "$sslDir" 2>/dev/null
- comprobarError $? 5 "$sslDir"
- fi
- openssl dhparam -out "$dhParamFile" 2048 >/dev/null 2>&1
- comprobarError $? 403
- # Configuramos Servidor Web
- if [ $nginxOn = true ];then
- sed -i '/ssl_param /c\\tssl_dhparam '$dhParamFile';' $nginxConfFile
- comprobarError $? 403
- fi
- unset sslDir dhParamFile nginxConfFile
- }
- habilitarServicio() {
- # Arrancamos y habilitamos el servicio (con SystemD, Upstart o SystemV)
- # Arrancamos el servicio
- if [ $# -le 0 ];then
- comprobarError 1 900
- fi
- # Intentamos con Systemd
- which systemctl > /dev/null 2>&1
- if [ $? -eq 0 ]; then
- systemctl start $1 > /dev/null 2>&1
- comprobarError $? 901 $1
- systemctl enable $1 > /dev/null 2>&1
- comprobarError $? 902 $1
- else
- # Intentamos con service (Upstart)
- which service > /dev/null 2>&1
- if [ $? -eq 0 ]; then
- service $1 start > /dev/null 2>&1
- comprobarError $? 901 $1
- else
- # Intentamos con init.d (SystemV)
- /etc/init.d/$1 start > /dev/null 2>&1
- comprobarError $? 901 $1
- fi
- # Intentamos habilitar en el arranque (Upstart)
- which update-rc.d > /dev/null 2>&1
- if [ $? -eq 0 ];then
- update-rc.d $1 enable
- comprobarError $? 902 $1
- else
- # Intentamos habilitar en el arranque (SystemV)
- which chkconfig > /dev/null 2>&1
- if [ $? -eq 0 ];then
- chkconfig $1 on
- comprobarError $? 902 $1
- else
- comprobarError 1 902 $1
- fi
- fi
- fi
- }
- deshabilitarServicio() {
- # Paramos y deshabilitamos el servicio (con SystemD, Upstart o SystemV)
- # Paramos el servicio
- if [ $# -le 0 ];then
- comprobarError 1 903
- fi
- # Intentamos con Systemd
- which systemctl > /dev/null 2>&1
- if [ $? -eq 0 ]; then
- systemctl stop $1 > /dev/null 2>&1
- comprobarError $? 904 $1
- systemctl disable $1 > /dev/null 2>&1
- comprobarError $? 905 $1
- else
- # Intentamos con service (Upstart)
- which service > /dev/null 2>&1
- if [ $? -eq 0 ]; then
- service $1 stop > /dev/null 2>&1
- comprobarError $? 904 $1
- else
- # Intentamos con init.d (SystemV)
- /etc/init.d/$1 stop > /dev/null 2>&1
- comprobarError $? 904 $1
- fi
- # Intentamos deshabilitar en el arranque (Upstart)
- which update-rc.d > /dev/null 2>&1
- if [ $? -eq 0 ];then
- update-rc.d $1 disable
- comprobarError $? 905 $1
- else
- # Intentamos deshabilitar en el arranque (SystemV)
- which chkconfig > /dev/null 2>&1
- if [ $? -eq 0 ];then
- chkconfig $1 off
- comprobarError $? 905 $1
- else
- comprobarError 1 905 $1
- fi
- fi
- fi
- }
- recargarServicio() {
- # Recargamos el servicio (con SystemD, Upstart o SystemV)
- # Recargamos el servicio
- if [ $# -le 0 ];then
- comprobarError 1 912
- fi
- # Intentamos con Systemd
- which systemctl > /dev/null 2>&1
- if [ $? -eq 0 ]; then
- systemctl reload $1 > /dev/null 2>&1
- comprobarError $? 913 $1
- else
- # Intentamos con service (Upstart)
- which service > /dev/null 2>&1
- if [ $? -eq 0 ]; then
- service $1 reload > /dev/null 2>&1
- comprobarError $? 913 $1
- else
- # Intentamos con init.d (SystemV)
- /etc/init.d/$1 reload > /dev/null 2>&1
- comprobarError $? 913 $1
- fi
- fi
- }
- configurarCortafuegos() {
- # Configuramos cortafuegos (añadir reglas y encender)
- # Comprobamos si estamos usando SSH
- esSSH $PPID
- case $ID in
- debian|ubuntu)
- ufw allow 80/tcp >> $logFile 2>&1
- comprobarError $? 906 "80/tcp"
- if [ $sshControl = true ];then
- ufw allow 22/tcp >> $logFile 2>&1
- comprobarError $? 906 "22/tcp"
- fi
- if [ $sslOn = true ];then
- ufw allow 443/tcp >> $logFile 2>&1
- comprobarError $? 906 "443/tcp"
- fi
- ufw --force enable >> $logFile 2>&1
- comprobarError $? 907
- ;;
- centos|fedora)
- firewall-cmd --add-port=80/tcp >> $logFile 2>&1
- comprobarError $? 906 "80/tcp"
- if [ $sshControl = true ];then
- firewall-cmd --add-port=22/tcp >> $logFile 2>&1
- comprobarError $? 906 "22/tcp"
- fi
- if [ $sslOn = true ];then
- firewall-cmd --add-port=443/tcp >> $logFile 2>&1
- comprobarError $? 906 "443/tcp"
- fi
- firewall-cmd --runtime-to-permanent >> $logFile 2>&1
- comprobarError $? 907
- habilitarServicio firewalld >> $logFile 2>&1
- comprobarError $? 907
- ;;
- esac
- unset sshControl
- }
- esSSH() {
- # Comprobamos si nuestro terminal usa SSH
- p=${1:-$PPID}
- #read pid name x ppid y < <( cat /proc/$p/stat )
- read pid name ppid < <( ps -o pid= -o comm= -o ppid= -p $p)
- [[ "$name" =~ sshd ]] && { sshControl=true; return 0; }
- [ "$ppid" -le 1 ] && { sshControl=false; return 1; }
- esSSH $ppid
- }
- descargarMediaWiki() {
- # Descargar la versión 1.31.0 de MediaWiki
- if [ ! -d ./var ];then
- comprobarError 1 5 "./var"
- fi
- curl "https://releases.wikimedia.org/mediawiki/1.31/mediawiki-1.31.0.tar.gz" 2>/dev/null | tar -xz -C "./var/"
- comprobarError $? 501
- }
- configurarMediaWiki() {
- # Configuramos MediaWiki
- if [ ! -f /var/www/$dominioMediaWiki/LocalSettings.php ];then
- # Copiamos archivos
- cp -fR ./var/mediawiki-1.31.0/ /var/www/$dominioMediaWiki
- comprobarError $? 502
- # Configuramos LocalSettings.php (y crea la base de datos por nosotros)
- nombreDBMW=$(echo $dominioMediaWiki | sed -e 's/\./_/g' | sed -e 's/-/_/g')
- userDBMW=$(echo "mediawiki_user" | sed -e 's/\./_/g' | sed -e 's/-/_/g')
- php /var/www/$dominioMediaWiki/maintenance/install.php --dbname=$nombreDBMW --dbserver="localhost" --installdbuser=root --installdbpass=$sqlPasswd --dbuser=$userDBMW --dbpass=$sqlPasswd --scriptpath="" --lang=es --pass=$passwdMediaWiki --with-extensions "$nombreMediaWiki" "admin" >> $logFile 2>&1
- comprobarError $? 502
- # Configuraciones adicionales
- sed -i '/$wgLanguageCode =/c\$wgLanguageCode = "es";' /var/www/$dominioMediaWiki/LocalSettings.php
- comprobarError $? 502
- sed -i '/$wgEnableEmail =/c\$wgEnableEmail = false;' /var/www/$dominioMediaWiki/LocalSettings.php
- comprobarError $? 502
- sed -i '/$wgEnableUploads =/c\$wgEnableUploads = true;' /var/www/$dominioMediaWiki/LocalSettings.php
- comprobarError $? 502
- echo -en "\$wgArticlePath = \"/wiki/\$1\";\n" >> /var/www/$dominioMediaWiki/LocalSettings.php
- echo -en "\$wgUsePathInfo = true;\n" >> /var/www/$dominioMediaWiki/LocalSettings.php
- echo -en "\$wgGroupPermissions['*']['createaccount'] = true;\n" >> /var/www/$dominioMediaWiki/LocalSettings.php
- echo -en "\$wgGroupPermissions['*']['edit'] = false;\n" >> /var/www/$dominioMediaWiki/LocalSettings.php
- echo -en "\$wgGroupPermissions['*']['read'] = true;\n" >> /var/www/$dominioMediaWiki/LocalSettings.php
- # Actualizamos permisos
- chown -R $webServerUser:$webServerGroup /var/www/$dominioMediaWiki
- comprobarError $? 502
- # Configuramos VirtualHost
- if [ $apacheOn = true ] && [ $sslOn = false ];then
- virtualHost="./etc/apache2/sites-available/mediawiki.conf"
- elif [ $nginxOn = true ] && [ $sslOn = false ];then
- virtualHost="./etc/nginx/sites-available/mediawiki.conf"
- elif [ $apacheOn = true ] && [ $sslOn = true ];then
- virtualHost="./etc/apache2/sites-available/mediawiki-ssl.conf"
- elif [ $nginxOn = true ] && [ $sslOn = true ];then
- virtualHost="./etc/nginx/sites-available/mediawiki-ssl.conf"
- else
- comprobarError 1 502
- fi
- if [ ! -f $virtualHost ];then
- comprobarError $? 502
- fi
- instalarVirtualHost "/var/www/$dominioMediaWiki" $virtualHost $dominioMediaWiki $aliasMediaWiki
- unset virtualHost
- else
- comprobarError 1 503 $dominioMediaWiki
- fi
- }
- descargarMoodle() {
- # Descargar la versión 1.31.0 de MediaWiki
- if [ ! -d ./var ];then
- comprobarError 1 5 "./var"
- fi
- curl "https://download.moodle.org/download.php/direct/stable35/moodle-latest-35.tgz" 2>/dev/null | tar -xz -C "./var/"
- comprobarError $? 501
- #echo -en " OK.\n" | tee -a $logFile
- }
- configurarMoodle() {
- # Configurar Moodle
- if [ ! -f /var/www/$dominioMoodle/config.php ];then
- # Copiamos archivos
- cp -Rf ./var/moodle/ /var/www/$dominioMoodle
- comprobarError $? 602
- # Crear carperta de datos (no online)
- if [ ! -d /var/www/moodledata ];then
- mkdir /var/www/moodledata 2>/dev/null
- comprobarError $? 602
- fi
- #Actualizamos permisos
- perm=$(stat -c %a /var/www/moodledata)
- if [ $perm -ne 777 ];then
- chmod -R 777 /var/www/moodledata 2>/dev/null
- comprobarError $? 602
- fi
- perm=$(stat -c %U /var/www/moodledata)
- if [ $perm != "$webServerUser" ];then
- chown -R $webServerUser:$webServerGroup /var/www/moodledata 2>/dev/null
- comprobarError $? 602
- fi
- unset perm
- # Creamos Base de Datos
- nombreDBMo=$(echo $dominioMoodle | sed -e 's/\./_/g' | sed -e 's/-/_/g')
- userDBMo=$(echo "moodle_user" | sed -e 's/\./_/g' | sed -e 's/-/_/g')
- crearDBMoodle
- # Configuramos e instalamos Moodle
- if [ $sslOn = true ];then
- wwwroot="https://$dominioMoodle"
- else
- wwwroot="http://$dominioMoodle"
- fi
- php /var/www/$dominioMoodle/admin/cli/install.php --lang=es --wwwroot="$wwwroot" --dataroot="/var/www/moodledata" --dbtype="$dbType" --dbname="$nombreDBMo" --dbuser="$userDBMo" --dbpass="$sqlPasswd" --fullname="$nombreMoodle" --shortname="$nombreCortoMoodle" --adminuser=admin --adminpass="$passwdMoodle" --adminemail="admin@$dominioMoodle" --agree-license --non-interactive >>$logFile 2>&1
- comprobarError $? 602
- # Actualizamos permisos
- chown -R $webServerUser:$webServerGroup /var/www/$dominioMoodle /var/www/moodledata
- # Configurar SE-Linux (RHEL)
- case $ID in
- centos|fedora)
- configurarSELinux
- ;;
- esac
- # Configuramos VirtualHost
- if [ $apacheOn = true ] && [ $sslOn = false ];then
- virtualHost="./etc/apache2/sites-available/moodle.conf"
- elif [ $nginxOn = true ] && [ $sslOn = false ];then
- virtualHost="./etc/nginx/sites-available/moodle.conf"
- elif [ $apacheOn = true ] && [ $sslOn = true ];then
- virtualHost="./etc/apache2/sites-available/moodle-ssl.conf"
- elif [ $nginxOn = true ] && [ $sslOn = true ];then
- virtualHost="./etc/nginx/sites-available/moodle-ssl.conf"
- else
- comprobarError 1 602
- fi
- instalarVirtualHost "/var/www/$dominioMoodle" $virtualHost $dominioMoodle
- unset virtualHost wwwroot
- else
- comprobarError 1 603 $dominioMoodle
- fi
- }
- crearDBMoodle() {
- # Crear base de datos para Moodle
- dbDir="./etc/db"
- if [ ! -d $dbDir ];then
- mkdir $dbDir 2>/dev/null
- comprobarError $? 603
- fi
- dbFile=$dbDir"/moodle.sql"
- echo -en "CREATE DATABASE IF NOT EXISTS $nombreDBMo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n" > $dbFile
- echo -en "GRANT ALL PRIVILEGES ON $nombreDBMo.* TO '$userDBMo'@'localhost' IDENTIFIED BY '$sqlPasswd';\n" >> $dbFile
- mysql -u root --password=$sqlPasswd < $dbFile > /dev/null 2>&1
- control=$?
- rm -f $dbFile 2>/dev/null
- comprobarError $? 603
- comprobarError $control 603
- unset control dbFile dbDir
- }
- configurarSELinux() {
- # Configurar SELinux
- which semanage >/dev/null 2>&1
- if [ $? -ne 0 ];then
- case $ID in
- centos)
- result=$(yum -y install policycoreutils-python 2>&1)
- comprobarError $? 605 $result
- ;;
- fedora)
- result=$(yum -y install policycoreutils-python-utils 2>&1)
- comprobarError $? 605 $result
- ;;
- *)
- comprobarError 1 604
- ;;
- esac
- fi
- semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/moodledata(/.*)?" > /dev/null 2>&1
- #comprobarError $? 604
- restorecon -R /var/www/ > /dev/null 2>&1
- comprobarError $? 604
- }
- instalarPHPInfo() {
- # Instalar fichero info.php y su VirtualHost
- if [ ! -f /etc/$webServerName/sites-enabled/phpinfo.conf ];then
- infoFile="./var/www/info.php"
- if [ ! -f $infoFile ];then
- comprobarError 1 4 "$infoFile"
- fi
- mkdir /var/www/localhost 2>/dev/null
- comprobarError $? 106
- cp -f $infoFile /var/www/localhost/ 2>/dev/null
- comprobarError $? 106
- chown -R $webServerUser:$webServerGroup /var/www/localhost 2>/dev/null
- comprobarError $? 106
- unset infoFile
- # Instalar VirtualHost
- if [ $apacheOn = true ] && [ $sslOn = false ];then
- virtualHost="./etc/apache2/sites-available/phpinfo.conf"
- elif [ $nginxOn = true ] && [ $sslOn = false ];then
- virtualHost="./etc/nginx/sites-available/phpinfo.conf"
- elif [ $apacheOn = true ] && [ $sslOn = true ];then
- virtualHost="./etc/apache2/sites-available/phpinfo-ssl.conf"
- elif [ $nginxOn = true ] && [ $sslOn = true ];then
- virtualHost="./etc/nginx/sites-available/phpinfo-ssl.conf"
- else
- comprobarError 1 106
- fi
- instalarVirtualHost "/var/www/localhost" $virtualHost "localhost"
- unset virtualHost
- return 0
- else
- return 1
- fi
- }
- configurarBackups() {
- # Instala backup-server y lo configura
- letsEncryptCode=""
- if [ ! -d "./var" ];then
- comprobarError 1 5 "./var"
- fi
- which backup-server > /dev/null 2>&1
- if [ $? -ne 0 ];then
- # Descargamos backup-server
- curl "https://code.castanedo.es/guzman/backup-server/archive/2.1.tar.gz" 2>/dev/null | tar -xz -C "./var/"
- if [ $? -ne 0 ];then
- comprobarError 1 701
- return 1
- fi
- # Copiamos backup-server y logrotate
- cp -f ./var/backup-server/backup-server /usr/bin/backup-server
- if [ $? -ne 0 ];then
- comprobarError 1 701
- return 1
- fi
- cp -f ./var/backup-server/scripts/logrotate.d/backup-server /etc/logrotate.d/backup-server
- if [ $? -ne 0 ];then
- comprobarError 1 701
- return 1
- fi
- # Creamos carpeta de backups
- if [ ! -d /var/backup ];then
- mkdir /var/backup 2>/dev/null
- comprobarError $? 5 "/var/backup"
- fi
- # Configuramos cron.d
- if [ $letsEncryptOn = false ];then
- letsEncryptCode="--no-letsencrypt "
- fi
- echo -en "# /etc/cron.d/backup-server: crontab for $hostname\n\n" > /etc/cron.d/backup-server
- echo -en "# Backup every day at 4:00 am\n" >> /etc/cron.d/backup-server
- echo -en "0 4 * * * root [ -x /usr/bin/backup-server ] && /usr/bin/backup-server --xz -u $webServerUser -g $webServerGroup --no-encryption --sql-user root --sql-pass $sqlPasswd --nginx-dir /etc/$webServerName $letsEncryptCode--no-mail --no-gogs --no-postfix --no-dovecot --no-opendkim --no-spf --no-opendmarc --no-amavis --no-spamassassin /var/backup >> /var/log/backup-server.log 2>&1" >> /etc/cron.d/backup-server
- comprobarError $? 701
- fi
- unset letsEncryptCode
- }
- # Comprobación del sistema e inicialización
- cd $(dirname $0) > /dev/null 2>&1
- inicializarVariables
- OSInfo
- # Leer opciones
- which getopt >/dev/null 2>&1
- 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,no-https,no-ssl,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
- nginxOn=false
- shift
- ;;
- --lemp)
- nginxOn=true
- apacheOn=false
- shift
- ;;
- --mariadb)
- case $ID in
- debian)
- mySQLOn=true
- mariaDBOn=false
- dbType="mariadb"
- ;;
- ubuntu|centos|fedora)
- mariaDBOn=true
- mySQLOn=false
- dbType="mariadb"
- esac
- shift
- ;;
- --mysql)
- if [ $ID = "ubuntu" ] && [ $VERSION = "18.04" ];then
- mySQLOn=true
- mariaDBOn=false
- 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
- ;;
- --no-https|--no-ssl)
- sslOn=false
- letsEncrypt=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 11
- else
- hostnamectl set-hostname $hostname >/dev/null 2>&1
- fi
- if [ -z "$sqlPasswd" ];then
- ayuda
- comprobarError 1 12
- fi
- if [ -z "$maxUpload" ];then
- ayuda
- comprobarError 1 13
- fi
- if [ $mediaWikiOn = true ];then
- if [ -z "$nombreMediaWiki" ];then
- ayuda
- comprobarError 1 14
- fi
- if [ -z "$dominioMediaWiki" ];then
- ayuda
- comprobarError 1 15
- fi
- if [ -z "$passwdMediaWiki" ];then
- ayuda
- comprobarError 1 16
- fi
- fi
- if [ $moodleOn = true ];then
- if [ -z "$nombreMoodle" ];then
- ayuda
- comprobarError 1 17
- fi
- if [ -z "$nombreCortoMoodle" ];then
- ayuda
- comprobarError 1 18
- fi
- if [ -z "$dominioMoodle" ];then
- ayuda
- comprobarError 1 19
- fi
- if [ -z "$passwdMoodle" ];then
- ayuda
- comprobarError 1 20
- fi
- fi
- # Comprobaciones
- comprobarRoot
- comprobarDependencias
- else
- # Preguntas interactivas
- # Comprobaciones
- comprobarRoot
- comprobarDependencias
- # Bienvenida
- mostrarBienvenida
- # Selección de componentes (express vs avanzada)
- mostrarExpress
- fi
- # Instalación Servidor Web
- horaInicial=$(date +"%s")
- if [ $apacheOn = true ]; then
- echo -en "Instalando Servidor Web Apache..." | tee -a $logFile
- instalarApache
- echo -en " OK.\n" | tee -a $logFile
- elif [ $nginxOn = true ]; then
- echo -en "Instalando Servidor Web Nginx..." | tee -a $logFile
- instalarNginx
- echo -en " OK.\n" | tee -a $logFile
- fi
- # Instalación Base de Datos
- if [ $mySQLOn = true ]; then
- echo -en "Instalando Base de Datos MySQL..." | tee -a $logFile
- instalarMySQL
- echo -en " OK.\n" | tee -a $logFile
- elif [ $mariaDBOn = true ]; then
- echo -en "Instalando Base de Datos MariaDB..." | tee -a $logFile
- instalarMariaDB
- echo -en " OK.\n" | tee -a $logFile
- fi
- # Instalación PHP-7
- if [ $phpOn = true ]; then
- echo -en "Instalando PHP-7..." | tee -a $logFile
- instalarPHP
- echo -en " OK.\n" | tee -a $logFile
- fi
- # Instalación Let's Encrypt
- if [ $letsEncryptOn = true ];then
- echo -en "Instalando Let's Encrypt..." | tee -a $logfile
- instalarLetsEncrypt
- echo -en " OK.\n" | tee -a $logFile
- fi
- # Configuración Web Server
- if [ $apacheOn = true ];then
- echo -en "Configurando Servidor Web Apache..." | tee -a $logFile
- configurarApache
- echo -en " OK.\n" | tee -a $logFile
- elif [ $nginxOn = true ]; then
- echo -en "Configurando Servidor Web Nginx..." | tee -a $logFile
- configurarNginx
- echo -en " OK.\n" | tee -a $logFile
- fi
- # Configuración Database (Configurar Ficheros, Arrancar Base de Datos, establecer contraseña y configuración segura)
- if [ $mySQLOn = true ] || [ $mariaDBOn = true ];then
- echo -en "Configurando Base de Datos..." | tee -a $logFile
- configurarSQL
- echo -en " OK.\n" | tee -a $logFile
- habilitarServicio "$sqlServerName"
- echo -en "Estableciendo contraseña de la Base de Datos..." | tee -a $logFile
- establecerSQLPasswd
- echo -en " OK.\n" | tee -a $logFile
- fi
- # Configuración PHP (cgi.fix_pathinfo=0 y Configurar máximo de subida de archivos)
- if [ $phpOn = true ];then
- echo -en "Configurando PHP-7..." | tee -a $logFile
- configurarPHP
- echo -en " OK.\n" | tee -a $logFile
- fi
- # Configuración SSL/TLS
- # Generar certificados auto-firmados
- if [ $sslOn = true ];then
- echo -en "Generando claves de intercambio Diffie-Hellman (puede llevar un largo tiempo)..." | tee -a $logFile
- generarDHParam
- echo -en " OK.\n" | tee -a $logFile
- echo -en "Generando Certificados Auto-Firmados..." | tee -a $logFile
- if [ $mediaWikiOn = true ];then
- generarCertAutofirmado $dominioMediaWiki
- fi
- if [ $moodleOn = true ];then
- generarCertAutofirmado $dominioMoodle
- fi
- if [ $infoPHPOn = true ];then
- generarCertAutofirmado "localhost"
- fi
- echo -en " OK.\n" | tee -a $logFile
- fi
- # Arrancar y habilitar todos los servicios (SystemD, Service o SystemV)
- echo -en "Habilitando todos los servicios..." | tee -a $logFile
- if [ $apacheOn = true ] || [ $nginxOn = true ];then
- habilitarServicio $webServerName
- fi
- if [ $nginxOn = true ] && [ $phpOn = true ];then
- habilitarServicio $phpFPMName
- fi
- echo -en " OK.\n" | tee -a $logFile
- # Instalar MediaWiki
- if [ $mediaWikiOn = true ]; then
- # Descargar MediaWiki
- echo -en "Descargando MediaWiki-1.31.0..." | tee -a $logFile
- descargarMediaWiki
- echo -en " OK.\n" | tee -a $logFile
- # Configurar MediWiki
- echo -en "Configurando MediaWiki..." | tee -a $logFile
- configurarMediaWiki
- echo -en " OK.\n" | tee -a $logFile
- fi
- # Instalar Moodle
- if [ $moodleOn = true ]; then
- # Descargar Moodle
- echo -en "Descargando Moodle-3.5.1..." | tee -a $logFile
- descargarMoodle
- echo -en " OK.\n" | tee -a $logFile
- # Configuración Moodle
- echo -en "Configurando Moodle (puede llevar un tiempo largo)..." | tee -a $logFile
- configurarMoodle
- echo -en " OK.\n" | tee -a $logFile
- fi
- # Instalar info.php
- if [ $infoPHPOn = true ];then
- echo -en "Configurando 'info.php'..." | tee -a $logFile
- instalarPHPInfo
- if [ $? -eq 0 ];then
- echo -en " OK.\n" | tee -a $logFile
- else
- echo -en " Ya se encuentra configurado.\n" | tee -a $logFile
- fi
- fi
- # Añadir reglas del cortafuegos
- echo -en "Configurando Cortafuegos..." | tee -a $logFile
- configurarCortafuegos
- echo -en " OK.\n" | tee -a $logFile
- # Generar certificados Let's Encrypt
- if [ $letsEncryptOn = true ];then
- echo -en "Generando Certificados Válidos Let's Encrypt..." | tee -a $logFile
- generarCertLetsEncrypt
- echo -en " OK.\n" | tee -a $logFile
- fi
- # Configurar Backup
- if [ $backupOn = true ]; then
- echo -en "Configurando Backup Automático..." | tee -a $logFile
- configurarBackups
- echo -en " OK.\n" | tee -a $logFile
- fi
- # Finalizamos
- horaFinal=$(date +"%s")
- echo -en "\n-------------------------------------------------------------\n" | tee -a $logFile
- echo -en "\t¡INSTALACION FINALIZADA CON EXITO! \n" | tee -a $logFile
- echo -en "\tDuración: "$((horaFinal-horaInicial))" seg." | tee -a $logFile
- echo -en "\n-------------------------------------------------------------\n" | tee -a $logFile
- echo -en " GUARDE LA CONFIGURACION EN UN LUGAR SEGURO\n"
- echo -en " LE SERÁ IMPRESCINDIBLE PARA CUALQUIER CAMBIO FUTURO\n"
- echo -en " Dominio: $hostname\n"
- echo -en " Usuarios SQL: root\n"
- echo -en " $userDBMW\n"
- echo -en " $userDBMo\n"
- echo -en " Contraseña SQL: $sqlPasswd\n"
- if [ $mediaWikiOn = true ];then
- echo -en " Nombre MediaWiki: $nombreMediaWiki\n"
- echo -en " Dominios MediaWiki: $dominioMediaWiki\n"
- for dominio in $aliasMediaWiki;do
- echo -en " $dominio\n"
- done
- echo -en " Usuario MediaWiki: admin\n"
- echo -en " Contraseña MediaWiki: $passwdMediaWiki\n"
- fi
- if [ $moodleOn = true ];then
- echo -en " Nombre Moodle: $nombreMoodle\n"
- echo -en " Dominio Moodle: $dominioMoodle\n"
- echo -en " Usuario Moodle: admin\n"
- echo -en " Contraseña Moodle: $passwdMoodle"
- fi
- echo -en "\n-------------------------------------------------------------\n"
|