« Contrôle parental » : différence entre les versions

De Le Wiki du Forum-Debian.fr
Aller à la navigation Aller à la recherche
(maj 3.85.4)
 
(176 versions intermédiaires par 4 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
lien sur le [http://www.debian-fr.org/controle-parental-pour-le-pc-debian-de-vos-enfants-t42009.html forum]
__TOC__
'''CTparental.sh'''
<code bash>#!/bin/bash
# CTparental.sh
#
# par Guillaume MARSAT
# Corrections orthographiques par Pierre-Edouard TESSIER
# une parti du code est tiré du script alcasar-bl.sh créé par Franck BOUIJOUX et Richard REY
# présent dans le code du projet alcasar en version 2.6.1 ; web page http://www.alcasar.net/
# This script is distributed under the Gnu General Public License (GPL)
arg1=${1}
if [ $# -ge 1 ];then
if [ $arg1 != "-listusers" ] ; then
if [ ! $UID -le 499 ]; then # considaire comme root tous les utilisateurs avec un uid inferieur ou egale a 499,ce qui permet a apt-get,urpmi,yum... de lance le scripte sans erreur.
  echo "Il vous faut des droits root pour lancer ce script"
  exit 1
fi
fi
fi


Petit rappel : Le contrôle parental ne doit pas se substituer aux coups d’œil et dialogues avec vos enfants de temps en temps mais apporte un plus.


noinstalldep="0"
Je vous propose donc de mettre en place un filtrage directement sur le pc a protéger, à l'aide de :
nomanuel="0"
ARGS=($*)
for (( narg=1; narg<=$#; narg++ )) ; do
        case "${ARGS[$narg]}" in
  -nodep )
    noinstalldep="1"
  ;;
  -nomanuel )
    nomanuel="1"
  ;;
  -dirhtml )
    narg=$(( $narg +1 ))
    DIRhtmlPersonaliser=${ARGS[$narg]}
    if [ ! -d $DIRhtmlPersonaliser ];then
echo "Chemin de répertoire non valide!"
exit 0
    fi
  ;;
esac
done
pause () {  # fonction pause pour debugage
      MESSAGE="$*"
      choi=""
      MESSAGE=${MESSAGE:="pour continuer appuyez sur une touche :"}
      echo  "$MESSAGE"
      while (true); do
        read choi
        case $choi in
        * )
        break
        ;;
      esac
      done
}
SED="/bin/sed -i"
DIR_CONF="/usr/local/etc/CTparental"
FILE_CONF="$DIR_CONF/CTparental.conf"
FILE_GCTOFFCONF="$DIR_CONF/GCToff.conf"
FILE_HCOMPT="$DIR_CONF/CThourscompteur"
FILE_HCONF="$DIR_CONF/CThours.conf"
if [ ! -f $FILE_CONF ] ; then
mkdir -p $DIR_CONF
mkdir -p /usr/local/share/CTparental/
cat << EOF > $FILE_CONF
LASTUPDATE=0
DNSMASQ=BLACK
AUTOUPDATE=OFF
HOURSCONNECT=OFF
GCTOFF=OFF
# Parfeux minimal.
IPRULES=OFF
# Ping Externe
IPRULE1=OFF
# IP indésirables
IPRULE2=OFF
# connections ftp
IPRULE3=ON
# cups serveur , impriment partager sous cups
IPRULE4=OFF
# emesene,pindgin,amsn...
IPRULE5=OFF
#  smtp + pop ssl thunderbird ...
IPRULE6=ON
#  smtp + pop thunderbird ...
IPRULE7=OFF
# client-transmission
IPRULE8=OFF
# Ryzom
IPRULE9=OFF
# Regnum Online
IPRULE10=OFF
# NeverWinter Nights 1
IPRULE11=OFF
# LandesEternelles
IPRULE12=OFF
# SecondeLife
IPRULE13=OFF
# Batel for Wesnoth
IPRULE14=OFF
# Steam: CS 1.6
IPRULE15=OFF
EOF


fi
iptables+dnsmasq+dansguardian+privoxy (Pour le filtrage)


lighttpd (Pour la page de redirection et l'interface d'administration)






## imports du plugin de la distributions si il existe
== Les sources. ==
if [ -f $DIR_CONF/dist.conf ];then
source  $DIR_CONF/dist.conf
fi


tempDIR="/tmp/alcasar"
Toutes les sources sont sur le [https://gitlab.com/marsat/CTparental site officiel]
tempDIRRamfs="/tmp/alcasarRamfs"
if [ ! -d $tempDIRRamfs ] ; then
mkdir $tempDIRRamfs
fi
RougeD="\033[1;31m"
BleuD="\033[1;36m"
VertD="\033[1;32m"
Fcolor="\033[0m"
GESTIONNAIREDESESSIONS=" login gdm lightdm slim kdm xdm lxdm gdm3 "
FILEPAMTIMECONF="/etc/security/time.conf"
DIRPAM="/etc/pam.d/"
DAYS=${DAYS:="lundi mardi mercredi jeudi vendredi samedi dimanche "}
DAYS=( $DAYS )
DAYSPAM=( Mo Tu We Th Fr Sa Su )
DAYSCRON=( mon tue wed thu fri sat sun )


#### DEPENDANCES par DEFAULT #####
== Installation par le deb : ==
DEPENDANCES=${DEPENDANCES:=" dnsmasq lighttpd php5-cgi libnotify-bin notification-daemon iptables-persistent rsyslog "}
#### PACKETS EN CONFLI par DEFAULT #####
CONFLICTS=${CONFLICTS:=" mini-httpd apache2 firewalld "}


#### COMMANDES de services par DEFAULT #####
Téléchargez la dernière version deb correspondant à votre distribution sur https://gitlab.com/marsat/CTparental/-/releases .
CMDSERVICE=${CMDSERVICE:="service "}
CRONstart=${CRONstart:="$CMDSERVICE cron start "}
CRONstop=${CRONstop:="$CMDSERVICE cron stop "}
CRONrestart=${CRONrestart:="$CMDSERVICE cron restart "}
LIGHTTPDstart=${LIGHTTPDstart:="$CMDSERVICE lighttpd start "}
LIGHTTPDstop=${LIGHTTPDstop:="$CMDSERVICE lighttpd stop "}
LIGHTTPDrestart=${LIGHTTPDrestart:="$CMDSERVICE lighttpd restart "}
DNSMASQstart=${DNSMASQstart:="$CMDSERVICE dnsmasq start "}
DNSMASQstop=${DNSMASQstop:="$CMDSERVICE dnsmasq stop "}
DNSMASQrestart=${DNSMASQrestart:="$CMDSERVICE dnsmasq restart "}
NWMANAGERstop=${NWMANAGERstop:="$CMDSERVICE network-manager stop"}
NWMANAGERstart=${NWMANAGERstart:="$CMDSERVICE network-manager start"}
NWMANAGERrestart=${NWMANAGERrestart:="$CMDSERVICE network-manager restart"}
IPTABLESsave=${IPTABLESsave:="$CMDSERVICE iptables-persistent save"}


#### LOCALISATION du fichier PID lighttpd par default ####
il y a 2 branches encore actives du logiciel en fonction des paquets utilisés pour effectuer le filtrages, ce qui permet d’être plus modulable en fonction des machines et distributions utilisées.
LIGHTTPpidfile=${LIGHTTPpidfile:="/var/run/lighttpd.pid"}
(à partir des versions versions 5.x.x)


#### LOCALISATION du fichier de chargement de modules ####
- '''master''' = nftables (successeur d'iptables), dnscrypt-proxy (remplaçant dnsmasq), lighttpd ou nginx, privoxy et e2guardian ( successeur de dansguardian ).
FILEMODULESLOAD=${MODULESLOAD:="/etc/modules-load.d/modules.conf"}


RSYSLOGCTPARENTAL=${RSYSLOGCTPARENTAL:="/etc/rsyslog.d/iptables.conf"}
- '''min''' = nftables = nftables (successeur d'iptables), dnscrypt-proxy (remplaçant dnsmasq), lighttpd ou nginx.


#### COMMANDES D'ACTIVATION DES SERVICES AU DEMARAGE DU PC ####
et 5 branches historique, non maintenu qui ce basé sur dnsmasq, dansguardian , iptables .(jusqu'aux versions 4.x.x)
ENCRON=${ENCRON:=""}
ENLIGHTTPD=${ENLIGHTTPD:=""}
ENDNSMASQ=${ENDNSMASQ:=""}
ENNWMANAGER=${ENNWMANAGER:=""}
ENIPTABLESSAVE=${ENIPTABLESSAVE:=""}
#### UID MINIMUM pour les UTILISATEUR
UIDMINUSER=${UIDMINUSER:=1000}


DNSMASQCONF=${DNSMASQCONF:="/etc/dnsmasq.conf"}
- '''dnsmasq''' = nftables (successeur d'iptables), dnsmasq, lighttpd ou nginx, privoxy et e2guardian ( successeur de dansguardian ).
MAINCONFHTTPD=${MAINCONFHTTPD:="/etc/lighttpd/lighttpd.conf"}
DIRCONFENABLEDHTTPD=${DIRCONFENABLEDHTTPD:="/etc/lighttpd/conf-enabled"}
CTPARENTALCONFHTTPD=${CTPARENTALCONFHTTPD:="$DIRCONFENABLEDHTTPD/10-CTparental.conf"}
DIRHTML=${DIRHTML:="/var/www/CTparental"}
DIRadminHTML=${DIRadminHTML:="/var/www/CTadmin"}
PASSWORDFILEHTTPD=${PASSWORDFILEHTTPD:="/etc/lighttpd/lighttpd-htdigest.user"}
REALMADMINHTTPD=${REALMADMINHTTPD:="interface admin"}
CMDINSTALL=""


ADDUSERTOGROUP=${ADDUSERTOGROUP:="gpasswd -a "}
- '''dnsmasq_min''' = nftables = nftables (successeur d'iptables), dnsmasq, lighttpd ou nginx.
DELUSERTOGROUP=${DELUSERTOGROUP:="gpasswd -d "}
if [ $(yum help 2> /dev/null | wc -l ) -ge 50 ] ; then
  ## "Distribution basée sur yum exemple redhat, fedora..."
  CMDINSTALL=${CMDINSTALL:="yum install "}
  CMDREMOVE=${CMDREMOVE:="rpm -e "}
fi
urpmi --help 2&> /dev/null
if [ $? -eq 1 ] ; then
  ## "Distribution basée sur urpmi exemple mandriva..."
  CMDINSTALL=${CMDINSTALL:="urpmi -a --auto "}
  CMDREMOVE=${CMDREMOVE:="rpm -e "}
fi
apt-get -h 2&> /dev/null
if [ $? -eq 0 ] ; then
  ## "Distribution basée sur apt-get exemple debian, ubuntu ..."
  CMDINSTALL=${CMDINSTALL:="apt-get -y --force-yes install "}
  CMDREMOVE=${CMDREMOVE:="dpkg --purge  "}
fi


if [ $( echo $CMDINSTALL | wc -m ) -eq 1 ] ; then
- '''iptables''' = iptables, ipset, dnsmasq, lighttpd ou nginx, privoxy et e2guardian ( successeur de dansguardian ).
  echo "Aucun gestionner de paquet connu , n'a été détecté."
  set -e
  exit 1
fi


- '''dansguardian''' = iptables, ipset, dnsmasq, lighttpd, privoxy et dansguardian.


- '''iptables_min''' = iptables, ipset,dnsmasq, lighttpd ou nginx.


exemple pour debian9 il y a 4 paquet possible. 2 paquet dérivé de la branche iptables avec lighttpd ou nginx et 2 autres dérivé de la branche iptables_min si l'on veut utiliser moins de ressources.


interface_WAN=$(ip route | awk '/^default via/{print $5}' | sort -u ) # suppose que la passerelle est la route par default
== Pour ceux qui veulent tester en ipv6 ==
ipbox=$(ip route | awk '/^default via/{print $3}' | sort -u )  # suppose que la passerelle est la route par default
ipinterface_WAN=$(ifconfig $interface_WAN | awk '/adr:/{print $2}' | cut -d":" -f2)
reseau_box=$(ip route | grep / | grep "$interface_WAN" | cut -d" " -f1 )
ip_broadcast=$(ifconfig $interface_WAN | awk '/Bcast:/{print $3}' | cut -d":" -f2)


DNS1=$(cat /etc/resolv.conf | grep ^nameserver | cut -d " " -f2 | tr "\n" " " | cut -d " " -f1)
c'est possible avec la dernière les version 4.20.x sous debian testing/sid ,<br />
DNS2=$(cat /etc/resolv.conf | grep ^nameserver | cut -d " " -f2 | tr "\n" " " | cut -d " " -f2)
il faudra au préalable s’assurer que son fournisseur d'accès accepte bien l'ipv6 , ce qui n'est malheureusement pas mon cas.
resolvconffix () {
resolvconf -u 2&> /dev/null
if [ $? -eq 1 ];then
if [ -f /run/resolvconf/interface/original.resolvconf ] ; then
cat /run/resolvconf/interface/original.resolvconf > /etc/resolvconf/resolv.conf.d/tail
resolvconf -u
DNS1=$(cat /run/resolvconf/interface/original.resolvconf | grep ^nameserver | cut -d " " -f2 | tr "\n" " " | cut -d " " -f1)
DNS2=$(cat /run/resolvconf/interface/original.resolvconf | grep ^nameserver | cut -d " " -f2 | tr "\n" " " | cut -d " " -f2)
fi
if [ -f /run/resolvconf/interface/$interface_WAN.dhclient ] ; then
cat /run/resolvconf/interface/$interface_WAN.dhclient >  /etc/resolvconf/resolv.conf.d/tail
resolvconf -u
DNS1=$(cat /run/resolvconf/interface/$interface_WAN.dhclient | grep ^nameserver | cut -d " " -f2 | tr "\n" " " | cut -d " " -f1)
DNS2=$(cat /run/resolvconf/interface/$interface_WAN.dhclient | grep ^nameserver | cut -d " " -f2 | tr "\n" " " | cut -d " " -f2)
fi
if [ -f /run/resolvconf/interface/NetworkManager ] ; then
cat /run/resolvconf/interface/NetworkManager >  /etc/resolvconf/resolv.conf.d/tail
resolvconf -u
DNS1=$(cat /run/resolvconf/interface/NetworkManager | grep ^nameserver | cut -d " " -f2 | tr "\n" " " | cut -d " " -f1)
DNS2=$(cat /run/resolvconf/interface/NetworkManager | grep ^nameserver | cut -d " " -f2 | tr "\n" " " | cut -d " " -f2)
fi
fi
}
resolvconffix


PRIVATE_IP="127.0.0.10"
l'ipv6 n'étant pas encore implémentée dans e2guardian , ctparental ne force pas le passage par celui-ci mais attaque directement privoxy.


FILE_tmp=${FILE_tmp:="$tempDIRRamfs/filetmp.txt"}
Une désinstallation avec purge est nécessaire en cas de mise à jour d'une version antérieure.
FILE_tmpSizeMax=${FILE_tmpSizeMax:="128M"}  # 70 Min, Recomend 128M
LOWRAM=${LOWRAM:=0}
if [ $LOWRAM -eq 0 ] ; then
MFILEtmp="mount -t tmpfs -o size=$FILE_tmpSizeMax tmpfs $tempDIRRamfs"
UMFILEtmp="umount $tempDIRRamfs"
else
MFILEtmp=""
UMFILEtmp=""
fi
BL_SERVER="dsi.ut-capitole.fr"
FILEIPBLACKLIST="$DIR_CONF/ip-blackliste"
CATEGORIES_ENABLED="$DIR_CONF/categories-enabled"
BL_CATEGORIES_AVAILABLE="$DIR_CONF/bl-categories-available"
WL_CATEGORIES_AVAILABLE="$DIR_CONF/wl-categories-available"
DIR_DNS_FILTER_AVAILABLE="$DIR_CONF/dnsfilter-available"
DIR_DNS_BLACKLIST_ENABLED="$DIR_CONF/blacklist-enabled"
DIR_DNS_WHITELIST_ENABLED="$DIR_CONF/whitelist-enabled"
DNS_FILTER_OSSI="$DIR_CONF/blacklist-local"
DREAB="$DIR_CONF/domaine-rehabiliter"
THISDAYS=$(expr $(date +%Y) \* 365 + $(date +%j))
MAXDAYSFORUPDATE="7" # update tous les 7 jours
CHEMINCTPARENTLE=$(readlink -f $0)


initblenabled () {
   # apt-get remove --purge ctparental privoxy e2guardian dansguardian dnsmasq lighttpd
  cat << EOF > $CATEGORIES_ENABLED
adult
agressif
dangerous_material
dating
drogue
gambling
hacking
malware
marketingware
mixed_adult
phishing
redirector
sect
strict_redirector
strong_redirector
tricheur
warez
ossi    
EOF
       


}
  $ wget -c https://gitlab.com/marsat/CTparental/uploads/d5567eb1a43ffde679193bce87be5f69/ctparental_debian10_lighttpd_4.44.18-1.0_all.deb


addadminhttpd() {
Pour tester le filtrage avec un utilisateur non filtré il suffit que celui-ci ajoute le proxy http et https suivant dans son navigateur.<br />
if [ ! -f $PASSWORDFILEHTTPD ] ; then
http et https '''::1''' port '''8888'''
    echo -n > $PASSWORDFILEHTTPD 
fi
chown root:$USERHTTPD $PASSWORDFILEHTTPD
chmod 640 $PASSWORDFILEHTTPD
USERADMINHTTPD=${1}
pass=${2}
hash=`echo -n "$USERADMINHTTPD:$REALMADMINHTTPD:$pass" | md5sum | cut -b -32`
ligne=$(echo "$USERADMINHTTPD:$REALMADMINHTTPD:$hash")
$SED "/^$USERADMINHTTPD:$REALMADMINHTTPD.*/d" $PASSWORDFILEHTTPD
echo $ligne >> $PASSWORDFILEHTTPD
}


download() {
Pour les utilisateurs filtrés c'est automatique, il n'y a rien à faire.
  rm -rf $tempDIR
  mkdir $tempDIR
  # on attend que la connection remonte suite au redemarage de networkmanager
  echo "attente de connection au serveur de toulouse:"
  i=1
  while [ $(ping -c 1 $BL_SERVER 2> /dev/null | grep -c "1 received"  ) -eq 0 ]
  do
  echo -n .
  sleep 1
  i=$(($i + 1 ))
  if [ $i -ge 40 ];then # si au bout de 40 secondes on a toujours pas de connection on considaire qu'il y a une erreur
echo "connection a $BL_SERVER impossible."
set -e
exit 1
  fi
  done
  echo
  echo "connection établit:"
 
  wget -P $tempDIR http://$BL_SERVER/blacklists/download/blacklists.tar.gz 2>&1 | cat
  if [ ! $? -eq 0 ]; then
      echo "erreur lors du téléchargement, processus interrompu"
      rm -rf $tempDIR
      set -e
      exit 1
  fi
  tar -xzf $tempDIR/blacklists.tar.gz -C $tempDIR
  if [ ! $? -eq 0 ]; then
      echo "erreur d'extraction de l'archive, processus interrompu"
      set -e
      exit 1
  fi
  rm -rf $DIR_DNS_FILTER_AVAILABLE/
  mkdir $DIR_DNS_FILTER_AVAILABLE
}
autoupdate() {
        LASTUPDATEDAY=`grep LASTUPDATE= $FILE_CONF | cut -d"=" -f2`
        LASTUPDATEDAY=${LASTUPDATEDAY:=0}
        DIFFDAY=$(expr $THISDAYS - $LASTUPDATEDAY)
if [ $DIFFDAY -ge $MAXDAYSFORUPDATE ] ; then
download
adapt
catChoice
dnsmasqon
                $SED "s?^LASTUPDATE.*?LASTUPDATE=$THISDAYS=`date +%d-%m-%Y\ %T`?g" $FILE_CONF
exit 0
fi
}
autoupdateon() {
$SED "s?^AUTOUPDATE.*?AUTOUPDATE=ON?g" $FILE_CONF
echo "*/10 * * * * root $CHEMINCTPARENTLE -aup" > /etc/cron.d/CTparental-autoupdate
$CRONrestart
}


autoupdateoff() {
== Nettoyage des versions précédentes : ==
$SED "s?^AUTOUPDATE.*?AUTOUPDATE=OFF?g" $FILE_CONF
si vous utilisé l'instance dnscrypt-proxy du deb pour vos connexions système il faut installer celui-ci de manière autonome via la commande ci dessous:
rm -f /etc/cron.d/CTparental-autoupdate
 
$CRONrestart
  # apt-get install dnscrypt-proxy
}
adapt() {
  echo adapt
  date +%H:%M:%S
  dnsmasqoff
  $MFILEtmp
  if [ ! -f $DNS_FILTER_OSSI ] ; then
            echo > $DNS_FILTER_OSSI
  fi


  if [ -d $tempDIR  ] ; then
cela éviteras la surpression de dnscrypt-proxy durant la procédure de dés-installation de ctparental, et ainsi une perte de connexion système.  
  CATEGORIES_AVAILABLE=$tempDIR/categories_available
  ls -FR $tempDIR/blacklists | grep '/$' | sed -e "s/\///g" > $CATEGORIES_AVAILABLE
          echo -n > $BL_CATEGORIES_AVAILABLE
          echo -n > $WL_CATEGORIES_AVAILABLE
          if [ ! -f $DIR_DNS_FILTER_AVAILABLE/ossi.conf ] ; then
echo > $DIR_DNS_FILTER_AVAILABLE/ossi.conf
  fi
  for categorie in `cat $CATEGORIES_AVAILABLE` # creation des deux fichiers de categories (BL / WL)
  do
if [ -e $tempDIR/blacklists/$categorie/usage ]
then
is_whitelist=`grep white $tempDIR/blacklists/$categorie/usage|wc -l`
else
is_whitelist=0 # ou si le fichier 'usage' n'existe pas, on considère que la catégorie est une BL
fi
if [ $is_whitelist -eq "0" ]
then
echo "$categorie" >> $BL_CATEGORIES_AVAILABLE
else
echo "$categorie" >> $WL_CATEGORIES_AVAILABLE
fi
  done
        echo -n "Toulouse Black and White List migration process. Please wait : "
        for DOMAINE in `cat  $CATEGORIES_AVAILABLE`  # pour chaque catégorie
        do
            echo -n "."
            # suppression des @IP, de caractères acccentués et des lignes commentées ou vide
            cp -f $tempDIR/blacklists/$DOMAINE/domains $FILE_tmp
            $SED -r '/([0-9]{1,3}\.){3}[0-9]{1,3}/d' $FILE_tmp
    $SED "/[äâëêïîöôüû]/d" $FILE_tmp
    $SED "/^#.*/d" $FILE_tmp
            $SED "/^$/d" $FILE_tmp
            $SED "s/\.\{2,10\}/\./g" $FILE_tmp # supprime les suite de "." exemple: address=/fucking-big-tits..com/127.0.0.10 devient address=/fucking-big-tits.com/127.0.0.10
    is_blacklist=`grep $DOMAINE $BL_CATEGORIES_AVAILABLE |wc -l`
    if [ $is_blacklist -ge "1" ] ; then
            $SED "s?.*?address=/&/$PRIVATE_IP?g" $FILE_tmp  # Mise en forme dnsmasq des listes noires
mv $FILE_tmp $DIR_DNS_FILTER_AVAILABLE/$DOMAINE.conf 
            else
$SED "s?.*?server=/&/#?g" $FILE_tmp  # Mise en forme dnsmasq des listes blanches
mv $FILE_tmp $DIR_DNS_FILTER_AVAILABLE/$DOMAINE.conf
            fi
        done
  else
        mkdir  $tempDIR
        echo -n "."
# suppression des @IP, de caractères acccentués et des lignes commentées ou vide
        cp -f $DNS_FILTER_OSSI $FILE_tmp
        $SED -r '/([0-9]{1,3}\.){3}[0-9]{1,3}/d' $FILE_tmp
        $SED "/[äâëêïîöôüû]/d" $FILE_tmp
        $SED "/^#.*/d" $FILE_tmp
        $SED "/^$/d" $FILE_tmp
        $SED "s/\.\{2,10\}/\./g" $FILE_tmp # supprime les suite de "." exemple: address=/fucking-big-tits..com/127.0.0.10 devient address=/fucking-big-tits.com/127.0.0.10
        $SED "s?.*?address=/&/$PRIVATE_IP?g" $FILE_tmp  # Mise en forme dnsmasq
        mv $FILE_tmp $DIR_DNS_FILTER_AVAILABLE/ossi.conf
  fi   
  echo
  $UMFILEtmp
  rm -rf $tempDIR
date +%H:%M:%S
}
catChoice() {
#  echo "catChoice"
  rm -rf $DIR_DNS_BLACKLIST_ENABLED/
  mkdir $DIR_DNS_BLACKLIST_ENABLED
  rm -rf  $DIR_DNS_WHITELIST_ENABLED/
  mkdir  $DIR_DNS_WHITELIST_ENABLED
   
      for CATEGORIE in `cat $CATEGORIES_ENABLED` # on affecte les catégories dnsmasq
      do
is_blacklist=`grep $CATEGORIE $BL_CATEGORIES_AVAILABLE |wc -l`
if [ $is_blacklist -ge "1" ] ; then
cp $DIR_DNS_FILTER_AVAILABLE/$CATEGORIE.conf $DIR_DNS_BLACKLIST_ENABLED/
        else
cp $DIR_DNS_FILTER_AVAILABLE/$CATEGORIE.conf $DIR_DNS_WHITELIST_ENABLED/
    fi   
      done
      cp $DIR_DNS_FILTER_AVAILABLE/ossi.conf $DIR_DNS_BLACKLIST_ENABLED/
#      echo "fincatChoice"
      reabdomaine
}


reabdomaine () {
  # apt-get autoremove --purge ctparental clamav-* privoxy lighttpd dansguardian dnsmasq nginx e2guardian
echo reabdomaine
date +%H:%M:%S
$MFILEtmp
if [ ! -f $DREAB ] ; then
cat << EOF > $DREAB
www.google.com
www.google.fr
EOF
fi
if [ ! -f $DIR_DNS_BLACKLIST_ENABLED/ossi.conf ] ; then
echo > $DIR_DNS_BLACKLIST_ENABLED/ossi.conf
fi
echo
echo -n "Application de la liste blanche (domaine réhabilité):"
for CATEGORIE in `cat  $CATEGORIES_ENABLED  `  # pour chaque catégorie
do
is_blacklist=`grep $CATEGORIE $BL_CATEGORIES_AVAILABLE |wc -l`
if [ $is_blacklist -ge "1" ] ; then
echo -n "."
for DOMAINE in `cat $DREAB`
do
    cp -f $DIR_DNS_BLACKLIST_ENABLED/$CATEGORIE.conf $FILE_tmp
    $SED "/$DOMAINE/d" $FILE_tmp
                    cp -f $FILE_tmp $DIR_DNS_BLACKLIST_ENABLED/$CATEGORIE.conf
done
        fi
done
echo -n "."
cat $DREAB | sed -e "s? ??g" | sed -e "s?.*?server=/&/#?g" >  $DIR_DNS_WHITELIST_ENABLED/whiteliste.ossi.conf
echo
$UMFILEtmp
rm -f $FILE_tmp
date +%H:%M:%S
}


dnsmasqon () {
   # rm -rf /etc/CTparental
  categorie1=`sed -n "1 p" $CATEGORIES_ENABLED` # on considère que si la 1ère categorie activée est un blacklist on fonctionne par blacklist.
  is_blacklist=`grep $categorie1 $BL_CATEGORIES_AVAILABLE |wc -l`
  if [ $is_blacklist -ge "1" ] ; then
  $SED "s?^DNSMASQ.*?DNSMASQ=BLACK?g" $FILE_CONF
  cat << EOF > $DNSMASQCONF
        # Configuration file for "dnsmasq with blackhole"
  # Inclusion de la blacklist <domains> de Toulouse dans la configuration
  conf-dir=$DIR_DNS_BLACKLIST_ENABLED
  # conf-file=$DIR_DEST_ETC/alcasar-dns-name  # zone de definition de noms DNS locaux
  interface=lo
  listen-address=127.0.0.1
  no-dhcp-interface=$interface_WAN
  bind-interfaces
  cache-size=1024
  domain-needed
  expand-hosts
  bogus-priv
  port=54
  server=$DNS1
  server=$DNS2
 
EOF
$DNSMASQrestart
else
  dnsmasqwhitelistonly
fi
}
dnsmasqoff () {
  $SED "s?^DNSMASQ.*?DNSMASQ=OFF?g" $FILE_CONF
}
ipMaskValide() {
ip=$(echo $1 | cut -d"/" -f1)
mask=$(echo $1 | grep "/" | cut -d"/" -f2)
if [ $(echo $1 | grep -c "^\(\(2[0-5][0-5]\|2[0-4][0-9]\|1[0-9][0-9]\|[0-9]\{1,2\}\)\.\)\{3\}\(2[0-5][0-5]\|2[0-4][0-9]\|1[0-9][0-9]\|[0-9]\{1,2\}\)$") -eq 1 ];then
echo 1
return 1
fi
if [ ! $(echo $ip | grep -c "^\(\(2[0-5][0-5]\|2[0-4][0-9]\|1[0-9][0-9]\|[0-9]\{1,2\}\)\.\)\{3\}\(2[0-5][0-5]\|2[0-4][0-9]\|1[0-9][0-9]\|[0-9]\{1,2\}\)$") -eq 1 ];then
echo 0
return 0
fi
if [ $(echo $mask | grep -c "^\([1-9]\|[1-2][0-9]\|3[0-2]\)$") -eq 1 ];then
echo 1
return 1
fi
i=1
octn=255
result=1
while [ $i -le 4 ]
do
oct=$( echo $mask | grep '\.'| cut -d "." -f$i )
if [ -z $oct ] ; then
result=0
break
fi
if [ ! $octn -eq 255 ];then
if [ ! $oct -eq 0 ];then
result=0
break
fi
fi
octn=$oct
if [ ! $oct -eq 255 ] &&  [ ! $oct -eq 254 ]  &&  [ ! $oct -eq 252 ] &&  [ ! $oct -eq 248 ] &&  [ ! $oct -eq 240 ] &&  [ ! $oct -eq 224 ] &&  [ ! $oct -eq 192 ] &&  [ ! $oct -eq 128 ] &&  [ ! $oct -eq 0 ]; then
result=0
break
   fi
i=$( expr $i + 1 )
done
  echo $result
  return $result
}
ipglobal () {
## parametrage pour ce protéger contre les attaques par spoofing et par synflood
    ### SUPPRESSION de TOUTES LES ANCIENNES TABLES (OUVRE TOUT!!) ###
    /sbin/iptables -F
    /sbin/iptables -X
    ### BLOQUE TOUT PAR DEFAUT (si aucune règle n'est définie par la suite) ###
    /sbin/iptables -P INPUT DROP
    /sbin/iptables -P OUTPUT DROP
    /sbin/iptables -P FORWARD DROP
    # TCP Syn Flood
    /sbin/iptables -A INPUT -i $interface_WAN -p tcp --syn -m limit --limit 3/s -j ACCEPT
    # UDP Syn Flood
    /sbin/iptables -A INPUT -i $interface_WAN -p udp -m limit --limit 10/s -j ACCEPT
    # Ping Externe
if [ $(cat $FILE_CONF | grep -c IPRULE1=ON ) -eq 1 ];then
      iptables -A INPUT -i $interface_WAN -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
      iptables -A INPUT -i $interface_WAN -p icmp --icmp-type echo-reply -m limit --limit 1/s -j ACCEPT
fi
### IP indésirables
    if [ $(cat $FILE_CONF | grep -c IPRULE2=ON ) -eq 1 ];then
      if [ -e $FILEIPBLACKLIST ]
      then
  while read ligne
  do
ipdrop=`echo $ligne | cut -d " " -f1` 
    if [ $( ipMaskValide $ipdrop ) -eq 1 ] ;then
iptables -I INPUT  -s $ipdrop -j DROP
iptables -I OUTPUT  -d $ipdrop -j DROP
fi
      done < $FILEIPBLACKLIST
      else
    echo >  $FILEIPBLACKLIST
    chown root:root  $FILEIPBLACKLIST
    chmod 750  $FILEIPBLACKLIST
      fi
    fi
    ### ACCEPT ALL interface loopback ###
    iptables -A INPUT  -i lo -j ACCEPT
    iptables -A OUTPUT -o lo -j ACCEPT
    ### accepte en entrée les connexions déjà établies (en gros cela permet d'accepter
    ### les connexions initiées par sont propre PC)
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
   
    ### DHCP
    iptables -A OUTPUT -o $interface_WAN -p udp --sport 68 --dport 67 -j ACCEPT
    iptables -A INPUT -i $interface_WAN -p udp --sport 67 --dport 68 -j ACCEPT
    ### DNS indispensable pour naviguer facilement sur le web ###
    iptables -A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
    iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
    iptables -A OUTPUT -d 127.0.0.1 -p tcp -m tcp --dport 54 -j ACCEPT
    iptables -A OUTPUT -d 127.0.0.1 -p udp -m udp --dport 54 -j ACCEPT
    ### HTTP navigation internet non sécurisée ###
    iptables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
   
    ### HTTPS pour le site des banques .... ###
    iptables -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
   
    ### ping ... autorise à "pinger" un ordinateur distant ###
    iptables -A OUTPUT -p icmp -j ACCEPT
   
    ### clientNTP ... syncro à un serveur de temps ###
    iptables -A OUTPUT -p udp -m udp --dport 123 -j ACCEPT
   
    ### ftp


    if [ $(cat $FILE_CONF | grep -c IPRULE3=ON ) -eq 1 ];then
== Installez le deb : ==
iptables -A OUTPUT -p tcp --dport 21  -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp --dport 1023:65535  -m state --state ESTABLISHED,RELATED -j ACCEPT
    fi
   
    ### cups serveur , impriment partager sous cups
if [ $(cat $FILE_CONF | grep -c IPRULE4=ON ) -eq 1 ] ; then
iptables -A OUTPUT -d $ip_broadcast -p udp -m udp --sport 631 --dport 631 -j ACCEPT # diffusion des imprimantes partager sur le réseaux
iptables -A INPUT -s $reseau_box -m state --state NEW -p TCP --dport 631 -j ACCEPT
iptables -I INPUT -s $ipbox -m state --state NEW -p TCP --dport 631 -j DROP # drop les requette provenent de la passerelle
fi
    ### emesene,pindgin,amsn...  ####
    if [ $(cat $FILE_CONF | grep -c IPRULE5=ON ) -eq 1 ] ; then
iptables -A OUTPUT -p tcp -m tcp --dport 1863 -j ACCEPT   
iptables -A OUTPUT -p tcp -m tcp --dport 6891:6900 -j ACCEPT # pour transfert de fichiers , webcam
iptables -A OUTPUT -p udp -m udp --dport 6891:6900 -j ACCEPT # pour transfert de fichiers , webcam
    fi
   
    ### smtp + pop ssl thunderbird ...  ####
    if [ $(cat $FILE_CONF | grep -c IPRULE6=ON ) -eq 1 ]
    then
iptables -A OUTPUT -p tcp -m tcp --dport 993 -j ACCEPT # imap/ssl
iptables -A OUTPUT -p tcp -m tcp --dport 995 -j ACCEPT # pop/ssl
iptables -A OUTPUT -p tcp -m tcp --dport 465 -j ACCEPT      # smtp/ssl
    fi
    ###  smtp + pop thunderbird ...  ###
    if [ $(cat $FILE_CONF | grep -c IPRULE7=ON ) -eq 1 ]
then
        iptables -A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT
        iptables -A OUTPUT -p tcp -m tcp --dport 110 -j ACCEPT
    fi


    ### client-transmission
   # gdebi ctparental_*_all.deb
    # ouvre beaucoup de ports
    if [ $(cat $FILE_CONF | grep -c IPRULE8=ON ) -eq 1 ]
    then
      iptables -A OUTPUT -p udp -m udp --sport 51413 --dport 1023:65535  -j ACCEPT
      iptables -A OUTPUT -p tcp -m tcp --sport 30000:65535 --dport 1023:65535  -j ACCEPT
    fi
###Ryzom
if [ $(cat $FILE_CONF | grep -c IPRULE9=ON ) -eq 1 ]
then
srvupdateRtzom=178.33.44.72
srvRyzom1=176.31.229.93
iptables -A OUTPUT  -d $srvupdateRtzom -p tcp --dport 873 -j ACCEPT
iptables -A OUTPUT  -d $srvRyzom1 -p tcp --dport 43434 -j ACCEPT
iptables -A OUTPUT  -d $srvRyzom1 -p tcp --dport 50000 -j ACCEPT
iptables -A OUTPUT  -d $srvRyzom1 -p tcp --dport 40916 -j ACCEPT
iptables -A OUTPUT  -d $srvRyzom1 -p udp --dport 47851:47860 -j ACCEPT
iptables -A OUTPUT  -d $srvRyzom1 -p tcp --dport 47851:47860 -j ACCEPT
fi
    ### Regnum Online
    if [ $(cat $FILE_CONF | grep -c IPRULE10=ON ) -eq 1 ]
    then
  iptables -A OUTPUT  -d 91.123.197.131 -p tcp --dport 47300 -j ACCEPT # autentification
iptables -A OUTPUT  -d 91.123.197.142 -p tcp --dport 48000:48002  -j ACCEPT # nemon
    fi
   
    ### NeverWinter Nights 1
    if [ $(cat $FILE_CONF | grep -c IPRULE11=ON ) -eq 1 ];then
      iptables -A OUTPUT  -p udp --dport 5120:5121 -j ACCEPT
      iptables -I OUTPUT  -d 204.50.199.9 -j DROP # nwmaster.bioware.com permet d'éviter le temps d'attente avant l'ouverture du multijoueur
    fi
    ### LandesEternelles
    if [ $(cat $FILE_CONF | grep -c IPRULE12=ON ) -eq 1 ]
    then
        iptables -A OUTPUT  -d 62.93.225.45 -p tcp --dport 3000 -j ACCEPT
    fi
    ### SecondeLife
    if [ $(cat $FILE_CONF | grep -c IPRULE13=ON ) -eq 1 ]
  then
     
      iptables -A INPUT  -s 216.82.0.0/18 -p tcp --dport 1023:65535 -j ACCEPT # Secondelife
      iptables -A INPUT  -s 64.94.252.0/23 -p tcp --dport 1023:65535 -j ACCEPT # Voice
      iptables -A INPUT  -s 70.42.62.0/24 -p tcp --dport 1023:65535 -j ACCEPT # Voice
      iptables -A INPUT  -s 74.201.98.0/23 -p tcp --dport 1023:65535 -j ACCEPT # Voice
      iptables -A INPUT  -s 216.82.0.0/18 -p udp --dport 1023:65535 -j ACCEPT # Secondelife
      iptables -A INPUT  -s 64.94.252.0/23 -p udp --dport 1023:65535 -j ACCEPT # Voice
      iptables -A INPUT  -s 70.42.62.0/24 -p udp --dport 1023:65535 -j ACCEPT # Voice
      iptables -A INPUT  -s 74.201.98.0/23 -p udp --dport 1023:65535 -j ACCEPT # Voice
      iptables -A OUTPUT  -d 216.82.0.0/18 -p tcp --sport 1023:65535 -j ACCEPT # Secondelife
      iptables -A OUTPUT  -d 64.94.252.0/23 -p tcp --sport 1023:65535 -j ACCEPT # Voice
      iptables -A OUTPUT  -d 70.42.62.0/24 -p tcp --sport 1023:65535 -j ACCEPT # Voice
      iptables -A OUTPUT  -d 74.201.98.0/23  -p tcp --sport 1023:65535 -j ACCEPT # Voice
      iptables -A OUTPUT  -d 216.82.0.0/18 -p udp --sport 1023:65535 -j ACCEPT # Secondelife
      iptables -A OUTPUT  -d 64.94.252.0/23 -p udp --sport 1023:65535 -j ACCEPT # Voice
      iptables -A OUTPUT  -d 70.42.62.0/24 -p udp --sport 1023:65535 -j ACCEPT # Voice
      iptables -A OUTPUT  -d 74.201.98.0/23  -p udp --sport 1023:65535 -j ACCEPT # Voice
    fi
   
    ### Batel for Wesnoth
    if [ $(cat $FILE_CONF | grep -c IPRULE14=ON ) -eq 1 ];then
      #14998 pour version stable.
      #14999 pour version stable précédente.
      #15000 pour version de dévelopement.
      #15001 télécharger addons
      iptables -A OUTPUT  -d 65.18.193.12 -p tcp --sport 1023:65535 --dport 14998:15001 -j ACCEPT
      iptables -A INPUT   -p tcp --sport 1023:65535 --dport 15000 -j ACCEPT
    fi
   
    # Steam: CS 1.6
    if [ $(cat $FILE_CONF | grep -c IPRULE15=ON ) -eq 1 ];then
   
        iptables -A INPUT -p tcp --sport 27030 -j ACCEPT
        iptables -A OUTPUT -p udp --dport 27015:27020 -j ACCEPT
    iptables -A INPUT -p udp --sport 27015:27020 -j ACCEPT
      iptables -A OUTPUT -p tcp --dport 27030 -j ACCEPT
    fi
   
  ### LOG ### Log tout ce qui qui n'est pas accepté par une règles précédente                 
  /sbin/iptables -A OUTPUT -j LOG  --log-prefix "iptables: "
  /sbin/iptables -A INPUT -j LOG  --log-prefix "iptables: "
  /sbin/iptables -A FORWARD -j LOG  --log-prefix "iptables: "


}
(J'utilise gdebit car cela évite le téléchargement et l'installation manuelle des dépendances.)


iptableson () {
Important : Depuis la version 3.92 les paramètres proxy changent automatiquement au premier démarrage de la session, ce qui fait que c'est transparent pour l'utilisateur.<br />
  # Redirect DNS requests
Si après avoir redémarré votre session vous avez encore des problèmes de connexion aux sites https tels que google.com, testez avant tout l'ajout du proxy suivant.<br />
  # note: http://superuser.com/a/594164
proxy http 127.0.0.1 sur port 8080<br />
resolvconffix
proxy https 127.0.0.1 sur port 8080<br />


  /sbin/iptables -t nat -N ctparental
=== Pour les versions avant la 3.95-3 ===
  /sbin/iptables -t nat -A OUTPUT -j ctparental
Il est conseillé d'ajouter tous les domaines de vos dépôts dans les domaines réhabilités cela peut éviter certaines erreurs quand on utilise su au lieu de su - avant des commandes apt-get aptitude …


  # Force non priviledged users to use dnsmasq
Lancez cette ligne de commandes pour les connaître.
      for user in `listeusers` ; do
   
      if  [ $(groups $user | grep -c " ctoff$") -eq 0 ];then
   $ cat /etc/apt/sources.list /etc/apt/sources.list.d/* 2>/dev/null | awk -F/ '/^deb/ {print $3}' | sort -u
        /sbin/iptables -t nat -A ctparental -m owner --uid-owner "$user" -p tcp --dport 53 -j DNAT --to 127.0.0.1:54
        /sbin/iptables -t nat -A ctparental -m owner --uid-owner "$user" -p udp --dport 53 -j DNAT --to 127.0.0.1:54
      fi
      done
 
  if [ $(cat $FILE_CONF | grep -c IPRULES=ON ) -eq 1 ];then
    ipglobal
  fi
 
cat << EOF > $RSYSLOGCTPARENTAL 
:msg,contains,"iptables" /var/log/iptables.log
& ~
EOF
 
# Save configuration so that it survives a reboot
  $IPTABLESsave
}
iptablesoff () {
  #if [ $(cat $FILE_CONF | grep -c IPRULES=ON ) -eq 1 ];then
  /sbin/iptables -F
  /sbin/iptables -X
  /sbin/iptables -P INPUT ACCEPT
  /sbin/iptables -P OUTPUT ACCEPT
  /sbin/iptables -P FORWARD ACCEPT
  #fi
  /sbin/iptables -t nat -D OUTPUT -j ctparental || /bin/true
  /sbin/iptables -t nat -F ctparental || /bin/true
  /sbin/iptables -t nat -X ctparental || /bin/true
  $IPTABLESsave
}
dnsmasqwhitelistonly  () {
  $SED "s?^DNSMASQ.*?DNSMASQ=WHITE?g" $FILE_CONF
  cat << EOF > $DNSMASQCONF
        # Configuration file for "dnsmasq with blackhole"
  # Inclusion de la blacklist <domains> de Toulouse dans la configuration
  conf-dir=$DIR_DNS_WHITELIST_ENABLED
  # conf-file=$DIR_DEST_ETC/alcasar-dns-name  # zone de definition de noms DNS locaux
  no-dhcp-interface=$interface_WAN
  bind-interfaces
  cache-size=0
  domain-needed
  expand-hosts
  bogus-priv
  server=$DNS1
  server=$DNS2
  address=/#/$PRIVATE_IP #redirige vers $PRIVATE_IP pour tout ce qui n'a pas été resolu dans les listes blanches
EOF
 
$DNSMASQrestart
}
 
 
FoncHTTPDCONF () {
$LIGHTTPDstop
rm -rf $DIRHTML/*
mkdir -v $DIRHTML
if [ ! -z $DIRhtmlPersonaliser ];then
  cp -r $DIRhtmlPersonaliser/* $DIRHTML
else
s="span"
st="style"
c="$c"
cab=";\">"
 
cat << EOF > $DIRHTML/index.html
  <HTML>
<HEAD>
  <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
   <TITLE>danger</TITLE>
</HEAD>
<BODY LANG="fr-FR" DIR="LTR">
<CENTER>
<img alt="Site dangereux pour des mineurs"
  HEIGHT="600" 
  src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKIAAACgCAYAAACPOrcQAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz
AAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAuGSURB
VHic7d17jFTlGcfx7zMol7KriRpF3Sii3FyooE1EWuNaFrFeWjXWqEBCmyYtrSa2iX9g+wcx9RZN
kya29i+1ETWKMSZI1AiClyI2KiJyFa8BBC9EuyAXhad/vDO7s8PszpyZc857zrzPJ9nsZvac931g
fnnf2Zlz3ldUFVNBZCQwDhhf/H480A60Fb+X/9xWPGsP0FP2vfznr4AtwGZgC6p70/qn5IUEHUSR
EcAFwGRc6Epfpybc83ZcKEtf64DXUd2XcL+ZFVYQRYYB04CLi1/TgKFea+pzEFgNrCh+rUb1gN+S
0tP6QRQ5B7gSF7zpwHC/BdVtP7AKF8olqK71XE+iWjOIIh3AjcBcYJLnauLyHvAI8Biq23wXE7fW
CaJIO3AtMAfoAgpe60nOYWAlsAh4CtUev+XEI/9BdFPvrcA1wAjP1aRtH/A0cG/ep+78BlFkOnAb
cLnvUjJiKXAnqqt8F9KI/AVRZBawALjIdykZ9TJwF6ov+C4kivwEUeQq4C/Aeb5LyYm3gL+i+ozv
QuqR/SCKTADuB2b4LiWnlgM3obrJdyGDye5fliIjEbkbeBcLYTNmAO8icnfxo8tMyuaIKPJL4G9A
h+9SWsw24E+oLvZdSKVsBVHkLOABoNt3KS1uGTAf1a2+CynJztQsMhtYg4UwDd3AGkTm+C6kxH8Q
RX6AyIO4Twraah1uYtMGPILIw1l47eh3ahaZDDwBTPRXhMFdinY9qu/4KsDfiCjyW+C/WAizYDyw
GpGbfBWQ/ogoMhR4EJidbsemTouBuWlfC5luEEWOwX1Ib+8LZtsrwM9R/SatDtMLosgo4DlgSjod
miatAy5FdUcanaXzGlFkHPA6FsI8mQysKn7EmrjkgyhyPvAfYHTifZm4nQ68hsi0pDtKNogi3cBL
wAmJ9mOSdDywvPhcJia514huJFwOeH+z1MRiLzAD1TeSaDyZIIqcDbwKHBd/48aj3cCFqG6Iu+H4
gyhyOu41YdI3qRs/tgM/RvWTOBuN9zWiyInAi1gIW9mpwIvF5zo28QXRvVn9PDA2tjZNVo0Fni8+
57GIJ4giAjwJTI2lPZMHU4Eni8990+IaEf8MzIqpLZMfs3DPfdOa/2NFpAt3xe+QGOox+XMI6EZ1
ZTONNBdEkZOAd4BRzRRhcm8nMAXVXY020PjULFIAHsdCaFwGHi9moiHNvEZciFvqzRhwWVjY6MmN
Tc0iF+JWpPJ/z4vJksNAF6qvRj0xehBFjsbdbdcZtTMThPXAVFS/i3JSIyPaH7EQmoF14jISSbQR
UeQ0YAN2RY0Z3F7gbFQ/rfeEqCPi37EQmtpG4rJSt/pHRJHLgWej12QCdgWqS+s5sL4guv1I1gNn
NFeXCcxHQGc9+8fUOzXPx0JoojsDl52aao+IIsOBD4GTmy7LhOgzYAyq+wc7qJ4R8TdYCE3jTsZl
aFCDj4hueZAPsAUzTXO2AWeienCgA2qNiPOwEJrmdeCyNKCBR0SRo4D3sRvjTTw+Bsai+n21Xw42
Is7BQmjiMxqXqaoGC+IfYi/FhG7ATFWfmkU6cbthGhO3Saiur3xwoBFxXrK1mIDNq/bgkSOiyBDc
n9t2C4BJwk6gA9VD5Q9WGxEvxUJokjMKl7F+qgVxXuKlmNDNq3yg/9QschywAxiWWkkmRAeAU1Dd
XXqgckT8BRZCk7xhuKz1qgyirfZv0tIva5VT83bglJQLMmHagWrv8oV9QXSrx2+M3Nwtt8Dw4XEV
Z/Jm1y546KFGz55Y2tC8PIjzgX9Gburrr+HYYxstxOTd2rUwpeFdS36P6gPQ/zXiT5suyphoejPn
gugWW+zyVIwJV1dpoc/SiPhDbC8Uk74TcNnrDeK5/moxgTsX+oKYyn5rxlQxASyIxr9+QbRd5I0v
EwEKxVtGx3guxoRrDCJDC8BZ2I4Axp8hwFkFbFo2/k0sAON9V2GCN74AxLq5nzENOLEAtPuuwgSv
3YJosqC9ALT5rsIEr81GRJMFNjWbTLCp2WSCTc0mE9ptU0eTCQWgx3cRJng9BWCP7ypM8PbYiGiy
oMeCaLLApmaTCTY1m0ywqdlkQk8B+Nx3FSZ4nxeAzb6rMMHbXKCRpeiMidfGArAVOFTrSGMScgjY
WihuXfqh72pMsD5E9WDpogebno0vG6FvyZFNHgsxYdsEFkTjX78gvu2xEBO2t6EviO8CX/qrxQTq
S1z2ikF0Wwus9FePCdTKYvb67SrwkqdiTLh6M1cexBUeCjFh681cXxDdDkA7fFRjgrSjtOsUwFEV
v1wBzI7U3IIFMMw2NA3WF180ema/GbhyU8hfAQ82XJQx9fs1qr2b+NnG4caHGhuHu18sSbkoE54l
5SGEIzcOB3g4nVpMwB6ufKD/1AwgMgTYBoxKpSQTmp1AB6r9roE9ckR0ByxKqSgTnkWVIYRqIyKA
SCfwXgpFmfBMQnV95YPVVwNzB76ZdEUmOG9WCyEMFETnHwkVY8I1YKaqT80AIkcB7wOjEynJhOZj
YCyq31f75cAjojvhrmRqMgG6a6AQwmAjIlDcufQDoCP+ukxAtgFnFu8YrWrwpYvdiffEXJQJzz2D
hRBqjYgAIsNx9z2fHF9dJiCfAWNQ3T/YQbUXc3cN3BdTUSY899UKIdQzIgKIjADWA2c0X5cJyEdA
J6r7ah1Y3/YWrqGbmyzKhOfmekII9QYRQHUp8EyjFZngPFPMTF3qm5p7j5bTgA3AyOh1mYDsBc5G
9dN6T4i285Rr+PaIRZnw3B4lhBB1RAQQORpYA3RGO9EEYj0wFdXvopwUfS8+18F84HDkc02rOwzM
jxpCaCSIAKqvAnc0dK5pZXcUsxFZ9Km590wpAMuAixtrwLSYFUA3qg3NlI0HEUDkJOAd7P6W0O0E
pqC6q9EGmtuv2XV8A7YYfMgOATc0E0JoNogAqiuBhU23Y/JqYTEDTWluau5tRQR4DpjVfGMmR14A
fkYMIYoniAAix+AW+5waT4Mm49YAXaj+L47G4gsigMiJwGvA2PgaNRn0PvATVGPbx7H514jlXGEz
ge2xtmuyZDswM84QQtxBBFD9BLgE2F3rUJM7u4FLis9xrOIPIoDqBuAy3FUYpjXsBS4rPrexSyaI
AKpvAFcB3ybWh0nLt8BVxec0EfH+sVK1BzkfeBY4IdmOTEK+Aq5AdXWSnSQfRACRcbj3nEYn35mJ
0SfApeWLricluam5nOoW4ALc59ImH9YB09MIIaQVRADVncBFwPLU+jSNegW4ENXUtjtJL4hA8V34
y4BHU+3XRLEY9xbNN2l2mm4QwS1jojoH+B1Q88Zrk5oDuNs/r0P1QNqdp/PHyoC9y2TgCWCivyIM
sBm4HlVvr+HTHxHLqa4DfgQ8VOtQk5h/A+f5DCH4HhHLicwG/gW0+S4lEHtwNzplYuF+vyNiOdVH
cZeQLfNdSgCW4W75zEQIIUtBBFDdiupM4Drc4o4mXtuA61CdiepW38WUy1YQS1QXAxNwi4RGvkfW
HOE73P/lhOL/beZk5zXiQEQmAPcDM3yXklPLgZvS+oSkUdkcEcupbkK1G7gaeMt3OTnyFnA1qt1Z
DyHkYUSsJDILWID7uNAc6WXcCv4v+C4kivwFsURkOnAbcLnvUjJiKXAnqqt8F9KI/AaxROQc4Fbg
GmCE52rStg94GrgX1bW+i2lG/oNYItIOXAvMAbrIw+vfxhzG3ba7CHgK1R6/5cSjdYJYTqQDuBGY
C0zyXE1c3gMeAR5DteXeY23NIJZzU/eVuFXLpgPD/RZUt/3AKtwqW0vyPvXW0vpBLCcyDJiGC+XF
xZ+Heq2pz0FgNS54K4DVPi7H8iWsIFZy+8dcAEwGxpd9nZpwz9txl16VvtYBr9e7FUQrCjuIAxEZ
CYzDhXIccDzQjrsyqL3i59LVQnuAnrLv5T9/BWzBhW4Lqna/d4X/A/bydTBs1YRqAAAAAElFTkSu
QmCC" />
</CENTER>
</BODY>
</HTML>
EOF
 
fi
## GENERATION
 
ln -s  $DIRHTML/index.html $DIRHTML/err404.html
USERHTTPD=$(cat /etc/passwd | grep /var/www | cut -d":" -f1)
GROUPHTTPD=$(cat /etc/group | grep $USERHTTPD | cut -d":" -f1)
chmod 644 $FILE_CONF
chown root:$GROUPHTTPD $FILE_CONF
cat << EOF > $MAINCONFHTTPD
server.modules = (
"mod_access",
"mod_alias",
"mod_redirect",
"mod_auth", #pour interface admin
"mod_fastcgi",  #pour interface admin (activation du php)
)
auth.debug                = 0
auth.backend              = "htdigest"
auth.backend.htdigest.userfile = "$PASSWORDFILEHTTPD"
 
server.document-root = "/var/www"
server.upload-dirs = ( "/var/cache/lighttpd/uploads" )
#server.errorlog = "/var/log/lighttpd/error.log" # ne pas decommenter sur les eeepc qui on /var/log  en tmpfs
server.pid-file = "$LIGHTTPpidfile"
server.username = "$USERHTTPD"
server.groupname = "$GROUPHTTPD"
server.port = 80
server.bind = "127.0.0.1"
 
 
index-file.names = ( "index.php", "index.html" )
url.access-deny = ( "~", ".inc" )
static-file.exclude-extensions = (".php", ".pl", ".fcgi" )
 
server.tag = ""
 
include_shell "/usr/share/lighttpd/create-mime.assign.pl"
include_shell "/usr/share/lighttpd/include-conf-enabled.pl"
EOF
 
mkdir -p /usr/share/lighttpd/
 
if [ ! -f /usr/share/lighttpd/create-mime.assign.pl ];then
cat << EOF > /usr/share/lighttpd/create-mime.assign.pl
#!/usr/bin/perl -w
use strict;
open MIMETYPES, "/etc/mime.types" or exit;
print "mimetype.assign = (\n";
my %extensions;
while(<MIMETYPES>) {
  chomp;
  s/\#.*//;
  next if /^\w*$/;
  if(/^([a-z0-9\/+-.]+)\s+((?:[a-z0-9.+-]+[ ]?)+)$/) {
    foreach(split / /, \$2) {
      # mime.types can have same extension for different
      # mime types
      next if \$extensions{\$_};
      \$extensions{\$_} = 1;
      print "\".\$_\" => \"\$1\",\n";
    }
  }
}
print ")\n";
EOF
chmod +x /usr/share/lighttpd/create-mime.assign.pl
fi
 
 
if [ ! -f /usr/share/lighttpd/include-conf-enabled.pl ];then
cat << EOF > /usr/share/lighttpd/include-conf-enabled.pl
#!/usr/bin/perl -wl
 
use strict;
use File::Glob ':glob';
 
my \$confdir = shift || "/etc/lighttpd/";
my \$enabled = "conf-enabled/*.conf";
 
chdir(\$confdir);
my @files = bsd_glob(\$enabled);
 
for my \$file (@files)
{
        print "include \"\$file\"";
}
EOF
chmod +x /usr/share/lighttpd/include-conf-enabled.pl
 
fi
 
mkdir -p $DIRCONFENABLEDHTTPD
mkdir -p $DIRadminHTML
cp -rf CTadmin/* $DIRadminHTML/
#if [ $noinstalldep = "1" ]; then
# addadminhttpd "admin" "admin"
#else
clear
echo "Entrer le login pour l'interface d'administration :"
while (true); do
read loginhttp
case $loginhttp in
* )
echo "login:  $loginhttp" > /root/passwordCTadmin
break
;;
esac
done
clear
echo "Entrer le mot de passe de $loginhttp :"
while (true); do
read password
case $password in
* )
echo "password: $password" >> /root/passwordCTadmin
        addadminhttpd "$loginhttp" "$password"
break
;;
esac
done
#fi
chmod 700 /root/passwordCTadmin
chown root:root /root/passwordCTadmin
mkdir /run/lighttpd/
chmod 770 /run/lighttpd/
chown root:$GROUPHTTPD /run/lighttpd/
cat << EOF > $CTPARENTALCONFHTTPD
 
fastcgi.server = (
    ".php" => (
      "localhost" => (
        "bin-path" => "/usr/bin/php-cgi",
        "socket" => "/run/lighttpd/php-fastcgi.sock",
        "max-procs" => 4, # default value
        "bin-environment" => (
          "PHP_FCGI_CHILDREN" => "1", # default value
        ),
        "broken-scriptfilename" => "enable"
      ))
)
  fastcgi.map-extensions    = ( ".php3" => ".php",
                              ".php4" => ".php",
                              ".php5" => ".php",
                              ".phps" => ".php",
                              ".phtml" => ".php" )
 
\$HTTP["url"] =~ ".*CTadmin.*" {
  auth.require = ( "" =>
                  (
                    "method"  => "digest",
                    "realm"  => "$REALMADMINHTTPD",
                    "require" => "user=$USERADMINHTTPD"
                  )
                )
 
}
\$SERVER["socket"] == "$PRIVATE_IP:80" {
server.document-root = "$DIRHTML"
server.errorfile-prefix = "$DIRHTML/err"
#ssl.engine = "enable"
#ssl.pemfile = "/etc/lighttpd/ssl/$PRIVATE_IP.pem"
}
 
EOF
chown root:$GROUPHTTPD $DREAB
chmod 660 $DREAB
chown root:$GROUPHTTPD $DNS_FILTER_OSSI
chmod 660 $DNS_FILTER_OSSI
chown root:$GROUPHTTPD $CATEGORIES_ENABLED
chmod 660 $CATEGORIES_ENABLED
chmod 660 /etc/sudoers
 
sudotest=`grep Defaults:$USERHTTPD /etc/sudoers |wc -l`
if [ $sudotest -ge "1" ] ; then
    $SED "s?^Defaults:$USERHTTPD.*requiretty.*?Defaults:$USERHTTPD    \!requiretty?g" /etc/sudoers
else
    echo "Defaults:$USERHTTPD    !requiretty" >> /etc/sudoers
fi
 
sudotest=`grep "$USERHTTPD ALL=" /etc/sudoers |wc -l`
if [ $sudotest -ge "1" ] ; then
    $SED "s?^$USERHTTPD.*?$USERHTTPD ALL=(ALL) NOPASSWD:/usr/local/bin/CTparental.sh -gctalist,/usr/local/bin/CTparental.sh -gctulist,/usr/local/bin/CTparental.sh -gcton,/usr/local/bin/CTparental.sh -gctoff,/usr/local/bin/CTparental.sh -tlu,/usr/local/bin/CTparental.sh -trf,/usr/local/bin/CTparental.sh -dble,/usr/local/bin/CTparental.sh -ubl,/usr/local/bin/CTparental.sh -dl,/usr/local/bin/CTparental.sh -on,/usr/local/bin/CTparental.sh -off,/usr/local/bin/CTparental.sh -aupon,/usr/local/bin/CTparental.sh -aupoff?g" /etc/sudoers
else
    echo "$USERHTTPD ALL=(ALL) NOPASSWD:/usr/local/bin/CTparental.sh -gctalist,/usr/local/bin/CTparental.sh -gctulist,/usr/local/bin/CTparental.sh -gcton,/usr/local/bin/CTparental.sh -gctoff,/usr/local/bin/CTparental.sh -tlu,/usr/local/bin/CTparental.sh -trf,/usr/local/bin/CTparental.sh -dble,/usr/local/bin/CTparental.sh -ubl,/usr/local/bin/CTparental.sh -dl,/usr/local/bin/CTparental.sh -on,/usr/local/bin/CTparental.sh -off,/usr/local/bin/CTparental.sh -aupon,/usr/local/bin/CTparental.sh -aupoff" >> /etc/sudoers
fi
 
sudotest=`grep %ctoff /etc/sudoers |wc -l`
if [ $sudotest -ge "1" ] ; then
  $SED "s?^%ctoff.*?%ctoff ALL=(ALL) NOPASSWD:/usr/local/bin/CTparental.sh -off,/usr/local/bin/CTparental.sh -on?g" /etc/sudoers
else
  echo "%ctoff ALL=(ALL) NOPASSWD:/usr/local/bin/CTparental.sh -off,/usr/local/bin/CTparental.sh -on"  >> /etc/sudoers
fi
sudotest=`grep "ALL  ALL=(ALL) NOPASSWD:/usr/local/bin/CTparental.sh" /etc/sudoers |wc -l`
if [ $sudotest -ge "1" ] ; then
$SED "s?^ALL  ALL=(ALL) NOPASSWD:/usr/local/bin/CTparental.sh.*?ALL  ALL=(ALL) NOPASSWD:/usr/local/bin/CTparental.sh -on?g" /etc/sudoers
else
echo "ALL  ALL=(ALL) NOPASSWD:/usr/local/bin/CTparental.sh -on" >> /etc/sudoers
fi
unset sudotest
   
chmod 440 /etc/sudoers
if [ ! -f $FILE_HCONF ] ; then
echo > $FILE_HCONF
fi
chown root:$GROUPHTTPD $FILE_HCONF
chmod 660 $FILE_HCONF
listeusers > $FILE_GCTOFFCONF
chown root:$GROUPHTTPD $FILE_GCTOFFCONF
chmod 660 $FILE_GCTOFFCONF
if [ ! -f $FILE_HCOMPT ] ; then
echo "date=$(date +%D)" > $FILE_HCOMPT
fi
chown root:$GROUPHTTPD $FILE_HCOMPT
chmod 660 $FILE_HCOMPT
 
chown -R root:$GROUPHTTPD $DIRHTML
chown -R root:$GROUPHTTPD $DIRadminHTML
$LIGHTTPDstart
test=$?
if [ ! $test -eq 0 ];then
echo "Erreur au lancement du service lighttpd "
set -e
exit 1
fi
}
 
install () {
groupadd ctoff
if [ $nomanuel -eq 0 ]; then
vim -h 2&> /dev/null
if [ $? -eq 0 ] ; then
EDIT="vim "
fi
mono -h 2&> /dev/null
if [ $? -eq 0 ] ; then
EDIT=${EDIT:="mono "}
fi
vi -h 2&> /dev/null
if [ $? -eq 0 ] ; then
EDIT=${EDIT:="vi "}
fi
if [ -f gpl-3.0.fr.txt ] ; then
cp -f gpl-3.0.fr.txt /usr/local/share/CTparental/
fi
if [ -f gpl-3.0.txt ] ; then
cp -f gpl-3.0.txt /usr/local/share/CTparental/
fi
if [ -f CHANGELOG ] ; then
cp -f CHANGELOG /usr/local/share/CTparental/
fi
if [ -f dist.conf ];then
cp -f dist.conf /usr/local/share/CTparental/dist.conf.orig
cp -f dist.conf $DIR_CONF/
fi
while (true); do
$EDIT $DIR_CONF/dist.conf
clear
cat $EDIT $DIR_CONF/dist.conf | grep -v -E ^#
echo "Entrer : S pour continuer avec ces parramêtres ."
echo "Entrer : Q pour Quiter l'installation."
echo "Entrer tous autre choix pour modifier les parramêtres."
read choi
case $choi in
S | s )
break
;;
Q | q )
exit
;;
esac
done
fi
if [ -f $DIR_CONF/dist.conf ];then
source  $DIR_CONF/dist.conf
fi
 
if [ -f /etc/NetworkManager/NetworkManager.conf ];then
    $SED "s/^dns=dnsmasq/#dns=dnsmasq/g" /etc/NetworkManager/NetworkManager.conf
    $NWMANAGERrestart
    sleep 5
  fi
 
      mkdir $tempDIR
      mkdir -p $DIR_CONF
      initblenabled
      cat /etc/resolv.conf > $DIR_CONF/resolv.conf.sav
  resolvconffix
      if [ $noinstalldep = "0" ]; then
  for PACKAGECT in $CONFLICTS
        do
$CMDREMOVE $PACKAGECT 2> /dev/null
        done
  fi
      if [ $noinstalldep = "0" ]; then
      $CMDINSTALL $DEPENDANCES
      fi
     
      if [ ! -f blacklists.tar.gz ]
      then
        download
      else
        tar -xzf blacklists.tar.gz -C $tempDIR
        if [ ! $? -eq 0 ]; then
            echo "Erreur d'extraction de l'archive, processus interrompu"
            uninstall
            set -e
            exit 1
        fi
        rm -rf $DIR_DNS_FILTER_AVAILABLE/
        mkdir $DIR_DNS_FILTER_AVAILABLE
      fi
      adapt
      catChoice
      dnsmasqon
      $SED "s?^LASTUPDATE.*?LASTUPDATE=$THISDAYS=`date +%d-%m-%Y\ %T`?g" $FILE_CONF
     
      # on charge le(s) module(s) indispensable(s) pour iptables.
test=`grep ip_conntrack_ftp $FILEMODULESLOAD |wc -l`
if [ $test -ge "1" ] ; then
$SED "s?.*ip_conntrack_ftp.*?#ip_conntrack_ftp?g" $FILEMODULESLOAD
else
echo "#ip_conntrack_ftp" >> $FILEMODULESLOAD
fi
modprobe ip_conntrack_ftp
$SED "s?.*ip_conntrack_ftp.*?ip_conntrack_ftp?g" $FILEMODULESLOAD
  ###
      FoncHTTPDCONF
      $ENCRON
      $ENLIGHTTPD
      $ENDNSMASQ
      $ENNWMANAGER
      $ENIPTABLESSAVE
 
 
     
}
 
 
updatelistgctoff () {
## on ajoutes tous les utilisateurs manquant dans la liste
for PCUSER in `listeusers`
do
if [ $(cat $FILE_GCTOFFCONF | sed -e "s/#//g" | grep -c -E "^$PCUSER$") -eq 0 ];then
echo $PCUSER >> $FILE_GCTOFFCONF
fi
done
## on suprime tous ceux qui n'existe plus sur le pc.
for PCUSER in $(cat $FILE_GCTOFFCONF | sed -e "s/#//g" )
do
if [ $( listeusers | grep -c -E "^$PCUSER$") -eq 0 ];then
$SED "/^$PCUSER$/d" $FILE_GCTOFFCONF
$SED "/^#$PCUSER$/d" $FILE_GCTOFFCONF
fi
done
}
applistegctoff () {
updatelistgctoff
 
$ADDUSERTOGROUP root ctoff 2> /dev/null
for PCUSER in $(cat $FILE_GCTOFFCONF )
do
if [ $(echo $PCUSER | grep -c -v "#") -eq 1 ];then
$ADDUSERTOGROUP $PCUSER ctoff 2> /dev/null
else
$DELUSERTOGROUP $(echo $PCUSER | sed -e "s/#//g" ) ctoff 2> /dev/null
fi
done
}
 
activegourpectoff () {
  groupadd ctoff
  $ADDUSERTOGROUP root ctoff
  $SED "s?^GCTOFF.*?GCTOFF=ON?g" $FILE_CONF
  applistegctoff
}
 
desactivegourpectoff () {
  groupdel ctoff
  $SED "s?^GCTOFF.*?GCTOFF=OFF?g" $FILE_CONF
}


uninstall () {
Pour la version 3.95-3 et supérieure, après l'ajout d'un nouveau dépôt, il faut juste penser à lancer la commande suivante :
  desactivegourpectoff
  rm -f /etc/cron.d/CTparental*
  $DNSMASQrestart
  $LIGHTTPDstop
  rm -f /var/www/index.lighttpd.html
  rm -rf $tempDIR
  rm -rf $DIRHTML
 
 
  rm -rf /usr/local/share/CTparental
  rm -rf /usr/share/lighttpd/*
  rm -f $CTPARENTALCONFHTTPD
  rm -rf $DIRadminHTML
  if [ -f /etc/NetworkManager/NetworkManager.conf ];then
$SED "s/^#dns=dnsmasq/dns=dnsmasq/g" /etc/NetworkManager/NetworkManager.conf
$NWMANAGERrestart
  sleep 5
  fi
 
  if [ $noinstalldep = "0" ]; then
for PACKAGECT in $DEPENDANCES
        do
$CMDREMOVE $PACKAGECT 2> /dev/null
        done
  fi
  # desactivation du modules ip_conntrack_ftp
test=`grep ip_conntrack_ftp $FILEMODULESLOAD |wc -l`
if [ $test -ge "1" ] ; then
$SED "s?.*ip_conntrack_ftp.*?#ip_conntrack_ftp?g" $FILEMODULESLOAD
else
echo "#ip_conntrack_ftp" >> $FILEMODULESLOAD
fi
modprobe -r ip_conntrack_ftp
$SED "s?.*ip_conntrack_ftp.*?#ip_conntrack_ftp?g" $FILEMODULESLOAD
###
  rm -rf $DIR_CONF
}
 
choiblenabled () {
echo -n > $CATEGORIES_ENABLED
clear
echo "Voulez-vous filtrer par Blacklist ou Whitelist :"
echo -n " B/W :"
while (true); do
        read choi
        case $choi in
        B | b )
        echo "Vous allez maintenant choisir les \"Black listes\" à appliquer."
for CATEGORIE in `cat  $BL_CATEGORIES_AVAILABLE`  # pour chaque catégorie
do 
      clear
      echo "Voulez vous activer la categorie :"
      echo -n "$CATEGORIE  O/N :"
      while (true); do
read choi
case $choi in
O | o )
echo $CATEGORIE >> $CATEGORIES_ENABLED
break
;;
N | n )
break
;;
      esac
      done
done
        break
        ;;
        W | w )
        echo "Vous allez maintenant choisir les \"White listes\" à appliquer."
for CATEGORIE in `cat  $WL_CATEGORIES_AVAILABLE`  # pour chaque catégorie
do 
      clear
      echo "Voulez vous activer la categorie :"
      echo -n "$CATEGORIE  O/N :"
      while (true); do
read choi
case $choi in
O | o )
echo $CATEGORIE >> $CATEGORIES_ENABLED
break
;;
N | n )
break
;;
      esac
      done
done
        break
        ;;
      esac
done
}
 
 
errortime1 () {
clear
echo -e "L'heure de début doit être strictement inférieure a l'heure de fin: $RougeD$input$Fcolor "
echo "exemple: 08h00 à 23h59 ou 08h00 à 12h00 et 14h00 à 23h59"
echo -e -n "$RougeD$PCUSER$Fcolor est autorisé à se connecter le $BleuD${DAYS[$NumDAY]}$Fcolor de :"
}
errortime2 () {
clear
echo -e "Mauvaise syntaxe: $RougeD$input$Fcolor "
echo "exemple: 08h00 à 23h59 ou 08h00 à 12h00 et 14h00 à 23h59"
echo -e -n "$RougeD$PCUSER$Fcolor est autorisé à se connecter le $BleuD${DAYS[$NumDAY]}$Fcolor de :"
}
 
 
timecronalert () {
MinAlert=${1} # temp en minute entre l'alerte et l'action
H=$((10#${2}))
M=$((10#${3}))
D=$((10#${4}))
MinTotalAlert="$(($H*60+$M-$MinAlert))"
if [ $(( $MinTotalAlert < 0 )) -eq 1 ]
then
if [ $Numday -eq 0 ] ; then
D=6
else
D=$(( $D -1 ))
fi
MinTotalAlert="$(($(($H + 24))*60+$M-$MinAlert))"
fi
Halert=$(($MinTotalAlert/60))
MAlert=$(($MinTotalAlert - $(( $Halert *60 )) ))
echo "$MAlert $Halert * * ${DAYSCRON[$D]}"
}
updatetimelogin () {
USERSCONECT=$(who | awk '//{print $1}' | sort -u)
  if [ $(cat $FILE_HCOMPT | grep -c $(date +%D)) -eq 1 ] ; then
# on incrément le conteur de temps de connection. pour chaque utilisateur connecter
for PCUSER in $USERSCONECT
do
if [ $(cat $FILE_HCONF | grep -c ^$PCUSER=user= ) -eq 1 ] ;then
  if [ $(cat $FILE_HCOMPT | grep -c ^$PCUSER= ) -eq 0 ] ;then
echo "$PCUSER=1" >> $FILE_HCOMPT
  else
count=$(($(cat $FILE_HCOMPT | grep ^$PCUSER= | cut -d"=" -f2) + 1 ))
$SED "s?^$PCUSER=.*?$PCUSER=$count?g" $FILE_HCOMPT
temprest=$(($(cat $FILE_HCONF | grep ^$PCUSER=user= | cut -d "=" -f3 ) - $count ))
echo $temprest
# si le compteur de l'usager depace la valeur max autoriser on verrouille le compte et on deconnect l'utilisateur.
if [ $temprest -le 0 ];then
/usr/bin/skill -KILL -u$PCUSER
passwd -l $PCUSER
else
# On allerte l'usager que sont quota temps arrive a expiration 5-4-3-2-1 minutes avant.
if [ $temprest -le 10 ];then
HOMEPCUSER=$(getent passwd "$PCUSER" | cut -d ':' -f6)
export HOME=$HOMEPCUSER && export DISPLAY=:0.0 && export XAUTHORITY=$HOMEPCUSER/.Xauthority && sudo -u $PCUSER  /usr/bin/notify-send -u critical "Alerte CTparental" "Votre temps de connection restent est de $temprest minutes "
fi
fi
  fi
 
else
# on efface les ligne relative a cette utilisateur
$SED "/^$PCUSER=/d" $FILE_HCOMPT
fi
 
done
else
# on réactivent tous les comptes
for PCUSER in `listeusers`
do
passwd -u $PCUSER
done
# on remait tous les compteurs a zero.
echo "date=$(date +%D)" > $FILE_HCOMPT
fi
}
activetimelogin () {
  TESTGESTIONNAIRE=""
  for FILE in `echo $GESTIONNAIREDESESSIONS`
  do
      if [ -f $DIRPAM$FILE ];then
        if [ $(cat $DIRPAM$FILE | grep -c "account required pam_time.so") -eq 0  ] ; then
            $SED "1i account required pam_time.so"  $DIRPAM$FILE
        fi
        TESTGESTIONNAIRE=$TESTGESTIONNAIRE\ $FILE
      fi
  done
  if [ $( echo $TESTGESTIONNAIRE | wc -m ) -eq 1 ] ; then
      echo "Aucun gestionnaire de session connu n'a été détecté."
      echo " il est donc impossible d'activer le contrôle horaire des connexions"
      desactivetimelogin
      exit 1
  fi
    
    
   if [ ! -f $FILEPAMTIMECONF.old ] ; then
   # CTparental -ubl
  cp $FILEPAMTIMECONF $FILEPAMTIMECONF.old
  fi
  echo "*;*;root;Al0000-2400" > $FILEPAMTIMECONF
  for NumDAY in 0 1 2 3 4 5 6
  do
  echo "PATH=$PATH"  > /etc/cron.d/CTparental${DAYS[$NumDAY]}
  done
  for PCUSER in `listeusers`
  do
  HOMEPCUSER=$(getent passwd "$PCUSER" | cut -d ':' -f6)
  $SED "/^$PCUSER=/d" $FILE_HCONF
  echo -e -n "$PCUSER est autorisé a se connecter 7j/7 24h/24 O/N?"
  choi=""
  while (true); do
  read choi
        case $choi in
        O | o )
alltime="O"
        echo "$PCUSER=admin=" >> $FILE_HCONF
  break
        ;;
N| n )
        alltime="N"
        clear
        echo -e "$PCUSER est autorisé a se connecter X minutes par jours"
        echo -e -n "X (1 a 1440) = "
        while (true); do
        read choi
        if [ $choi -ge 1 ];then
if [ $choi -le 1440 ];then
break
fi
fi
        echo " X doit prendre un valeur entre 1 et 1440 "
        done
        echo "$PCUSER=user=$choi" >> $FILE_HCONF
break
        ;;
  esac
  done
      HORAIRES=""
      for NumDAY in 0 1 2 3 4 5 6
        do
if [ $alltime = "O" ];then
break
fi
        clear
        echo "exemple: 00h00 à 23h59 ou 08h00 à 12h00 et 14h00 à 16h50"
        echo -e -n "$RougeD$PCUSER$Fcolor est autorisé à se connecter le $BleuD${DAYS[$NumDAY]}$Fcolor de :"
        while (true); do
            read choi
            input=$choi
            choi=$(echo $choi | sed -e "s/h//g" | sed -e "s/ //g" | sed -e "s/a/-/g" | sed -e "s/et/:/g" ) # mise en forme de la variable choi pour pam 
              if [ $( echo $choi | grep -E -c "^([0-1][0-9]|2[0-3])[0-5][0-9]-([0-1][0-9]|2[0-3])[0-5][0-9]$|^([0-1][0-9]|2[0-3])[0-5][0-9]-([0-1][0-9]|2[0-3])[0-5][0-9]:([0-1][0-9]|2[0-3])[0-5][0-9]-([0-1][0-9]|2[0-3])[0-5][0-9]$" ) -eq 1 ];then
                  int1=$(echo $choi | cut -d ":" -f1 | cut -d "-" -f1)
                  int2=$(echo $choi | cut -d ":" -f1 | cut -d "-" -f2)
                  int3=$(echo $choi | cut -d ":" -f2 | cut -d "-" -f1)
                  int4=$(echo $choi | cut -d ":" -f2 | cut -d "-" -f2)
                  if [ $int1 -lt $int2 ];then
                    if [ ! $(echo $choi | grep -E -c ":") -eq 1 ] ; then
                        if [ $NumDAY -eq 6 ] ; then
                          HORAIRESPAM="$HORAIRESPAM${DAYSPAM[$NumDAY]}$int1-$int2"
                        else
                          HORAIRESPAM="$HORAIRESPAM${DAYSPAM[$NumDAY]}$int1-$int2|"
                        fi
                        m1=$(echo $int1 | sed -e 's/.\{02\}//')
                        h1=$(echo $int1 | sed -e 's/.\{02\}$//')
                        m2=$(echo $int2 | sed -e 's/.\{02\}//')
                        h2=$(echo $int2 | sed -e 's/.\{02\}$//')
echo "$PCUSER=$NumDAY=$h1${h}h$m1:$h2${h}h$m2" >> $FILE_HCONF 
                        echo "$m2 $h2 * * ${DAYSCRON[$NumDAY]} root /usr/bin/skill -KILL -u$PCUSER" >> /etc/cron.d/CTparental${DAYS[$NumDAY]}
for count in 1 2 3 4 5
do
                        echo "$(timecronalert $count $h2 $m2 $NumDAY) root export HOME=$HOMEPCUSER && export DISPLAY=:0.0 && export XAUTHORITY=$HOMEPCUSER/.Xauthority && sudo -u $PCUSER  /usr/bin/notify-send -u critical \"Alerte CTparental\" \"fermeture de session dans $count minutes \" " >> /etc/cron.d/CTparental${DAYS[$NumDAY]}
done
                        break
 
                    else 
                        if [ $int2 -lt $int3 ];then
                          if [ $int3 -lt $int4 ];then
                              if [ $NumDAY -eq 6 ] ; then
                                HORAIRESPAM="$HORAIRESPAM${DAYSPAM[$NumDAY]}$int1-$int2|${DAYSPAM[$NumDAY]}$int3-$int4"
                              else
                                HORAIRESPAM="$HORAIRESPAM${DAYSPAM[$NumDAY]}$int1-$int2|${DAYSPAM[$NumDAY]}$int3-$int4|"
                              fi
                              m1=$(echo $int1 | sed -e 's/.\{02\}//')
                              h1=$(echo $int1 | sed -e 's/.\{02\}$//') 
                              m2=$(echo $int2 | sed -e 's/.\{02\}//')
                              h2=$(echo $int2 | sed -e 's/.\{02\}$//') 
                              m3=$(echo $int3 | sed -e 's/.\{02\}//')
                              h3=$(echo $int3 | sed -e 's/.\{02\}$//') 
                              m4=$(echo $int4 | sed -e 's/.\{02\}//')
                              h4=$(echo $int4 | sed -e 's/.\{02\}$//') 
                              ## minutes heures jourdumoi moi jourdelasemaine utilisateur  commande
  echo "$PCUSER=$NumDAY=$h1${h}h$m1:$h2${h}h$m2:$h3${h}h$m3:$h4${h}h$m4" >> $FILE_HCONF
                              echo "$m2 $h2 * * ${DAYSCRON[$NumDAY]} root /usr/bin/skill -KILL -u$PCUSER" >> /etc/cron.d/CTparental${DAYS[$NumDAY]}
      echo "$m4 $h4 * * ${DAYSCRON[$NumDAY]} root /usr/bin/skill -KILL -u$PCUSER" >> /etc/cron.d/CTparental${DAYS[$NumDAY]}
      for count in 1 2 3 4 5
      do
                              echo "$(timecronalert $count $h2 $m2 $NumDAY) root export HOME=$HOMEPCUSER && export DISPLAY=:0.0 && export XAUTHORITY=$HOMEPCUSER/.Xauthority && sudo -u $PCUSER  /usr/bin/notify-send -u critical \"Alerte CTparental\" \"fermeture de session dans $count minutes \" " >> /etc/cron.d/CTparental${DAYS[$NumDAY]}
                              echo "$(timecronalert $count $h4 $m4 $NumDAY) root export HOME=$HOMEPCUSER && export DISPLAY=:0.0 && export XAUTHORITY=$HOMEPCUSER/.Xauthority && sudo -u $PCUSER  /usr/bin/notify-send -u critical \"Alerte CTparental\" \"fermeture de session dans $count minutes\" " >> /etc/cron.d/CTparental${DAYS[$NumDAY]}
      done
                           
                              break 
                          else
                              errortime1
                          fi
                        else
                          errortime1
                        fi
                    fi
                  else
                    errortime1
 
                  fi
                     
              else
                  errortime2 
              fi
         
        done
   
        done
    if [ $alltime = "N" ] ; then
echo "*;*;$PCUSER;$HORAIRESPAM" >> $FILEPAMTIMECONF
else
echo "*;*;$PCUSER;Al0000-2400" >> $FILEPAMTIMECONF
fi
  done
 
  for NumDAY in 0 1 2 3 4 5 6
  do
      echo >> /etc/cron.d/CTparental${DAYS[$NumDAY]}
  done
  echo >> $FILE_HCONF
echo "PATH=$PATH"  > /etc/cron.d/CTparentalmaxtimelogin
echo "*/1 * * * * root /usr/local/bin/CTparental.sh -uctl" >> /etc/cron.d/CTparentalmaxtimelogin
$SED "s?^HOURSCONNECT.*?HOURSCONNECT=ON?g" $FILE_CONF
$CRONrestart
}
 
desactivetimelogin () {
for FILE in `echo $GESTIONNAIREDESESSIONS`
do
  $SED "/account required pam_time.so/d" $DIRPAM$FILE
done
cat $FILEPAMTIMECONF.old > $FILEPAMTIMECONF
for NumDAY in 0 1 2 3 4 5 6
do
  rm -f /etc/cron.d/CTparental${DAYS[$NumDAY]}
done
rm -f /etc/cron.d/CTparentalmaxtimelogin
$SED "s?^HOURSCONNECT.*?HOURSCONNECT=OFF?g" $FILE_CONF
for PCUSER in `listeusers`
do
passwd -u $PCUSER
done
# on remait tous les compteurs a zero.
echo "date=$(date +%D)" > $FILE_HCOMPT
echo > $FILE_HCONF
$CRONrestart
}


Pour tester si ça fonctionne faire un ping à partir d'un compte filtré.


listeusers () {
  $ su child -c "ping youporn.com"
TABUSER=( " $(getent passwd | cut -d":" -f1,3) " )
for LIGNES in $TABUSER
do
#echo $(echo $LIGNES | cut -d":" -f2)
if [ $(echo $LIGNES | cut -d":" -f2) -ge $UIDMINUSER ] ;then
echo $LIGNES | cut -d":" -f1
fi
done
}


''child'' est à remplacer par le compte pour lequel vous voulez tester.


readTimeFILECONF () {
doit retourner quelque chose comme ça :
  TESTGESTIONNAIRE=""
  for FILE in `echo $GESTIONNAIREDESESSIONS`
  do
      if [ -f $DIRPAM$FILE ];then
        if [ $(cat $DIRPAM$FILE | grep -c "account required pam_time.so") -eq 0  ] ; then
            $SED "1i account required pam_time.so"  $DIRPAM$FILE
        fi
        TESTGESTIONNAIRE=$TESTGESTIONNAIRE\ $FILE
      fi
  done
  if [ $( echo $TESTGESTIONNAIRE | wc -m ) -eq 1 ] ; then
      echo "Aucun gestionnaire de session connu n'a été détecté."
      echo " il est donc impossible d'activer le contrôle horaire des connexions"
      desactivetimelogin
      exit 1
  fi
 
  if [ ! -f $FILEPAMTIMECONF.old ] ; then
  cp $FILEPAMTIMECONF $FILEPAMTIMECONF.old
  fi
  echo "*;*;root;Al0000-2400" > $FILEPAMTIMECONF
  for NumDAY in 0 1 2 3 4 5 6
  do
  echo "PATH=$PATH" > /etc/cron.d/CTparental${DAYS[$NumDAY]}
  done
 
  for PCUSER in `listeusers`
  do
  HOMEPCUSER=$(getent passwd "$PCUSER" | cut -d ':' -f6)
  HORAIRESPAM=""
  userisconfigured="0"


while read line
  PING youporn.com (127.0.0.10) 56(84) bytes of data.
do
if [ $( echo $line | grep -E -c "^$PCUSER=[0-6]=" ) -eq 1 ] ; then
echo "$line"
NumDAY=$(echo $line | cut -d"=" -f2)
h1=$(echo $line | cut -d"=" -f3 | cut -d":" -f1 | cut -d"h" -f1)
m1=$(echo $line | cut -d"=" -f3 | cut -d":" -f1 | cut -d"h" -f2)
h2=$(echo $line | cut -d"=" -f3 | cut -d":" -f2 | cut -d"h" -f1)
m2=$(echo $line | cut -d"=" -f3 | cut -d":" -f2 | cut -d"h" -f2)
h3=$(echo $line | cut -d"=" -f3 | cut -d":" -f3 | cut -d"h" -f1)
m3=$(echo $line | cut -d"=" -f3 | cut -d":" -f3 | cut -d"h" -f2)
h4=$(echo $line | cut -d"=" -f3 | cut -d":" -f4 | cut -d"h" -f1)
m4=$(echo $line | cut -d"=" -f3 | cut -d":" -f4 | cut -d"h" -f2)
if [ $(echo -n $h3$m3 | wc -c) -gt 2 ]; then
if [ $NumDAY -eq 6 ] ; then
                        HORAIRESPAM="$HORAIRESPAM${DAYSPAM[$NumDAY]}$h1$m1-$h2$m2|${DAYSPAM[$NumDAY]}$h3$m3-$h4$m4"
                      else
                        HORAIRESPAM="$HORAIRESPAM${DAYSPAM[$NumDAY]}$h1$m1-$h2$m2|${DAYSPAM[$NumDAY]}$h3$m3-$h4$m4|"
                      fi
echo "$m2 $h2 * * ${DAYSCRON[$NumDAY]} root /usr/bin/skill -KILL -u$PCUSER" >> /etc/cron.d/CTparental${DAYS[$NumDAY]}
echo "$m4 $h4 * * ${DAYSCRON[$NumDAY]} root /usr/bin/skill -KILL -u$PCUSER" >> /etc/cron.d/CTparental${DAYS[$NumDAY]}
for count in 1 2 3 4 5 6 7 8 9 10
do
echo "$(timecronalert $count $h2 $m2 $NumDAY) root export HOME=$HOMEPCUSER && export DISPLAY=:0.0 && export XAUTHORITY=$HOMEPCUSER/.Xauthority && sudo -u $PCUSER  /usr/bin/notify-send -u critical \"Alerte CTparental\" \"fermeture de session dans $count minutes \" " >> /etc/cron.d/CTparental${DAYS[$NumDAY]}
echo "$(timecronalert $count $h4 $m4 $NumDAY) root export HOME=$HOMEPCUSER && export DISPLAY=:0.0 && export XAUTHORITY=$HOMEPCUSER/.Xauthority && sudo -u $PCUSER  /usr/bin/notify-send -u critical \"Alerte CTparental\" \"fermeture de session dans $count minutes \" " >> /etc/cron.d/CTparental${DAYS[$NumDAY]}
userisconfigured="1"
done


else
  bytes from 127.0.0.10: icmp_req=1 ttl=64 time=0.026 ms
        if [ $NumDAY -eq 6 ] ; then
          HORAIRESPAM="$HORAIRESPAM${DAYSPAM[$NumDAY]}$h1$m1-$h2$m2"
        else
          HORAIRESPAM="$HORAIRESPAM${DAYSPAM[$NumDAY]}$h1$m1-$h2$m2|"
        fi
for count in 1 2 3 4 5 6 7 8 9 10
do
echo "$(timecronalert $count $h2 $m2 $NumDAY) root export HOME=$HOMEPCUSER && export DISPLAY=:0.0 && export XAUTHORITY=$HOMEPCUSER/.Xauthority && sudo -u $PCUSER  /usr/bin/notify-send -u critical \"Alerte CTparental\" \"fermeture de session dans $count minutes \" " >> /etc/cron.d/CTparental${DAYS[$NumDAY]}
done
echo "$m2 $h2 * * ${DAYSCRON[$NumDAY]} root /usr/bin/skill -KILL -u$PCUSER" >> /etc/cron.d/CTparental${DAYS[$NumDAY]}
userisconfigured="1"
fi
fi
done < $FILE_HCONF
if [ $userisconfigured -eq 1 ] ; then
echo "*;*;$PCUSER;$HORAIRESPAM" >> $FILEPAMTIMECONF
else
echo "*;*;$PCUSER;Al0000-2400" >> $FILEPAMTIMECONF
$SED "/^$PCUSER=/d" $FILE_HCOMPT
passwd -u $PCUSER
fi
  done
echo "PATH=$PATH"  > /etc/cron.d/CTparentalmaxtimelogin 
echo "*/1 * * * * root /usr/local/bin/CTparental.sh -uctl" >> /etc/cron.d/CTparentalmaxtimelogin
$SED "s?^HOURSCONNECT.*?HOURSCONNECT=ON?g" $FILE_CONF
$CRONrestart
}


Si l'adresse IP est différente de 127.0.0.10 c'est que le filtrage ne fonctionne pas.


Pour l'aide tapez :


usage="Usage: CTparental.sh    {-i }|{ -u }|{ -dl }|{ -ubl }|{ -rl }|{ -on }|{ -off }|{ -cble }|{ -dble }
   # CTparental
                              |{ -tlo }|{ -tlu }|{ -uhtml }|{ -aupon }|{ -aupoff }|{ -aup }
-i      => Installe le contrôle parental sur l'ordinateur (pc de bureau). Peut être utilisé avec
          un paramètre supplémentaire pour indiquer un chemin de sources pour la page web de redirection.
          exemple : CTparental.sh -i -dirhtml /home/toto/html/
          si pas d'option le \"sens interdit\" est utilisé par défaut.
-u      => désinstalle le contrôle parental de l'ordinateur (pc de bureau)
-dl    => met à jour le contrôle parental à partir de la blacklist de l'université de Toulouse
-ubl    => A faire après chaque modification du fichier $DNS_FILTER_OSSI
-rl    => A faire après chaque modification manuelle du fichier $DREAB
-on    => Active le contrôle parental
-off    => Désactive le contrôle parental
-cble   => Configure le mode de filtrage par liste blanche ou par liste noire (défaut) ainsi que les
          catégories que l'on veut activer.
-dble  => Remet les catégories actives par défaut et le filtrage par liste noire.
-tlo    => Active et paramètre les restrictions horaires de login pour les utilisateurs.
          Compatible avec les gestionnaire de sessions suivant $GESTIONNAIREDESESSIONS .
-tlu    => Désactive les restrictions horaires de login pour les utilisateurs.
-uhtml  => met à jour la page de redirection à partir d'un répertoire source ou par défaut avec
            le \"sens interdit\".
            exemples:
                    - avec un repertoire source : CTparental.sh -uhtml -dirhtml /home/toto/html/
      - par défaut :              CTparental.sh -uhtml
            permet aussi de changer le couple login, mot de passe de l'interface web.
-aupon  => active la mise à jour automatique de la blacklist de Toulouse (tous les 7 jours).
-aupoff => désactive la mise à jour automatique de la blacklist de Toulouse.
-aup    => comme -dl mais seulement si il n'y a pas eu de mise à jour depuis plus de 7 jours.
-nodep  => si placer aprés -i ou -u permet de ne pas installer/désinstaller les dépendances, utiles si
            on préfaire les installer a la mains , ou pour le scripte de postinst et prerm
            du deb.
            exemples:
                    CTparental.sh -i -nodep
    CTparental.sh -i -dirhtml /home/toto/html/ -nodep 
    CTparental.sh -u -nodep
-nomanuel => utiliser uniquement pour le scripte de postinst et prerm
            du deb.
-gcton   => créer un group de privilégier ne subisent pas le filtrage.
exemple:CTparental.sh -gctulist
editer $FILE_GCTOFFCONF et y commanter tous les utilisateurs que l'on veut filtrer.
CTparental.sh -gctalist
-gctoff  => suprime le group de privilégier .
tous les utilisateurs du system subisse le filtrages!!
-gctulist => Mes a jour le fichier de conf du group , $FILE_GCTOFFCONF
en fonction des utilisateur ajouter ou suprimer du pc.
-gctalist => Ajoute/Suprime les utilisateurs dans le group ctoff en fonction du fichier de conf.
"
case $arg1 in
  -\? | -h* | --h*)
      echo "$usage"
      exit 0
      ;;
  -i | --install )
      install
      iptablesoff
      iptableson
      exit 0
      ;;
  -u | --uninstall )
      autoupdateoff
      iptablesoff
      dnsmasqoff
      desactivetimelogin
      uninstall
      exit 0
      ;;
  -dl | --download )
      download
      adapt
      catChoice
      dnsmasqon
      $SED "s?^LASTUPDATE.*?LASTUPDATE=$THISDAYS=`date +%d-%m-%Y\ %T`?g" $FILE_CONF
      exit 0
      ;;
  -ubl | --updatebl )
      adapt
      catChoice
      dnsmasqon
      exit 0
      ;;
  -uhtml | --updatehtml )
      FoncHTTPDCONF
      exit 0
      ;;
  -rl | --reload )
      catChoice
      dnsmasqon
      exit 0
      ;;
  -on | --on )
      dnsmasqon
      iptableson
      exit 0
      ;;
  -off | --off )
  desactivegourpectoff
      autoupdateoff
      dnsmasqoff
      iptablesoff
      exit 0
      ;;
  -wlo | --whitelistonly )
      dnsmasqwhitelistonly
      exit 0
      ;;
  -cble | --confblenable )
      choiblenabled
      catChoice
      dnsmasqon
      exit 0
      ;;
    -dble | --defaultblenable )
      initblenabled
      catChoice
      dnsmasqon
      ;;
    -tlo | --timeloginon )
      activetimelogin
      ;;
    -tlu | --timeloginon )
      desactivetimelogin
      ;;
    -trf | --timeloginon )
      readTimeFILECONF
      ;;
    -aupon | --autoupdateon )
      autoupdateon
      ;;
    -aupoff | --autoupdateoff )
      autoupdateoff
      ;;
    -aup | --autoupdate )
      autoupdate
      ;;
    -listusers )
      listeusers
      ;;
    -gcton )
      activegourpectoff
  iptablesoff
  iptableson
      ;;
    -gctoff )
  desactivegourpectoff
  iptablesoff
  iptableson
      ;;
    -gctulist )
  updatelistgctoff
  iptablesoff
  iptableson
      ;;
    -gctalist )
  applistegctoff
  iptablesoff
  iptableson
      ;;
    -uctl )
  # apelet toute les minute par cron pour activer desactiver les usagers ayant des restrictions de temps journalier de connection.
  updatetimelogin
      ;;     
     
  *)
      echo "Argument inconnu :$1";
      echo "$usage";
      exit 1
      ;;
