Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédenteProchaine révisionLes deux révisions suivantes | ||
python:acn-py-installer [2020/01/26 16:03] – créée crust | python:acn-py-installer [2020/02/08 18:50] – crust | ||
---|---|---|---|
Ligne 3: | Ligne 3: | ||
Script d'auto configuration d'un serveur de cache pour APT, côté serveur et client. | Script d'auto configuration d'un serveur de cache pour APT, côté serveur et client. | ||
+ | Installation d'un cron-apt récupérant les mises à jour la nuit et installant automatiquement les mises à jour de sécurité des repo. présent sur votre système. | ||
+ | Gestion de la configuration d' | ||
// | // | ||
Ligne 9: | Ligne 11: | ||
Le principe est qu'une machine centrale héberge le mandataire pour un réseau local. Les clients règlent leur configuration d'APT pour télécharger sur cette machine. Apt-Cacher NG conserve une copie de toutes les données utiles transitant à travers lui et, quand une requête similaire est faite, la copie en cache des données est délivrée sans être téléchargée à nouveau.// | Le principe est qu'une machine centrale héberge le mandataire pour un réseau local. Les clients règlent leur configuration d'APT pour télécharger sur cette machine. Apt-Cacher NG conserve une copie de toutes les données utiles transitant à travers lui et, quand une requête similaire est faite, la copie en cache des données est délivrée sans être téléchargée à nouveau.// | ||
- | Ci dessus la version 0.1.0 | + | {{ : |
- | Mais préfèrable de suivre la version du GIT : https:// | ||
+ | ====== Les avantages d' | ||
+ | |||
+ | |||
+ | * apt-cacher-ng est un gain de temps | ||
+ | * apt-cacher-ng limite l' | ||
+ | * apt-cacher-ng permet d' | ||
+ | |||
+ | |||
+ | |||
+ | Ci dessus la version 2.0.0 | ||
+ | |||
+ | Mais préfèrable de suivre la version du GIT : [[https:// | ||
<code bash># | <code bash># | ||
# -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||
Ligne 19: | Ligne 32: | ||
apt-cacher-ng soit en tant que serveur (ajout du paquet sur le système | apt-cacher-ng soit en tant que serveur (ajout du paquet sur le système | ||
soit en tant que client (cration d'un fichier de proxy apt) | soit en tant que client (cration d'un fichier de proxy apt) | ||
+ | Possibilité pour les clients de choisir le port d' | ||
+ | Installation de cron-apt avec configuration spécifique | ||
+ | pour installation automatique des mises à jour de sécurité des repo | ||
+ | présents sur le système | ||
""" | """ | ||
Ligne 25: | Ligne 42: | ||
__credits__ = " | __credits__ = " | ||
__license__ = " | __license__ = " | ||
- | __version__ = "0.1.2" | + | __version__ = "2.0.0" |
- | __date__ = "2020/01/26" | + | __date__ = "2020/02/05" |
__maintainer__ = " | __maintainer__ = " | ||
__email__ = " | __email__ = " | ||
__status__ = " | __status__ = " | ||
- | import os, re, sys | + | import os, re, sys, platform |
- | import | + | import |
+ | |||
def baseDebian(): | def baseDebian(): | ||
- | """ | + | """ |
- | Ou DEBIAN ou UBUNTU pour savoir si on utilise su ou sudo | + | |
- | Retourne une variable de type string (admin) | + | Ou DEBIAN ou UBUNTU pour savoir si on utilise su ou sudo |
+ | Retourne une variable de type string (admin) | ||
+ | :return: admin soit ' | ||
""" | """ | ||
# Ubuntu ou DEBIAN | # Ubuntu ou DEBIAN | ||
if ' | if ' | ||
# Si DEBIAN, verif si root lance le script | # Si DEBIAN, verif si root lance le script | ||
- | | + | print(' |
- | | + | |
if not os.geteuid() == 0: | if not os.geteuid() == 0: | ||
- | sys.exit(" | + | sys.exit(" |
+ | distrib = ' | ||
else: | else: | ||
- | print(' | + | |
- | | + | print(" |
- | return | + | sys.exit(" |
+ | | ||
+ | | ||
+ | return | ||
- | + | def installPackage(package, debianUbuntu): | |
- | def installServeur(): | + | """ |
- | """ | + | |
- | | + | |
- | | + | |
- | + | | |
- | | + | |
- | | + | retval = subprocess.call(['which', package]) |
- | retval = subprocess.call(["which", " | + | |
if retval != 0: | if retval != 0: | ||
- | print(" | + | print(" |
# Paramètres de l' | # Paramètres de l' | ||
- | cmdInstall = [' | + | cmdInstall = [' |
cmdUpdate = [' | cmdUpdate = [' | ||
- | # Debian, Ubuntu | ||
- | admin = baseDebian() | ||
# Adaptation système Ubuntu | # Adaptation système Ubuntu | ||
- | if admin == 'sudo': | + | if debianUbuntu |
cmdInstall.insert(0, | cmdInstall.insert(0, | ||
cmdUpdate.insert(0, | cmdUpdate.insert(0, | ||
Ligne 77: | Ligne 98: | ||
# On installe le paquet | # On installe le paquet | ||
subprocess.run(cmdInstall) | subprocess.run(cmdInstall) | ||
- | subprocess.run(cmdUpdate) | + | |
else: | else: | ||
- | print(' | + | print(' |
- | | + | |
+ | return None | ||
+ | |||
+ | def installServeur(ip, port, | ||
+ | """ | ||
+ | Fonction installant le serveur de cache apt-cacher-ng | ||
+ | :param ip: IP du Serveur | ||
+ | :param port: interger port ACN | ||
+ | :param distrib: Ubuntu ou Debian | ||
+ | :return: None | ||
+ | """ | ||
+ | |||
+ | # Installation du serveur | ||
+ | installPackage(' | ||
# Affichage Informations | # Affichage Informations | ||
print(" | print(" | ||
print(" | print(" | ||
- | print(" | + | print(" |
- | print(" | + | print(" |
print(" | print(" | ||
- | print(" | + | print(" |
print(" | print(" | ||
+ | print(" | ||
+ | return None | ||
- | def installClient(ip): | + | |
- | """ | + | def installClient(ipServeur, |
- | Créer un fichier dans / | + | |
""" | """ | ||
- | | + | |
- | # Reste à insérer l'ip et à le coller au bo n endroit | + | Créer un fichier dans / |
- | msgApt = ' | + | :param ipServeur: |
+ | :param portACN: port d' | ||
+ | :return: None | ||
+ | | ||
+ | |||
+ | # COnfig IP serveur dans un fichier de proxy APT | ||
+ | msgApt = ' | ||
+ | print(msgApt) | ||
dirInstall = '/ | dirInstall = '/ | ||
fileName = ' | fileName = ' | ||
Ligne 105: | Ligne 147: | ||
fichier.write(msgApt) | fichier.write(msgApt) | ||
fichier.close() | fichier.close() | ||
+ | return None | ||
+ | |||
+ | |||
+ | |||
+ | def portSelection(portACN): | ||
+ | while True: | ||
+ | try: | ||
+ | portDefault = input(" | ||
+ | if portDefault.lower() == ' | ||
+ | print(' | ||
+ | break | ||
+ | |||
+ | elif portDefault.lower() == ' | ||
+ | try: | ||
+ | portSelect = int(input(" | ||
+ | if -1 < portSelect < 65536: | ||
+ | print(" | ||
+ | portACN = portSelect | ||
+ | break | ||
+ | except ValueError: | ||
+ | print(" | ||
+ | except ValueError: | ||
+ | print(" | ||
+ | print(" | ||
def ipRecuperation(): | def ipRecuperation(): | ||
- | """ | + | """ |
+ | | ||
+ | :return: l'ip de la machine lançant ce script | ||
+ | | ||
s = socket.socket(socket.AF_INET, | s = socket.socket(socket.AF_INET, | ||
s.setsockopt(socket.SOL_SOCKET, | s.setsockopt(socket.SOL_SOCKET, | ||
Ligne 116: | Ligne 185: | ||
def ipTest(ip): | def ipTest(ip): | ||
- | """ | + | """ |
+ | | ||
+ | :param ip: ip à tester | ||
+ | :return: True si IP valide, False sinon | ||
+ | | ||
reg = r" | reg = r" | ||
if re.match(reg, | if re.match(reg, | ||
Ligne 124: | Ligne 197: | ||
- | # =========================== | ||
- | # Lancement du script | ||
- | # ========================== | ||
def clientServeur(): | def clientServeur(): | ||
- | """ | + | """ |
- | Retourne une variable string | + | |
- | """ | + | : |
+ | """ | ||
while True: | while True: | ||
try: | try: | ||
Ligne 144: | Ligne 215: | ||
return choixInstall | return choixInstall | ||
+ | def portStatus(ip, | ||
+ | """ | ||
+ | Fonction de scanne d'un port d'une machine en fonction de son IP | ||
+ | :param ip: IP de la machine à scanner | ||
+ | :param port: port à scanner | ||
+ | :return: Retourne True si port ouvert ou False si port fermé | ||
+ | """ | ||
- | # Procédure | + | sock = socket.socket(socket.AF_INET, |
- | choixInstall | + | sock.settimeout(1) |
- | if choixInstall.lower() == ' | + | result = sock.connect_ex((ip, |
- | | + | if result == 0: |
- | else: | + | message = str(ip) + ' : Le port ' + str(port) + ' est ouvert. Possibilié de serveur ACN.' |
- | # Installation client | + | print(message) |
- | while True: | + | return True |
- | try: | + | else: |
- | ipServeur = input(" | + | message = str(ip) + ' : Le port est fermé. Code d\'erreur de retour; ' + str(result) |
- | if ipTest(ipServeur) is True: | + | message += '. Pas de serveur ACN' |
- | break | + | print(message) |
- | except ValueError: | + | return False |
- | print(" | + | |
- | installClient(ipServeur) | + | def chercherServeurACN(ip, |
+ | """ | ||
+ | Fonction recherchant | ||
+ | :param ip: IP du client lançant le scan, permet de trouver un motif réseau | ||
+ | :param port: port à scanner (port ACN) | ||
+ | :return: retourne une liste contenant les IP possibles des machines ayant port spécifié ouvert | ||
+ | """ | ||
+ | ipModele = '' | ||
+ | listeHosts = [] | ||
+ | ipServeurACN = [] | ||
+ | |||
+ | |||
+ | # Création d'un motif pour le scan reseau | ||
+ | ipSplit = ip.split(' | ||
+ | for i in range (0,3): | ||
+ | ipModele += ipSplit[i] + ' | ||
+ | ipModele += ' | ||
+ | |||
+ | # debug | ||
+ | print(' | ||
+ | print(' | ||
+ | |||
+ | # Scan reseau à la recherche de clients | ||
+ | nm = nmap.PortScanner() # instantiate nmap.PortScanner object | ||
+ | nm.scan(hosts=ipModele+'/ | ||
+ | for host in nm.all_hosts(): | ||
+ | print(' | ||
+ | print(' | ||
+ | print(' | ||
+ | # Creation d'un mappage reseau | ||
+ | listeHosts.append(host) | ||
+ | |||
+ | # Sca, port ACN des clients | ||
+ | print(' | ||
+ | print(' | ||
+ | # Pour chacune des machines du réseau, on teste le port d'ACN (par defaut 3142 | ||
+ | for i in listeHosts: | ||
+ | testPort = portStatus(i, | ||
+ | # Si réponse True, c'est le serveur | ||
+ | if testPort == True: | ||
+ | ipServeurACN.append(i) | ||
+ | message = ' | ||
+ | else: | ||
+ | message = 'Pas de port ACN ouvert' | ||
+ | print(i, ' : ', testPort, '. ', message) | ||
+ | |||
+ | return ipServeurACN | ||
+ | |||
+ | def validerIpServeurACN(listIp): | ||
+ | """ | ||
+ | Fonction recupérant la liste des machines susceptibles d' | ||
+ | Teste de cette liste pour valider ces IP ou les infirmer | ||
+ | :param listIp: liste contenant les IP des machines écoutant le port ACN | ||
+ | :return: IP de la machine sélectionnée comme serveur ACN | ||
+ | """ | ||
+ | if len(listIp) == 0: | ||
+ | sys.exit(' | ||
+ | ' | ||
+ | ' | ||
+ | elif len(listIp) | ||
+ | print(' | ||
+ | while True: | ||
+ | try: | ||
+ | ouiNon = input(" | ||
+ | | ||
+ | print(' | ||
+ | ipServeur = listIp[0] | ||
+ | break | ||
+ | elif ouiNon.lower() == 'non': | ||
+ | | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | | ||
+ | print(" | ||
+ | # Valider l'ip unique | ||
+ | | ||
+ | print(' | ||
+ | print(' | ||
+ | for i in enumerate(listIp): | ||
+ | print(' | ||
+ | | ||
+ | while True: | ||
+ | try: | ||
+ | ipServeur = input(" | ||
+ | if ipTest(ipServeur) is True and ipServeur in listIp: | ||
+ | break | ||
+ | except ValueError: | ||
+ | print(" | ||
+ | | ||
+ | |||
+ | |||
+ | def installCronApt(distrib): | ||
+ | """ | ||
+ | Fonction Recuperation des entrées des mises à jour de sécurité dans | ||
+ | dans les divers sources.list possibles | ||
+ | Et création d'un sources.list basé que sur ces entrées (security) | ||
+ | Le fichier est propre à primtux. Donc si existe, on le régénère sinon on le crée | ||
+ | Et envoi mail sur root | ||
+ | :param distrib: Ubuntu ou Debian | ||
+ | :return: None | ||
+ | """ | ||
+ | |||
+ | mailRoot = ' | ||
+ | aptSecurity = "find /etc/apt -type f -name ' | ||
+ | "| xargs cat " \ | ||
+ | " | ||
+ | |||
+ | # Installation de cron-apt | ||
+ | installPackage(' | ||
+ | |||
+ | # Création sources.list spécial sécurité | ||
+ | log = open('/ | ||
+ | log.write('# | ||
+ | log.flush() | ||
+ | c = subprocess.call(aptSecurity, | ||
+ | |||
+ | # Configuration d'une action dans la conf de cron-apt | ||
+ | # / | ||
+ | fichier = open('/ | ||
+ | fichier.write(" | ||
+ | fichier.write(" | ||
+ | " | ||
+ | "-o Dir:: | ||
+ | fichier.write(" | ||
+ | fichier.write(" | ||
+ | fichier.close() | ||
+ | |||
+ | print(" | ||
+ | |||
+ | return None | ||
+ | |||
+ | |||
+ | |||
+ | def main(): | ||
+ | """ | ||
+ | Lancement du script | ||
+ | :return: None | ||
+ | """ | ||
+ | # Défnition du port par defaut d' | ||
+ | portACN = 3142 | ||
+ | # Recupere le type de distribution faisant tourner le script | ||
+ | distrib | ||
+ | |||
+ | choixInstall = clientServeur() | ||
+ | if choixInstall.lower() == ' | ||
+ | ipServeur = ipRecuperation() | ||
+ | installServeur(ipServeur, | ||
+ | else: | ||
+ | # Installation client | ||
+ | portSelection(portACN) | ||
+ | ip = ipRecuperation() | ||
+ | ipServeur = chercherServeurACN(ip, | ||
+ | ipServeur = validerIpServeurACN(ipServeur) | ||
+ | | ||
+ | |||
+ | # Que ce sont pour l'un ou l' | ||
+ | installCronApt(distrib) | ||
+ | return None | ||
+ | |||
+ | """ | ||
+ | | ||
+ | """ | ||
+ | if __name__ == " | ||
+ | # execute only if run as a script | ||
+ | main() | ||
</ | </ | ||
- | ===== Lien ===== | + | |
+ | ===== Liens ===== | ||
*[[https:// | *[[https:// | ||
*[[https:// | *[[https:// | ||