#!/usr/bin/env python
# -*- coding: UTF8 -*-
# Copyright (C) 2004 by
#   Francisco Moreno Llorca
#   http://www.assamita.net
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

# Python module versiones.py v1.0

import httplib
import ftplib

nvidia_grafica = ['Linux IA32','Linux IA64','Linux AMD64/EM64T','FreeBSD x86','Solaris x64/x86',]
nforce = ['Linux IA32 Drivers','Linux AMD64/EM64T Drivers']
xorgs = []
kdes = []
firefoxs = []
gnomes = [] 
linuxs = []
linuxt = []
openoffices = []

def nvidia_g():
    h1 = httplib.HTTPConnection('www.nvidia.com')
    h1.request("GET",'/object/unix.html')
    salida = h1.getresponse()
    pagina =  salida.read()
    lista = []
    #for a in nvidia_grafica:
    #indice = pagina.find(a)
    indice= pagina.find('linux_display_ia32_')
    lista.append(pagina[indice+19:indice+19+11].split("h")[0][:-1])
    h1.close()
    return lista
    
def nvidia_nforce():
    h1 = httplib.HTTPConnection('www.nvidia.com')
    h1.request("GET",'/object/unix.html')
    salida = h1.getresponse()
    pagina =  salida.read()
    lista = []
    for a in nforce:
        indice = pagina.find(a)
        indice2= pagina[indice:indice+120].find('</A>')
        lista.append(pagina[indice+indice2-8:indice+indice2])
    h1.close()
    return lista
    
def ati():
    h1 = httplib.HTTPConnection('ati.amd.com')  #http://www.ati.com/online/rss/atilinuxdriver.rss?OTC-rssfeedlinux
    h1.request("GET",'/support/drivers/linux/linux-radeon.html')
    salida = h1.getresponse()
    salida2 =  salida.read()
    pagina = salida2.split('\n')
    h1.close()
    for a in pagina:
        indice = a.find("drivers/linux/ati-driver-installer")
        indice2 = a.find("x86",indice)
        if indice != -1:
            return a[indice+35:indice2].strip("-")
        
def wine():
    h1 = httplib.HTTPConnection('www.winehq.org')  
    h1.request("GET",'/')
    salida = h1.getresponse()
    salida2 =  salida.read()
    pagina = salida2.split('\n')
    h1.close()
    anterior = ""
    for a in pagina:
        indice = a.find('<a href="?announce=')
        if indice != -1 and anterior.find("Stable") != -1:
            return a.strip().split('=')[2][:a.strip().split('=')[2].find('">')]
        anterior = a
    
def callback_linux(cadena):
    if cadena.find('linux-2.6.') != -1:
        if cadena.find('bz2') != -1 and cadena.find('sign') == -1:
            linuxs.append(cadena.split()[8])
      
def linux_26():
    ftp = ftplib.FTP('ftp.rediris.es')
    ftp.login()               # user anonymous, passwd anonymous@
    #ftp.retrlines('LIST')     # list directory contents
    salida = ftp.sendcmd('cwd /mirror/kernel/linux/kernel/v2.6/')
    salida = ftp.retrlines('list',callback_linux)
    
    ftp.close()
    #se da pos supuesto que es 2.6
    ver = 0   #con el split del . el 2
    ver_s = 0 #con el split del . el 3, comprobar que es digito
    
    for a in linuxs:
        if ver < int(a.split('.')[2]):
            ver = int(a.split('.')[2])
            if a.split('.')[3][0:1] != 't':
                ver_s = int(a.split('.')[3])
            else:
                ver_s = 'no'
        elif ver == int(a.split('.')[2]):
            if a.split('.')[3][0:1] != 't' and ver_s < int(a.split('.')[3]):
                ver_s = int(a.split('.')[3])

    if ver_s == 'no':
        return '2.6.'+str(ver)
    else:
        return '2.6.'+str(ver) +'.'+ str(ver_s)

def callback_linux_t(cadena):
    if cadena.find('linux-2.6.') != -1:
        if cadena.find('bz2') != -1 and cadena.find('sign') == -1:
            linuxt.append(cadena.split()[8])