esac


</code>
sans aucun paramètre.
'''index.php'''
<code php>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><!-- written by Rexy -->
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<TITLE>CTparental DNS filtering</TITLE>
<link rel="stylesheet" href="/CTadmin/css/style.css" type="text/css">
</HEAD>
<body>
<?php
function form_filter ($form_content)
{
// réencodage iso + format unix + rc fin de ligne (ouf...)
$list = str_replace("\r\n", "\n", utf8_decode($form_content));
if (strlen($list) != 0){
if ($list[strlen($list)-1] != "\n") { $list[strlen($list)]="\n";} ;} ;
return $list;
}
# Choice of language
$Language = 'en';
if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])){
  $Langue = explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']);
  $Language = strtolower(substr(chop($Langue[0]),0,2)); }
if($Language == 'fr'){
$l_selectuser="l'utilisateur selectionné est : ";
$l_userisnotselect="Veuillez selectionner un utilisateur.";
$l_isadmin = "7j/7 24h/24";
$l_valide = "Enregistrer";
$to = " à " ;
$and = " et " ;
$l_select = "Sélectionner";
$l_info1 = "08h00 à 24h00 ou 08h00 à 12h00 et 14h00 à 24h00";
$week = array( "lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche");
  $tmaxinfo= "Minutes max /24 heurs";
  $l_switch_LogOFF="Déconnection";
  $l_hours_error1="un mauvais format horaire a été trouvé :exemple 8h30 doit s'écrire 08h30";
  $l_hours_error2="incohérence horaire : ";
  $l_hours_error3="Vous devez rentrer une valeur entre 1 et 1440 minutes.";
  $l_hours_on = "Les horaires de connexion sont actuellement activés";
  $l_hours_off = "Les horaires de connexion sont actuellement désactivés";
  $l_switch_hours_off = "Désactiver les horaires de connexion";
  $l_switch_hours_on = "Activer les horaires de connexion";
  $l_hours1 = "Heures de connexions autorisées";
  $l_switch_Init_bl = "Init Catégories";
  $l_auto_update_on = "La mise à jour de la blacklist de Toulouse tous les 7 jours est activée";
  $l_auto_update_off = "La mise à jour de la blacklist de Toulouse tous les 7 jours est désactivée";
  $l_switch_auto_update_on = "Activer Maj Auto";
  $l_switch_auto_update_off = "Désactiver Maj Auto";
  $l_fmenu_black = "Filtrage par BlackList";
  $l_fmenu_white = "Filtrage par WhiteList";
  $l_title1 = "Filtrage de noms de domaine ";
  $l_error_open_file="Erreur d'ouverture du fichier";
  $l_dnsfilter_on="Le filtrage de noms de domaine est actuellement activé";
  $l_dnsfilter_off="Le filtrage de noms de domaine est actuellement désactivé";
  $l_switch_filtering_on="Activer le filtrage";
  $l_switch_filtering_off="Désactiver le filtrage";
  $l_main_bl="Liste noire/blanche";
  $l_bl_version="Version actuelle :";
  $l_bl_categories_bl="Choix des catégories à filtrer";
  $l_bl_categories_wl="Choix des catégories à autoriser";
  $l_download_bl="Télécharger la dernière version";
  $l_fingerprint="L'empreinte numérique du fichier téléchargé est : ";
  $l_fingerprint2="Vérifiez-là en suivant ce lien (ligne 'blacklists.tar.gz') : ";
  $l_activate_bl="Activer la nouvelle version";
  $l_reject_bl="Rejeter";
  $l_warning="Temps estimé : une minute.";
  $l_specific_filtering="Filtrage spécial";
  $l_forbidden_dns="Noms de domaine filtrés";
  $l_forbidden_dns_explain="Entrez un nom de domaine par ligne (exemple : domaine.org)";
  $l_one_dns="Entrez un nom de domaine par ligne (exemple : domaine.org)";
  $l_rehabilitated_dns="Noms de domaine réhabilités";
  $l_rehabilitated_dns_explain_bl="1-Entrez ici des noms de domaine bloqués par la liste noire <BR> que vous souhaitez réhabiliter.";
  $l_rehabilitated_dns_explain_wl="2-Entrez ici des noms de domaine autorisés en plus de ceux <BR> de la liste blanche de Toulouse.";
  $l_add_to_bl="Noms de domaine ajoutés à la liste noire";
  $l_record="Enregistrer les modifications";
  $l_wait="Une fois validées, 30 secondes sont nécessaires pour traiter vos modifications";
  $l_title_gctoff="Groupe privilégié";
  $l_gctoff_explain="Cocher des utilisateurs ne devant pas subir de filtrage";
  $l_gctoff_username="Nom d'utilisateur";
  $l_gctoff_username_comment="Commentaires";
  $l_switch_gctoff_on="Activer le groupe de privilégiés.";
  $l_switch_gctoff_off="Désactiver le groupe de privilégiés.";
  $l_gctoff_on = "Le Groupe privilégié est actuellement activés";
  $l_gctoff_off = "Le Groupe privilégié est actuellement désactivés";


}
== Configuration ==
else {
Pour les versions 4.20.27  et supérieures on accède à l'interface d'administration par le lien web suivant: https://admin.ct.local
  $l_userisnotselect="Veuillez sélectionner un utilisateur.";
  $l_selectuser="l'utilisateur sélectionné est : ";
  $l_isadmin = "7j/7 24h/24";
  $l_valide = "Enregistrer";
  $l_select = "Select";
  $to = " to " ;
  $and = " and " ;
  $l_info1 = "08h00 à 24h00 ou 08h00 à 12h00 et 14h00 à 24h00";
  $week = array( "lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche");
  $tmaxinfo= "Minutes max /24 heurs";
  $l_switch_LogOFF="Logout";
  $l_hours_error1="Un mauvais format horaire a été trouvé : exemple 8h30 doit s'écrire 08h30";
  $l_hours_error2="incohérence horaire : ";
  $l_hours_error3="Vous devez rentrer une valeur entre 1 et 1440 minutes.";
  $l_hours_on = "Les horaires de connexion sont actuellement activés";
  $l_hours_off = "Les horaires de connexion sont actuellement désactivés";
  $l_switch_hours_off = "Désactiver les horaires de connexion";
  $l_switch_hours_on = "Activer les horaires de connexion";
  $l_hours1 = "Heures de connexions autorisées";
  $l_switch_Init_bl = "Init Catégories";
  $l_auto_update_on = "La mise à jour de la blacklist de Toulouse tous les 7 jours est activée";
  $l_auto_update_off = "La mise à jour de la blacklist de Toulouse tous les 7 jours est désactivée";
  $l_switch_auto_update_on = "Activer Maj Auto";
  $l_switch_auto_update_off = "Désactiver Maj Auto";
  $l_fmenu_black = "Filtrage par BlackList";
  $l_fmenu_white = "Filtrage par WhiteList";
  $l_title1 = "Domain names filtering";
  $l_error_open_file="Error opening the file";
  $l_dnsfilter_on="Actually, the Domain name filter is on";
  $l_dnsfilter_off="Actually, the Domain name filter is off";
  $l_switch_filtering_on="Switch the Filter on";
  $l_switch_filtering_off="Switch the Filter off";
  $l_main_bl="Blacklist/Whitelist";
  $l_bl_version="Current version : ";
  $l_bl_categories_bl="Choice of filtered categories";
  $l_bl_categories_wl="Choice of authorized categories";
  $l_download_bl="Download the last version";
  $l_fingerprint="The digital fingerprint of the downloaded blacklist is : ";
  $l_fingerprint2="Verify it with this link (line 'blacklists.tar.gz') : ";
  $l_activate_bl="Activate the new version";
  $l_reject_bl="Reject";
  $l_warning="Estimated time : one minute.";
  $l_specific_filtering="Specific filtering";
  $l_forbidden_dns="Filtered domain names";
  $l_forbidden_dns_explain="Enter one domain name per row (exemple : domain.org)";
  $l_one_dns="Enter one domain name per row (example : domain.org)";
  $l_rehabilitated_dns="Rehabilitated domain names";
  $l_rehabilitated_dns_explain_bl="Enter here domain names that are blocked by the blacklist <BR> and you want to rehabilitate.";
  $l_rehabilitated_dns_explain_wl="2-Entrez ici des noms de domaine autorisés en plus de ceux <BR> de la liste blanche de Toulouse.";
  $l_add_to_bl="Domain names to add to blacklist";
  $l_record="Save changes";
  $l_wait="Once validated, 30 seconds is necessary to compute your modifications";
  $l_title_gctoff="Groupe privilégié";
  $l_gctoff_explain="Cocher des utilisateurs ne devant pas subir de filtrage";
  $l_gctoff_username="Username";
  $l_gctoff_username_comment="Comments";
  $l_switch_gctoff_on="Activer le groupe de privilégiés.";
  $l_switch_gctoff_off="Désactiver le groupe de privilégiés.";
  $l_gctoff_on = "Le Groupe privilégié est actuellement activés";
  $l_gctoff_off = "Le Groupe privilégié est actuellement désactivés";


}
Pour les versions 4.20.26  on accède à l'interface d'administration par le lien web suivant: https://admin.ct.localhost
$weeknum = array( 0,1,2,3,4,5,6);
$bl_categories="/usr/local/etc/CTparental/bl-categories-available";
$bl_categories_enabled="/usr/local/etc/CTparental/categories-enabled";
$conf_file="/usr/local/etc/CTparental/CTparental.conf";
$conf_ctoff_file="/usr/local/etc/CTparental/GCToff.conf";
$hconf_file="/usr/local/etc/CTparental/CThours.conf";
$wl_domains="/usr/local/etc/CTparental/domaine-rehabiliter";
$bl_domains="/usr/local/etc/CTparental/blacklist-local";
# default values


