#!/bin/bash

# Pour avoir un retour du choix de l'utilisateur
asksomething()
{
    read -r -p "${1} [y/N] " response

    case "$response" in
        [yY][eE][sS]|[yY])
            true
            ;;
        *)
            false
            ;;
    esac
}

showlicence() {

	cecho "-----------------------------------------------------------------------------" $light_gray
	echo ""
	cecho "            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE" $light_gray
	cecho "                   Version 2, December 2004" $light_gray
	echo ""
	cecho "           Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>" $light_gray
	echo ""
	cecho "Everyone is permitted to copy and distribute verbatim or modified" $light_gray
	cecho "copies of this license document, and changing it is allowed as long" $light_gray
	cecho "as the name is changed." $light_gray
	echo ""
	cecho "           DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE" $light_gray
	cecho "  TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION" $light_gray
	echo ""
	cecho " 0. You just DO WHAT THE FUCK YOU WANT TO." $light_gray
	echo ""
	cecho "-----------------------------------------------------------------------------" $light_gray
	echo ""
	cecho "                        Fermeture du script en cours" $light_green
	sleep 5s
	return
}


# Pour mettre de la couleur
red="\033[0;31m"
blue="\033[0;34m"
light_blue="\033[1;34m"
light_red="\033[1;31m"
cyan="\033[0;36m"
light_green="\033[1;32m"
light_gray="\033[0;37m"
green="\033[0;32m"
yellow="\033[1;33m"
light_purple="\033[1;35m"
purple="\033[0;35m"
reset_color="\033[0;00m"

cecho () {
	local msg_par_defaut=""

	local message=${1:-$msg_par_defaut} # Message par défaut.
	local couleur=${2:-$reset_color}    # Couleur par défaut si non spécifié.

	echo -e "$couleur $message"
	# Restaure le paramètre d'origine
	tput sgr0                     # Retour à la normale.

	return
}