def linux_testing():
    ftp = ftplib.FTP('ftp.rediris.es')
    ftp.login()               # user anonymous, passwd anonymous@
    #ftp.retrlines('LIST')     # list directory contents
    salida = ftp.sendcmd('cwd /mirror/kernel/linux/kernel/v2.6/testing/')
    salida = ftp.retrlines('list',callback_linux_t)
    
    ftp.close()
    #se da pos supuesto que es 2.6
    ver = 0   #con el split del . el 2
    ver_s = '0-rc0' #con el split del . el 3, comprobar que es digito
    
    for a in linuxt:

        if ver <= int(a.split('.')[2].split('-')[0]):
            ver = int(a.split('.')[2].split('-')[0])
            if a.split('-')[2][0:1] == 'r' and ver_s < a.split('.')[2]:                
                ver_s = a.split('.')[2]
    return '2.6.'+ str(ver_s)
    
def callback(cadena):
    if cadena.find('X11R') != -1 and cadena.find('->') == -1:
        xorgs.append(cadena.split()[8][4:])
        
def xorg():
    ftp = ftplib.FTP('ftp.cica.es')
    ftp.login()               # user anonymous, passwd anonymous@
    #ftp.retrlines('LIST')     # list directory contents
    salida = ftp.sendcmd('cwd /pub/X/pub/')
    salida = ftp.retrlines('list',callback)
    
    ftp.close()
    return compareVersion(xorgs)
    
def callback_kde(cadena):
    version = cadena.split()[8]
    try:
        if range(2,9).count(int(version[0])) >= 1:
            kdes.append(version)
    except:
        return 0
        
def kde():
    ftp = ftplib.FTP('ftp.kde.org')
    ftp.login()               # user anonymous, passwd anonymous@
    salida = ftp.sendcmd('cwd /pub/kde/stable')
    salida = ftp.retrlines('list',callback_kde)
    
    ftp.close()
    return compareVersion(kdes)

def callback_firefox(cadena):
    version = cadena.split()[8]
    try:
        if range(0,9).count(int(version[0])) >=1 and version.find('rc')  == -1 and version.find('b')  == -1:
            firefoxs.append(version)
    except:
        return 0
        
def firefox():
    ftp = ftplib.FTP('ftp.mozilla.org')
    ftp.login()               # user anonymous, passwd anonymous@
    salida = ftp.sendcmd('cwd /pub/mozilla.org/firefox/releases/')
    salida = ftp.retrlines('list',callback_firefox)
    ftp.close()
    return compareVersion(firefoxs)

def callback_gnome(cadena):
    gnomes.append(cadena.split()[8])

        
def gnome():
    ftp = ftplib.FTP('sunsite.uio.no')
    ftp.login()               # user anonymous, passwd anonymous@
    salida = ftp.sendcmd('cwd /pub/GNOME/platform/')
    salida = ftp.retrlines('list',callback_gnome)
    ftp.close()
    return compareVersion(gnomes)

def callback_openoffice(cadena):
    if cadena.split()[8][0:3].isalpha() != True and cadena.split()[8].find('sdk') ==-1 and cadena.split()[8]!="." and cadena.split()[8]!="..":
        openoffices.append(cadena.split()[8])
        
def openoffice():
    ftp = ftplib.FTP('ftp.rediris.es')
    ftp.login()               # user anonymous, passwd anonymous@
    
    salida = ftp.sendcmd('cwd /mirror/openoffice.org/stable')
    salida = ftp.retrlines('list',callback_openoffice)
    
    ftp.close()
    return compareVersion(openoffices)
    
def compareVersion(list_source):
    list = []
    resultado = []
    
    for a in list_source:
        list.append(a.split("."))
    for a in list:
        ind = 0
        for b in a:
            try:
                if int(b) > int(resultado[ind]):
                    resultado = a
                elif int(b) != int(resultado[ind]):
                    break
            except:
                try:
                    int(b)
                    resultado = a
                except:
                    break
            ind = ind+1
    return ".".join(resultado)

print 'Ati\t: '+str(ati())+' '
print 'Nvidia\t: '+str(nvidia_g()[0])+' '
    #print 'Nvidia_nforce\t: '+str(nvidia_nforce()[0])+' '
print 'Kernel\t: '+str(linux_26())+' '
   #print 'Kernel_testing\t: '+str(linux_testing())+' '
print 'Xorg\t: '+str(xorg())+' '
print 'Kde\t: '+str(kde())+' '
print 'Firefox\t: '+str(firefox())+' '
print 'Gnome\t: '+str(gnome())+' '
print 'OOffice\t: '+str(openoffice())+' '
print 'Wine\t: '+str(wine())
"""
print1.0-7676
1.0-0306
2.6.12.5
X11R6.8.2
3.4.2
1.0.6
2.10
"""