Pour les versions inférieure à  4.20.26 on accède à l'interface d'administration par le lien web suivant: http://127.0.0.1/CTadmin


if (isset($_POST['choix'])){ $choix=$_POST['choix']; } else { $choix=""; }
Pour les versions 4.20.9 et supérieures dans le Choix des catégories à filtrer ajouter la catégorie '''ctparental'''<br />
switch ($choix)
Pour les versions inférieures ajouter la liste ci dessous dans les [https://github.com/marsat/CTparental/wiki/Noms-de-domaine-filtr%C3%A9s-%28ossi%29 Noms de domaine filtrés]  
{
case 'gct_Off' :
exec ("sudo -u root /usr/local/bin/CTparental.sh -gctoff");
break;
case 'gct_On' :
exec ("sudo -u root /usr/local/bin/CTparental.sh -gcton");
break;
case 'LogOFF' :
header('HTTP/1.0 401 Unauthorized');
header('WWW-Authenticate: Digest realm="interface admin"');
exit;
break;
case 'BL_On' :
exec ("sudo -u root /usr/local/bin/CTparental.sh -on");
break;
case 'BL_Off' :
exec ("sudo -u root /usr/local/bin/CTparental.sh -off");
break;
case 'H_On' :
exec ("sudo -u root /usr/local/bin/CTparental.sh -trf");
break;
case 'H_Off' :
exec ("sudo -u root /usr/local/bin/CTparental.sh -tlu");
break;
case 'AUP_On' :
exec ("sudo -u root /usr/local/bin/CTparental.sh -aupon");
break;
case 'AUP_Off' :
exec ("sudo -u root /usr/local/bin/CTparental.sh -aupoff");
break;
case 'INIT_BL' :
exec ("sudo -u root /usr/local/bin/CTparental.sh -dble");
break;
case 'Download_bl' :
exec ("sudo -u root /usr/local/bin/CTparental.sh -dl");
break;
case 'MAJ_cat' :
$tab=file($bl_categories_enabled);
if ($tab)
{
$pointeur=fopen($bl_categories_enabled, "w+");
foreach ($_POST as $key => $value)
{
                        if (strstr($key,'chk-'))
{
$line=str_replace('chk-','',$key)."\n";
fwrite($pointeur,$line);
}
}
fclose($pointeur);
}
else {echo "$l_error_open_file $bl_categories_enabled";}
$fichier=fopen($bl_domains,"w+");
fputs($fichier, form_filter($_POST['OSSI_bl_domains']));
fclose($fichier);
unset($_POST['OSSI_bl_domains']);
$fichier=fopen($wl_domains,"w+");
fputs($fichier, form_filter($_POST['OSSI_wl_domains']));
fclose($fichier);
unset($_POST['OSSI_wl_domains']);
exec ("sudo -u root /usr/local/bin/CTparental.sh -ubl");
break;
case 'MAJ_H' :
$formatheuresok=1;
if (isset($_POST['selectuser'])){ $selectuser=$_POST['selectuser']; }
#echo "$selectuser";
$tab=file($hconf_file);
if ($tab)
{
$pointeur=fopen($hconf_file, "w+");
foreach ($tab as $line)
{
if (strstr($line,$selectuser) == false)
{
fwrite($pointeur,$line); # on reécrit toutes les lignes ne correspondant pas à l'utilisateur sélectionné
}
}
}
else {echo "$l_error_open_file $hconf_file";}
if (isset($_POST["isadmin"])){fwrite($pointeur,"$selectuser=admin="."\n"); }
else
{
if (isset($_POST["tmax"])){
if ( preg_match( "/^[1-9]$|^[1-9][0-9]$|^[1-9][0-9][0-9]$|^1[0-3][0-9][0-9]$|^14[0-3][0-9]$|^1440$/", $_POST["tmax"] ) == 1  )
{fwrite($pointeur,"$selectuser=user=".$_POST["tmax"]."\n");}
else {fwrite($pointeur,"$selectuser=user=1440"."\n");
  echo "<H3>$l_hours_error3</H3>";}
}
else {fwrite($pointeur,"$selectuser=user=1440"."\n"); }
foreach ($weeknum as $numday)
{
$formatheuresok=1;
if (isset($_POST["h1$numday"])){ $h1[$numday]=$_POST["h1$numday"]; } else { $h1[$numday]="00h00"; }
if (isset($_POST["h2$numday"])){ $h2[$numday]=$_POST["h2$numday"]; } else { $h2[$numday]="23h59"; }
if (isset($_POST["h3$numday"])){ $h3[$numday]=$_POST["h3$numday"]; } else { $h3[$numday]=""; }
if (isset($_POST["h4$numday"])){ $h4[$numday]=$_POST["h4$numday"]; } else { $h4[$numday]=""; }
if (preg_match("/^[0-1][0-9]h[0-5][0-9]$|^2[0-3]h[0-5][0-9]$/",$h1[$numday])!=1){$formatheuresok=0;}
if (preg_match("/^[0-1][0-9]h[0-5][0-9]$|^2[0-3]h[0-5][0-9]$/",$h2[$numday])!=1){$formatheuresok=0;}
if ($h3[$numday]=="")
{
if ($formatheuresok == 1)
{
$t1=explode("h", $h1[$numday]);
$t2=explode("h", $h2[$numday]);
$v1="$t1[0]$t1[1]";
$v2="$t2[0]$t2[1]";
if ( $v1 < $v2)
{
fwrite($pointeur,"$selectuser=$numday=$h1[$numday]:$h2[$numday]"."\n");
}
else
{
fwrite($pointeur,"$selectuser=$numday=00h00:23h59"."\n");
echo "<H3>$week[$numday] : $l_hours_error2 $h1[$numday]>=$h2[$numday]</H3>";
}
}
else
{
fwrite($pointeur,"$selectuser=$numday=00h00:23h59"."\n");
echo "<H3>$week[$numday] : $l_hours_error1</H3>";
}
}
else
{
if (preg_match("/^[0-1][0-9]h[0-5][0-9]$|^2[0-3]h[0-5][0-9]$/",$h3[$numday])!=1){$formatheuresok=0;}
if (preg_match("/^[0-1][0-9]h[0-5][0-9]$|^2[0-3]h[0-5][0-9]$/",$h4[$numday])!=1){$formatheuresok=0;}
if ($formatheuresok == 1)
{
$t1=explode("h", $h1[$numday]);
$t2=explode("h", $h2[$numday]);
$t3=explode("h", $h3[$numday]);
$t4=explode("h", $h4[$numday]);
$v1="$t1[0]$t1[1]";
$v2="$t2[0]$t2[1]";
$v3="$t3[0]$t3[1]";
$v4="$t4[0]$t4[1]";
if ( $v1 < $v2 && $v2 < $v3 && $v3 < $v4)
{
fwrite($pointeur,"$selectuser=$numday=$h1[$numday]:$h2[$numday]:$h3[$numday]:$h4[$numday]"."\n");
}
else
{
fwrite($pointeur,"$selectuser=$numday=00h00:23h59"."\n");
echo "<H3>$week[$numday] : $l_hours_error2 $h1[$numday]>=$h2[$numday]>=$h3[$numday]>=$h4[$numday]</H3>";
}
}
else
{
fwrite($pointeur,"$selectuser=$numday=00h00:23h59"."\n");
echo "<H3>$week[$numday] : $l_hours_error1</H3>";
}
}


}
Pour les utilisateurs des applications winehq et playonelinux en ctparental versions 4.20.11 et inférieures,<br />
}
si le proxy système n'est pas pris en compte il faut le paramétrer via la base de registre de votre disque dur virtuel ou par le menu configuration de l’application qui a besoin d'accéder à internet.<br />
Les versions 4.20.12 et supérieures ne sont pas affectées par ce problème.
fclose($pointeur);
exec ("sudo -u root /usr/local/bin/CTparental.sh -trf");
break;
case 'change_user' :
$tab=file($conf_ctoff_file);
if ($tab)
{
$pointeur=fopen($conf_ctoff_file,"w+");
foreach ($tab as $ligne)
{
$CONF_CTOFF1 = str_replace('#','',$ligne);
$actif = False ;
foreach ($_POST as $key => $value)
{
if (strstr($key,'chk-'))
{
$CONF_CTOFF2 = str_replace('chk-','',$key);
if ( trim($CONF_CTOFF1) == trim($CONF_CTOFF2) )
{
$actif = True;
break;
}
}
}


if (! $actif) { $line="#$CONF_CTOFF1";}
Par exemple, pour Internet Explorer :
else { $line="$CONF_CTOFF1";}
fwrite($pointeur,$line);
}
fclose($pointeur);
}
exec ("sudo -u root /usr/local/bin/CTparental.sh -gctalist");
break;


}
<pre>
REGEDIT4


echo "<TABLE width='100%' border=0 cellspacing=0 cellpadding=0>";
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
echo "<tr><th>$l_title1</th></tr>";
echo "<tr bgcolor='#FFCC66'><td><img src='/images/pix.gif' width=1 height=2></td></tr>";
echo "</TABLE>";
echo "<TABLE width='100%' border=1 cellspacing=0 cellpadding=0>";
echo "<tr><td valign='middle' align='left'>";
echo "<CENTER>";
echo "<FORM action='$_SERVER[PHP_SELF]' method=POST>";
echo "<input type=hidden name='choix' value=\"LogOFF\">";
echo "<input type=submit value=\"$l_switch_LogOFF\">";
echo "</FORM>";
echo "</CENTER>";
if (is_file ($conf_file))
{
$tab=file($conf_file);
if ($tab)
{
foreach ($tab as $line)
{
$field=explode("=", $line);
if ($field[0] == "LASTUPDATE") {$LASTUPDATE=trim($field[2]);}
if ($field[0] == "DNSMASQ") {$DNSMASQ=trim($field[1]);}
if ($field[0] == "AUTOUPDATE") {$AUTOUPDATE=trim($field[1]);}
if ($field[0] == "HOURSCONNECT") {$HOURSCONNECT=trim($field[1]);}
            if ($field[0] == "GCTOFF") {$GCTOFF=trim($field[1]);}           
}
}
}
else { echo "$l_error_open_file $conf_file";}


include 'dns.php';
"ProxyEnable"=dword:00000001


include 'hours.php';
"ProxyServer"="http=127.0.0.1:8080;https=127.0.0.1:8080"


include 'gctoff.php';
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap]