runserver() {

	# Recherche de l'adresse ipv4 du poste.
	local poste=`hostname -I | tr -s ' ' | cut -d' ' -f1`
	local serverport=8512 # default port
	local keepportallowedbyfirewall=false
	local openserver=false


	# Lancer un serveur monothread sur le port voulu (defaut : 8512)
	cecho "   		 #############################################" $light_purple
	cecho "   		 #                                           #" $light_purple
	cecho "   		 #    Ouverture d'un serveur monothread      #" $light_purple
	cecho "   		 #                                           #" $light_purple
	cecho "   		 #          author : Jerry Wham              #" $light_purple
	cecho "   		 #          contact()ecyseo.net              #" $light_purple
	cecho "   		 #                                           #" $light_purple
	cecho "   		 #                                           #" $light_purple
	cecho "   		 #############################################" $light_purple
	echo ""
	echo -n "Entrez le numéro du port que vous souhaiter utiliser, entre 8000 et 8999 :"
	# local userinput=$1
	read userinput


	if [[ $userinput -lt 8000 || $userinput -gt 8999 ]];   # checks that the input is within the desired range
		then
			echo ""
			cecho "Votre saisie est en dehors de la plage autorisée." $light_red
			cecho "Le port sera celui par défaut : 8512." $light_red
		else
			serverport=$userinput
	fi

	# Commandes pour lancer le serveur
	local cmdpython="python3 -m http.server $serverport --bind $poste"
	local cmdphp="php -S $poste:$serverport monothread-server.php"

	# Vérifie si le port est autorisé par le parefeu
	echo ""
	echo "Vérification dans 2 secondes de l'autorisation d'ouverture du port $serverport par le parefeu..."
	sleep 2s
	pkexec ufw status verbose | tr -d "[:space:]" | grep -q "$serverport""ALLOW"
	# Récupère le status de la commande précédente
	local status=$?
	echo ""
	# "0" : le port est ouvert. "1" : il est fermé
	if [[ $status == 1 ]]; then
		cecho "Le port est actuellement fermé." $light_red
		if asksomething "Autoriser l'ouverture du port $serverport ?"; then
			pkexec ufw allow $serverport
			if asksomething "Souhaitez-vous conserver cette règle lorsque le serveur sera fermé ?"; then
				keepportallowedbyfirewall=true
			fi
			openserver=true
		else
			echo ""
			cecho "Vous avez refusé l'ouverture du port." $light_red
			echo "Le serveur ne sera pas lancé. Le script va se terminer."
			showlicence
			notify-send -i info -t 20000 "Serveur fermé"
			exit
		fi
	else
		cecho "Le port $serverport est actuellement ouvert." $light_green
		if asksomething "Souhaitez-vous conserver cette règle lorsque le serveur sera fermé ?"; then
			keepportallowedbyfirewall=true
		fi
		openserver=true
	fi
	if [[ $openserver == true ]]; then
		# Choix du type de serveur
		# Et lancement de celui-ci
		echo ""
		echo "   		 		---- *** ----"
		echo ""
		echo "			   Initialisation du serveur."
		cecho "		Appuyer sur les touches ctrl+c pour le fermer..." $light_green
		echo ""
		echo "   		 		---- *** ----"
		echo ""
		echo "Voulez-vous lancer un serveur python ?"
		if asksomething "Dans le cas contraire, un serveur php sera lancé"; then
			echo ""
			printf '		 		   \U1F409\n'
			cecho "			 Lancement du serveur python." $light_green
			echo ""
			printf '		 		   \U1F409\n'
			echo ""
			($cmdpython)
		else
			touch monothread-server.php
			echo "<?php \$requestedAbsoluteFile = dirname(__FILE__) . \$_SERVER['REQUEST_URI'];if (!preg_match('/\.php\$/', \$requestedAbsoluteFile) && \$_SERVER['REQUEST_URI'] != '/') {header('Content-Type: '.mime_content_type(\$requestedAbsoluteFile));\$fh = fopen(\$requestedAbsoluteFile, 'r');fpassthru(\$fh);fclose(\$fh);return true;}function scanFileNameRecursivly(\$path = '', &\$name = array() ) {\$path = \$path == ''? dirname(__FILE__) : \$path;\$lists = @scandir(\$path);if(!empty(\$lists)){ foreach(\$lists as \$f){if(is_dir(\$path.DIRECTORY_SEPARATOR.\$f) && '..' != \$f && '.' != \$f){scanFileNameRecursivly(\$path.DIRECTORY_SEPARATOR.\$f, \$name); }else if ('..' != \$f && '.' != \$f && 'monothread-server.php' != \$f){\$name[] = \$path.DIRECTORY_SEPARATOR.\$f;}}}return \$name;} ?><?php \$files = scanFileNameRecursivly(__DIR__);echo '<html><body><h1>Dossier /</h1><ul>';foreach (\$files as \$i => \$file) {if ('.' !== \$file && '..' !== \$file && 'monothread-server.php' !== \$file) {\$f = str_replace(__DIR__,'',\$file);echo '<li><a href=\"'.\$f.'\">'.\$f.'</a></li>';}}?>" >> monothread-server.php
			echo ""
			printf '		 		   \U1F418\n'
			cecho "			 Lancement du serveur php." $light_blue
			echo ""
			printf '		 		   \U1F418\n'
			echo ""
			($cmdphp)
			rm monothread-server.php
		fi
		if [[ $keepportallowedbyfirewall == false ]]; then
			echo ""
			if asksomething "Autoriser la fermeture du port $serverport ?"; then
				pkexec ufw deny $serverport
			else
				cecho "Le port restera ouvert lorsque ce script sera terminé" $light_blue
				sleep 3s
			fi
		fi
		showlicence
		notify-send -i info -t 20000 "Serveur fermé"
		exit
	fi
}

runserver