#SingleInstance ignore

; Définition des emplacements (téléchargement si besoin)
p_WM := A_ScriptDir
SplitPath, p_WM,, p_Racine
If not FileExist("..\..\Framakey")
	{
	; Mode standalone
	; p_WM = K:\WebappsManagerPortable
	; p_Apps = K:
	; p_Racine = K:
	p_Apps := p_Racine
	}
Else 
	{
	; Mode Framakey
	; p_WM = K:\Framakey\WebappsManagerPortable
	; p_Apps = K:\Apps
	; p_Racine = K:
	SplitPath, p_Racine,, p_Racine
	p_Apps := p_Racine . "\Apps"
	}

;Lecture des infos appinfo.ini
IniRead, s_Name, %p_WM%\App\AppInfo\appinfo.ini, Framakey, Name,
IniRead, s_Website, %p_WM%\App\AppInfo\appinfo.ini, WebAppSpecific, Website,
IniRead, s_Support, %p_WM%\App\AppInfo\appinfo.ini, WebAppSpecific, Support,
IniRead, s_DisplayVersion, %p_WM%\App\AppInfo\appinfo.ini, Version, DisplayVersion,
IniRead, s_License, %p_WM%\App\AppInfo\appinfo.ini, Framakey, License,
IniRead, s_NginX, %p_WM%\App\AppInfo\appinfo.ini, WebAppSpecific, NginX,
IniRead, s_Php, %p_WM%\App\AppInfo\appinfo.ini, WebAppSpecific, Php,
IniRead, s_NodeJS, %p_WM%\App\AppInfo\appinfo.ini, WebAppSpecific, NodeJS,
IniRead, s_MariaDB, %p_WM%\App\AppInfo\appinfo.ini, WebAppSpecific, MariaDB,
IniRead, s_Adminer, %p_WM%\App\AppInfo\appinfo.ini, WebAppSpecific, Adminer,

IniRead, b_Https, %p_WM%\App\AppInfo\config.ini, General, Https,0
IniRead, s_Domaine, %p_WM%\App\AppInfo\config.ini, General, Domaine,localhost
IniRead, s_Prefixe, %p_WM%\App\AppInfo\config.ini, General, Prefixe,0
;IniRead, s_FramaDNSUtilisateur, App\AppInfo\config.ini, Config, FramaDNSUtilisateur,
;IniRead, s_FramaDNSCle, App\AppInfo\config.ini, Config, FramaDNSCle,
i_NginXPort = 80
IniRead, s_MotDePasseBdD, %p_WM%\App\AppInfo\config.ini, MariaDB, MotDePasse,
IniRead, i_MariaDBPort, %p_WM%\App\AppInfo\config.ini, MariaDB, Port,3306
IniRead, i_FastCGIPort, %p_WM%\App\AppInfo\config.ini, FastCGI, Port,9000
IniRead, i_NodeJSPort, %p_WM%\App\AppInfo\config.ini, NodeJS, Port,1337
;*ToDo* : Définir mot de passe root du WM
;http://dev.mysql.com/doc/refman/5.5/en/resetting-permissions.html#resetting-permissions-windows

; Préfixe pour adminer et phpinfo (sécurité)

If (%s_Prefixe% = 0)
	{
	s_Prefixe := ChaineAleatoire(10)
	IniWrite, %s_Prefixe%, %p_WM%\App\AppInfo\config.ini, General, Prefixe
;* * * * * * * * * * * * * * * *;
	If FileExist(p_WM . "\App\nginx\www\-adminer.php")
		FileMove, %p_WM%\App\nginx\www\-adminer.php, %p_WM%\App\nginx\www\%s_Prefixe%-adminer.php
	If FileExist(p_WM . "\App\nginx\www\-phpinfo.php")
		FileMove, %p_WM%\App\nginx\www\-phpinfo.php, %p_WM%\App\nginx\www\%s_Prefixe%-phpinfo.php
	}
;* * * * En cas de mauvaise fermeture à la session précédente * * * *;
f_lock =
If FileExist(p_WM . "\App\AppInfo\lock")
; Aïe, le WM s'est mal fermé la dernière fois
{
	FileRead, f_lock, %p_WM%\App\AppInfo\lock
	; Si on utilise la clé sur la même machine que précédemment (infos contenues dans le fichier lock),
	; et qu'il y a des processus nginx, mysqld, php-cgi qui tournent encore
	; ce sont sûrement les notres 
	; donc on les arrêtes pour que le WM les relance proprement
	If (f_lock = A_OSType . "|" . A_OSVersion . "|" . A_ComputerName) 
	{
		NginX("stop")
		MariaDB("stop")
		FastCGI("stop")
	}
}
FileDelete, %p_WM%\App\AppInfo\lock
;* * * * * * * *;

