<commit_before>#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Per ogni Lug indicato nella LugMap effettuo un insieme di controlli di validità.
   Se qualcosa non torna, avverto chi di dovere"""

if True: # import dei moduli
	try: # quelli builtin
		import ConfigParser
		import csv
		import datetime
		import glob
		import multiprocessing
		import os
		import random
		import re
		import shelve
		import shlex
		import subprocess
		import socket
		import sys
		import time
	except:
		import sys
		print "Errore nell'import dei moduli standard. Versione troppo vecchia dell'interprete?"
		sys.exit(-1)

def controllo_dominio_dns(url):
	"""Ricevo un URL, estraggo il dominio, torno True se tutto torna. Diversamente emetto il messaggio da segnalare"""
	
	global archivio, url_completo

	url = url.split('/')[2] # estraggo solo il nome di dominio	# TODO: una regexp sarebbe più elegante

	try:
		info_url = socket.getaddrinfo(url, 80, 0, 0, socket.SOL_TCP)
	except:
		return "Errore: problema sul dominio (esistenza/mappatura)"

	IP_nuovo = info_url[0][4][0] # Inizio controllo IP cambiato. Possono esserci dei falsi positivi in caso di round robin.
	
	try: # Pesco il vecchio iP
		IP_vecchi = archivio[url_completo]['IP']
	except: # Non esiste ancora una voce relativa, la creiamo
		archivio[url_completo] = {'IP': set([IP_nuovo])}
		return True

	if IP_nuovo in IP_vecchi: # se è gia' presente, me ne fotto
		return True
	else: # diversamente segnalo e aggiungo
		archivio[url_completo]['IP'].add(IP_nuovo)
		return 'Errore: cambiato IP del server (Vecchio: %s, Nuovo: %s)' % (IP_vecchi, IP_nuovo)

def controllo_whois(url):
	"""Ricevo un URL, estraggo il dominio, torno True/False in caso di cambiamento del whois"""
	pass

def richiedi_controllo(errore):
	"""Ricevo un errore, e invio una mail di richiesta di controllo"""
	
	global riga
	
	print errore, riga

if __name__ == "__main__":
	#TODO: portare come demone
	#      mettere segnalazioni
	#      mettere parser per config
	#      scrivere test whois
	#      scrivere test contenuto
	
	# La struttura dell'archivio è:
	# dizionario archivio[url_completo come chiave]:
	#												dizionario ['IP'] = Set degli IP
	archivio = shelve.open(os.path.join(os.environ["HOME"], '.spazzino.db'), writeback=True) # Apro il db persistente
	
	for filedb in glob.glob( os.path.join('./db/', '*.txt') ): # piglio ogni file db
		for riga in csv.reader(open(filedb, "r"), delimiter='|', quoting=csv.QUOTE_NONE): # e per ogni riga/Lug indicato
			url_completo = riga[3]
			
			risultato = controllo_dominio_dns(url_completo) # inizio il ciclo di controlli
			if risultato is not True:
				richiedi_controllo(risultato)

	archivio.sync()
	archivio.close<commit_msg>Prototipo funzionante.<commit_after>#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Per ogni Lug indicato nella LugMap effettuo un insieme di controlli di validità.
   Se qualcosa non torna, avverto chi di dovere"""

if True: # import dei moduli
	try:
		import ConfigParser, csv, glob, os, shelve, socket, subprocess, sys, syslog, urllib
	except:
		import sys
		print "Errore nell'import dei moduli standard. Versione troppo vecchia dell'interprete?"
		sys.exit(-1)

