#!/usr/bin/env python
#-*- coding:utf-8 -*-


### AUTHOR & INFOS ###
# Questo piccolo script Python è stato creato da
#		Riccardo, Benito Desantis a.k.a. FT
# Fatene quello che vi pare, è rilasciato sotto GPL.


### CONFIGURATION ###

# Percorso completo al file sources.list di sistema.
#
# Predefinito:
#
# sourcespath = "/etc/apt/sources.list"

sourcespath = "/etc/apt/sources.list"

# Lista di server dai quali repository non si deve controllare.
#
# Predefinito:
#
# badservers = ['ubuntu.com', 'canonical.com']

badservers = ['ubuntu.com', 'canonical.com']

# stop editing here #

distros = {'jaunty': 1, 'intrepid': 2, 'hardy': 3, 'gutsy': 4, 'feisty': 5}

import os, urllib

def os_version():
	"""
		Restituisce la versione del sistema operativo installata.
	"""
	c = "lsb_release -c"
	return os.popen(c, "r").read().split()[1]

def priority(name):
	"""
		Riporta la priorità dell'o.s. noto il nome.
	"""
	for i in range(len(distros)):
		if distros[i] == name:
			return i
def distro_name(priority):
	for d in distros:
		if distros[d] == priority:
			return d
	return priority
	

class repository(object):
	"""
		Rappresenta un "deposito di file", o repository, generico,
		con indirizzo, distribuzione in uso, informazione se il
		deposito è di sorgenti o meno.
	"""
	def __init__(self, url, dist, src = False):
		self.url = url
		i = url.find("mirror://")
		if i != -1:
			self.url = "http://%s" % url[i+len("mirror://"):]
		self.dist = dist
		self.src = src
		self.dists = None
		self.lastavailable = None
	def dist_available(self):
		"""
			Ricava le versioni di s.o. supportate dal repository che l'oggetto
			rappresenta. 
		"""
		if self.dists != None:
			return self.dists
		dists = []
		# mi collego al server per recuperare le distribuzioni disponibili
		
		html = self.gethtml()
		# print html
		
		x = self.getallbw(html, "href=\"", "\"")
		
		for s in x:
			if s[0] != "/" and s[-1:] == "/":
				dists.append(s[:-1])
		
		self.dists = dists
		return self.dists
	def gethtml(self):
		"""
			Ricava il codice HTML della pagina web associata alla cartella
			"dists" del repository.
		"""
		x = urllib.urlopen("%s/dists/" % self.url)
		html = x.read()
		x.close()
		return html
	def getallbw(self, html, sfrom, sto):
		"""
			Restituisce tutto ciò che è contenuto tra "sfrom" e "sto" nel
			codice HTML "html".
		"""
		t = []
		da = html
		
		init = da.find(sfrom)
		linit = len(sfrom)
		end = da[init+linit:].find(sto)
		lend = len(sto)
		
		while init != -1:
			x = da[init+linit : init+end+linit]
			t.append(x)
			
			da = da[init+end+linit+lend :]
			init = da.find(sfrom)
			linit = len(sfrom)
			end = da[init+linit :].find(sto)
			lend = len(sto)
		return t
	def check_distro(self):
		"""
			Dopo aver ricavato l'informazione sulla versione
			attuale del sistema operativo, controlla prima di
			tutto se quella del repository che si sta usando è
			la stessa, e se non è così cerca di veder se tra
			le disponibili vi è anche quella di sistema.
		"""
		# os = os_version() # ricava la versione attuale del s.o.
		if self.dist == os:
			return 0
		prioritaattuale = distros[self.dist]
		minprioritadisp = 99
		for d in self.dist_available():
			if d in distros and distros[d] < 99:
				minprioritadisp = distros[d]
		if prioritaattuale > minprioritadisp:
			self.lastavailable = distro_name(minprioritadisp)
			print "- %s: %s" % (self.url, self.lastavailable)
		#if os in self.dist_available():
			return 1
		return -1
		

def get_using_repositories():
	"""
		Legge dal file sources.list specificato la lista di repository
		da controllare (cioè tutti quelli non ufficiali), restituendola al chiamante.
	"""
	f = open(sourcespath)
	repos = []

	for line in f:
		if line[0] == "#":
			if line.find("deb ") == -1:
				continue
			else:
				line = line[1:]
		goodserver = True
		for s in badservers:
			if line.find(s) > -1:
				goodserver = False
				break
		if not goodserver:
			continue
		if len(line.strip()) > 1:
			spline = line.split()
			if spline[2] not in distros:
				# print spline[2]
				continue
			src = False
			if spline[0] == "deb-src":
				src = True
			r = repository(spline[1], spline[2], src)
			repos.append(r)
	
	return repos

if __name__ == "__main__":
	print "Controllo se ci sono nuove versioni di repositories..."
	distros[os_version()] = 0
	repos = get_using_repositories()
	trovati = False
	for x in repos:
		x.check_distro()
		if x.lastavailable != None:
			trovati = True
	print "Arrivederci!"