;* * * * En cas d'indisponibilité des ports  * * * * * * * * *;
; On arrête le WM
; Netstat existe sur toutes les versions de Windows même sur Wine.
;*ToDo* : Voir comment ça se passe avec IPv6
Run, %comspec% /c netstat -anp TCP > "%p_WM%\App\AppInfo\netstat.txt",,Hide
FileRead, f_netstat, %p_WM%\App\AppInfo\netstat.txt
FileDelete, %p_WM%\App\AppInfo\netstat.txt
; Port http 80 - Nginx.
; Obligatoire! (un site en 8080 = trop geek)
_port80 := RegExMatch(f_netstat, "TCP.*0\.0\.0\.0:80.*0\.0\.0\.0:0.*LISTENING")
; Port https - NginX.
; Idem
_port443 := RegExMatch(f_netstat, "TCP.*0\.0\.0\.0:443.*0\.0\.0\.0:0.*LISTENING")
; Port 3306 - MySQL.
; On pourrait l'incrémenter s'il est occupé, ça reste transparent pour l'utilisateur
; Mais il faut créer pour chaque webapp le script qui modifie son fichier de config
_port3306 := RegExMatch(f_netstat, "TCP.*0\.0\.0\.0:3306.*0\.0\.0\.0:0.*LISTENING")
; Port 9000 - FastCGI (PHP).
; On pourrait l'incrémenter s'il est occupé. 
; Le port est défini dans les fichiers nginx.conf, https.conf et WebappPortable.exe.conf
_port9000 := RegExMatch(f_netstat, "TCP.*127\.0\.0\.1:9000.*0\.0\.0\.0:0.*LISTENING")
; Port 1337 - NodeJS
; On pourrait l'incrémenter s'il est occupé.
; Le port est défini dans les fichiers WebappPortable.exe.conf
_port1337 := RegExMatch(f_netstat, "TCP.*127\.0\.0\.1:1337.*0\.0\.0\.0:0.*LISTENING")
If (%_port80%!=0 or %_port3306%!=0 or %_port9000%!=0) ; or %_port1337%!=0
{
	If (f_lock!="")
		Sleep 1000
	MsgBox,64,Erreur,Un serveur web est déjà en fonction.`r`nLe WM ne peut pas fonctionner sur cette machine
	ExitApp
}
If (b_Https and %_port443%!=0)
{
	If (f_lock!="")
		Sleep 1000
	MsgBox,64,,Un serveur web est déjà en fonction.`r`nLe WM ne peut pas fonctionner sur cette machine
	ExitApp
}
;* * * * * * * *;


;* * * * Préparer la config au démarrage * * * *;
; On crée un nouveau fichier "lock" témoin de session
FileAppend, %A_OSType%|%A_OSVersion%|%A_ComputerName% ,%p_WM%\App\AppInfo\lock
; Premier lancement du WM, sauvegarde des fichiers nginx.conf et https.conf
If not FileExist(p_WM . "\App\nginx\conf\~nginx.conf")
	SauvegardeFichier(p_WM . "\App\nginx\conf\nginx.conf")
If not FileExist(p_WM . "\App\nginx\conf\~https.conf")
	SauvegardeFichier(p_WM . "\App\nginx\conf\https.conf")
; au démarrage du WM, on réinitialise nginx.conf et https.conf
RestaureFichier(p_WM . "\App\nginx\conf\nginx.conf")
RestaureFichier(p_WM . "\App\nginx\conf\https.conf")