//echo "</td></tr>";
"AutoDetect"=dword:00000000
?>
</BODY>
</HTML>


"IntranetName"=dword:00000001


</code>
"ProxyByPass"=dword:00000001
'''dns.php'''
   
<code php>
</pre>
<?php
 
if ($DNSMASQ <> "OFF")
{
echo "<CENTER><H3>$l_dnsfilter_on</H3></CENTER>";
echo "<FORM action='$_SERVER[PHP_SELF]' method=POST>";
echo "<input type=hidden name='choix' value=\"BL_Off\">";
echo "<input type=submit value=\"$l_switch_filtering_off\">";
echo "</FORM>";
 
if (isset($_GET['filtragemode'])){ $filtragemode=$_GET['filtragemode']; } else {$filtragemode=$DNSMASQ;}
if ($filtragemode == 'WHITE')
{
$bl_categories="/usr/local/etc/CTparental/wl-categories-available";
}
else { $bl_categories="/usr/local/etc/CTparental/bl-categories-available";}
 
$filtragemode = urlencode($filtragemode);
echo "<table border=0 width=400 cellpadding=0 cellspacing=2>";
echo "<tr valign=top>";
echo "<td align=center"; if ( $filtragemode == "BLACK" ) { echo " bgcolor=\"#FFCC66\"";} echo ">";
echo "<a href=\"$_SERVER[PHP_SELF]?filtragemode=BLACK\" title=\"\"><font color=\"black\"><b>$l_fmenu_black</b></font></a></td>";
echo "<td align=center"; if ( $filtragemode == "WHITE" ) { echo " bgcolor=\"#FFCC66\"";} echo ">";
echo "<a href=\"$_SERVER[PHP_SELF]?filtragemode=WHITE\" title=\"\"><font color=\"black\"><b>$l_fmenu_white</b></font></a></td>";
echo "</tr>";
echo" </table>";
echo "</td></tr>";
 
 
function echo_file ($filename)
{
if (file_exists($filename))
{
if (filesize($filename) != 0)
{
$pointeur=fopen($filename,"r");
$tampon = fread($pointeur, filesize($filename));
fclose($pointeur);
echo $tampon;
}
}
else
{
echo "$l_error_openfile $filename";
}
}
 
echo "<TABLE width='100%' border=1 cellspacing=0 cellpadding=1>";
echo "<CENTER><H3>$l_main_bl</H3></CENTER>";
echo "<tr><td valign='middle' align='left' colspan=10>";
echo "<FORM action='$_SERVER[PHP_SELF]' method=POST>";
echo "<center>$l_bl_version $LASTUPDATE";
echo "</center><BR>";
echo "<input type='hidden' name='choix' value='Download_bl'>";
echo "<input type='submit' value='$l_download_bl'>";
echo " ($l_warning)";
 
echo "</FORM>";
echo "<FORM action='$_SERVER[PHP_SELF]' method=POST>";
echo "<input type='hidden' name='choix' value='INIT_BL'>";
echo "<input type='submit' value='$l_switch_Init_bl'>";
echo "</FORM>";
if ($AUTOUPDATE == "ON")
{
echo "<CENTER><H3>$l_auto_update_on</H3></CENTER>";
echo "<FORM action='$_SERVER[PHP_SELF]' method=POST>";
echo "<input type=hidden name='choix' value=\"AUP_Off\">";
echo "<input type=submit value=\"$l_switch_auto_update_off\">";
}
else
{
echo "<CENTER><H3>$l_auto_update_off</H3></CENTER>";
echo "<FORM action='$_SERVER[PHP_SELF]' method=POST>";
echo "<input type=hidden name='choix' value=\"AUP_On\">";
echo "<input type=submit value=\"$l_switch_auto_update_on\">";
}
echo "</FORM>";
echo "</td></tr>";
echo "<tr><td valign=\"middle\" align=\"left\" colspan=10>";
echo "<FORM action='$_SERVER[PHP_SELF]' method=POST>";
echo "<input type='hidden' name='choix' value='MAJ_cat'>";
if ($filtragemode == "BLACK"){echo "<center>$l_bl_categories_bl</center></td></tr>";}
else {echo "<center>$l_bl_categories_wl</center></td></tr>";}
 
//on lit et on interprète le fichier de catégories
$cols=1;
if (file_exists($bl_categories))
{
$pointeur=fopen($bl_categories,"r");
while (!feof ($pointeur))
{
$ligne=fgets($pointeur, 4096);
if ($ligne)
{
if ($cols == 1) { echo "<tr>";}
$categorie=trim(basename($ligne));
echo "<td><a href='bl_categories_help.php?cat=$categorie' target='cat_help' onclick=window.open('bl_categories_help.php','cat_help','width=600,height=150,toolbar=no,scrollbars=no,resizable=yes') title='categories help page'>$categorie</a><br>";
echo "<input type='checkbox' name='chk-$categorie'";
// la catégorie n'existe pas dans le fichier de catégorie activé -> categorie non sélectionnée
$str = file_get_contents($bl_categories_enabled);
if (strpos($str, $categorie)===false) { echo ">";}
else { echo "checked>"; }
echo "</td>";
$cols++;
if ($cols > 10) {
echo "</tr>";
$cols=1; }
}
}
fclose($pointeur);
}
else {
echo "$l_error_open_file $bl_categories";
}
echo "</td></tr>";
echo "<tr><td valign='middle' align='left' colspan=10></td></tr>";
echo "<tr><td colspan=5 align=center>";
if ($filtragemode == "BLACK"){echo "<H3>$l_rehabilitated_dns</H3>$l_rehabilitated_dns_explain_bl<BR>$l_one_dns<BR>";}
else {echo "<H3>$l_rehabilitated_dns</H3>$l_rehabilitated_dns_explain_wl<BR>$l_one_dns<BR>";}
echo "<textarea name='OSSI_wl_domains' rows=5 cols=40>";
echo_file ($wl_domains);
echo "</textarea></td>";
if ( $filtragemode == "BLACK" ) {
echo "<td colspan=5 align=center>";
echo "<H3>$l_forbidden_dns</H3>$l_forbidden_dns_explain<BR>";
echo "<textarea name='OSSI_bl_domains' rows=5 cols=40>";
echo_file ($bl_domains);
echo "</textarea></td>";
}
echo "</tr><tr><td colspan=10>";
 
echo "<input type='submit' value='$l_record'>";
echo "</form> ($l_wait)";
 
echo "</td></tr>";
echo "</TABLE>";
echo "</TABLE>";
 
 
}
else
{
echo "<CENTER><H3>$l_dnsfilter_off</H3></CENTER>";
echo "<FORM action='$_SERVER[PHP_SELF]' method=POST>";
echo "<input type=hidden name='choix' value=\"BL_On\">";
echo "<input type=submit value=\"$l_switch_filtering_on\">";
echo "</FORM>";
echo "</td></tr>";
}
 
 
 
 
?>
 
