install 66 KB

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