; S'il y a des Webapps actives, on les ajoute à nginx.conf et https.conf
; S'il y avait des Webapps actives (reste des traces dans nginx/conf/webapps) et que le WM a fermé brutalement (ie %f_lock%!="" ), on demande s'il faut le relancer
s_WebappsActives =
b_restaureWA=false
Loop, %p_WM%\App\nginx\conf\webapps\*.conf
    s_WebappsActives = %s_WebappsActives%%A_LoopFileName%`n
Loop, parse, s_WebappsActives, `n
{
	StringReplace, _WAexe, A_LoopField, .conf, , All
	StringReplace, _WAdir, _WAexe, .exe, , All
	Process,Exist,%_WAexe%
	pid := ErrorLevel
	If (%pid%!=0 and _WAexe != "")
	{
		RemplaceFichier(p_WM . "\App\nginx\conf\nginx.conf", "`r`n" . A_Tab . "include webapps/" . _WAexe . ".conf;`r`n`", "") ; Evite les doublons
		RemplaceFichier(p_WM . "\App\nginx\conf\nginx.conf", A_Tab . "location / {", A_Tab . "include webapps/" . _WAexe . ".conf;`r`n`r`n" . A_Tab . "location / {")
		RemplaceFichier(p_WM . "\App\nginx\conf\https.conf", "`r`n" . A_Tab . "include webapps/" . _WAexe . ".conf;`r`n`", "") ; Evite les doublons
		RemplaceFichier(p_WM . "\App\nginx\conf\https.conf", A_Tab . "location / {", A_Tab . "include webapps/" . _WAexe . ".conf;`r`n`r`n" . A_Tab . "location / {")
	}
	
	If (%pid%=0 and _WAexe != "" and f_lock != "")
	{
	MsgBox,64,,%pid% %_WAexe% %_WAdir% %f_Lock%
		If (b_restaureWA=false)
			MsgBox,4,Restaurer la session,Précédemment, le WebappsManager a quitté brutalement.`r`nVoulez-vous relancer les webapps en fonction à ce moment là ?
		IfMsgBox, Yes
			b_restaureWA=true
		If (b_restaureWA and FileExist(p_Apps . "\" . _WAdir . "\" . _WAexe))
			Run %p_Apps%\%_WAdir%\%_WAexe%
	}
}

; Remplace le nom de domaine dans nginx.conf et https.conf. Doit-on le faire avec le hosts de la machine ?
RemplaceFichier(p_WM . "\App\nginx\conf\nginx.conf","server_name localhost;","server_name " . s_Domaine . ";")
RemplaceFichier(p_WM . "\App\nginx\conf\https.conf","server_name localhost;","server_name " . s_Domaine . ";")

; Si le mode https est activé on fait un include du fichier https.conf à la fin du fichier nginx.conf
If (b_Https)
	RemplaceFichier(p_WM . "\App\nginx\conf\nginx.conf","} # end http server","} # end http server`r`n`r`n	include https.conf")

;* * * * * * * Lancer les serveurs * * * * * * *;
	NginX()
	FastCGI()
	MariaDB()

;* * * * * * * GUI * * * * * * *;
Gui, Add, Button, x16 y265 w140 h30 gEnregistreConfig, Enregister
Gui, Add, Text, x176 y265 w160 h50 , NB: Les changements prendront effet après un redémarrage du WebappsManager
Gui, Add, Tab, x6 y5 w330 h255 , Serveur web|Bases de données|Langages

Gui, Tab, Serveur web
Gui, Add, GroupBox, x16 y30 w310 h135 , NginX
Gui, Add, Button, x26 y50 w80 h30 gNginXDemarrer, (re)Démarrer
Gui, Add, Button, x116 y50 w80 h30 gNginXArreter, Arrêter
Gui, Add, Picture, x206 y50 w30 h30 vPic_NginX, %p_WM%\App\AppInfo\on.png
Gui, Add, Text, x256 y45 w60 h20 Disabled, Port
Gui, Add, Edit, x256 y65 w60 h20 Disabled, %i_NginXPort%
Gui, Add, Text, x256 y90 w60 h20 , Https
Gui, Add, CheckBox, x256 y110 w20 h20 vNb_https Checked%b_https%, 
Gui, Add, Text, x26 y90 w210 h20 , Nom de domaine
Gui, Add, Edit, x26 y110 w210 h20 vNs_Domaine, %s_Domaine%
;*ToDo* : Ajouter champs utilisateur/clé-dns lorsqu'on aura mis en place un service de DynDNS
Gui, Add, Text, x26 y140 w140 h20 cBlue gNginxConf, Editer le fichier nginx.conf

Gui, Add, GroupBox, x16 y175 w310 h70 , Sécurité/Confidentialité
Gui, Add, Text, x26 y195 w140 h20 , Prefixe Adminer/PhpInfo
Gui, Add, Edit, x26 y215 w140 h20 vNs_Prefixe, %s_Prefixe%
Gui, Add, Text, x176 y195 w140 h20 cBlue gRobotsTxt, Editer le fichier robots.txt
;*ToDo* : Ajouter champs utilisateur/mot-de-passe pour authetification http sur localhost (config à ajouter dans nginx.conf)

Gui, Tab, Bases de données
Gui, Add, GroupBox, x16 y30 w310 h160 , MariaDB (MySQL)
Gui, Add, Button, x26 y50 w80 h30 gMariaDBDemarrer, (re)Démarrer
Gui, Add, Button, x116 y50 w80 h30 gMariaDBArreter, Arrêter
Gui, Add, Picture, x206 y50 w30 h30 vPic_MariaDB, %p_WM%\App\AppInfo\on.png
Gui, Add, Text, x256 y45 w60 h20 Disabled, Port
Gui, Add, Edit, x256 y65 w60 h20 Disabled vNi_MariaDBPort, %i_MariaDBPort%
Gui, Add, Text, x26 y90 w170 h20 , Changer le mot de passe "root"
Gui, Add, Edit, x26 y110 w170 h20 vNs_MotDePasseBdD,%s_MotDePasseBdD%
Gui, Add, Text, x26 y140 w140 h20 cBlue gAdminer, Adminer
Gui, Add, Text, x176 y140 w140 h20 cBlue gMyIni, Editer le fichier my.ini
If FileExist(p_Apps . "\HeidiSQLPortable\HeidiSQLPortable.exe")
	Gui, Add, Text, x26 y160 w140 h20 cBlue gHeidiSQL, HeidiSQL
Else
	Gui, Add, Text, x26 y160 w140 h20 cBlue Disabled, HeidiSQL
If FileExist(p_Apps . "\PhpMyAdminPortable\PhpMyAdminPortable.exe")
	Gui, Add, Text, x176 y160 w140 h20 cBlue gPhpMyAdmin, PhpMyAdmin
Else
	Gui, Add, Text, x176 y160 w140 h20 cBlue Disabled, PhpMyAdmin

;Gui, Add, GroupBox, x16 y200 w310 h60 , MongoDB
;Gui, Add, Button, x26 y220 w80 h30 , (re)Démarrer
;Gui, Add, Button, x116 y220 w80 h30 , Arrêter
;Gui, Add, Picture, x206 y220 w30 h30 , %p_WM%\App\AppInfo\off.png

Gui, Tab, Langages
Gui, Add, GroupBox, x16 y30 w310 h100 , PHP - FastCGI
Gui, Add, Button, x26 y50 w80 h30 gFastCGIDemarrer, (re)Démarrer
Gui, Add, Button, x116 y50 w80 h30 gFastCGIArreter, Arrêter
Gui, Add, Picture, x206 y50 w30 h30 vPic_FastCGI, %p_WM%\App\AppInfo\on.png
Gui, Add, Text, x256 y45 w60 h20 Disabled, Port
Gui, Add, Edit, x256 y65 w60 h20 Disabled vNi_FastCGIPort, %i_FastCGIPort%
Gui, Add, Text, x206 y100 w110 h20 cBlue gPhpInfo, PhpInfo
Gui, Add, Text, x26 y100 w110 h20 cBlue gPhpIni, Editer le fichier php.ini

Gui, Add, GroupBox, x16 y140 w310 h70 Disabled, NodeJS
Gui, Add, Button, x26 y160 w80 h30 Disabled, (re)Démarrer
Gui, Add, Button, x116 y160 w80 h30 Disabled, Arrêter
Gui, Add, Picture, x206 y160 w32 h30 Disabled vPic_NodeJS, %p_WM%\App\AppInfo\off.png
Gui, Add, Text, x256 y155 w60 h20 Disabled, Port
Gui, Add, Edit, x256 y175 w60 h20 Disabled vNi_NodeJSPort, %i_NodeJSPort%

; A propos
s_Devel := "WebappsManager Portable est développé par l'équipe Framakey et fonctionne grâce un ensemble de logiciels libres : `r`n" . A_Tab . "NginX " . s_NginX . "`r`n" . A_Tab . "PHP " . s_Php . A_Tab . "NodeJS " . s_NodeJS . "`r`n" . A_Tab . "MariaDB (MySQL) " . s_MariaDB . "`r`n" . A_Tab . "et Adminer " . s_Adminer
Gui, 2:Font, S12 CDefault Bold, Verdana
Gui, 2:Add, Text, x20 y10 w310 h20 Center, %s_Name% Portable
Gui, 2:Font, S8 CDefault Normal, Verdana
Gui, 2:Add, Text, x20 y35 w310 h20 Center, version %s_DisplayVersion% | licence %s_License%
Gui, 2:Add, Text, x20 y55 w155 h20 Center cBlue gWebsite, Site Officiel
Gui, 2:Add, Text, x175 y55 w155 h20 Center cBlue gSupportOfficiel, Support Officiel
Gui, 2:Add, Picture, x135 y55 w64 h64, %p_WM%\App\AppInfo\appicon_64.png
Gui, 2:Add, Text, x20 y124 w310 h210 , %s_devel%	

;* * * * * * *  Menu * * * * * * *;
; Titre
Menu, Tray, Add, %s_Name% , showTray
Menu, Tray, Default, %s_Name% ; Affiche le menu au clic gauche
Menu, Tray, Disable, %s_Name% ; Désactive le clic sur le titre
Menu, Tray, Click, 1
Menu, Tray, NoStandard ; Désactive le menu AHK
Menu, Tray, Add

Menu, Tray, Add, Configuration, Configuration
; Sous menu Base de données
Menu, Tray, Add, Base de données, SousMenu
Menu, Base de données, Add, Adminer, Adminer
Menu, Base de données, Add
Menu, Base de données, Add, MariaDB, SousMenu
Menu, Base de données, Disable, MariaDB
Menu, Base de données, Add, (re)Démarrer, MariaDBDemarrer
Menu, Base de données, Add, Arrêter, MariaDBArreter
If FileExist(p_Apps . "\HeidiSQLPortable\HeidiSQLPortable.exe")
	Menu, Base de données, Add, HeidiSQL, HeidiSQL
If FileExist(p_Apps . "\PhpMyAdminPortable\PhpMyAdminPortable.exe")
	Menu, Base de données, Add, HeidiSQL, HeidiSQL
; Autres SGBD :
; Il faut qu'ils puissent fonctionner avec des liens symboliques
; MySQL utilise les fichier sym pour émuler le fonctionnement sur WinXP et +
; Pour les autres il faudra probablement passer par les liens symboliques officiels sur Win7 et +
; PostgreSQL ne passe pas sur disque en FAT32, uniquement sur du NTFS
; Du coup, voir ce que sqlite, mongodb et redis peuvent donner
;Menu, Base de données, Add
;Menu, Base de données, Add, MongoDB, SousMenu
;Menu, Base de données, Disable, MongoDB
Menu, Tray, Add, Base de données, :Base de données

; Sous menu Langages
Menu, Tray, Add, Langages, SousMenu
Menu, Langages, Add, PHP, SousMenu
Menu, Langages, Disable, PHP
Menu, Langages, Add, Afficher PhpInfo, PhpInfo 
Menu, Langages, Add
Menu, Langages, Add, NodeJS, SousMenu
Menu, Langages, Disable, NodeJS
Menu, Tray, Add, Langages, :Langages

; Sous menu Serveur web
Menu, Tray, Add, Serveur web, SousMenu
Menu, Serveur web, Add, NginX, SousMenu
Menu, Serveur web, Disable, NginX
Menu, Serveur web, Add, (re)Démarrer, NginXDemarrer
Menu, Serveur web, Add, Arrêter, NginXArreter
Menu, Tray, Add, Serveur web, :Serveur web

Menu, Tray, Add
Menu, Tray, Add, Créer/Cloner une webapp, NouvelleWebapp
Menu, Tray, Add, Aide, Aide
Menu, Tray, Add, A propos, Apropos
Menu, tray, Add
Menu, Tray, Add, Quitter
#Persistent
OnExit, Quitter
return

SousMenu:
return

Apropos:
	Gui, 2:Show, h230 w340 Center, A propos
return

showTray:
Menu, Tray, show
return

GuiClose:
Gui, Hide
return
;* * * * * * *  Actions * * * * * * *;
; Liens
Website:
	OuvrirURL(s_Website)
return

SupportOfficiel:
	OuvrirURL(s_Support)
return

Aide:
	OuvrirURL("http://localhost/aide.html")
return

Configuration:
	Gui, Show, h312 w345 Center, Configuration
return

EnregistreConfig:
	Gui, Submit
	FileMove, %p_WM%\App\nginx\www\%s_Prefixe%-adminer.php, %p_WM%\App\nginx\www\%Ns_Prefixe%-adminer.php
	FileMove, %p_WM%\App\nginx\www\%s_Prefixe%-phpinfo.php, %p_WM%\App\nginx\www\%Ns_Prefixe%-phpinfo.php
	
	IniWrite, %Nb_Https%, %p_WM%\App\AppInfo\config.ini, General, Https
	IniWrite, %Ns_Domaine%, %p_WM%\App\AppInfo\config.ini, General, Domaine
	If (Ns_Prefixe="")
		Ns_Prefixe=0
	IniWrite, %Ns_Prefixe%, %p_WM%\App\AppInfo\config.ini, General, Prefixe
	;IniWrite, %Ns_FramaDNSUtilisateur%, App\AppInfo\config.ini, Config, FramaDNSUtilisateur
	;IniWrite, %Ns_FramaDNSCle%, App\AppInfo\config.ini, Config, FramaDNSCle
	IniWrite, %Ns_MotDePasseBdD%, %p_WM%\App\AppInfo\config.ini, MariaDB, MotDePasse
	IniWrite, %Ni_MariaDBPort%, %p_WM%\App\AppInfo\config.ini, MariaDB, Port
	IniWrite, %Ni_FastCGIPort%, %p_WM%\App\AppInfo\config.ini, FastCGI, Port
	IniWrite, %Ni_NodeJSPort%, %p_WM%\App\AppInfo\config.ini, NodeJS, Port	
	Gui, Hide
return

;* * * * Base de données * * * *;
Adminer:
	OuvrirURL("http://localhost/" . s_Prefixe . "-adminer.php")
return

; MariaDB
MariaDBDemarrer:
	GuiControl,, Pic_MariaDB, %p_WM%\App\AppInfo\wait.png
	MariaDB()
	GuiControl,, Pic_MariaDB, %p_WM%\App\AppInfo\on.png
return

MariaDBArreter:
	GuiControl,, Pic_MariaDB, %p_WM%\App\AppInfo\wait.png
	MariaDB("stop")
	GuiControl,, Pic_MariaDB, %p_WM%\App\AppInfo\off.png
return

HeidiSQL:
	Run %p_Apps%\HeidiSQLPortable\HeidiSQLPortable.exe
return

PhpMyAdmin:
	Run %p_Apps%\PhpMyAdminPortable\PhpMyAdminPortable.exe
return

MyIni:
	EditerFichier(p_WM . "\App\mariadb\my.ini")
return

; MongoDB

;* * * * Langages * * * *;
; PHP
FastCGIDemarrer:
	GuiControl,, Pic_FastCGI, %p_WM%\App\AppInfo\wait.png
	FastCGI()
	GuiControl,, Pic_FastCGI, %p_WM%\App\AppInfo\on.png
return

FastCGIArreter:
	GuiControl,, Pic_FastCGI, %p_WM%\App\AppInfo\wait.png
	FastCGI("stop")
	GuiControl,, Pic_FastCGI, %p_WM%\App\AppInfo\off.png
return

PhpInfo:
	OuvrirURL("http://localhost/" . s_Prefixe . "-phpinfo.php")
return

PhpIni:
	EditerFichier(p_WM . "\App\php\php.ini")
return

; NodeJS

;* * * * Serveur * * * *;
; NginX
NginxConf:
	EditerFichier(p_WM . "\App\nginx\conf\~nginx.conf")
return

NginXDemarrer:
	GuiControl,, Pic_NginX, %p_WM%\App\AppInfo\wait.png
	NginX()
	GuiControl,, Pic_NginX, %p_WM%\App\AppInfo\on.png
return

NginXArreter:
	GuiControl,, Pic_NginX, %p_WM%\App\AppInfo\wait.png
	NginX("stop")
	GuiControl,, Pic_NginX, %p_WM%\App\AppInfo\off.png
return

RobotsTxt:
	EditerFichier(p_WM . "\App\nginx\www\robots.txt")
return


;* * * * * * * * * * * * * * * * *;

NouvelleWebapp:
	MsgBox,64,Info,En chantier.`r`nObjectif : ouvrir un équivalent de FramaWizahk
return

Quitter:
	Quitter("WebappsManagerPortable.exe")
	ExitApp
return

;* * * * * * *  Fonctions * * * * * * *;
Quitter(_exe,_verbose="on") {
	; _verbose = "off" est utilisé pour les fermetures silencieuses et brutales des WA et du WM
	; quand _verbose = "on", il faut appeler ExitApp ensuite.
	global p_WM
	global p_WA
	global s_DatabaseName
	;* * * * Fermer le WebappsManager * * * *;
	If(_exe="WebappsManagerPortable.exe")
	{
		; On arrête les serveurs
		NginX("stop")
		FastCGI("stop")
		MariaDB("stop")
				
		; On ferme les Webapps actives
		s_WebappsActives =
		Loop, %p_WM%\App\nginx\conf\webapps\*.conf
			s_WebappsActives = %s_WebappsActives%%A_LoopFileName%`n
		Loop, parse, s_WebappsActives, `n
		{
			StringReplace, _WAexe, A_LoopField, .conf, , All
			Process,Exist,%_WAexe%
			If (%ErrorLevel%!=0 && _WAexe != "")
				Quitter(_WAexe,"off")
		}
		; On supprime tous les liens symboliques MariaDB et fichiers de conf NginX
		; et on réinitialise nginx.conf
		FileDelete, %p_WM%\App\mariadb\data\*.sym
		FileDelete, %p_WM%\App\nginx\conf\webapps\*.conf
		RestaureFichier(p_WM . "\App\nginx\conf\nginx.conf")
		
		; La fermeture s'est correctement déroulée, on supprime le fichier lock
		FileDelete, %p_WM%\App\AppInfo\lock
	;* * * * Fermer une Webapp	* * * *;
	} Else {
		; Suppression du lien symbolique MariaDB de la WA.
		; Il ne se passe rien lorsque la fonction est appelée depuis le WM.
		If FileExist(p_WM . "\App\mariadb\data\" . s_DatabaseName . ".sym")
			FileDelete, %p_WM%\App\mariadb\data\%s_DatabaseName%.sym
		; Suppression du fichier de config Nginx de la WA
		If FileExist(p_WM . "\App\nginx\conf\webapps\" . _exe . ".conf")
			FileDelete, %p_WM%\App\nginx\conf\webapps\%_exe%.conf
		; Suppression du include dans nginx.conf
		RemplaceFichier(p_WM . "\App\nginx\conf\nginx.conf", "`r`n" . A_Tab . "include webapps/" . _exe . ".conf;`r`n`", "")
		
		; Vérifier si la WA était la dernière active : Fermer le WM ou Recharger Nginx ?
		Process,Exist,WebappsManagerPortable.exe
		pid := ErrorLevel
		If FileExist(p_WM . "\App\nginx\conf\webapps\*.conf")
		{
			NginX()
		} Else {
			If (%pid%!=0)
			{
				If (_verbose="on")
				{
					MsgBox,4,Fermer le WebappsManager,Vous venez de fermer la dernière webapp active.`r`nVoulez-vous fermer le WebappsManager ?
					IfMsgBox, Yes
						Quitter("WebappsManagerPortable.exe", "off")
					Else
						NginX()
				} Else {
					NginX()
				}
			}
		}	
	}
	If(_verbose="off")
	{
		Process,Exist,%_exe%		
		If (%ErrorLevel%!=0)
			Process,Close,%ErrorLevel%
	}
}

NginX(statut="start") {
	global p_WM
	If (statut="start")
	{
		Process,Exist,nginx.exe
		If (%ErrorLevel%!=0)
			Run, %comspec% /c cd "%p_WM%\App\nginx" & nginx.exe -s reload, , Hide
		Else
			Run, %comspec% /c cd "%p_WM%\App\nginx" & nginx.exe, , Hide
	}
	If (statut="stop")
	{
		Run, %comspec% /c cd "%p_WM%\App\nginx" & nginx.exe -s stop, , Hide
		Sleep 200
		TuerProcessus("nginx.exe")
	}
}

MariaDB(statut="start") {
	global p_WM
	If (statut="start")
	{
		Process,Exist,mysqld.exe
		If (%ErrorLevel%!=0)
		{
			MariaDB("stop")
			Sleep 200
			Run, %comspec% /c cd "%p_WM%\App\mariadb\bin" & mysqld.exe --defaults-file="%p_WM%\App\mariadb\my.ini", , Hide
		} Else {
			Run, %comspec% /c cd "%p_WM%\App\mariadb\bin" & mysqld.exe --defaults-file="%p_WM%\App\mariadb\my.ini", , Hide
		}
	}
	If (statut="stop")
	{
		Run, %comspec% /c cd "%p_WM%\App\mariadb\bin\" & mysqladmin.exe -u root shutdown, , Hide
		Sleep 200
		TuerProcessus("mysqld.exe")
	}
}

FastCGI(statut="start") {
	global p_WM
	If (statut="start")
	{
		Process,Exist,php-cgi.exe
		If (%ErrorLevel%!=0)
		{
			FastCGI("stop")
			Sleep 200
			Run, %comspec% /c cd "%p_WM%\App\php" & php-cgi.exe -b localhost:9000, , Hide
		} Else {
			Run, %comspec% /c cd "%p_WM%\App\php" & php-cgi.exe -b localhost:9000, , Hide
		}
	}
	If (statut="stop")
	{
		TuerProcessus("php-cgi.exe") ; Procedure normale :)
	}
}

TuerProcessus(_exe) {
	Process,Exist,%_exe%
	pid := ErrorLevel
	While(%pid% !=0)
	{
		Process,Close,%_exe%
		Sleep 100
		Process,Exist,%_exe%
		pid := ErrorLevel
	}
}

OuvrirURL(url)
{
	global p_Apps	
	If FileExist(p_Apps . "\FramafoxPortable\FramafoxPortable.exe")
		Run %p_Apps%\FramafoxPortable\FramafoxPortable.exe %url%
	Else
		Run %url%
}

EditerFichier(fichier)
{
	global p_Apps	
	If FileExist(p_Apps . "\Notepad++Portable\Notepad++Portable.exe")
		Run %p_Apps%\Notepad++Portable\Notepad++Portable.exe %fichier%
	Else
		Run notepad.exe %fichier%
}

RequeteSQL(SQL) {
	global p_WM
	global s_DatabaseName
	If (SubStr(SQL, -3) = ".sql")
	{
		If not FileExist(SQL) 
			MsgBox,64,Erreur,Le fichier %SQL% n'existe pas
		RunWait, %comspec% /c cd "%p_WM%\App\mariadb\bin\" && mysql.exe -u root -e "source %SQL%" %s_DatabaseName%,,Hide
	} Else {
		RunWait, %comspec% /c cd "%p_WM%\App\mariadb\bin\" && mysql.exe -u root -e "%SQL%" %s_DatabaseName%,,Hide
	}
}

RemplaceFichier(fichier, cherche, remplace, mode="texte") {
	If not FileExist(fichier) 
	{
		MsgBox,64,Erreur,Le fichier %fichier% n'existe pas
		return
	} Else {
		If (mode="texte")
		{
			FileRead, f_Fichier, %fichier%
			StringReplace, f_Fichier, f_Fichier, %cherche%, %remplace%, All
			FileDelete, %fichier%
			FileAppend, %f_Fichier%, %fichier%
		}
		If (mode="regex")
		{
			FileRead, f_Fichier, %fichier%
			FileDelete, %fichier%
			Nf_Fichier =
			
			Loop, Parse, f_Fichier, `r
			{
				Nf_Fichier := RegExReplace(A_LoopField, cherche, remplace)
				FileAppend, %Nf_Fichier%`r, %fichier%
			}
		}
	}
}

SauvegardeFichier(fichier) {
	SplitPath, fichier, nom_fichier, dossier
	FileCopy, %fichier%, %dossier%\~%nom_fichier%, 1
}

RestaureFichier(fichier) {
	SplitPath, fichier, nom_fichier, dossier
	FileCopy, %dossier%\~%nom_fichier%, %fichier%, 1
}

ChaineAleatoire(i_longueur) {
	_chars=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_
	Loop, %i_longueur%
	{
		Random, _i, 0, 62
		_char := SubStr(_chars, _i, 1)
		_key = %_key%%_char%
	}
	return %_key%
}

;* * * * Code Importé * * * *;
UTF82Ansi(zString)
{
   Ansi2Unicode(zString, wString, 65001)
   Unicode2Ansi(wString, sString, 0)
   Return sString
}

Ansi2Unicode(ByRef sString, ByRef wString, CP = 0)
{
     nSize := DllCall("MultiByteToWideChar"
      , "Uint", CP
      , "Uint", 0
      , "Uint", &sString
      , "int",  -1
      , "Uint", 0
      , "int",  0)

   VarSetCapacity(wString, nSize * 2)

   DllCall("MultiByteToWideChar"
      , "Uint", CP
      , "Uint", 0
      , "Uint", &sString
      , "int",  -1
      , "Uint", &wString
      , "int",  nSize)
}

Unicode2Ansi(ByRef wString, ByRef sString, CP = 0)
{
     nSize := DllCall("WideCharToMultiByte"
      , "Uint", CP
      , "Uint", 0
      , "Uint", &wString
      , "int",  -1
      , "Uint", 0
      , "int",  0
      , "Uint", 0
      , "Uint", 0)

   VarSetCapacity(sString, nSize)

   DllCall("WideCharToMultiByte"
      , "Uint", CP
      , "Uint", 0
      , "Uint", &wString
      , "int",  -1
      , "str",  sString
      , "int",  nSize
      , "Uint", 0
      , "Uint", 0)
}