</code>
'''hours.php'''
<code php>
 
<?php
echo "<TABLE width='100%' border=0 cellspacing=0 cellpadding=0>";
echo "<tr><th>$l_hours1</th></tr>";
echo "<tr bgcolor='#FFCC66'><td><img src='/images/pix.gif' width=1 height=2></td></tr>";
echo "</TABLE>";
echo "<TABLE width='100%' border=1 cellspacing=0 cellpadding=0>";
echo "<tr><td valign='middle' align='left'>";
if ($HOURSCONNECT == "ON")
{
echo "<CENTER><H3>$l_hours_on</H3></CENTER>";
echo "<FORM action='$_SERVER[PHP_SELF]' method=POST>";
echo "<input type=hidden name='choix' value=\"H_Off\">";
echo "<input type=submit value=\"$l_switch_hours_off\">";
echo "</FORM>";
# Choice of language
$Language = 'en';
if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])){
  $Langue = explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']);
  $Language = strtolower(substr(chop($Langue[0]),0,2)); }
if($Language == 'fr'){
  $l_selectuser="l'utilisateur sélectionné est : ";
  $l_userisnotselect="Veuillez sélectionner un utilisateur.";
  $l_isadmin = "7j/7 24h/24";
  $l_valide = "Enregistrer";
  $to = " à " ;
  $and = " et " ;
  $l_select = "Sélectionner";
  $l_info1 = "08h00 à 24h00 ou 08h00 à 12h00 et 14h00 à 24h00";
  $week = array( "lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche");
  $tmaxinfo= "Minutes max /24 heurs";
}
else {
  $l_userisnotselect="Veuillez sélectionner un utilisateur.";
  $l_selectuser="l'utilisateur sélectionné est : ";
  $l_isadmin = "7j/7 24h/24";
  $l_valide = "Enregistrer";
  $l_select = "Select";
  $to = " to " ;
  $and = " and " ;
  $l_info1 = "08h00 à 24h00 ou 08h00 à 12h00 et 14h00 à 24h00";
  $week = array( "lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche");
  $tmaxinfo= "Minutes max /24 heurs";
}
if (isset($_POST['selectuser'])){ $selectuser=$_POST['selectuser']; }
 
 
### on lit et on interprète le fichier CTparental.conf
echo "<TABLE width='100%' border=0 cellspacing=0 cellpadding=0>";
exec ("/usr/local/bin/CTparental.sh -listusers 2> /dev/null",$USERSPC); # récupération des utilisateurs du poste.(UID >= 1000)
echo "<FORM action='$_SERVER[PHP_SELF]' method=POST>";
echo "<select name=\"selectuser\">";
if ($selectuser){echo "<option value=\"$selectuser\">$selectuser\n"; }
else {echo "<option value=\"\">\n"; }
foreach ($USERSPC as $USERSELECT){echo "<option value=\"$USERSELECT\">$USERSELECT\n";}
echo " </select>";
echo "<input type=\"submit\" value=\"$l_select\">";
echo "</FORM>";
if (isset($selectuser)) {
echo "</TABLE>";
echo "<TABLE width='600' border=0 cellspacing=0 cellpadding=0>";
echo "<FORM action='$_SERVER[PHP_SELF]' method=POST>";
echo "<CENTER><H3>$l_selectuser $selectuser</H3></CENTER>";
if (is_file ($hconf_file))
{
$tab=file($hconf_file);
if ($tab)
{
foreach ($tab as $line)
{
$field=explode("=", $line);
if ( $field[0] == $selectuser ){
$field2=explode(":", $field[2]);
$numday=$field[1];
$isconfigured=1;
if ( $numday == "admin") { echo "<tr><td>$l_isadmin : <input type='checkbox' name='isadmin' checked></td></tr>";}
elseif ( $numday == "user") {echo "<tr><td>$l_isadmin : <input type='checkbox' name='isadmin' ></td></tr>";
if ( intval ($field[2]) == 0 ) { $field[2]="1440"; }
echo"<tr><td>$tmaxinfo<td><INPUT type=\"text\" size=4 maxlength=4 value=\"$field[2]\"  name=\"tmax\">/1440<td</tr>";
}
else {
echo"<tr><td>$week[$numday]:</td><td><INPUT type=\"text\" size=5 maxlength=5 value=\"$field2[0]\"  name=\"h1$numday\"></td>";
echo" <td>$to <INPUT type=\"text\" size=5 maxlength=5 value=\"$field2[1]\" name=\"h2$numday\"></td>";
echo" <td>$and <INPUT type=\"text\" size=5 maxlength=5 value=\"$field2[2]\" name=\"h3$numday\"></td>";
echo" <td>$to <INPUT type=\"text\" size=5 maxlength=5 value=\"$field2[3]\" name=\"h4$numday\"></td></tr>";
}
}
}
}
}
else { echo "$l_error_open_file $hconf_file";}
 
if (isset($isconfigured)==0){
echo "<tr><td>$l_isadmin : <input type='checkbox' name='isadmin' checked=\"checked\"></td></tr>";
}
 
 
echo "</TABLE>";
echo "<input type=hidden name='selectuser' value=\"$selectuser\">";
echo "<input type=hidden name='choix' value=\"MAJ_H\">";
echo "<input type=\"submit\" value=\"$l_valide\">";
echo "</FORM>";
}
else { echo "<CENTER><H3>$l_userisnotselect</H3></CENTER>";}
 
}
else
{
echo "<CENTER><H3>$l_hours_off</H3></CENTER>";
echo "<FORM action='$_SERVER[PHP_SELF]' method=POST>";
echo "<input type=hidden name='choix' value=\"H_On\">";
echo "<input type=submit value=\"$l_switch_hours_on\">";
echo "</FORM>";
}
 
 
 
