install 78 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463
  1. #!/bin/bash
  2. #################################################################
  3. # auto-elearning #
  4. # Instala automáticamente una Wiki (MediaWiki) y un Campus #
  5. # Virtual (Moodle). #
  6. # Para ello instala un entorno LEMP (GNU/Linux+Nginx+MySQL/ #
  7. # MariaDB+PHP) o LAMP (GNU/Linux+Apache+MySQL/MariaDB+PHP). #
  8. # Además instala certificados SSL/TLS válidos de Let's Encrypt #
  9. # (o auto-firmados) y genera copias de seguridad diariamente. #
  10. # #
  11. # Guzman Castanedo Villalba (guzman@castanedo.es) Junio 2018 #
  12. # GPLv3 (https://www.gnu.org/licenses/gpl.html) #
  13. #################################################################
  14. ayuda() {
  15. # Muestra ayuda al usuario y termina
  16. echo -en "AYUDA AUTO-ELEARNING:\n"
  17. echo -en " Instala automáticamente una Wiki (MediaWiki) y un Campus Virtual (Moodle).\n"
  18. echo -en " Para ello instala un entorno LEMP (GNU/Linux+Nginx+MySQL/MariaDB+PHP) o LAMP (GNU/Linux+Apache+MySQL/MariaD+PHP).\n"
  19. echo -en " Además instala certificados SSL/TLS válidos de Let's Encrypt (o auto-firmados) y genera copias de seguridad diariamente.\n"
  20. echo -en " Licencia: GPLv3 (Autor: Guzmán Castanedo Villalba [guzman@castanedo.es]).\n"
  21. echo -en "\nSINOPSIS:\n"
  22. echo -en " sudo ./"$(basename $0)" (Forma 1)\n"
  23. echo -en " sudo ./"$(basename $0)" [OPCIONES] (Forma 2)\n"
  24. echo -en "\nDESCRIPCIÓN:\n"
  25. echo -en " La primera forma permite instalarlo todo de forma INTERACTIVA (contestando a unas preguntas que saldrán por pantalla).\n"
  26. echo -en " La segunda forma permite hacer lo mismo de forma NO INTERACTIVA (indicando todas las opciones desde el terminal).\n"
  27. echo -en " Esta aplicación requiere de permisos de administrador (root).\n"
  28. echo -en "\nCOMPATIBILIDAD:\n"
  29. echo -en " Esta aplicación es compatible con Ubuntu 18.04, 16.04, Debian 9, CentOS 7 y Fedora 28.\n"
  30. echo -en " Requiere de un sistema moderno que tenga instalado SystemD.\n"
  31. echo -en " Se irán añadiendo nuevas distribuciones en futuras versiones.\n"
  32. echo -en "\nOPCIONES:\n"
  33. echo -en " -d, --dominio, --fqdn <dominio>: dominio principal del servidor (OBLIGATORIO)\n"
  34. echo -en " --lemp: activa servidor web Nginx (Por Defecto)\n"
  35. echo -en " --lamp: activa servidor web Apache2\n"
  36. echo -en " --mariadb: activa base de datos mariadb (Por Defecto)\n"
  37. echo -en " --mysql: activa base de datos mysql\n"
  38. echo -en " Sólo es posible para Ubuntu 18.04\n"
  39. echo -en " --password-sql <pass>: contraseña root de base de datos (OBLIGATORIO)\n"
  40. echo -en " --max-upload-size <size>: tamaño de subida permitido (Por Defecto: \"100M\")\n"
  41. echo -en " --lets-encrypt: activa certificados SSL/TLS de Let's Encrypt\n"
  42. echo -en " --auto-firmados: activa certificadaos SSL/TLS auto-firmados (sólo para pruebas)\n"
  43. echo -en "\nOPCIONES MEDIA WIKI:\n"
  44. echo -en " --media-wiki: activa instalación de Media Wiki (Por Defecto)\n"
  45. echo -en " Si se activa esta opción --nombre-mw, --dominios-mw y --password-mw son OBLIGARIOS\n"
  46. echo -en " --no-media-wiki: desactiva instalación de Media Wiki\n"
  47. echo -en " --nombre-mw <nombre>: nombre de la wiki\n"
  48. echo -en " --dominios-mw <dominios>: dominios para Media Wiki\n"
  49. echo -en " Deben estar configuradas las DNS para que estos apunten a este servidor\n"
  50. echo -en " Se pueden indicar más de uno separándolos con espacios\n"
  51. echo -en " --password-mw <pass>: contraseña para usuario 'admin'\n"
  52. echo -en "\nOPCIONES MOODLE:\n"
  53. echo -en " --moodle: activa instalación de Moodle (Por Defecto)\n"
  54. echo -en " Si se activa esta opción --nombre-mo, --nombre-corto-mo, --dominios-mo y --password-mo son OBLIGARIOS\n"
  55. echo -en " --no-moodle: desactiva instalación de Moodle\n"
  56. echo -en " --nombre-mo <nombre>: nombre del campus\n"
  57. echo -en " --nombre-corto-mo <nombre>: nombre corto del campus (una sola palabra)\n"
  58. echo -en " --dominio-mo <dominio>: dominio para Moodle\n"
  59. echo -en " Deben estar configuradas las DNS para que estos apunten a este servidor\n"
  60. echo -en " Sólo se puede indicar UN DOMINIO\n"
  61. echo -en " --password-mo <pass>: contraseña para usuario 'admin'\n"
  62. echo -en "\nOTRAS OPCIONES:\n"
  63. echo -en " --php-info: activa info.php (sólo para pruebas)\n"
  64. echo -en " --no-php-info: desactiva info.php (Por Defecto)\n"
  65. echo -en " --backup: activa los backups automáticos (Por Defecto)\n"
  66. echo -en " --no-backup: desactiva los backups automáticos\n"
  67. echo -en "\nEJEMPLOS:\n"
  68. echo -en " sudo "$0"\n"
  69. echo -en " Activa el programa en modo interactivo\n"
  70. 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"
  71. echo -en " Instala LEMP con mariadb y Media Wiki\n"
  72. 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"
  73. echo -en " Instala LAMP con MySQL y Moodle\n\n"
  74. }
  75. comprobarError() {
  76. # Permite comprobar si se ha producido un error y de serlo devuelve un código de error
  77. # comprobarError exitNum codeNum extraInfo
  78. # 1xx: Servidor Web
  79. # 2xx: Base de Datos
  80. # 3xx: PHP
  81. # 4xx: SSL/TLS
  82. # 5xx: MediaWiki
  83. # 6xx: Moodle
  84. # 7xx: Backup automático
  85. # 8xx: Dependencias
  86. # 9xx: Servicios & Firewall
  87. type="ERROR"
  88. exitNum=$1
  89. shift
  90. codeNum=$1
  91. shift
  92. extraInfo=$@
  93. case $codeNum in
  94. 1)
  95. error="$type $codeNum:\tInstalación interrumpida por el usuario.\n"
  96. ;;
  97. 2)
  98. error="$type $codeNum:\tError interno (selección express).\n"
  99. ;;
  100. 3)
  101. error="$type $codeNum:\tError interno (selección avanzada).\n"
  102. ;;
  103. 4)
  104. error="\n$type $codeNum:\tEl archivo '"$(realpath $extraInfo)"' no existe.\n"
  105. ;;
  106. 5)
  107. error="\n$type $codeNum:\tEl directorio '"$(realpath $extraInfo)"' no existe.\n"
  108. ;;
  109. 6)
  110. error="$type $codeNum:\tError interno (selección SSL/TLS).\n"
  111. ;;
  112. 10)
  113. error="$type $codeNum:\tOpción inesperada '$extraInfo'.\n"
  114. ;;
  115. 11)
  116. error="$type $codeNum:\tDominio Principal no definido ('--hostname \"ejemplo.com\"').\n"
  117. ;;
  118. 12)
  119. error="$type $codeNum:\tContraseña SQL no definida ('--password-sql \"pass\"').\n"
  120. ;;
  121. 13)
  122. error="$type $codeNum:\tTamaño de subida no definido ('--max-upload-size \"100M\"').\n"
  123. ;;
  124. 14)
  125. error="$type $codeNum:\tNombre Media Wiki no definida (--nombre-mw \"Wiki de Ejemplo\").\n"
  126. ;;
  127. 15)
  128. error="$type $codeNum:\tDominios Media Wiki no definidos (--dominios-mw \"ejemplo.com wiki.ejemplo.com\").\n"
  129. ;;
  130. 16)
  131. error="$type $codeNum:\tContraseña Media Wiki no definida (--password-mw \"pass\").\n"
  132. ;;
  133. 17)
  134. error="$type $codeNum:\tNombre Moodle no definido (--nombre-mo \"Campus Virtual de Ejemplo\").\n"
  135. ;;
  136. 18)
  137. error="$type $codeNum:\tNombre Corto Moodle no definido (--nombre-corto-mo \"Ejemplo\").\n"
  138. ;;
  139. 19)
  140. error="$type $codeNum:\tDominio Moodle no definido (--dominio-mo \"moodle.ejemplo.com\").\n"
  141. ;;
  142. 20)
  143. error="$type $codeNum:\tContraseña Moodle no definida (--password-mo \"pass\").\n"
  144. ;;
  145. 100)
  146. error="$type $codeNum:\tError interno (selección del servidor web).\n"
  147. ;;
  148. 101)
  149. error="\n$type $codeNum:\tError al instalar Apache2.\nDetalles:\n$extraInfo\n"
  150. ;;
  151. 102)
  152. error="\n$type $codeNum:\tError al instalar Nginx.\nDetalles:\n$extraInfo\n"
  153. ;;
  154. 103)
  155. error="\n$type $codeNum:\tError al nstalar repositorio 'epel-release'.\nDetalles:\n$extraInfo\n"
  156. ;;
  157. 104)
  158. error="\n$type $codeNum:\tError interno (instalación Apache2).\n"
  159. ;;
  160. 105)
  161. error="\n$type $codeNum:\tError interno (instalación Nginx).\n"
  162. ;;
  163. 106)
  164. type="WARNING"
  165. error="\n$type $codeNum:\tImposible instalar 'info.php'.\n"
  166. ;;
  167. 107)
  168. error="\n$type $codeNum:\tError al configurar Nginx.\n"
  169. ;;
  170. 108)
  171. error="\n$type $codeNum:\tError al configurar Apache2.\n"
  172. ;;
  173. 200)
  174. error="$type $codeNum:\tError interno (selección de base de datos).\n"
  175. ;;
  176. 201)
  177. error="\n$type $codeNum:\tError al instalar MySQL.\nDetalles:\n$extraInfo\n"
  178. ;;
  179. 202)
  180. error="\n$type $codeNum:\tError al instalar MariaDB.\nDetalles:\n$extraInfo\n"
  181. ;;
  182. 203)
  183. error="\n$type $codeNum:\tError interno (instalación MySQL).\n"
  184. ;;
  185. 204)
  186. error="\n$type $codeNum:\tError interno (instalación MariaDB).\n"
  187. ;;
  188. 205)
  189. error="\n$type $codeNum:\t$DIST no incluye MySQL en sus repositorios.\n"
  190. ;;
  191. 206)
  192. type="WARNING"
  193. error="\n$type $codeNum:\tUsuario 'root' ya dispone de contraseña."
  194. ;;
  195. 207)
  196. error="\n$type $codeNum:\tImposible cambiar la contraseña de 'root'."
  197. ;;
  198. 208)
  199. error="\n$type $codeNum:\tImposible desactivar acceso 'root' desde el exterior."
  200. ;;
  201. 209)
  202. error="\n$type $codeNum:\tImposible eliminar usuarios anónimos."
  203. ;;
  204. 210)
  205. type="WARNING"
  206. error="\n$type $codeNum:\tImposible eliminar bases de datos de pruebas."
  207. ;;
  208. 211)
  209. type="WARNING"
  210. error="\n$type $codeNum:\tImposible eliminar los permisos de las bases de datos de pruebas."
  211. ;;
  212. 212)
  213. error="\n$type $codeNum:\tImposible recargar base de datos."
  214. ;;
  215. 213)
  216. error="\n$type $codeNum:\tImposible configurar SQL.\n"
  217. ;;
  218. 214)
  219. type="WARNING"
  220. error="\n$type $codeNum:\tSQL ya está configurado."
  221. ;;
  222. 300)
  223. error="\n$type $codeNum:\tError interno (instalación PHP-7).\n"
  224. ;;
  225. 301)
  226. error="\n$type $codeNum:\tError interno (Web Server no seleccionado).\n"
  227. ;;
  228. 302)
  229. error="\n$type $codeNum:\tError al instalar PHP-7.\nDetalles:\n$extraInfo\n"
  230. ;;
  231. 303)
  232. error="\n$type $codeNum:\tError al instalar Repositorio Remi.\nDetalles:\n$extraInfo\n"
  233. ;;
  234. 304)
  235. error="\n$type $codeNum:\tSistema Operativo no compatible con PHP-7 ($OS $DIST $REV).\n"
  236. ;;
  237. 305)
  238. error="\n$type $codeNum:\tImposible configurar PHP-7.\n"
  239. ;;
  240. 401)
  241. error="\n$type $codeNum:\tError al instalar 'certbot' (Let's Encrypt).\n"
  242. ;;
  243. 402)
  244. error="\n$type $codeNum:\tImposible generar Certificados Autofirmados.\n"
  245. ;;
  246. 403)
  247. error="\n$type $codeNum:\tImposible generar claves de intercambio Diffie-Hellman.\n"
  248. ;;
  249. 404)
  250. error="\n$type $codeNum:\tImposible generar Certificados Let's Encrypt.\n"
  251. ;;
  252. 501)
  253. error="\n$type $codeNum:\tImposible descargar MediaWiki-1.31.0.\n"
  254. ;;
  255. 502)
  256. error="\n$type $codeNum:\tImposible configurar MediaWiki-1.31.0.\n"
  257. ;;
  258. 503)
  259. type="WARNING"
  260. error="\n$type $codeNum:\tYa existe una copia configurada de MediaWiki en el dominio: '$extraInfo'."
  261. ;;
  262. 601)
  263. error="\n$type $codeNum:\tImposible descargar Moodle-3.5.1.\n"
  264. ;;
  265. 602)
  266. error="\n$type $codeNum:\tImposible configurar Moodle-3.5.1.\n"
  267. ;;
  268. 603)
  269. type="WARNING"
  270. error="\n$type $codeNum:\tYa existe una copia configurada de Moodle en el dominio: '$extraInfo'."
  271. ;;
  272. 604)
  273. error="\n$type $codeNum:\tImposible configurar SELinux.\n"
  274. ;;
  275. 605)
  276. error="\n$type $codeNum:\tImposible instalar 'policycoreutils-python'.Detalles:\n$extraInfo\n"
  277. ;;
  278. 701)
  279. type="WARNING"
  280. error="\n$tupe $codeNum:\tImposible configurar actualizaciones automáticas.\n"
  281. ;;
  282. 800)
  283. error="$type $codeNum:\tEs necesario ser root ('sudo $0').\n"
  284. ;;
  285. 801)
  286. error="$type $codeNum:\t'whiptail' no instalado.\n"
  287. ;;
  288. 802)
  289. error="$type $codeNum:\t'hostnamectl' no instalado.\n"
  290. ;;
  291. 803)
  292. error="$type $codeNum:\t'apt-get' no instalado.\n"
  293. ;;
  294. 804)
  295. error="$type $codeNum:\t'yum' no instalado.\n"
  296. ;;
  297. 805)
  298. error="\n$type $codeNum:\tImposible actualizar repositorio\nDetalles:\n$extraInfo.\n"
  299. ;;
  300. 806)
  301. error="$type $codeNum:\t'ufw' no instalado.\nDetalles:\n$extraInfo\n"
  302. ;;
  303. 807)
  304. error="$type $codeNum:\t'firewall-cmd' no instalado.\n"
  305. ;;
  306. 808)
  307. error="$type $codeNum:\t'tput' no instalado.\nDetalles:\n$extraInfo\n"
  308. ;;
  309. 809)
  310. error="$type $codeNum:\t'sed' no instalado.\nDetalles:\n$extraInfo\n"
  311. ;;
  312. 810)
  313. error="$type $codeNum:\t'curl' no instalado.\nDetalles:\n$extraInfo\n"
  314. ;;
  315. 811)
  316. error="$type $codeNum:\t'tar' no instalado.\nDetalles:\n$extraInfo\n"
  317. ;;
  318. 812)
  319. error="$type $codeNum:\t'gzip' no instalado.\nDetalles:\n$extraInfo\n"
  320. ;;
  321. 813)
  322. error="$type $codeNum:\t'bzip2' no instalado.\nDetalles:\n$extraInfo\n"
  323. ;;
  324. 814)
  325. error="$type $codeNum:\t'xz' no instalado.\nDetalles:\n$extraInfo\n"
  326. ;;
  327. 815)
  328. error="$type $codeNum:\t'openssl' no instalado.\nDetalles:\n$extraInfo\n"
  329. ;;
  330. 816)
  331. error="$type $codeNum:\t'find' no instalado.\n"
  332. ;;
  333. 817)
  334. 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"
  335. ;;
  336. 900)
  337. error="$type $codeNum:\tError interno (habilitar servicio).\n"
  338. ;;
  339. 901)
  340. error="$type $codeNum:\tImposible encender servicio '$extraInfo'.\n"
  341. ;;
  342. 902)
  343. error="$type $codeNum:\tImposible habilitar servicio '$extraInfo' durante el arranque.\n"
  344. ;;
  345. 903)
  346. error="$type $codeNum:\tError interno (deshabilitar servicio).\n"
  347. ;;
  348. 904)
  349. error="$type $codeNum:\tImposible parar servicio '$extraInfo'.\n"
  350. ;;
  351. 905)
  352. error="$type $codeNum:\tImposible deshabilitar servicio '$extraInfo' durante el arranque.\n"
  353. ;;
  354. 906)
  355. type="WARNING"
  356. error="\n$type $codeNum:\tImposible añadir regla al cortafuegos ('$extraInfo').\n"
  357. ;;
  358. 907)
  359. type="WARNING"
  360. error="\n$type $codeNum:\tImposible encender cortafuegos.\n"
  361. ;;
  362. 908)
  363. error="\n$type $codeNum:\tError interno (instalar Virtual Host).\n"
  364. ;;
  365. 909)
  366. error="\n$type $codeNum:\tVirtual Host '$extraInfo' no existe.\n"
  367. ;;
  368. 910)
  369. error="\n$type $codeNum:\tImposible copiar Virtual Host '$extraInfo'.\n"
  370. ;;
  371. 911)
  372. error="\n$type $codeNum:\tImposible activar Virtual Host '$extraInfo'.\n"
  373. ;;
  374. 912)
  375. error="\n$type $codeNum:\tError interno (recargar servicio).\n"
  376. ;;
  377. 913)
  378. error="\n$type $codeNum:\tImposible recargar servicio '$extraInfo'.\n"
  379. ;;
  380. *)
  381. error="ERROR 13:\tError interno (comprobación de errores)\n"
  382. exitNum=1
  383. codeNum=13
  384. ;;
  385. esac
  386. if [ $exitNum -ne 0 ];then
  387. echo -en "$error" | tee -a $logFile
  388. if [ $type = "ERROR" ];then
  389. exit $codeNum
  390. fi
  391. fi
  392. unset error exitNum codeNum type
  393. }
  394. OSInfo() {
  395. # Detecta el OS en el que se está ejecutando el programa, así como su versión
  396. # Sólo continuará si se trata de una distribución compatible
  397. echo -en "Detectando SO..." >> $logFile
  398. OS=$(uname -s)
  399. if [ $OS = "Linux" ]; then
  400. OS="GNU/Linux"
  401. if [ -f /etc/os-release ]; then
  402. DIST=$(grep ^NAME= /etc/os-release | cut -d = -f 2 | cut -d '"' -f 2)
  403. REV=$(grep ^VERSION= /etc/os-release | cut -d = -f 2 | cut -d '"' -f 2)
  404. ID=$(grep ^ID= /etc/os-release | cut -d = -f 2 | cut -d '"' -f 2)
  405. VERSION=$(grep ^VERSION_ID= /etc/os-release | cut -d = -f 2 | cut -d '"' -f 2)
  406. for i in $ID; do
  407. case $i in
  408. debian)
  409. case $VERSION in
  410. 9)
  411. # Debian 9 Soportado
  412. ;;
  413. *)
  414. comprobarError 1 817
  415. ;;
  416. esac
  417. break
  418. ;;
  419. ubuntu)
  420. case $VERSION in
  421. 18.04)
  422. # Ubuntu 18.04 Soportado
  423. ;;
  424. 16.04)
  425. # Ubuntu 16.04 Soportado
  426. ;;
  427. *)
  428. comprobarError 1 817
  429. ;;
  430. esac
  431. break
  432. ;;
  433. rhel|centos)
  434. case $VERSION in
  435. 7)
  436. # CentOS 7 Soportado
  437. ;;
  438. *)
  439. comprobarError 1 817
  440. ;;
  441. esac
  442. break
  443. ;;
  444. fedora)
  445. case $VERSION in
  446. 28)
  447. # Fedora 28 Soportado
  448. ;;
  449. *)
  450. comprobarError 1 817
  451. ;;
  452. esac
  453. break
  454. ;;
  455. *)
  456. comprobarError 1 817
  457. ;;
  458. esac
  459. done
  460. else
  461. # Other Linux (No Soportado)
  462. comprobarError 1 817
  463. fi
  464. else
  465. # UNIX, OS X, ... (No Soportado)
  466. comprobarError 1 817
  467. fi
  468. echo -en " $OS $DIST $REV\n" >> $logFile
  469. HDInfo=$(df -h | head -1)"\n"$(df -h | grep ^/dev/sd)"\n"$(df -h | grep ^/dev/mapper)
  470. echo -en "$HDInfo\n" >> $logFile
  471. }
  472. comprobarRoot() {
  473. # Comprueba si se está ejecutando con privilegios de root
  474. comprobarError $(id -u) 800
  475. }
  476. comprobarDependencias() {
  477. # Comprueba si están instalados todos los programas necesarios.
  478. # En la mayoría de los casos, trata de instalarlos.
  479. # Comprobamos whiptail
  480. which whiptail > /dev/null 2>&1
  481. comprobarError $? 801
  482. # Comprobamos hostnamectl
  483. which hostnamectl > /dev/null 2>&1
  484. comprobarError $? 802
  485. which find > /dev/null 2>&1
  486. comprobarError $? 816
  487. case $ID in
  488. debian|ubuntu)
  489. # Comprobamos apt-get
  490. which apt-get > /dev/null 2>&1
  491. comprobarError $? 803
  492. # Actualizamos base de datos del repositorio
  493. echo -en "Actualizando repositorio APT..." | tee -a $logFile
  494. result=$(apt-get -q -y update 2>&1)
  495. comprobarError $? 805 $result
  496. echo -en " OK.\n" | tee -a $logFile
  497. # Comprobamos Firewall (ufw)
  498. which ufw > /dev/null 2>&1
  499. if [ $? -ne 0 ];then
  500. result=$(apt-get -q -y install ufw 2>&1)
  501. comprobarError $? 806 $result
  502. fi
  503. # Comprobamos tput
  504. which tput > /dev/null 2>&1
  505. if [ $? -ne 0 ];then
  506. result=$(apt-get -q -y install ncurses-bin 2>&1)
  507. comprobarError $? 808 $result
  508. fi
  509. # Comprobar sed
  510. which sed > /dev/null 2>&1
  511. if [ $? -ne 0 ];then
  512. result=$(apt-get -q -y install sed 2>&1)
  513. comprobarError $? 809 $result
  514. fi
  515. # Comprobar curl
  516. which curl > /dev/null 2>&1
  517. if [ $? -ne 0 ];then
  518. result=$(apt-get -q -y install curl 2>&1)
  519. comprobarError $? 810 $result
  520. fi
  521. # Comprobamos tar, gzip, bzip2 y xz
  522. which tar > /dev/null 2>&1
  523. if [ $? -ne 0 ];then
  524. result=$(apt-get -q -y install tar 2>&1)
  525. comprobarError $? 811 $result
  526. fi
  527. which gzip > /dev/null 2>&1
  528. if [ $? -ne 0 ];then
  529. result=$(apt-get -q -y install gzip 2>&1)
  530. comprobarError $? 812 $result
  531. fi
  532. which bzip2 > /dev/null 2>&1
  533. if [ $? -ne 0 ];then
  534. result=$(apt-get -q -y install bzip2 2>&1)
  535. comprobarError $? 813 $result
  536. fi
  537. which xz > /dev/null 2>&1
  538. if [ $? -ne 0 ];then
  539. result=$(apt-get -q -y install xz-utils 2>&1)
  540. comprobarError $? 814 $result
  541. fi
  542. which openssl > /dev/null 2>&1
  543. if [ $? -ne 0 ];then
  544. result=$(apt-get -q -y install openssl 2>&1)
  545. comprobarError $? 815 $result
  546. fi
  547. ;;
  548. centos|fedora)
  549. # Comprobamos yum
  550. which yum > /dev/null 2>&1
  551. comprobarError $? 804
  552. # Actualizamos base de datos del repositorio
  553. echo -en "Actualizando repositorio YUM..." | tee -a $logFile
  554. result=$(yum -y makecache 2>&1)
  555. comprobarError $? 805 $result
  556. echo -en " OK.\n" | tee -a $logFile
  557. # Comprobamos Firewall (firewall-cmd)
  558. which firewall-cmd > /dev/null 2>&1
  559. comprobarError $? 807
  560. # Comprobamos tput
  561. which tput > /dev/null 2>&1
  562. if [ $? -ne 0 ];then
  563. result=$(yum -y install ncurses 2>&1)
  564. comprobarError $? 808 $result
  565. fi
  566. # Comprobar sed
  567. which sed > /dev/null 2>&1
  568. if [ $? -ne 0 ];then
  569. result=$(yum -y install sed 2>&1)
  570. comprobarError $? 809 $result
  571. fi
  572. # Comprobar curl
  573. which curl > /dev/null 2>&1
  574. if [ $? -ne 0 ];then
  575. result=$(yum -y install curl 2>&1)
  576. comprobarError $? 810 $result
  577. fi
  578. # Comprobamos tar, gzip, bzip2 y xz
  579. which tar > /dev/null 2>&1
  580. if [ $? -ne 0 ];then
  581. result=$(yum -y install tar 2>&1)
  582. comprobarError $? 811 $result
  583. fi
  584. which gzip > /dev/null 2>&1
  585. if [ $? -ne 0 ];then
  586. result=$(yum -y install gzip 2>&1)
  587. comprobarError $? 812 $result
  588. fi
  589. which bzip2 > /dev/null 2>&1
  590. if [ $? -ne 0 ];then
  591. result=$(yum -y install bzip2 2>&1)
  592. comprobarError $? 813 $result
  593. fi
  594. which xz > /dev/null 2>&1
  595. if [ $? -ne 0 ];then
  596. result=$(yum -y install xz 2>&1)
  597. comprobarError $? 814 $result
  598. fi
  599. which openssl > /dev/null 2>&1
  600. if [ $? -ne 0 ];then
  601. result=$(yum -y install openssl 2>&1)
  602. comprobarError $? 815 $result
  603. fi
  604. ;;
  605. esac
  606. }
  607. inicializarVariables() {
  608. # Inicializa las variables que necesitan de un estado previo
  609. apacheOn=false
  610. nginxOn=false
  611. mySQLOn=false
  612. mariaDBOn=false
  613. phpOn=false
  614. sslOn=false
  615. letsEncryptOn=false
  616. mediaWikiOn=false
  617. moodleOn=false
  618. infoPHPOn=false
  619. backupOn=false
  620. hostname=""
  621. logFile="./."$(basename $0)".log"
  622. maxUpload="100M"
  623. webServerName=""
  624. webServerUser=""
  625. webServerGroup=""
  626. sqlServerName=""
  627. dbType=""
  628. phpFPMName=""
  629. nombreMediaWiki=""
  630. dominioMediaWiki=""
  631. passwdMediaWiki=""
  632. nombreMoodle=""
  633. nombreCortoMoodle=""
  634. dominioMoodle=""
  635. passwdMoodle=""
  636. }
  637. instalacionExpress() {
  638. # Permite una instalación rápida, haciendo el menor número de preguntas
  639. # Defecto: Nginx + MariaDB + PHP + Let's Encrypt + MediaWiki + Moodle + Backup
  640. nginxOn=true
  641. case $ID in
  642. debian)
  643. mySQLOn=true
  644. dbType="mariadb"
  645. ;;
  646. ubuntu|centos|fedora)
  647. mariaDBOn=true
  648. dbType="mariadb"
  649. ;;
  650. esac
  651. phpOn=true
  652. sslOn=true
  653. letsEncryptOn=true
  654. mediaWikiOn=true
  655. moodleOn=true
  656. backupOn=true
  657. }
  658. mostrarBienvenida() {
  659. # Pantalla de bienvenida y muestra SO y estado de los discos
  660. ANCHO=$(tput cols)
  661. ALTO=$(tput lines)
  662. whiptail --title "INSTALACION MEDIAWIKI" --yesno "Este script automatiza completamente la instalación de una WIKI y un CAMPUS VIRTUAL.\nPara ello instala un servidor LAMP, el software MediaWiki 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"
  663. comprobarError $? 1
  664. }
  665. mostrarExpress() {
  666. # Pantalla de elección entre instalación express o avanzada
  667. 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ático.\nSeleccione el tipo de instalación que desee:" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) 2 \
  668. "Express" "Instalación rápida" ON \
  669. "Avanzada" "Permite escoger todas las opciones disponibles" OFF \
  670. --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  671. comprobarError $? 1
  672. case $express in
  673. Express)
  674. instalacionExpress
  675. # Preguntas mínimas
  676. establecerFQDN
  677. leerSQLPasswd
  678. mostrarMediaWiki
  679. mostrarMoodle
  680. mostrarConfirmacion
  681. ;;
  682. Avanzada)
  683. mostrarAvanzada
  684. ;;
  685. *)
  686. comprobarError 1 2
  687. ;;
  688. esac
  689. unset express
  690. }
  691. mostrarAvanzada() {
  692. # Pantalla que permite instalar un servidor LAMP o LEMP
  693. webServer=$(whiptail --title "INSTALACION AVANZADA" --radiolist "<ESPACIO>: seleccionar <TAB>: cambiar <FLECHAS>: moverse\n\nEscoge el tipo de Servidor Web que quieres instalar:" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) 2 \
  694. "LEMP" "GNU/Linux + (E)Nginx + MySQL/MariaDB + PHP-7" ON \
  695. "LAMP" "GNU/Linux + Apache + MySQL/MariaDB + PHP-7" OFF \
  696. --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  697. comprobarError $? 1
  698. for i in $webServer; do
  699. case $i in
  700. LEMP)
  701. nginxOn=true
  702. ;;
  703. LAMP)
  704. apacheOn=true
  705. ;;
  706. *)
  707. comprobarError 1 100
  708. ;;
  709. esac
  710. done
  711. # Opciones comunes
  712. establecerFQDN
  713. mostrarDatabase
  714. phpOn=true
  715. establecerMaxUpload
  716. mostrarComponentes
  717. mostrarConfirmacion
  718. unset webServer
  719. }
  720. mostrarComponentes() {
  721. # Pantalla de elección de componentes (SSL/TLS, MediaWiki, Moodle, InfoPHP y Backup)
  722. componentes=$(whiptail --title "INSTALACION AVANZADA" --checklist "<ESPACIO>: seleccionar <TAB>: cambiar <FLECHAS>: moverse\n\nEscoge los componentes que quieres instalar:" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) 5 \
  723. "SSL/TLS" "Instalar certificados para activar HTTPS" ON \
  724. "MediaWiki" "Instalar wiki con MediaWiki" ON \
  725. "Moodle" "Instalar campus virtual con Moodle" ON \
  726. "InfoPHP" "Instalar info.php (sólo para pruebas)" OFF \
  727. "Backup" "Programar backups automáticos" ON \
  728. --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  729. comprobarError $? 1
  730. # Mejora: autodetección de componentes ya instalados
  731. for i in $componentes; do
  732. case $i in
  733. \"SSL/TLS\")
  734. # 2 Opciones: Let's Encrypt o Autofirmado
  735. mostrarSSL
  736. ;;
  737. \"MediaWiki\")
  738. mediaWikiOn=true
  739. mostrarMediaWiki
  740. ;;
  741. \"Moodle\")
  742. moodleOn=true
  743. mostrarMoodle
  744. ;;
  745. \"InfoPHP\")
  746. infoPHPOn=true
  747. ;;
  748. \"Backup\")
  749. backupOn=true
  750. ;;
  751. *)
  752. comprobarError 1 3
  753. ;;
  754. esac
  755. done
  756. unset componentes
  757. }
  758. mostrarSSL() {
  759. # Pantalla que permite seleccionar el tipo de certificados
  760. ssl=$(whiptail --title "INSTALACION SSL/TLS" --radiolist "<ESPACIO>: seleccionar <TAB>: cambiar <FLECHAS>: moverse\n\nEscoge el tipo de Certificado SSL/TLS que quieres instalar:" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) 2 \
  761. "LetsEncrypt" "Compatible con todos los navegadores" ON \
  762. "Auto-Firmado" "Certificados auto-firmados (sólo para pruebas)" OFF \
  763. --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  764. comprobarError $? 1
  765. for i in $ssl; do
  766. case $i in
  767. LetsEncrypt)
  768. sslOn=true
  769. letsEncryptOn=true
  770. ;;
  771. Auto-Firmado)
  772. sslOn=true
  773. ;;
  774. *)
  775. comprobarError 1 6
  776. ;;
  777. esac
  778. done
  779. unset ssl
  780. }
  781. mostrarMediaWiki(){
  782. # Pantalla que pregunta sobre las opciones necesarias para configurar MediaWiki
  783. # Introducir nombre wiki
  784. while [ -z "$nombreMediaWiki" ]; do
  785. 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)
  786. comprobarError $? 1
  787. done
  788. # Introducir dominio
  789. while [ -z "$dominioMediaWiki" ]; do
  790. dominioMediaWiki=$(whiptail --title "CONFIGURACION MEDIAWIKI" --inputbox "Introduzca el dominio/subdominio de la Wiki.\nTenga en cuenta que debes apuntar este dominio a la dirección IP de esta máquina mediante un registro DNS de tipo CNAME.\nSi quiere introducir varios dominios sepárelos con espacios. El 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)
  791. comprobarError $? 1
  792. done
  793. cont=1
  794. serverName=""
  795. aliasMediaWiki=""
  796. for dominio in $dominioMediaWiki;do
  797. if [ $cont -eq 1 ];then
  798. # Dominio Principal (ServerName)
  799. serverName=$dominio
  800. else
  801. # Dominios Secundarios (ServerAlias)
  802. aliasMediaWiki=$aliasMediaWiki" "$dominio
  803. fi
  804. cont=$((cont + 1))
  805. done
  806. dominioMediaWiki=$serverName
  807. # Introducir contraseña
  808. control=false
  809. error=""
  810. while [ $control = false ]; do
  811. 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)
  812. comprobarError $? 1
  813. 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)
  814. comprobarError $? 1
  815. if [ -z "$passwdMediaWiki" ] || [ -z "$passwdMediaWiki2" ]; then
  816. error="ERROR: LA CONTRASEÑA NO PUEDE ESTAR VACIA.\n"
  817. elif [ $passwdMediaWiki != $passwdMediaWiki2 ];then
  818. error="ERROR: LAS CONTRASEÑAS NO COINCIDEN.\n"
  819. else
  820. control=true
  821. fi
  822. done
  823. unset control error passwdMediaWiki2 dominio cont serverName
  824. }
  825. mostrarMoodle() {
  826. # Pantalla que pregunta sobre las opciones necesarias para configurar Moodle
  827. # Introducir Nombre Moodle
  828. while [ -z "$nombreMoodle" ]; do
  829. 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)
  830. comprobarError $? 1
  831. done
  832. # Introducir Nombre Corto Moodle
  833. while [ -z "$nombreCortoMoodle" ]; do
  834. 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)
  835. comprobarError $? 1
  836. done
  837. nombreCortoMoodle=$(echo $nombreCortoMoodle | cut -d ' ' -f 1)
  838. # Introducir dominio
  839. while [ -z "$dominioMoodle" ]; do
  840. dominioMoodle=$(whiptail --title "CONFIGURACION MOODLE" --inputbox "Introduzca el dominio/subdominio del campus virtual.\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)
  841. comprobarError $? 1
  842. done
  843. cont=1
  844. serverName=""
  845. aliasMoodle=""
  846. for dominio in $dominioMoodle;do
  847. if [ $cont -eq 1 ];then
  848. # Dominio Principal (ServerName)
  849. serverName=$dominio
  850. else
  851. # Dominios Secundarios (ServerAlias)
  852. aliasMoodle=$aliasMoodle" "$dominio
  853. fi
  854. cont=$((cont + 1))
  855. done
  856. dominioMoodle=$serverName
  857. # Introducir contraseña
  858. control=false
  859. error=""
  860. while [ $control = false ]; do
  861. 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)
  862. comprobarError $? 1
  863. 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)
  864. comprobarError $? 1
  865. if [ -z "$passwdMoodle" ] || [ -z "$passwdMoodle2" ]; then
  866. error="ERROR: LA CONTRASEÑA NO PUEDE ESTAR VACIA.\n"
  867. elif [ $passwdMoodle != $passwdMoodle2 ];then
  868. error="ERROR: LAS CONTRASEÑAS NO COINCIDEN.\n"
  869. else
  870. control=true
  871. fi
  872. done
  873. unset control error passwdMoodle2 dominio cont serverName aliasMoodle
  874. }
  875. mostrarConfirmacion() {
  876. # Pantalla que presenta una confirmación antes de realizar la instalación
  877. 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 HACER ALGÚN CAMBIO EN EL FUTURO.\n¿DESEA CONTINUAR?" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --yes-button "Instalar" --no-button "Salir"
  878. comprobarError $? 1
  879. }
  880. establecerFQDN() {
  881. # Configura el FQDN (dominio principal del servidor)
  882. while [ -z "$hostname" ]; do
  883. 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)
  884. if [ $? -eq 0 ] && [ ! -z "$hostname" ]; then
  885. hostnamectl set-hostname $hostname
  886. else
  887. hostname=$(hostname)
  888. fi
  889. done
  890. echo -en "Hostname: $hostname\n" >> $logFile
  891. }
  892. instalarApache() {
  893. # Instala Apache2
  894. case $ID in
  895. debian|ubuntu)
  896. webServerName="apache2"
  897. result=$(apt-get -q -y install apache2 2>&1)
  898. comprobarError $? 101 $result
  899. ;;
  900. centos|fedora)
  901. webServerName="httpd"
  902. result=$(yum -y install httpd 2>&1)
  903. comprobarError $? 101 $result
  904. if [ $sslOn = true ];then
  905. # Instalamos módulo mod_ssl (no se instala por defecto)
  906. result=$(yum -y install mod_ssl 2>&1)
  907. comprobarError $? 101 $result
  908. fi
  909. ;;
  910. *)
  911. comprobarError 1 104
  912. ;;
  913. esac
  914. deshabilitarServicio $webServerName
  915. }
  916. configurarApache() {
  917. # Configura Apache2
  918. case $ID in
  919. debian|ubuntu)
  920. apacheConfFile="./etc/apache2/apache2.conf"
  921. if [ ! -f $apacheConfFile ];then
  922. comprobarError 1 4 $apacheConfFile
  923. fi
  924. cp -f $apacheConfFile /etc/$webServerName/apache2.conf 2>/dev/null
  925. comprobarError $? 108
  926. webServerUser=$(grep ^User /etc/$webServerName/apache2.conf | cut -d ' ' -f 2)
  927. webServerGroup=$(grep ^Group /etc/$webServerName/apache2.conf | cut -d ' ' -f 2)
  928. if [ ! -L /etc/$webServerName/logs ];then
  929. ln -s /var/log/apache2 /etc/$webServerName/logs 2>/dev/null
  930. comprobarError $? 108
  931. fi
  932. # Activamos mod_rewrite (no viene activado por defecto)
  933. a2enmod rewrite >/dev/null 2>&1
  934. comprobarError $? 108
  935. # Activamos mod_ssl y mod_headers (no viene activado por defecto)
  936. if [ $sslOn = true ];then
  937. a2enmod ssl >/dev/null 2>&1
  938. comprobarError $? 108
  939. a2enmod headers >/dev/null 2>&1
  940. comprobarError $? 108
  941. fi
  942. unset apacheConfFile
  943. ;;
  944. centos|fedora)
  945. apacheConfFile="./etc/apache2/conf/httpd.conf"
  946. sslConfFile="./etc/apache2/conf.d/ssl.conf"
  947. welcomeConfFile="/etc/apache2/conf.d/welcome.conf"
  948. if [ ! -f $apacheConfFile ];then
  949. comprobarError 1 4 $apacheConfFile
  950. fi
  951. cp -f $apacheConfFile /etc/$webServerName/conf/httpd.conf 2>/dev/null
  952. comprobarError $? 108
  953. # Desactivamos Mensaje de Bienvenida
  954. if [ -f $welcomeConfFile ];then
  955. sed -i -e 's/^/#/' $welcomeConfFile
  956. comprobarError $? 108
  957. fi
  958. # Configuramos mod_ssl
  959. if [ $sslOn = true ];then
  960. if [ ! -f $sslConfFile ];then
  961. comprobarError 1 4 $sslConfFile
  962. fi
  963. cp -f $sslConfFile /etc/$webServerName/conf.d/ssl.conf 2>/dev/null
  964. comprobarError $? 108
  965. fi
  966. webServerUser=$(grep ^User /etc/$webServerName/conf/httpd.conf | cut -d ' ' -f 2)
  967. webServerGroup=$(grep ^Group /etc/$webServerName/conf/httpd.conf | cut -d ' ' -f 2)
  968. unset apacheConfFile sslConfFile welcomeConfFile
  969. ;;
  970. *)
  971. comprobarError 1 108
  972. ;;
  973. esac
  974. # Creamos directorios sites-available y sites-enabled
  975. if [ ! -d "/etc/$webServerName/sites-available" ];then
  976. mkdir "/etc/$webServerName/sites-available" 2>/dev/null
  977. comprobarError $? 5 "/etc/$webServerName/sites-available"
  978. fi
  979. if [ ! -d "/etc/$webServerName/sites-enabled" ]; then
  980. mkdir "/etc/$webServerName/sites-enabled" 2>/dev/null
  981. comprobarError $? 5 "/etc/$webServerName/sites-enabled"
  982. else
  983. # Eliminar Virtual Host por defecto
  984. if [ -f /etc/$webServerName/sites-enabled/000-default.conf ];then
  985. rm -f /etc/$webServerName/sites-enabled/000-default.conf 2>/dev/null
  986. fi
  987. fi
  988. }
  989. instalarNginx() {
  990. # Instala Nginx
  991. webServerName="nginx"
  992. case $ID in
  993. ubuntu|debian)
  994. result=$(apt-get -q -y install nginx 2>&1)
  995. comprobarError $? 102 $result
  996. ;;
  997. centos)
  998. # Sólo para CentOS
  999. result=$(yum -y install epel-release)
  1000. comprobarError $? 103 $result
  1001. result=$(yum -y install nginx 2>&1)
  1002. comprobarError $? 102 $result
  1003. ;;
  1004. fedora)
  1005. result=$(yum -y install nginx 2>&1)
  1006. comprobarError $? 102 $result
  1007. ;;
  1008. *)
  1009. comprobarError 1 105
  1010. ;;
  1011. esac
  1012. deshabilitarServicio $webServerName
  1013. }
  1014. configurarNginx() {
  1015. # Configura Nginx
  1016. rm -Rf "/etc/$webServerName/!(sites-available|sites-enabled)" 2>/dev/null
  1017. comprobarError $? 107
  1018. nginxConfFile="./etc/$webServerName"
  1019. if [ -d "$nginxConfFile" ];then
  1020. cp -Rf $nginxConfFile/* /etc/$webServerName/ 2>/dev/null
  1021. comprobarError $? 107
  1022. else
  1023. comprobarError 1 5 "$nginxConfFile"
  1024. fi
  1025. # Creamos directorios sites-available y sites-enabled
  1026. if [ ! -d "/etc/$webServerName/sites-available" ];then
  1027. mkdir "/etc/$webServerName/sites-available" 2>/dev/null
  1028. comprobarError $? 5 "/etc/$webServerName/sites-available"
  1029. fi
  1030. if [ ! -d "/etc/$webServerName/sites-enabled" ]; then
  1031. mkdir "/etc/$webServerName/sites-enabled" 2>/dev/null
  1032. comprobarError $? 5 "/etc/$webServerName/sites-enabled"
  1033. else
  1034. # Eliminar Virtual Host por defecto
  1035. if [ -f /etc/$webServerName/sites-enabled/default ];then
  1036. rm -f /etc/$webServerName/sites-enabled/default 2>/dev/null
  1037. fi
  1038. fi
  1039. # Configuramos Usuario y Grupo
  1040. case $ID in
  1041. debian|ubuntu)
  1042. webServerUser="www-data"
  1043. webServerGroup=$webServerUser
  1044. ;;
  1045. centos|fedora)
  1046. webServerUser="nginx"
  1047. webServerGroup=$webServerUser
  1048. ;;
  1049. esac
  1050. sed -i '/user /c\user '$webServerUser';' /etc/$webServerName/nginx.conf
  1051. comprobarError $? 107
  1052. unset nginxConfFile
  1053. }
  1054. instalarVirtualHost() {
  1055. # Configuramos un Virtual Host para Apache o Nginx
  1056. # Uso: instalarVirtualHost $root $virtualHost $dominio $alias
  1057. if [ $# -ge 3 ];then
  1058. rootVirtualHost=$(realpath $1)
  1059. shift
  1060. virtualHostFile=$(realpath $1)
  1061. shift
  1062. dominioVirtualHost=$1
  1063. virtualHostName=$dominioVirtualHost".conf"
  1064. shift
  1065. aliasVirtualHost=$@
  1066. else
  1067. comprobarError 1 908
  1068. fi
  1069. if [ ! -f $virtualHostFile ];then
  1070. comprobarError 1 909 $virtualHostName
  1071. fi
  1072. if [ $apacheOn = true ];then
  1073. # Configuramos root, dominio y logs
  1074. sed -i '/ServerName /c\\tServerName '"$dominioVirtualHost" $virtualHostFile
  1075. comprobarError $? 908
  1076. if [ ! -z "$aliasVirtualHost" ];then
  1077. sed -i '/ServerName /a\\tServerAlias '"$aliasVirtualHost" $virtualHostFile
  1078. comprobarError $? 908
  1079. fi
  1080. sed -i '/DocumentRoot /c\\tDocumentRoot '"$rootVirtualHost" $virtualHostFile
  1081. comprobarError $? 908
  1082. sed -i '/ErrorLog /c\\tErrorLog logs/'"$dominioVirtualHost"'-error.log' $virtualHostFile
  1083. comprobarError $? 908
  1084. sed -i '/CustomLog /c\\tCustomLog logs/'"$dominioVirtualHost"'-access.log common' $virtualHostFile
  1085. comprobarError $? 908
  1086. if [ $sslOn = true ];then
  1087. sed -i '/SSLCertificateFile /c\\tSSLCertificateFile ssl/'"$dominioVirtualHost"'.crt' $virtualHostFile
  1088. comprobarError $? 908
  1089. sed -i '/SSLCertificateKeyFile /c\\tSSLCertificateKeyFile ssl/'"$dominioVirtualHost"'.key' $virtualHostFile
  1090. comprobarError $? 908
  1091. fi
  1092. elif [ $nginxOn = true ];then
  1093. # Configuramos root, dominio, logs y php-fpm.sock (NGINX)
  1094. sed -i '/root /c\\troot '$rootVirtualHost';' "$virtualHostFile"
  1095. comprobarError $? 908
  1096. sed -i '/server_name /c\\tserver_name '"$dominioVirtualHost"' '"$aliasVirtualHost"';' $virtualHostFile
  1097. comprobarError $? 908
  1098. sed -i '/access_log /c\\taccess_log /var/log/nginx/'"$dominioVirtualHost"'-access.log;' $virtualHostFile
  1099. comprobarError $? 908
  1100. sed -i '/error_log /c\\terror_log /var/log/nginx/'"$dominioVirtualHost"'-error.log;' $virtualHostFile
  1101. comprobarError $? 908
  1102. socket=$(find /var/run/ -type s -name 'php*.sock')
  1103. sed -i '/fastcgi_pass /c\\t\tfastcgi_pass unix:'"$socket"';' $virtualHostFile
  1104. comprobarError $? 908
  1105. if [ $sslOn = true ];then
  1106. sed -i '/ssl_certificate /c\\tssl_certificate ssl/'"$dominioVirtualHost"'.crt;' $virtualHostFile
  1107. comprobarError $? 908
  1108. sed -i '/ssl_certificate_key /c\\tssl_certificate_key ssl/'"$dominioVirtualHost"'.key;' $virtualHostFile
  1109. comprobarError $? 908
  1110. fi
  1111. fi
  1112. # Copiamos ficheros de configuración
  1113. cp -f $virtualHostFile "/etc/$webServerName/sites-available/$virtualHostName" >> $logFile 2>&1
  1114. comprobarError $? 910
  1115. if [ -f "/etc/$webServerName/sites-enabled/$virtualHostName" ];then
  1116. rm -f /etc/$webServerName/sites-enabled/$virtualHostName 2>/dev/null
  1117. comprobarError 911 $virtualHostName
  1118. fi
  1119. ln -s "/etc/$webServerName/sites-available/$virtualHostName" "/etc/$webServerName/sites-enabled/$virtualHostName" >> $logFile 2>&1
  1120. comprobarError $? 911 $virtualHostName
  1121. recargarServicio $webServerName
  1122. unset rootVirtualHost dominioVirtualHost virtualHostFile virtualHostName aliasVirtualHost socket
  1123. }
  1124. mostrarDatabase() {
  1125. # Pantalla que permite escoger entre instalar MariaDB o MySQL
  1126. case $ID in
  1127. debian)
  1128. 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"
  1129. comprobarError $? 1
  1130. # Excepción: aunque es MariaDB (se instala con el nombre de mysql-server)
  1131. mySQLOn=true
  1132. dbType="mariadb"
  1133. ;;
  1134. ubuntu)
  1135. case $VERSION in
  1136. 18.04)
  1137. 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 \
  1138. "MariaDB" "Instalar la base de datos MariaDB (fork de MySQL)" ON \
  1139. "MySQL" "Instalar la base de datos MySQL (uso no comercial)" OFF \
  1140. --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  1141. comprobarError $? 1
  1142. case $database in
  1143. MariaDB)
  1144. mariaDBOn=true
  1145. dbType="mariadb"
  1146. ;;
  1147. MySQL)
  1148. mySQLOn=true
  1149. dbType="mysqli"
  1150. ;;
  1151. *)
  1152. comprobarError 1 200
  1153. ;;
  1154. esac
  1155. ;;
  1156. 16.04)
  1157. # Ubuntu 16.04 presenta un bug en MySQL (así que lo deshabilitamos)
  1158. 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"
  1159. comprobarError $? 1
  1160. mariaDBOn=true
  1161. dbType="mariadb"
  1162. ;;
  1163. esac
  1164. ;;
  1165. centos|fedora)
  1166. 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"
  1167. comprobarError $? 1
  1168. mariaDBOn=true
  1169. dbType="mariadb"
  1170. ;;
  1171. *)
  1172. comprobarError 1 200
  1173. ;;
  1174. esac
  1175. # Otras opciones (contraseña)
  1176. leerSQLPasswd
  1177. }
  1178. leerSQLPasswd() {
  1179. # Pantalla para leer la contraseña para el usuario root de SQL
  1180. control=false
  1181. error=""
  1182. # Leemos la contreseña (stdin) y confirmamos
  1183. while [ $control = false ]; do
  1184. 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)
  1185. comprobarError $? 1
  1186. 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)
  1187. comprobarError $? 1
  1188. #echo -en "SQL Password 1: $sqlPasswd\n"
  1189. #echo -en "SQL Password 2: $sqlPasswd2\n"
  1190. if [ -z "$sqlPasswd" ] || [ -z "$sqlPasswd2" ]; then
  1191. error="ERROR: LA CONTRASEÑA NO PUEDE ESTAR VACIA.\n"
  1192. elif [ $sqlPasswd != $sqlPasswd2 ];then
  1193. error="ERROR: LAS CONTRASEÑAS NO COINCIDEN.\n"
  1194. else
  1195. control=true
  1196. fi
  1197. done
  1198. #echo -en "SQL Password: $sqlPasswd\n"
  1199. unset control error sqlPasswd2
  1200. }
  1201. establecerSQLPasswd() {
  1202. # Establecemos SQL root passwd y securizamos BD (mysql_secure_installation)
  1203. # Comprobamos si ya tiene una contraseña asignada
  1204. mysql -e "FLUSH PRIVILEGES" >> $logFile 2>&1
  1205. if [ $? -eq 0 ];then
  1206. # Establecemos contraseña del usuario root (y desactivamos posibles plugins para forzar login por contraseña)
  1207. mysql -e "UPDATE mysql.user SET plugin = '', Password = PASSWORD('$sqlPasswd') WHERE User = 'root'" >> $logFile 2>&1
  1208. if [ $? -ne 0 ];then
  1209. # Lo intentamos de otra forma (para versiones modernas de mysql)
  1210. mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '$sqlPasswd'" >> $logFile 2>&1
  1211. comprobarError $? 207
  1212. fi
  1213. # Aplicamos el cambio de contraseña
  1214. mysql -e "FLUSH PRIVILEGES" >> $logFile 2>&1
  1215. # Desactivamos acceso root desde el exterior (solo localhost)
  1216. 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
  1217. comprobarError $? 208
  1218. # Eliminamos todos los usuarios anónimos
  1219. mysql -u root --password=$sqlPasswd -e "DELETE FROM mysql.user WHERE User=''" >> $logFile 2>&1
  1220. comprobarError $? 209
  1221. # Eliminamos bases de datos 'test'
  1222. mysql -u root --password=$sqlPasswd -e "DROP DATABASE IF EXISTS test" >> $logFile 2>&1
  1223. comprobarError $? 210
  1224. # Eliminamos privilegios de la base de datos 'test'
  1225. mysql -u root --password=$sqlPasswd -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'" >> $logFile 2>&1
  1226. comprobarError $? 211
  1227. # Aplicamos los cambios
  1228. mysql -u root --password=$sqlPasswd -e "FLUSH PRIVILEGES" >> $logFile 2>&1
  1229. comprobarError $? 212
  1230. else
  1231. comprobarError 1 206
  1232. fi
  1233. }
  1234. instalarMySQL() {
  1235. # Instala MySQL (sólo para Debian)
  1236. sqlServerName="mysql"
  1237. case $ID in
  1238. debian|ubuntu)
  1239. result=$(apt-get -q -y install mysql-server mysql-client 2>&1)
  1240. comprobarError $? 201 $result
  1241. ;;
  1242. centos|fedora)
  1243. # MySQL no disponible en RHEL.
  1244. # No se instalará MySQL en distribuciones RHEL
  1245. comprobarError 1 205
  1246. ;;
  1247. *)
  1248. comprobarError 1 203
  1249. ;;
  1250. esac
  1251. deshabilitarServicio $sqlServerName
  1252. }
  1253. instalarMariaDB() {
  1254. # Instala MariaDB
  1255. sqlServerName="mariadb"
  1256. case $ID in
  1257. debian)
  1258. result=$(apt-get -q -y install mariadb-server mariadb-client 2>&1)
  1259. comprobarError $? 202 $result
  1260. ;;
  1261. ubuntu)
  1262. case $VERSION in
  1263. 16.04)
  1264. sqlServerName="mysql"
  1265. ;;
  1266. esac
  1267. result=$(apt-get -q -y install mariadb-server mariadb-client 2>&1)
  1268. comprobarError $? 202 $result
  1269. ;;
  1270. centos|fedora)
  1271. result=$(yum -y install mariadb-server mariadb 2>&1)
  1272. comprobarError $? 202 $result
  1273. ;;
  1274. *)
  1275. comprobarError 1 204
  1276. ;;
  1277. esac
  1278. deshabilitarServicio $sqlServerName
  1279. }
  1280. configurarSQL() {
  1281. # Configura BarracudaFS en mysql (necesario para Moodle)
  1282. # Configura MariaDB o MySQL
  1283. case $ID in
  1284. debian|ubuntu)
  1285. sqlConfFile="/etc/mysql/my.cnf"
  1286. ;;
  1287. centos|fedora)
  1288. sqlConfFile="/etc/my.cnf"
  1289. ;;
  1290. *)
  1291. comprobarError 1 213
  1292. ;;
  1293. esac
  1294. if [ ! -f $sqlConfFile ];then
  1295. comprobarError 1 213
  1296. fi
  1297. grep "# Configuration for Moodle" $sqlConfFile >/dev/null 2>&1
  1298. if [ $? -ne 0 ];then
  1299. # Establecemos UTF8 (codificación de caracteres) y Barracuda (sistema de ficheros)
  1300. echo -en "\n# Configuration for Moodle\n" >> $sqlConfFile
  1301. echo -en "[client]\n" >> $sqlConfFile
  1302. echo -en "default-character-set = utf8mb4\n\n" >> $sqlConfFile
  1303. echo -en "[mysqld]\n" >> $sqlConfFile
  1304. echo -en "innodb_file_format = Barracuda\n" >> $sqlConfFile
  1305. echo -en "innodb_file_per_table = 1\n" >> $sqlConfFile
  1306. echo -en "innodb_large_prefix\n\n" >> $sqlConfFile
  1307. echo -en "character-set-server = utf8mb4\n" >> $sqlConfFile
  1308. echo -en "collation-server = utf8mb4_unicode_ci\n" >> $sqlConfFile
  1309. echo -en "skip-character-set-client-handshake\n\n" >> $sqlConfFile
  1310. echo -en "[mysql]\n" >> $sqlConfFile
  1311. echo -en "default-character-set = utf8mb4\n" >> $sqlConfFile
  1312. else
  1313. comprobarError 1 214
  1314. fi
  1315. unset sqlConfFile
  1316. }
  1317. instalarPHP() {
  1318. # Instalamos PHP-7 y los módulos PHP que necesitan MediaWiki y Moodle
  1319. case $ID in
  1320. debian)
  1321. phpFPMName="php7.0-fpm"
  1322. if [ $apacheOn = true ]; then
  1323. 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)
  1324. comprobarError $? 302 $result
  1325. elif [ $nginxOn = true ];then
  1326. 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)
  1327. comprobarError $? 302 $result
  1328. deshabilitarServicio $phpFPMName
  1329. else
  1330. comprobarError 1 301
  1331. fi
  1332. ;;
  1333. ubuntu)
  1334. case $VERSION in
  1335. 18.04)
  1336. phpFPMName="php7.2-fpm"
  1337. ;;
  1338. 16.04)
  1339. phpFPMName="php7.0-fpm"
  1340. ;;
  1341. esac
  1342. if [ $apacheOn = true ]; then
  1343. 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)
  1344. comprobarError $? 302 $result
  1345. elif [ $nginxOn = true ];then
  1346. 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)
  1347. comprobarError $? 302 $result
  1348. deshabilitarServicio $phpFPMName
  1349. else
  1350. comprobarError 1 301
  1351. fi
  1352. ;;
  1353. centos)
  1354. phpFPMName="php-fpm"
  1355. # Necesitamos un repositorio adicional para PHP-7 (EPEL-RELEASE) sólo en CentOS
  1356. result=$(yum -y install epel-release yum-utils 2>&1)
  1357. comprobarError $? 103 $result
  1358. # Necesitamos un repositorio adicional para PHP-7 (REMI-RELEASE)
  1359. if [ ! -f /etc/yum.repos.d/remi-php72.repo ];then
  1360. result=$(yum -y install "http://remi.mirrors.cu.be/enterprise/remi-release-7.rpm" 2>&1)
  1361. comprobarError $? 303 $result
  1362. fi
  1363. # Activamos repositorio remi-php72
  1364. result=$(yum-config-manager --enable remi-php72 2>&1)
  1365. comprobarError $? 303 $result
  1366. # Instalamos PHP-7.2
  1367. if [ $apacheOn = true ];then
  1368. 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)
  1369. comprobarError $? 302 $result
  1370. elif [ $nginxOn = true ];then
  1371. 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)
  1372. comprobarError $? 302 $result
  1373. deshabilitarServicio $phpFPMName
  1374. else
  1375. comprobarError 1 301
  1376. fi
  1377. ;;
  1378. fedora)
  1379. phpFPMName="php-fpm"
  1380. # Instalamos PHP-7.2
  1381. if [ $apacheOn = true ];then
  1382. 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)
  1383. comprobarError $? 302 $result
  1384. elif [ $nginxOn = true ];then
  1385. 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)
  1386. comprobarError $? 302 $result
  1387. deshabilitarServicio $phpFPMName
  1388. else
  1389. comprobarError 1 301
  1390. fi
  1391. ;;
  1392. *)
  1393. comprobarError 1 300
  1394. ;;
  1395. esac
  1396. }
  1397. configurarPHP() {
  1398. # Configura PHP para segurizarlo y establecer máximo de subida.
  1399. case $ID in
  1400. debian)
  1401. phpConfFile="./etc/php/php.ini.debian"
  1402. phpDest="/etc/php/7.0/cli/php.ini"
  1403. ;;
  1404. ubuntu)
  1405. phpConfFile="./etc/php/php.ini.debian"
  1406. case $VERSION in
  1407. 18.04)
  1408. phpDest="/etc/php/7.2/cli/php.ini"
  1409. ;;
  1410. 16.04)
  1411. phpDest="/etc/php/7.0/cli/php.ini"
  1412. ;;
  1413. esac
  1414. ;;
  1415. centos|fedora)
  1416. phpConfFile="./etc/php/php.ini.rhel"
  1417. phpDest="/etc/php.ini"
  1418. ;;
  1419. *)
  1420. comprobarError 1 305
  1421. ;;
  1422. esac
  1423. if [ ! -f $phpConfFile ];then
  1424. comprobarError 1 4 "$phpConfFile"
  1425. fi
  1426. # Copiamos configuración
  1427. cp -f $phpConfFile $phpDest 2>/dev/null
  1428. comprobarError $? 305
  1429. # Configuramos cgi.fix_pathinfo
  1430. sed -i '/cgi.fix_pathinfo=/c\cgi.fix_pathinfo=0' $phpDest
  1431. comprobarError $? 305
  1432. # Configuramos post_max_size
  1433. sed -i '/post_max_size =/c\post_max_size = '$maxUpload $phpDest
  1434. comprobarError $? 305
  1435. # Configuramos upload_max_filesize
  1436. sed -i '/upload_max_filesize =/c\upload_max_filesize = '$maxUpload $phpDest
  1437. comprobarError $? 305
  1438. # Configurar php-fpm (sólo en RHEL con Nginx)
  1439. case $ID in
  1440. centos|fedora)
  1441. if [ $nginxOn = true ];then
  1442. # Configurar Socket UNIX
  1443. phpConfFile="./etc/php/php-fpm.d/www.conf"
  1444. phpDest="/etc/php-fpm.d/www.conf"
  1445. if [ ! -f $phpConfFile ];then
  1446. comprobarError $? 4 "$phpConfFile"
  1447. fi
  1448. cp -f $phpConfFile $phpDest 2>/dev/null
  1449. comprobarError $? 305
  1450. # Configurar Permisos /var/lib/php
  1451. chown -R $webServerUser:$webServerGroup /var/lib/php/
  1452. comprobarError $? 305
  1453. fi
  1454. ;;
  1455. esac
  1456. unset phpConfFile phpDest
  1457. }
  1458. establecerMaxUpload() {
  1459. # Pantalla para establecer el máximo de subida al servidor (vía PHP)
  1460. control=false
  1461. error=""
  1462. while [ $control = false ];do
  1463. maxUpload2=$(whiptail --title "PHP MAX UPLOAD" --inputbox "$error""Introduzca el tamaño máximo 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)
  1464. comprobarError $? 1
  1465. if [ -z "$maxUpload2" ];then
  1466. error="ERROR: NO PUEDES DEJAR ESTE PARÁMETRO VACIO.\n"
  1467. else
  1468. control=true
  1469. fi
  1470. done
  1471. maxUpload=$maxUpload2
  1472. unset control maxUpload2
  1473. }
  1474. instalarLetsEncrypt() {
  1475. # Instala certbot (para certificados Let's Encrypt)
  1476. # Comprobamos si cerbot está instalado
  1477. which certbot > /dev/null 2>&1
  1478. if [ $? -ne 0 ];then
  1479. # Descargar Let's Encrypt, hacer ejecutable e instalar
  1480. curl -o ./var/certbot https://dl.eff.org/certbot-auto 2>/dev/null
  1481. comprobarError $? 401
  1482. chmod 755 ./var/certbot 2>/dev/null
  1483. comprobarError $? 401
  1484. cp -f ./var/certbot /usr/bin/certbot 2>/dev/null
  1485. comprobarError $? 401
  1486. # Configurar /etc/cron.d/certbot para renovar automáticamente los certificados
  1487. echo -en "# /etc/cron.d/certbot: certbot autorenew the certificates twice a day\n" > /etc/cron.d/certbot
  1488. echo -en "SHELL=/bin/sh\n" >> /etc/cron.d/certbot
  1489. echo -en "PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin\n\n" >> /etc/cron.d/certbot
  1490. echo -en "# Job start twice per day (4am & 2pm) in a random minute" >> /etc/cron.d/certbot
  1491. echo -en "0 4,14 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew\n" >> /etc/cron.d/certbot
  1492. fi
  1493. }
  1494. generarCertLetsEncrypt() {
  1495. # Generar Certificados SEGUROS Let's Encrypt
  1496. dominios=""
  1497. if [ $apacheOn = true ];then
  1498. # Usamos plugin para apache
  1499. if [ $mediaWikiOn = true ];then
  1500. if [ ! -z "$aliasMediaWiki" ];then
  1501. dominios=$dominioMediaWiki$(echo "$aliasMediaWiki" | sed -e 's/ /,/g')
  1502. else
  1503. dominios=$dominioMediaWiki
  1504. fi
  1505. certbot -n --agree-tos --email "admin@$hostname" --apache --domains "$dominios" >> $logFile 2>&1
  1506. comprobarError $? 404
  1507. fi
  1508. if [ $moodleOn = true ];then
  1509. certbot -n --agree-tos --email "admin@$hostname" --apache --domains "$dominioMoodle" >> $logFile 2>&1
  1510. comprobarError $? 404
  1511. fi
  1512. elif [ $nginxOn = true ];then
  1513. # Usamos plugin para nginx
  1514. if [ $mediaWikiOn = true ];then
  1515. if [ ! -z "$aliasMediaWiki" ];then
  1516. dominios=$dominioMediaWiki$(echo "$aliasMediaWiki" | sed -e 's/ /,/g')
  1517. else
  1518. dominios=$dominioMediaWiki
  1519. fi
  1520. certbot -n --agree-tos --email "admin@$hostname" --nginx --domains "$dominios" >> $logFile 2>&1
  1521. comprobarError $? 404
  1522. fi
  1523. if [ $moodleOn = true ];then
  1524. certbot -n --agree-tos --email "admin@$hostname" --nginx --domains "$dominioMoodle" >> $logFile 2>&1
  1525. comprobarError $? 404
  1526. fi
  1527. else
  1528. comprobarError 1 404
  1529. fi
  1530. unset dominios
  1531. }
  1532. generarCertAutofirmado() {
  1533. # Genera certificados autofirmados
  1534. # Estos certificados no son seguros, pero valen para pruebas o como paso intermedio para obtener los válidos
  1535. # Uso: generarCertAutofirmado $dominio
  1536. dominio=$1
  1537. sslDir="/etc/$webServerName/ssl"
  1538. keyFile="$sslDir/$dominio.key"
  1539. reqFile="$sslDir/$dominio.csr"
  1540. certFile="$sslDir/$dominio.crt"
  1541. dhParamFile="$sslDir/dhparam.pem"
  1542. if [ ! -d "$sslDir" ];then
  1543. mkdir "$sslDir" 2>/dev/null
  1544. comprobarError $? 5 "$sslDir"
  1545. fi
  1546. # Generamos clave privada RSA de 2048 bits
  1547. openssl genrsa -out "$keyFile" 2048 >/dev/null 2>&1
  1548. comprobarError $? 402
  1549. # Generamos petición de firma
  1550. 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
  1551. comprobarError $? 402
  1552. # Autofirmados clave para 2 años (730 días)
  1553. openssl x509 -req -days 730 -in "$reqFile" -signkey "$keyFile" -out "$certFile" >/dev/null 2>&1
  1554. comprobarError $? 402
  1555. # Eliminamos petición
  1556. rm -f $reqFile
  1557. comprobarError $? 402
  1558. # Añadimos clave Diffie-Hellman al certificado
  1559. if [ -f "$dhParamFile" ];then
  1560. cat "$dhParamFile" >> $certFile
  1561. comprobarError $? 402
  1562. fi
  1563. # Cambiamos permisos
  1564. chmod 644 $certFile
  1565. comprobarError $? 402
  1566. chmod 400 $keyFile
  1567. comprobarError $? 402
  1568. unset dominio sslDir keyFile reqFile certFile dhParamFile
  1569. }
  1570. generarDHParam() {
  1571. # Genera clave de intercambio Diffie-Hellman y lo configuramos
  1572. # Esto aumenta notablemente la seguridad de SSL/TLS
  1573. sslDir="/etc/$webServerName/ssl"
  1574. dhParamFile="$sslDir/dhparam.pem"
  1575. nginxConfFile="/etc/$webServerName/nginx.conf"
  1576. if [ ! -d "$sslDir" ];then
  1577. mkdir "$sslDir" 2>/dev/null
  1578. comprobarError $? 5 "$sslDir"
  1579. fi
  1580. openssl dhparam -out "$dhParamFile" 2048 >/dev/null 2>&1
  1581. comprobarError $? 403
  1582. # Configuramos Servidor Web
  1583. if [ $nginxOn = true ];then
  1584. sed -i '/ssl_param /c\\tssl_dhparam '$dhParamFile';' $nginxConfFile
  1585. comprobarError $? 403
  1586. fi
  1587. # unset sslDir dhParamFile apacheConfFile nginxConfFile
  1588. unset sslDir dhParamFile nginxConfFile
  1589. }
  1590. habilitarServicio() {
  1591. # Arrancamos y habilitamos el servicio (con SystemD, Upstart o SystemV)
  1592. # Intentamos con systemctl (SystemD)
  1593. #echo -en "Habilitando Servicio '$1'" | tee -a $logFile
  1594. if [ $# -le 0 ];then
  1595. comprobarError 1 900
  1596. fi
  1597. which systemctl > /dev/null 2>&1
  1598. if [ $? -eq 0 ]; then
  1599. #echo -en " (SystemD)..." | tee -a $logFile
  1600. systemctl start $1 > /dev/null 2>&1
  1601. comprobarError $? 901 $1
  1602. systemctl enable $1 > /dev/null 2>&1
  1603. comprobarError $? 902 $1
  1604. else
  1605. # Intentamos con service (Upstart)
  1606. which service > /dev/null 2>&1
  1607. if [ $? -eq 0 ]; then
  1608. #echo -en " (Upstart)..." | tee -a $logFile
  1609. service $1 start > /dev/null 2>&1
  1610. comprobarError $? 901 $1
  1611. else
  1612. # Intentamos con init.d (SystemV)
  1613. #echo -en " (SystemV)..." | tee -a $logFile
  1614. /etc/init.d/$1 start > /dev/null 2>&1
  1615. comprobarError $? 901 $1
  1616. fi
  1617. # Intentamos habilitar en el arranque (Upstart)
  1618. which update-rc.d > /dev/null 2>&1
  1619. if [ $? -eq 0 ];then
  1620. update-rc.d $1 enable
  1621. comprobarError $? 902 $1
  1622. else
  1623. # Intentamos habilitar en el arranque (SystemV)
  1624. which chkconfig > /dev/null 2>&1
  1625. if [ $? -eq 0 ];then
  1626. chkconfig $1 on
  1627. comprobarError $? 902 $1
  1628. else
  1629. # ¿Qué mas opciones nos quedan?
  1630. comprobarError 1 902 $1
  1631. fi
  1632. fi
  1633. fi
  1634. # Mejora: comprobar si el servicio está parado
  1635. #echo -en " OK.\n" | tee -a $logFile
  1636. }
  1637. deshabilitarServicio() {
  1638. # Paramos y deshabilitamos el servicio (con SystemD, Upstart o SystemV)
  1639. # Intentamos con systemctl (SystemD)
  1640. #echo -en "Deshabilitando Servicio '$1'" | tee -a $logFile
  1641. if [ $# -le 0 ];then
  1642. comprobarError 1 903
  1643. fi
  1644. which systemctl > /dev/null 2>&1
  1645. if [ $? -eq 0 ]; then
  1646. #echo -en " (SystemD)..." | tee -a $logFile
  1647. systemctl stop $1 > /dev/null 2>&1
  1648. comprobarError $? 904 $1
  1649. systemctl disable $1 > /dev/null 2>&1
  1650. comprobarError $? 905 $1
  1651. else
  1652. # Intentamos con service (Upstart)
  1653. which service > /dev/null 2>&1
  1654. if [ $? -eq 0 ]; then
  1655. #echo -en " (Upstart)..." | tee -a $logFile
  1656. service $1 stop > /dev/null 2>&1
  1657. comprobarError $? 904 $1
  1658. else
  1659. # Intentamos con init.d (SystemV)
  1660. #echo -en " (SystemV)..." | tee -a $logFile
  1661. /etc/init.d/$1 stop > /dev/null 2>&1
  1662. comprobarError $? 904 $1
  1663. fi
  1664. # Intentamos habilitar en el arranque (Upstart)
  1665. which update-rc.d > /dev/null 2>&1
  1666. if [ $? -eq 0 ];then
  1667. update-rc.d $1 disable
  1668. comprobarError $? 905 $1
  1669. else
  1670. # Intentamos habilitar en el arranque (SystemV)
  1671. which chkconfig > /dev/null 2>&1
  1672. if [ $? -eq 0 ];then
  1673. chkconfig $1 off
  1674. comprobarError $? 905 $1
  1675. else
  1676. # ¿Qué mas opciones nos quedan?
  1677. comprobarError 1 905 $1
  1678. fi
  1679. fi
  1680. fi
  1681. # Mejora: comprobar si el servicio está funcionando
  1682. #echo -en " OK.\n" | tee -a $logFile
  1683. }
  1684. recargarServicio() {
  1685. # Recargamos el servicio (con SystemD, Upstart o SystemV)
  1686. # Intentamos con systemctl (SystemD)
  1687. #echo -en "Recargando Servicio '$1'" | tee -a $logFile
  1688. if [ $# -le 0 ];then
  1689. comprobarError 1 912
  1690. fi
  1691. which systemctl > /dev/null 2>&1
  1692. if [ $? -eq 0 ]; then
  1693. #echo -en " (SystemD)..." | tee -a $logFile
  1694. systemctl reload $1 > /dev/null 2>&1
  1695. comprobarError $? 913 $1
  1696. else
  1697. # Intentamos con service (Upstart)
  1698. which service > /dev/null 2>&1
  1699. if [ $? -eq 0 ]; then
  1700. #echo -en " (Upstart)..." | tee -a $logFile
  1701. service $1 reload > /dev/null 2>&1
  1702. comprobarError $? 913 $1
  1703. else
  1704. # Intentamos con init.d (SystemV)
  1705. #echo -en " (SystemV)..." | tee -a $logFile
  1706. /etc/init.d/$1 reload > /dev/null 2>&1
  1707. comprobarError $? 913 $1
  1708. fi
  1709. fi
  1710. # Mejora: comprobar si el servicio está funcionando
  1711. #echo -en " OK.\n" | tee -a $logFile
  1712. }
  1713. configurarCortafuegos() {
  1714. # Configuramos cortafuegos (añadir reglas y encender)
  1715. # Comprobamos si estamos usando SSH
  1716. esSSH $PPID
  1717. case $ID in
  1718. debian|ubuntu)
  1719. ufw allow 80/tcp >> $logFile 2>&1
  1720. comprobarError $? 906 "80/tcp"
  1721. if [ $sshControl = true ];then
  1722. ufw allow 22/tcp >> $logFile 2>&1
  1723. comprobarError $? 906 "22/tcp"
  1724. fi
  1725. if [ $sslOn = true ];then
  1726. ufw allow 443/tcp >> $logFile 2>&1
  1727. comprobarError $? 906 "443/tcp"
  1728. fi
  1729. ufw --force enable >> $logFile 2>&1
  1730. comprobarError $? 907
  1731. ;;
  1732. centos|fedora)
  1733. firewall-cmd --add-port=80/tcp >> $logFile 2>&1
  1734. comprobarError $? 906 "80/tcp"
  1735. if [ $sshControl = true ];then
  1736. firewall-cmd --add-port=22/tcp >> $logFile 2>&1
  1737. comprobarError $? 906 "22/tcp"
  1738. fi
  1739. if [ $sslOn = true ];then
  1740. firewall-cmd --add-port=443/tcp >> $logFile 2>&1
  1741. comprobarError $? 906 "443/tcp"
  1742. fi
  1743. firewall-cmd --runtime-to-permanent >> $logFile 2>&1
  1744. comprobarError $? 907
  1745. habilitarServicio firewalld >> $logFile 2>&1
  1746. comprobarError $? 907
  1747. ;;
  1748. esac
  1749. unset sshControl
  1750. }
  1751. esSSH() {
  1752. # Comprobamos si nuestro terminal usa SSH
  1753. p=${1:-$PPID}
  1754. #read pid name x ppid y < <( cat /proc/$p/stat )
  1755. read pid name ppid < <( ps -o pid= -o comm= -o ppid= -p $p)
  1756. [[ "$name" =~ sshd ]] && { sshControl=true; return 0; }
  1757. [ "$ppid" -le 1 ] && { sshControl=false; return 1; }
  1758. esSSH $ppid
  1759. }
  1760. descargarMediaWiki() {
  1761. # Descargar la versión 1.31.0 de MediaWiki
  1762. if [ ! -d ./var ];then
  1763. comprobarError 1 5 "./var"
  1764. fi
  1765. curl "https://releases.wikimedia.org/mediawiki/1.31/mediawiki-1.31.0.tar.gz" 2>/dev/null | tar -xz -C "./var/"
  1766. comprobarError $? 501
  1767. }
  1768. configurarMediaWiki() {
  1769. # Configuramos MediaWiki
  1770. if [ ! -f /var/www/$dominioMediaWiki/LocalSettings.php ];then
  1771. # Copiamos archivos
  1772. cp -fR ./var/mediawiki-1.31.0/ /var/www/$dominioMediaWiki
  1773. comprobarError $? 502
  1774. # Configuramos LocalSettings.php (y crea la base de datos por nosotros)
  1775. nombreDBMW=$(echo $dominioMediaWiki | sed -e 's/\./_/g' | sed -e 's/-/_/g')
  1776. userDBMW=$(echo "mediawiki_user" | sed -e 's/\./_/g' | sed -e 's/-/_/g')
  1777. 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
  1778. comprobarError $? 502
  1779. # Configuraciones adicionales
  1780. sed -i '/$wgLanguageCode =/c\$wgLanguageCode = "es";' /var/www/$dominioMediaWiki/LocalSettings.php
  1781. comprobarError $? 502
  1782. sed -i '/$wgEnableEmail =/c\$wgEnableEmail = false;' /var/www/$dominioMediaWiki/LocalSettings.php
  1783. comprobarError $? 502
  1784. sed -i '/$wgEnableUploads =/c\$wgEnableUploads = true;' /var/www/$dominioMediaWiki/LocalSettings.php
  1785. comprobarError $? 502
  1786. echo -en "\$wgArticlePath = \"/wiki/\$1\";\n" >> /var/www/$dominioMediaWiki/LocalSettings.php
  1787. echo -en "\$wgUsePathInfo = true;\n" >> /var/www/$dominioMediaWiki/LocalSettings.php
  1788. echo -en "\$wgGroupPermissions['*']['createaccount'] = true;\n" >> /var/www/$dominioMediaWiki/LocalSettings.php
  1789. echo -en "\$wgGroupPermissions['*']['edit'] = false;\n" >> /var/www/$dominioMediaWiki/LocalSettings.php
  1790. echo -en "\$wgGroupPermissions['*']['read'] = true;\n" >> /var/www/$dominioMediaWiki/LocalSettings.php
  1791. # Actualizamos permisos
  1792. chown -R $webServerUser:$webServerGroup /var/www/$dominioMediaWiki
  1793. comprobarError $? 502
  1794. # Configuramos VirtualHost
  1795. if [ $apacheOn = true ] && [ $sslOn = false ];then
  1796. virtualHost="./etc/apache2/sites-available/mediawiki.conf"
  1797. elif [ $nginxOn = true ] && [ $sslOn = false ];then
  1798. virtualHost="./etc/nginx/sites-available/mediawiki.conf"
  1799. elif [ $apacheOn = true ] && [ $sslOn = true ];then
  1800. virtualHost="./etc/apache2/sites-available/mediawiki-ssl.conf"
  1801. elif [ $nginxOn = true ] && [ $sslOn = true ];then
  1802. virtualHost="./etc/nginx/sites-available/mediawiki-ssl.conf"
  1803. else
  1804. comprobarError 1 502
  1805. fi
  1806. if [ ! -f $virtualHost ];then
  1807. comprobarError $? 502
  1808. fi
  1809. instalarVirtualHost "/var/www/$dominioMediaWiki" $virtualHost $dominioMediaWiki $aliasMediaWiki
  1810. unset virtualHost
  1811. else
  1812. comprobarError 1 503 $dominioMediaWiki
  1813. fi
  1814. }
  1815. descargarMoodle() {
  1816. # Descargar la versión 1.31.0 de MediaWiki
  1817. if [ ! -d ./var ];then
  1818. comprobarError 1 5 "./var"
  1819. fi
  1820. #echo -en "Descargando Moodle-3.5-1..." | tee -a $logFile
  1821. #curl -o "./var/moodle-3.5.1.tgz" "https://download.moodle.org/download.php/direct/stable35/moodle-latest-35.tgz" >> $logFile 2>&1
  1822. curl "https://download.moodle.org/download.php/direct/stable35/moodle-latest-35.tgz" 2>/dev/null | tar -xz -C "./var/"
  1823. comprobarError $? 501
  1824. #echo -en " OK.\n" | tee -a $logFile
  1825. }
  1826. configurarMoodle() {
  1827. # Configurar Moodle
  1828. if [ ! -f /var/www/$dominioMoodle/config.php ];then
  1829. # Copiamos archivos
  1830. cp -Rf ./var/moodle/ /var/www/$dominioMoodle
  1831. comprobarError $? 602
  1832. # Crear carperta de datos (no online)
  1833. if [ ! -d /var/www/moodledata ];then
  1834. mkdir /var/www/moodledata 2>/dev/null
  1835. comprobarError $? 602
  1836. fi
  1837. #Actualizamos permisos
  1838. perm=$(stat -c %a /var/www/moodledata)
  1839. if [ $perm -ne 777 ];then
  1840. chmod -R 777 /var/www/moodledata 2>/dev/null
  1841. comprobarError $? 602
  1842. fi
  1843. perm=$(stat -c %U /var/www/moodledata)
  1844. if [ $perm != "$webServerUser" ];then
  1845. chown -R $webServerUser:$webServerGroup /var/www/moodledata 2>/dev/null
  1846. comprobarError $? 602
  1847. fi
  1848. unset perm
  1849. # Creamos Base de Datos
  1850. nombreDBMo=$(echo $dominioMoodle | sed -e 's/\./_/g' | sed -e 's/-/_/g')
  1851. userDBMo=$(echo "moodle_user" | sed -e 's/\./_/g' | sed -e 's/-/_/g')
  1852. crearDBMoodle
  1853. # Configuramos e instalamos Moodle
  1854. if [ $sslOn = true ];then
  1855. wwwroot="https://$dominioMoodle"
  1856. else
  1857. wwwroot="http://$dominioMoodle"
  1858. fi
  1859. 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
  1860. comprobarError $? 602
  1861. # Actualizamos permisos
  1862. chown -R $webServerUser:$webServerGroup /var/www/$dominioMoodle /var/www/moodledata
  1863. # Configurar SE-Linux (RHEL)
  1864. case $ID in
  1865. centos|fedora)
  1866. configurarSELinux
  1867. ;;
  1868. esac
  1869. # Configuramos VirtualHost
  1870. if [ $apacheOn = true ] && [ $sslOn = false ];then
  1871. virtualHost="./etc/apache2/sites-available/moodle.conf"
  1872. elif [ $nginxOn = true ] && [ $sslOn = false ];then
  1873. virtualHost="./etc/nginx/sites-available/moodle.conf"
  1874. elif [ $apacheOn = true ] && [ $sslOn = true ];then
  1875. virtualHost="./etc/apache2/sites-available/moodle-ssl.conf"
  1876. elif [ $nginxOn = true ] && [ $sslOn = true ];then
  1877. virtualHost="./etc/nginx/sites-available/moodle-ssl.conf"
  1878. else
  1879. comprobarError 1 602
  1880. fi
  1881. instalarVirtualHost "/var/www/$dominioMoodle" $virtualHost $dominioMoodle
  1882. unset virtualHost wwwroot
  1883. else
  1884. comprobarError 1 603 $dominioMoodle
  1885. fi
  1886. }
  1887. crearDBMoodle() {
  1888. # Crear base de datos para Moodle
  1889. dbDir="./etc/db"
  1890. if [ ! -d $dbDir ];then
  1891. mkdir $dbDir 2>/dev/null
  1892. comprobarError $? 603
  1893. fi
  1894. dbFile=$dbDir"/moodle.sql"
  1895. echo -en "CREATE DATABASE IF NOT EXISTS $nombreDBMo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n" > $dbFile
  1896. echo -en "GRANT ALL PRIVILEGES ON $nombreDBMo.* TO '$userDBMo'@'localhost' IDENTIFIED BY '$sqlPasswd';\n" >> $dbFile
  1897. mysql -u root --password=$sqlPasswd < $dbFile > /dev/null 2>&1
  1898. control=$?
  1899. rm -f $dbFile 2>/dev/null
  1900. comprobarError $? 603
  1901. comprobarError $control 603
  1902. unset control dbFile dbDir
  1903. }
  1904. configurarSELinux() {
  1905. # Configurar SELinux
  1906. which semanage >/dev/null 2>&1
  1907. if [ $? -ne 0 ];then
  1908. case $ID in
  1909. centos)
  1910. result=$(yum -y install policycoreutils-python 2>&1)
  1911. comprobarError $? 605 $result
  1912. ;;
  1913. fedora)
  1914. result=$(yum -y install policycoreutils-python-utils 2>&1)
  1915. comprobarError $? 605 $result
  1916. ;;
  1917. *)
  1918. comprobarError 1 604
  1919. ;;
  1920. esac
  1921. fi
  1922. semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/moodledata(/.*)?" > /dev/null 2>&1
  1923. #comprobarError $? 604
  1924. restorecon -R /var/www/ > /dev/null 2>&1
  1925. comprobarError $? 604
  1926. }
  1927. instalarPHPInfo() {
  1928. # Instalar fichero info.php y su VirtualHost
  1929. if [ ! -f /etc/$webServerName/sites-enabled/phpinfo.conf ];then
  1930. infoFile="./var/www/info.php"
  1931. if [ ! -f $infoFile ];then
  1932. comprobarError 1 4 "$infoFile"
  1933. fi
  1934. mkdir /var/www/localhost 2>/dev/null
  1935. comprobarError $? 106
  1936. cp -f $infoFile /var/www/localhost/ 2>/dev/null
  1937. comprobarError $? 106
  1938. chown -R $webServerUser:$webServerGroup /var/www/localhost 2>/dev/null
  1939. comprobarError $? 106
  1940. unset infoFile
  1941. # Instalar VirtualHost
  1942. if [ $apacheOn = true ] && [ $sslOn = false ];then
  1943. virtualHost="./etc/apache2/sites-available/phpinfo.conf"
  1944. elif [ $nginxOn = true ] && [ $sslOn = false ];then
  1945. virtualHost="./etc/nginx/sites-available/phpinfo.conf"
  1946. elif [ $apacheOn = true ] && [ $sslOn = true ];then
  1947. virtualHost="./etc/apache2/sites-available/phpinfo-ssl.conf"
  1948. elif [ $nginxOn = true ] && [ $sslOn = true ];then
  1949. virtualHost="./etc/nginx/sites-available/phpinfo-ssl.conf"
  1950. else
  1951. comprobarError 1 106
  1952. fi
  1953. instalarVirtualHost "/var/www/localhost" $virtualHost "localhost"
  1954. unset virtualHost
  1955. return 0
  1956. else
  1957. return 1
  1958. fi
  1959. }
  1960. configurarBackups() {
  1961. # Instala backup-server y lo configura
  1962. letsEncryptCode=""
  1963. if [ ! -d "./var" ];then
  1964. comprobarError 1 5 "./var"
  1965. fi
  1966. which backup-server > /dev/null 2>&1
  1967. if [ $? -ne 0 ];then
  1968. # Descargamos backup-server
  1969. curl "https://code.castanedo.es/guzman/backup-server/archive/2.1.tar.gz" 2>/dev/null | tar -xz -C "./var/"
  1970. if [ $? -ne 0 ];then
  1971. comprobarError 1 701
  1972. return 1
  1973. fi
  1974. # Copiamos backup-server y logrotate
  1975. cp -f ./var/backup-server/backup-server /usr/bin/backup-server
  1976. if [ $? -ne 0 ];then
  1977. comprobarError 1 701
  1978. return 1
  1979. fi
  1980. cp -f ./var/backup-server/scripts/logrotate.d/backup-server /etc/logrotate.d/backup-server
  1981. if [ $? -ne 0 ];then
  1982. comprobarError 1 701
  1983. return 1
  1984. fi
  1985. # Creamos carpeta de backups
  1986. if [ ! -d /var/backup ];then
  1987. mkdir /var/backup 2>/dev/null
  1988. comprobarError $? 5 "/var/backup"
  1989. fi
  1990. # Configuramos cron.d
  1991. if [ $letsEncryptOn = false ];then
  1992. letsEncryptCode="--no-letsencrypt "
  1993. fi
  1994. echo -en "# /etc/cron.d/backup-server: crontab for $hostname\n\n" > /etc/cron.d/backup-server
  1995. echo -en "# Backup every day at 4:00 am\n" >> /etc/cron.d/backup-server
  1996. 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
  1997. comprobarError $? 701
  1998. fi
  1999. unset letsEncryptCode
  2000. }
  2001. # Comprobación del sistema e inicialización
  2002. horaInicial=$(date +"%s")
  2003. inicializarVariables
  2004. OSInfo
  2005. # Leer opciones
  2006. which getopt >/dev/null 2>&1
  2007. if [ $? -eq 0 ] && [ $# -ne 0 ];then
  2008. # Configuración por defecto (opciones de Express)
  2009. instalacionExpress
  2010. # Leer opciones
  2011. 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) -- "$@")
  2012. eval set -- $TEMP
  2013. unset TEMP
  2014. while true; do
  2015. case $1 in
  2016. -h|--help)
  2017. ayuda
  2018. exit 0
  2019. ;;
  2020. -d|--dominio|--fqdn)
  2021. hostname=$2
  2022. shift 2
  2023. ;;
  2024. --lamp)
  2025. apacheOn=true
  2026. shift
  2027. ;;
  2028. --lemp)
  2029. nginxOn=true
  2030. shift
  2031. ;;
  2032. --mariadb)
  2033. case $ID in
  2034. debian)
  2035. mySQLOn=true
  2036. dbType="mariadb"
  2037. ;;
  2038. ubuntu|centos|fedora)
  2039. mariaDBOn=true
  2040. dbType="mariadb"
  2041. esac
  2042. shift
  2043. ;;
  2044. --mysql)
  2045. if [ $ID = "ubuntu" ] && [ $VERSION = "18.04" ];then
  2046. mySQLOn=true
  2047. dbType="mysqli"
  2048. else
  2049. # No está soportado
  2050. ayuda
  2051. comprobarError 1 205
  2052. fi
  2053. shift
  2054. ;;
  2055. --password-sql)
  2056. sqlPasswd=$2
  2057. shift 2
  2058. ;;
  2059. --max-upload-size)
  2060. maxUpload=$2
  2061. shift 2
  2062. ;;
  2063. --lets-encrypt)
  2064. sslOn=true
  2065. letsEncryptOn=true
  2066. shift
  2067. ;;
  2068. --auto-firmados)
  2069. sslOn=true
  2070. letsEncryptOn=false
  2071. shift
  2072. ;;
  2073. --media-wiki)
  2074. mediaWikiOn=true
  2075. shift
  2076. ;;
  2077. --no-media-wiki)
  2078. mediaWikiOn=false
  2079. shift
  2080. ;;
  2081. --nombre-mw)
  2082. nombreMediaWiki=$2
  2083. shift 2
  2084. ;;
  2085. --dominios-mw)
  2086. dominioMediaWiki=$2
  2087. cont=1
  2088. serverName=""
  2089. aliasMediaWiki=""
  2090. for dominio in $dominioMediaWiki;do
  2091. if [ $cont -eq 1 ];then
  2092. # Dominio Principal (ServerName)
  2093. serverName=$dominio
  2094. else
  2095. # Dominios Secundarios (ServerAlias)
  2096. aliasMediaWiki=$aliasMediaWiki" "$dominio
  2097. fi
  2098. cont=$((cont + 1))
  2099. done
  2100. dominioMediaWiki=$serverName
  2101. unset cont serverName dominio
  2102. shift 2
  2103. ;;
  2104. --password-mw)
  2105. passwdMediaWiki=$2
  2106. shift 2
  2107. ;;
  2108. --moodle)
  2109. moodleOn=true
  2110. shift
  2111. ;;
  2112. --no-moodle)
  2113. moodleOn=false
  2114. shift
  2115. ;;
  2116. --nombre-mo)
  2117. nombreMoodle=$2
  2118. shift 2
  2119. ;;
  2120. --nombre-corto-mo)
  2121. nombreCortoMoodle=$(echo $2 | cut -d ' ' -f 1)
  2122. shift 2
  2123. ;;
  2124. --dominio-mo)
  2125. dominioMoodle=$2
  2126. cont=1
  2127. serverName=""
  2128. aliasMoodle=""
  2129. for dominio in $dominioMoodle;do
  2130. if [ $cont -eq 1 ];then
  2131. # Dominio Principal (ServerName)
  2132. serverName=$dominio
  2133. else
  2134. # Dominios Secundarios (ServerAlias)
  2135. aliasMoodle=$aliasMoodle" "$dominio
  2136. fi
  2137. cont=$((cont + 1))
  2138. done
  2139. dominioMoodle=$serverName
  2140. unset cont ServerName dominio aliasMoodle
  2141. shift 2
  2142. ;;
  2143. --password-mo)
  2144. passwdMoodle=$2
  2145. shift 2
  2146. ;;
  2147. --php-info)
  2148. infoPHPOn=true
  2149. shift
  2150. ;;
  2151. --no-php-info)
  2152. infoPHPOn=false
  2153. shift
  2154. ;;
  2155. --backup)
  2156. backupOn=true
  2157. shift
  2158. ;;
  2159. --no-backup)
  2160. backupOn=false
  2161. shift
  2162. ;;
  2163. --)
  2164. #Ultimo
  2165. shift
  2166. break
  2167. ;;
  2168. *)
  2169. # Inesperado
  2170. ayuda
  2171. comprobarError 1 10 $1
  2172. ;;
  2173. esac
  2174. done
  2175. # Comprobar si los datos son correctos
  2176. if [ -z "$hostname" ];then
  2177. ayuda
  2178. comprobarError 1 11
  2179. else
  2180. hostnamectl set-hostname $hostname >/dev/null 2>&1
  2181. fi
  2182. if [ -z "$sqlPasswd" ];then
  2183. ayuda
  2184. comprobarError 1 12
  2185. fi
  2186. if [ -z "$maxUpload" ];then
  2187. ayuda
  2188. comprobarError 1 13
  2189. fi
  2190. if [ $mediaWikiOn = true ];then
  2191. if [ -z "$nombreMediaWiki" ];then
  2192. ayuda
  2193. comprobarError 1 14
  2194. fi
  2195. if [ -z "$dominioMediaWiki" ];then
  2196. ayuda
  2197. comprobarError 1 15
  2198. fi
  2199. if [ -z "$passwdMediaWiki" ];then
  2200. ayuda
  2201. comprobarError 1 16
  2202. fi
  2203. fi
  2204. if [ $moodleOn = true ];then
  2205. if [ -z "$nombreMoodle" ];then
  2206. ayuda
  2207. comprobarError 1 17
  2208. fi
  2209. if [ -z "$nombreCortoMoodle" ];then
  2210. ayuda
  2211. comprobarError 1 18
  2212. fi
  2213. if [ -z "$dominioMoodle" ];then
  2214. ayuda
  2215. comprobarError 1 19
  2216. fi
  2217. if [ -z "$passwdMoodle" ];then
  2218. ayuda
  2219. comprobarError 1 20
  2220. fi
  2221. fi
  2222. # Comprobaciones
  2223. comprobarRoot
  2224. comprobarDependencias
  2225. else
  2226. # Preguntas interactivas
  2227. # Comprobaciones
  2228. comprobarRoot
  2229. comprobarDependencias
  2230. # Bienvenida
  2231. mostrarBienvenida
  2232. # Selección de componentes (express vs avanzada)
  2233. mostrarExpress
  2234. fi
  2235. # Instalación Servidor Web
  2236. if [ $apacheOn = true ]; then
  2237. echo -en "Instalando Servidor Web Apache..." | tee -a $logFile
  2238. instalarApache
  2239. echo -en " OK.\n" | tee -a $logFile
  2240. elif [ $nginxOn = true ]; then
  2241. echo -en "Instalando Servidor Web Nginx..." | tee -a $logFile
  2242. instalarNginx
  2243. echo -en " OK.\n" | tee -a $logFile
  2244. fi
  2245. # Instalación Base de Datos
  2246. if [ $mySQLOn = true ]; then
  2247. echo -en "Instalando Base de Datos MySQL..." | tee -a $logFile
  2248. instalarMySQL
  2249. echo -en " OK.\n" | tee -a $logFile
  2250. elif [ $mariaDBOn = true ]; then
  2251. echo -en "Instalando Base de Datos MariaDB..." | tee -a $logFile
  2252. instalarMariaDB
  2253. echo -en " OK.\n" | tee -a $logFile
  2254. fi
  2255. # Instalación PHP-7
  2256. if [ $phpOn = true ]; then
  2257. echo -en "Instalando PHP-7..." | tee -a $logFile
  2258. instalarPHP
  2259. echo -en " OK.\n" | tee -a $logFile
  2260. fi
  2261. # Instalación Let's Encrypt
  2262. if [ $letsEncryptOn = true ];then
  2263. echo -en "Instalando Let's Encrypt..." | tee -a $logfile
  2264. instalarLetsEncrypt
  2265. echo -en " OK.\n" | tee -a $logFile
  2266. fi
  2267. # Configuración Web Server
  2268. if [ $apacheOn = true ];then
  2269. echo -en "Configurando Servidor Web Apache..." | tee -a $logFile
  2270. configurarApache
  2271. echo -en " OK.\n" | tee -a $logFile
  2272. elif [ $nginxOn = true ]; then
  2273. echo -en "Configurando Servidor Web Nginx..." | tee -a $logFile
  2274. configurarNginx
  2275. echo -en " OK.\n" | tee -a $logFile
  2276. fi
  2277. # Configuración Database (Configurar Ficheros, Arrancar Base de Datos, establecer contraseña y configuración segura)
  2278. if [ $mySQLOn = true ] || [ $mariaDBOn = true ];then
  2279. echo -en "Configurando Base de Datos..." | tee -a $logFile
  2280. configurarSQL
  2281. echo -en " OK.\n" | tee -a $logFile
  2282. habilitarServicio "$sqlServerName"
  2283. echo -en "Estableciendo contraseña de la Base de Datos..." | tee -a $logFile
  2284. establecerSQLPasswd
  2285. echo -en " OK.\n" | tee -a $logFile
  2286. fi
  2287. # Configuración PHP (cgi.fix_pathinfo=0 y Configurar máximo de subida de archivos)
  2288. if [ $phpOn = true ];then
  2289. echo -en "Configurando PHP-7..." | tee -a $logFile
  2290. configurarPHP
  2291. echo -en " OK.\n" | tee -a $logFile
  2292. fi
  2293. # Configuración SSL/TLS
  2294. # Generar certificados auto-firmados
  2295. if [ $sslOn = true ];then
  2296. echo -en "Generando claves de intercambio Diffie-Hellman (puede llevar un largo tiempo)..." | tee -a $logFile
  2297. generarDHParam
  2298. echo -en " OK.\n" | tee -a $logFile
  2299. echo -en "Generando Certificados Auto-Firmados..." | tee -a $logFile
  2300. if [ $mediaWikiOn = true ];then
  2301. generarCertAutofirmado $dominioMediaWiki
  2302. fi
  2303. if [ $moodleOn = true ];then
  2304. generarCertAutofirmado $dominioMoodle
  2305. fi
  2306. if [ $infoPHPOn = true ];then
  2307. generarCertAutofirmado "localhost"
  2308. fi
  2309. echo -en " OK.\n" | tee -a $logFile
  2310. fi
  2311. # Arrancar y habilitar todos los servicios (SystemD, Service o SystemV)
  2312. echo -en "Habilitando todos los servicios..." | tee -a $logFile
  2313. if [ $apacheOn = true ] || [ $nginxOn = true ];then
  2314. habilitarServicio $webServerName
  2315. fi
  2316. if [ $nginxOn = true ] && [ $phpOn = true ];then
  2317. habilitarServicio $phpFPMName
  2318. fi
  2319. echo -en " OK.\n" | tee -a $logFile
  2320. # Instalar MediaWiki
  2321. if [ $mediaWikiOn = true ]; then
  2322. # Descargar MediaWiki
  2323. echo -en "Descargando MediaWiki-1.31.0..." | tee -a $logFile
  2324. descargarMediaWiki
  2325. echo -en " OK.\n" | tee -a $logFile
  2326. # Configurar MediWiki
  2327. echo -en "Configurando MediaWiki..." | tee -a $logFile
  2328. configurarMediaWiki
  2329. echo -en " OK.\n" | tee -a $logFile
  2330. fi
  2331. # Instalar Moodle
  2332. if [ $moodleOn = true ]; then
  2333. # Descargar Moodle
  2334. echo -en "Descargando Moodle-3.5.1..." | tee -a $logFile
  2335. descargarMoodle
  2336. echo -en " OK.\n" | tee -a $logFile
  2337. # Configuración Moodle
  2338. echo -en "Configurando Moodle (puede llevar un tiempo largo)..." | tee -a $logFile
  2339. configurarMoodle
  2340. echo -en " OK.\n" | tee -a $logFile
  2341. fi
  2342. # Instalar info.php
  2343. if [ $infoPHPOn = true ];then
  2344. echo -en "Configurando 'info.php'..." | tee -a $logFile
  2345. instalarPHPInfo
  2346. if [ $? -eq 0 ];then
  2347. echo -en " OK.\n" | tee -a $logFile
  2348. else
  2349. echo -en " Ya se encuentra configurado.\n" | tee -a $logFile
  2350. fi
  2351. fi
  2352. # Añadir reglas del cortafuegos
  2353. echo -en "Configurando Cortafuegos..." | tee -a $logFile
  2354. configurarCortafuegos
  2355. echo -en " OK.\n" | tee -a $logFile
  2356. # Generar certificados Let's Encrypt
  2357. if [ $letsEncryptOn = true ];then
  2358. echo -en "Generando Certificados Válidos Let's Encrypt..." | tee -a $logFile
  2359. generarCertLetsEncrypt
  2360. echo -en " OK.\n" | tee -a $logFile
  2361. fi
  2362. # Configurar Backup
  2363. if [ $backupOn = true ]; then
  2364. echo -en "Configurando Backup Automático..." | tee -a $logFile
  2365. configurarBackups
  2366. echo -en " OK.\n" | tee -a $logFile
  2367. fi
  2368. # Finalizamos
  2369. horaFinal=$(date +"%s")
  2370. echo -en "\n-------------------------------------------------------------\n" | tee -a $logFile
  2371. echo -en "\t¡INSTALACION FINALIZADA CON EXITO! \n" | tee -a $logFile
  2372. echo -en "\tDuración: "$((horaFinal-horaInicial))" seg." | tee -a $logFile
  2373. echo -en "\n-------------------------------------------------------------\n" | tee -a $logFile
  2374. echo -en " GUARDE LA CONFIGURACION EN UN LUGAR SEGURO\n"
  2375. echo -en " LE SERÁ IMPRESCINDIBLE PARA CUALQUIER CAMBIO FUTURO\n"
  2376. echo -en " Dominio: $hostname\n"
  2377. echo -en " Usuarios SQL: root\n"
  2378. echo -en " $userDBMW\n"
  2379. echo -en " $userDBMo\n"
  2380. echo -en " Contraseña SQL: $sqlPasswd\n"
  2381. if [ $mediaWikiOn = true ];then
  2382. echo -en " Nombre MediaWiki: $nombreMediaWiki\n"
  2383. echo -en " Dominios MediaWiki: $dominioMediaWiki\n"
  2384. for dominio in $aliasMediaWiki;do
  2385. echo -en " $dominio\n"
  2386. done
  2387. echo -en " Usuario MediaWiki: admin\n"
  2388. echo -en " Contraseña MediaWiki: $passwdMediaWiki\n"
  2389. fi
  2390. if [ $moodleOn = true ];then
  2391. echo -en " Nombre Moodle: $nombreMoodle\n"
  2392. echo -en " Dominio Moodle: $dominioMoodle\n"
  2393. echo -en " Usuario Moodle: admin\n"
  2394. echo -en " Contraseña Moodle: $passwdMoodle"
  2395. fi
  2396. echo -en "\n-------------------------------------------------------------\n"