install 78 KB

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