?>
 
</code>
'''gctoff.php'''
<code php>
<?php
echo "<TABLE width='100%' border=0 cellspacing=0 cellpadding=0>";
echo "<tr><th>$l_title_gctoff</th></tr>";
echo "<tr bgcolor='#FFCC66'><td><img src='/images/pix.gif' width='1' height='2'></td></tr>";
echo "</table>";
echo "<table width='100%' border=1 cellspacing=0 cellpadding=1>";
if ($GCTOFF == "ON")
{
echo "<CENTER><H3>$l_gctoff_on</H3></CENTER>";
echo "<FORM action='$_SERVER[PHP_SELF]' method=POST>";
echo "<input type=hidden name='choix' value=\"gct_Off\">";
echo "<input type=submit value=\"$l_switch_gctoff_off\">";
echo "</FORM>";
 
echo "<tr><td colspan=2 align='center'>";
echo "$l_gctoff_explain</td></tr>";
echo "<tr><td align='center' valign='middle'>";
echo "<FORM action='$_SERVER[PHP_SELF]' method='POST'>";
echo "<table cellspacing=2 cellpadding=2 border=1>";
echo "<tr><th>$l_gctoff_username<th>$l_blocked</tr>";
// Read the "CTOFF.conf" file
exec ("sudo /usr/local/bin/CTparental.sh -gctulist");
$tab=file($conf_ctoff_file);
if ($tab) # the file isn't empty
{
foreach ($tab as $line)
{
if (trim($line) != '') # the line isn't empty
{
$user_lignes=explode(" ", $line);
$userx=trim($user_lignes[0],"#");
echo "<tr><td>$userx";
echo "<td><input type='checkbox' name='chk-$userx'";
if (preg_match('/^#/',$line, $r)) {
echo ">";}
else {
echo "checked>";}
echo "</tr>";
}
}
}
echo "</table>";
echo "<input type='hidden' name='choix' value='change_user'>";
echo "<input type='submit' value='$l_record'>";
echo "</form>";
}
else
{
echo "<CENTER><H3> $l_gctoff_off</H3></CENTER>";
echo "<FORM action='$_SERVER[PHP_SELF]' method=POST>";
echo "<input type=hidden name='choix' value=\"gct_On\">";
echo "<input type=submit value=\"$l_switch_gctoff_on\">";
echo "</FORM>";
}
 
