Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédenteProchaine révisionLes deux révisions suivantes | ||
python:acn-py-installer [2020/01/26 16:03] – [Lien] crust | python:acn-py-installer [2020/02/12 21:04] – [Installation et lancement du script] crust | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== Serveur de cache APT ====== | + | ====== Serveur de cache APT / cron-apt |
- | Script d'auto configuration d'un serveur de cache pour APT, côté serveur et client. | + | ===== Installation et lancement du script ===== |
+ | |||
+ | Télécharger la dernière version depuis le git (version stable et devel - de préférence prenez la stable) : | ||
+ | * [[https:// | ||
+ | |||
+ | ===== Utilités de ce script ===== | ||
+ | |||
+ | |||
+ | Script d'auto configuration d' | ||
+ | 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ésentes sur votre système. | ||
+ | Gestion de la configuration aussi bien niveau **installation client / serveur**. | ||
+ | |||
+ | Ce script peut être installé via un compte **root** | ||
+ | |||
+ | Utilité dans le cadre de la gestion d'un parc de PC. Un PC est défini comme **serveur** et sera le seul à utiliser la bande passante de l' | ||
+ | |||
+ | La mise à jour du cache se fera depuis le serveur, mais également dès l' | ||
// | // | ||
Ligne 9: | Ligne 25: | ||
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 | + | {{ : |
+ | |||
+ | |||
+ | ===== Les avantages d' | ||
+ | |||
+ | |||
+ | * apt-cacher-ng est un gain de temps | ||
+ | * apt-cacher-ng limite l' | ||
+ | * apt-cacher-ng permet d' | ||
+ | |||
+ | ===== Spéficités du script ===== | ||
+ | |||
+ | ==== Configuration, | ||
+ | |||
+ | Installation des paquets : | ||
+ | |||
+ | * apt-cacher-ng | ||
+ | * cron-apt | ||
+ | |||
+ | |||
+ | Lisez les messages du terminal, ils contiennent des données importantes : | ||
+ | |||
+ | <code bash> | ||
+ | Traitement des actions différées (« triggers ») pour man-db (2.9.0-2) ... | ||
+ | Traitement des actions différées (« triggers ») pour libc-bin (2.29-9) ... | ||
+ | ============================================== | ||
+ | Le serveur de cache est dès lors opérationnel | ||
+ | Le port d' | ||
+ | Page d' | ||
+ | Notez bien l'ip de votre serveur, elle vous sera indispensable pour la configuration des clients. | ||
+ | L'IP du serveur est : 192.168.0.20 | ||
+ | Indispensable : cette IP doit être FIXE (réglage sur votre BOX ou serveur DHCP). | ||
+ | Cette machine est un serveur, mettre de ne l' | ||
+ | ....................... | ||
+ | |||
+ | Dès lors, le système installera les mises à jour de sécurité, toutes les nuits à 4 heures. | ||
+ | .......................</ | ||
+ | |||
+ | Voir config** cron-apt** plus bas. | ||
+ | |||
+ | |||
+ | ==== Configuration, | ||
+ | __**Paquets installés**__ | ||
+ | |||
+ | * cron-apt | ||
+ | * python-nmap | ||
+ | |||
+ | Le script va scanner, depuis la reconnaissance de l'IP du PC, le réseau local à la recherche d'une machine dont le port spécifique à **Acn-cacher-ng** est ouvert (**port 3142** par défaut mais modifiable). | ||
+ | |||
+ | __**Fichier crée**__ | ||
+ | Un fichier de proxy apt pointant sur l'IP du serveur est créé à cet endroit avec ce contenu | ||
+ | |||
+ | <code bash> | ||
+ | Acquire:: | ||
+ | </ | ||
+ | |||
+ | __Le scan du réseau peut avoir à 3 solutions :__ | ||
+ | * Aucune machine n'est détecter. il faut revoir la configuration du serveur. | ||
+ | *Une seule machine est détectée : elle est proposée par défaut. | ||
+ | *Plusieurs machines sont détectée. Une Liste de choix est proposée. | ||
+ | |||
+ | A chaque niveau, des choix sont possibles (**modification des IP ou du port**) afin de mettre la jour la configuration en cas de modification des paramètres serveur. | ||
+ | |||
+ | <code bash> | ||
+ | Vous utilisez un système Debian (su pour administration). | ||
+ | Type d' | ||
+ | Installation de type client | ||
+ | Utiliser le port par défaut 3142 (recommandé) ?. [Oui / Non] Oui | ||
+ | Type d' | ||
+ | Installation de type client | ||
+ | ======================================== | ||
+ | Votre machine possède l'ip 192.168.0.20. | ||
+ | Le motif de scan sera donc : 192.168.0.0 | ||
+ | ---------------------------------------------------- | ||
+ | Host : 192.168.0.15 () | ||
+ | State : up | ||
+ | ---------------------------------------------------- | ||
+ | Host : 192.168.0.20 () | ||
+ | State : up | ||
+ | ---------------------------------------------------- | ||
+ | Host : 192.168.0.254 () | ||
+ | State : up | ||
+ | ======================================== | ||
+ | Résultats du scan réseau : (True si port Apt-cache-server trouvé. | ||
+ | 192.168.0.15 : Le port est fermé. Code d' | ||
+ | 192.168.0.15 | ||
+ | 192.168.0.20 : Le port 3142 est ouvert. Possibilié de serveur ACN. | ||
+ | 192.168.0.20 | ||
+ | 192.168.0.254 : Le port est fermé. Code d' | ||
+ | 192.168.0.254 | ||
+ | Serveur ACN possible : 192.168.0.20 | ||
+ | Valider ce choix ? (Oui / Non)</ | ||
+ | |||
+ | ==== cron-apt, configuration ==== | ||
+ | |||
+ | Le script automatise sa configuration, | ||
+ | |||
+ | **__Paquet installé__** | ||
+ | * **cron-apt** | ||
+ | |||
+ | **__Fichiers spécifiques créées__** | ||
+ | * **/ | ||
+ | |||
+ | Scanne des entrées du dossier contenant les repos de votre système. Récupère uniquement les entrées de " | ||
+ | |||
+ | Ce fichier commence par cette entête : | ||
+ | <code bash> | ||
+ | # Security Update. For Primtux Apt-cacher-ng. | ||
+ | deb http:// | ||
+ | * __**/ | ||
+ | |||
+ | Ce fichier contient les information de configuration pour utiliser avec cron-apt le fichier précédant. | ||
+ | |||
+ | <code bash># cat / | ||
+ | upgrade -y -o APT:: | ||
+ | OPTIONS=" | ||
+ | MAILTO=" | ||
+ | MAILON=" | ||
+ | |||
+ | Contrairement aux autres mises à jour qui ne sont que télécharger et dont l' | ||
+ | |||
+ | ==== Import de .deb dans acn-cacher-ng ==== | ||
+ | Faire pointer un navigateur sur le serveur avec le port d' | ||
+ | Ce sera un url de ce type : http:// | ||
+ | |||
+ | L'url correspondant à votre configuration est donné en retour d' | ||
+ | |||
+ | {{ : | ||
+ | |||
- | Mais préfèrable de suivre | + | ===== Le script ===== |
+ | Ci dessus | ||
+ | Mais préfèrable de suivre la version du GIT : [[https:// | ||
<code bash># | <code bash># | ||
# -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||
Ligne 19: | Ligne 166: | ||
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 176: | ||
__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 232: | ||
# 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 281: | ||
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 319: | ||
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 331: | ||
- | # =========================== | ||
- | # Lancement du script | ||
- | # ========================== | ||
def clientServeur(): | def clientServeur(): | ||
- | """ | + | """ |
- | Retourne une variable string | + | |
- | """ | + | : |
+ | """ | ||
while True: | while True: | ||
try: | try: | ||
Ligne 144: | Ligne 349: | ||
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() | ||
</ | </ | ||
+ | |||
===== Liens ===== | ===== Liens ===== |