install 68 KB

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