</code>
'''bl_categories_help.php'''
<code php>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><!-- written by Rexy -->
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<?php
$bl_dir="/usr/local/etc/CTparental/dnsfilter-available/";
# Choice of language
$Language = 'en';
if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])){
  $Langue = explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']);
  $Language = strtolower(substr(chop($Langue[0]),0,2)); }
if($Language == 'fr'){
  $l_title = "Catégories de la liste noire";
  $l_error_open_file="Erreur d'ouverture du fichier";
  $l_close="Fermer";
  $l_unknown_cat="Cette catégorie n'est pas décrite";
  $l_nb_domains="Nombre de noms de domaine filtrés :";
  $l_nb_urls="Nombre d'URL filtrés :";
  $l_explain_adult="Sites relatifs à l'érotisme et à la pornographie";
  $l_explain_agressif="Sites extrémistes, racistes, antisémites ou incitant à la haine";
  $l_explain_arjel="Sites de pari en ligne certifies par l'ARJEL (Autorité de Régulation des Jeux En Ligne)";
  $l_explain_astrology="Sites relatifs à l'astrologie";
  $l_explain_bank="Sites de banques en ligne";
  $l_explain_audio_video="Sites de téléchargement de fichiers audio et vidéo";
  $l_explain_blog="Sites d'hébergement de blogs";
  $l_explain_celebrity="Sites « people », stars, etc.";
  $l_explain_chat="Sites de dialogue en ligne";
  $l_explain_child="Sites pour enfants";
  $l_explain_cleaning="Sites relatifs à la mise à jour logicielle ou antivirale";
  $l_explain_dangerous_material="Sites relatifs à la création de produits dangereux (explosif, poison, etc.)";
  $l_explain_dating="Sites de rencontres en ligne";
  $l_explain_drogue="Sites relatifs aux produits stupéfiants";
  $l_explain_filehosting="Entrepôts de fichiers  (vidéo, images, son, logiciels, etc.)";
  $l_explain_financial="Sites d'informations financières, bourses, etc.";
  $l_explain_forums="Sites d'hébergement de forums de discussion";
  $l_explain_gambling="Sites de jeux d'argent en ligne (casino, grattage virtuel, etc.)";
  $l_explain_games="Sites de jeux en ligne";
  $l_explain_hacking="Sites relatifs au piratage informatique";
  $l_explain_jobsearch="Sites de recherche d'emplois";
  $l_explain_liste_bu="Liste de sites éducatifs pour bibliothèque";
  $l_explain_malware="Site relatifs au logiciels malveillants (virus, vers, trojans, etc.)";
  $l_explain_manga="Site de Mangas";
  $l_explain_marketingware="Sites marchands douteux (X, organes, enfants, etc.)";
  $l_explain_mixed_adult="Sites pour adultes (image-choc, gore, guerre, etc.)";
  $l_explain_mobile_phone="Sites relatifs aux mobiles GSM (sonneries, logos, etc.)";
  $l_explain_ossi="Noms de domaine et URLs que vous ajoutez à la liste noire (voir ci-dessous)";
  $l_explain_phishing="Sites relatifs à l'hammeçonnage (pièges bancaires, redirection, etc.)";
  $l_explain_press="Sites de presse";
  $l_explain_publicite="Sites ou bannières publicitaires";
  $l_explain_radio="Sites de radios en ligne ou de podcast";
  $l_explain_reaffected="Sites connus ayant changé de propriétaire (et donc de contenu)";
  $l_explain_redirector="Sites de redirection, d'anonymisation ou de contournement";
  $l_explain_remote_control="Sites permettant la prise de controle a distance";
  $l_explain_sect="Sites sectaires";
  $l_explain_social_networks="Sites de réseaux sociaux";
  $l_explain_sexual_education="Sites relatifs à l'éducation sexuelle";
  $l_explain_shopping="Sites de vente et d'achat en ligne";
  $l_explain_sport="Sites de sport";
  $l_explain_strict_redirector="URL intentionnellement mal formées";
  $l_explain_strong_redirector="URL mal formées dans une requête « google »";
  $l_explain_tricheur="Sites relatifs aux tricheries (examens, concours, etc.)";
  $l_explain_webmail="Site WEB permettant de consultation son courrier électronique";
  $l_explain_warez="Sites relatifs aux logiciels piratés (crackés), aux générateurs de clés, etc.";
}
else {
  $l_title = "Blacklist categories";
  $l_error_open_file="Error opening the file";
  $l_close="Close";
  $l_unknown_cat="This category isn't describe";
  $l_nb_domains="Number of filtered domain names :";
  $l_nb_urls="Number of filtered URL :";
  $l_explain_adult="Sites related to eroticism and pornography";
  $l_explain_agressif="Sites extremist, racist, anti-Semitic or hate";
  $l_explain_arjel="Online gambling sites allowed by the french authority 'ARJEL' (Autorité de Régulation des Jeux En Ligne)";
  $l_explain_astrology="Sites related to astrology";
  $l_explain_audio_video="Sites for downloading audio and video";
  $l_explain_bank="Online bank sites";
  $l_explain_blog="Sites hosting blogs";
  $l_explain_celebrity="Sites « people », stars, etc.";
  $l_explain_chat="Online chat sites";
  $l_explain_child="Sites for children";
  $l_explain_cleaning="Sites related to software update or antiviral";
  $l_explain_dangerous_material="Sites related to the creation of dangerous goods (explosives, poison, etc.)";
  $l_explain_dating="Online dating sites";
  $l_explain_drogue="Sites related to narcotic";
  $l_explain_filehosting="Warehouses of files (video, images, sound, software, etc.)";
  $l_explain_financial="Sites of financial information";
  $l_explain_forums="Sites hosting discussion forums";
  $l_explain_gambling="Online gambling sites (casino, virtual scratching, etc.)";
  $l_explain_games="Online games sites";
  $l_explain_hacking="Sites related to hacking";
  $l_explain_jobsearch="Job search sites";
  $l_explain_liste_bu="List of educational sites for library";
  $l_explain_malware="Malware sites (viruses, worms, trojans, etc.).";
  $l_explain_manga="Manga site";
  $l_explain_marketingware="doubtful commercial sites";
  $l_explain_mixed_adult="Adult sites (shock, gore, war, etc.).";
  $l_explain_mobile_phone="Sites related to GSM mobile (ringtones, logos, etc.)";
  $l_explain_ossi="Domain names and URLs you add to the blacklist (see below)";
  $l_explain_phishing="Phishing sites (traps banking, redirect, etc..)";
  $l_explain_press="News sites";
  $l_explain_publicite="Advertising sites";
  $l_explain_radio="Online radio podcast sites";
  $l_explain_reaffected="Sites that have changed ownership (and therefore content)";
  $l_explain_redirector="redirects, anonymization or bypass sites";
  $l_explain_remote_control="Sites for making remote control";
  $l_explain_sect="Sectarian sites";
  $l_explain_social_networks="Social networks sites";
  $l_explain_sexual_education="Sites related to sex education";
  $l_explain_shopping="Shopping sites and online shopping";
  $l_explain_sport="Sport sites";
  $l_explain_strict_redirector="Intentionally malformed URL";
  $l_explain_strong_redirector="Malformed URL in a 'google' query";
  $l_explain_tricheur="Sites related to cheating (tests, examinations, etc.)";
  $l_explain_webmail="Web sites for e-mail consultation";
  $l_explain_warez="Sites related to cracked softwares";
}
if (isset($_GET['cat'])){$categorie=$_GET['cat'];}
$bl_categorie_domain_file=$bl_dir.$categorie.".conf";
if (file_exists($bl_categorie_domain_file))
$nb_domains=exec ("wc -w $bl_categorie_domain_file|cut -d' ' -f1");
else
$nb_domains=$l_error_openfilei." ".$bl_categorie_domain_file;
if (file_exists($bl_categorie_url_file))
$nb_urls=exec ("wc -w $bl_categorie_url_file|cut -d' ' -f1");
else
$nb_urls=$l_error_openfile." ".$bl_categorie_url_file;
echo "<TITLE>$l_title</TITLE>";
?>
<link rel="stylesheet" href="/CTadmin/css/style.css" type="text/css">
</HEAD>
<body>
<TABLE width="100%" border="0" cellspacing="0" cellpadding="0">
<tr><th><?php echo $categorie ;?></th></tr>
<tr bgcolor="#FFCC66"><td><img src="/images/pix.gif" width="1" height="2"></td></tr>
</TABLE>
<TABLE width="100%" border=1 cellspacing=0 cellpadding=1>
<tr><td valign="middle" align="left">
<?php
$compat_categorie=strtr($categorie,"-","_");
if (!empty(${'l_explain_'.$compat_categorie}))
echo "<center><b>${'l_explain_'.$compat_categorie}</b></center>";
else echo "$l_unknown_cat";
echo "<br>$l_nb_domains <b>$nb_domains</b><br>";
?>
</td></tr>
</TABLE>
<br>
<center><a href="javascript:window.close();"><b><?php echo "$l_close"; ?></b></a></center>
</BODY>
</HTML>
</code>
 