def controllo_dominio_dns(url):
	"""Ricevo un URL, estraggo il dominio, torno True se tutto torna. Diversamente emetto il messaggio da segnalare"""
	
	global archivio, url_completo

	url = url.split('/')[2] # estraggo solo il nome di dominio	# TODO: una regexp sarebbe più elegante

	try:
		info_url = socket.getaddrinfo(url, 80, 0, 0, socket.SOL_TCP)
	except:
		return "Errore: problema sul dominio (esistenza/mappatura)"

	IP_nuovo = info_url[0][4][0] # Inizio controllo IP cambiato. Possono esserci dei falsi positivi in caso di round robin.

	try: # Pesco il vecchio iP
		IP_vecchi = archivio[url_completo]['IP']
	except: # Non esiste ancora una voce relativa, la creiamo
		archivio[url_completo] = {'IP': set([IP_nuovo])}
		return True

	if IP_nuovo in IP_vecchi: # se è gia' presente, me ne fotto
		return True
	else: # diversamente segnalo e aggiungo
		archivio[url_completo]['IP'].add(IP_nuovo)
		return 'Errore: cambiato IP del server (Vecchio: %s, Nuovo: %s)' % (IP_vecchi, IP_nuovo)

def controllo_contenuto(url):
	"""Ricevo un URL, estraggo la pagina, ne valuto la differenza rispetto alla lettura precedente. Torno True se tutto a posto."""
	
	global archivio, url_completo
	
	try: # pesco la pagina
		pagina_html = urllib.urlopen(url_completo).read()
	except:
		return 'Errore: impossibile leggere la pagina html.'
	
	Termini_Attuali = set(pagina_html.split()) # Estrapolo subito i termini presenti
	
	try: # Leggo i termini precedenti
		Termini_Precedenti = archivio[url_completo]['TerminiPrecedenti']
	except: # Non esiste la voce, la creo
		archivio[url_completo]['TerminiPrecedenti'] = Termini_Attuali
		return True
	
	valore_magico = float(len(Termini_Precedenti.intersection(Termini_Attuali))*1.0/len(Termini_Precedenti.union(Termini_Attuali)))
	archivio[url_completo] = {'TerminiPrecedenti': Termini_Attuali}

	if valore_magico <= 0.8:
		return 'Errore: troppa differenza di contenuto:'+str(valore_magico)
	else:
		return True
	
def richiedi_controllo(errore):
	"""Ricevo un errore, e invio una mail di richiesta di controllo"""
	
	email_alert = '<EMAIL>'
	
	if os.path.exists('/usr/bin/mail'):
		echo_command = shlex.split("echo '"+'\n'.join(list(errore)+riga)+"'")
		mail_command = shlex.split("mail -s 'LugMap check: %s' %s" % (riga[3], email_alert))
		subprocess.Popen(mail_command, stdin=subprocess.Popen(echo_command, stdout=subprocess.PIPE).stdout, stdout=subprocess.PIPE).wait()

	print errore, riga[3]
	syslog.syslog(syslog.LOG_ERR, 'Spazzino: '+riga[3]+' '+errore)

if __name__ == "__main__":
	#TODO: portare come demone
	#      mettere parser per config	
	# La struttura dell'archivio è:
	# dizionario archivio[url_completo come chiave]: dizionario
	#															['IP'] = Set degli IP
	#															['TerminiPrecedenti'] = Set dei Termini delle pagine HTML

	archivio = shelve.open(os.path.join(os.environ["HOME"], '.spazzino.db'), writeback=True) # Apro il db persistente
	
	for filedb in glob.glob( os.path.join('./db/', '*.txt') ): # piglio ogni file db
		for riga in csv.reader(open(filedb, "r"), delimiter='|', quoting=csv.QUOTE_NONE): # e per ogni riga/Lug indicato
			url_completo = riga[3]
			
			responso = controllo_dominio_dns(url_completo) # inizio il ciclo di controlli
			if responso is not True:
				richiedi_controllo(responso)

			responso = controllo_contenuto(url_completo)
			if responso is not True:
				richiedi_controllo(responso)
				
	archivio.sync()
	archivio.close()
{'fraction_non_alphanumeric': 0.10852126532465567, 'fraction_numerical': 0.00438928409262903, 'mean_word_length': 4.411957411957412, 'pattern_counts': {'":': 2, '<': 5, '<?xml version=': 0, '>': 4, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '703850', 'n_tokens_mistral': 2658, 'n_tokens_neox': 2438, 'n_words': 688}