[[Catégorie:Scripts]]
[[Catégorie:Logiciels Divers]]

Dernière version du 26 mars 2022 à 07:18

Petit rappel : Le contrôle parental ne doit pas se substituer aux coups d’œil et dialogues avec vos enfants de temps en temps mais apporte un plus.

Je vous propose donc de mettre en place un filtrage directement sur le pc a protéger, à l'aide de :

iptables+dnsmasq+dansguardian+privoxy (Pour le filtrage)

lighttpd (Pour la page de redirection et l'interface d'administration)


Les sources.

Toutes les sources sont sur le site officiel

Installation par le deb :

Téléchargez la dernière version deb correspondant à votre distribution sur https://gitlab.com/marsat/CTparental/-/releases .

il y a 2 branches encore actives du logiciel en fonction des paquets utilisés pour effectuer le filtrages, ce qui permet d’être plus modulable en fonction des machines et distributions utilisées. (à partir des versions versions 5.x.x)

- master = nftables (successeur d'iptables), dnscrypt-proxy (remplaçant dnsmasq), lighttpd ou nginx, privoxy et e2guardian ( successeur de dansguardian ).

- min = nftables = nftables (successeur d'iptables), dnscrypt-proxy (remplaçant dnsmasq), lighttpd ou nginx.

et 5 branches historique, non maintenu qui ce basé sur dnsmasq, dansguardian , iptables .(jusqu'aux versions 4.x.x)

- dnsmasq = nftables (successeur d'iptables), dnsmasq, lighttpd ou nginx, privoxy et e2guardian ( successeur de dansguardian ).

- dnsmasq_min = nftables = nftables (successeur d'iptables), dnsmasq, lighttpd ou nginx.

- iptables = iptables, ipset, dnsmasq, lighttpd ou nginx, privoxy et e2guardian ( successeur de dansguardian ).

- dansguardian = iptables, ipset, dnsmasq, lighttpd, privoxy et dansguardian.

- iptables_min = iptables, ipset,dnsmasq, lighttpd ou nginx.

exemple pour debian9 il y a 4 paquet possible. 2 paquet dérivé de la branche iptables avec lighttpd ou nginx et 2 autres dérivé de la branche iptables_min si l'on veut utiliser moins de ressources.

Pour ceux qui veulent tester en ipv6

c'est possible avec la dernière les version 4.20.x sous debian testing/sid ,
il faudra au préalable s’assurer que son fournisseur d'accès accepte bien l'ipv6 , ce qui n'est malheureusement pas mon cas.

l'ipv6 n'étant pas encore implémentée dans e2guardian , ctparental ne force pas le passage par celui-ci mais attaque directement privoxy.

Une désinstallation avec purge est nécessaire en cas de mise à jour d'une version antérieure.

 # apt-get remove --purge ctparental privoxy e2guardian dansguardian dnsmasq lighttpd
 $ wget -c https://gitlab.com/marsat/CTparental/uploads/d5567eb1a43ffde679193bce87be5f69/ctparental_debian10_lighttpd_4.44.18-1.0_all.deb

Pour tester le filtrage avec un utilisateur non filtré il suffit que celui-ci ajoute le proxy http et https suivant dans son navigateur.
http et https ::1 port 8888

Pour les utilisateurs filtrés c'est automatique, il n'y a rien à faire.

Nettoyage des versions précédentes :

si vous utilisé l'instance dnscrypt-proxy du deb pour vos connexions système il faut installer celui-ci de manière autonome via la commande ci dessous:

 # apt-get install dnscrypt-proxy

cela éviteras la surpression de dnscrypt-proxy durant la procédure de dés-installation de ctparental, et ainsi une perte de connexion système.

 # apt-get autoremove --purge  ctparental clamav-* privoxy lighttpd dansguardian dnsmasq nginx e2guardian
 # rm -rf /etc/CTparental

Installez le deb :

 # gdebi ctparental_*_all.deb

(J'utilise gdebit car cela évite le téléchargement et l'installation manuelle des dépendances.)

Important : Depuis la version 3.92 les paramètres proxy changent automatiquement au premier démarrage de la session, ce qui fait que c'est transparent pour l'utilisateur.
Si après avoir redémarré votre session vous avez encore des problèmes de connexion aux sites https tels que google.com, testez avant tout l'ajout du proxy suivant.
proxy http 127.0.0.1 sur port 8080
proxy https 127.0.0.1 sur port 8080

Pour les versions avant la 3.95-3

Il est conseillé d'ajouter tous les domaines de vos dépôts dans les domaines réhabilités cela peut éviter certaines erreurs quand on utilise su au lieu de su - avant des commandes apt-get aptitude …

Lancez cette ligne de commandes pour les connaître.

  $ cat /etc/apt/sources.list /etc/apt/sources.list.d/* 2>/dev/null | awk -F/ '/^deb/ {print $3}' | sort -u

Pour la version 3.95-3 et supérieure, après l'ajout d'un nouveau dépôt, il faut juste penser à lancer la commande suivante :

  # CTparental -ubl

Pour tester si ça fonctionne faire un ping à partir d'un compte filtré.

  $ su child -c "ping youporn.com"

child est à remplacer par le compte pour lequel vous voulez tester.

doit retourner quelque chose comme ça :

 PING youporn.com (127.0.0.10) 56(84) bytes of data.
 bytes from 127.0.0.10: icmp_req=1 ttl=64 time=0.026 ms

Si l'adresse IP est différente de 127.0.0.10 c'est que le filtrage ne fonctionne pas.

Pour l'aide tapez :

 # CTparental

sans aucun paramètre.

Configuration

Pour les versions 4.20.27 et supérieures on accède à l'interface d'administration par le lien web suivant: https://admin.ct.local

Pour les versions 4.20.26 on accède à l'interface d'administration par le lien web suivant: https://admin.ct.localhost

Pour les versions inférieure à 4.20.26 on accède à l'interface d'administration par le lien web suivant: http://127.0.0.1/CTadmin

Pour les versions 4.20.9 et supérieures dans le Choix des catégories à filtrer ajouter la catégorie ctparental
Pour les versions inférieures ajouter la liste ci dessous dans les Noms de domaine filtrés

Pour les utilisateurs des applications winehq et playonelinux en ctparental versions 4.20.11 et inférieures,
si le proxy système n'est pas pris en compte il faut le paramétrer via la base de registre de votre disque dur virtuel ou par le menu configuration de l’application qui a besoin d'accéder à internet.
Les versions 4.20.12 et supérieures ne sont pas affectées par ce problème.

Par exemple, pour Internet Explorer :

REGEDIT4

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]

"ProxyEnable"=dword:00000001

"ProxyServer"="http=127.0.0.1:8080;https=127.0.0.1:8080"

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap]

"AutoDetect"=dword:00000000

"IntranetName"=dword:00000001

"ProxyByPass"=dword:00000001