# [SCRIPT] script para busqueda web de portage-MEJORADO

## v1ll4

Visto que siempre que buscaba algo en el portage, lo hacia a traves de su pagina web que es muchisimo mas rápido que buscarlo a traves de emerge, me decidí a intentar implementarlo para usarlo en consola.

El script no es nada profesional y deja mucho que desear, no iba a postearlo pero bueno , pensando en la filosofia de gentoo, pues mira, igual a partir de aqui la gente lo va mejorando y quedo algo chulo.

Yo durante 2 dias me ha ido mas o menos bien , se puede mejorar, pero para lo que yo lo queria me funcionaba, bueno , aqui dejo la salida del scrip para que se vea como funciona mas o menos :

```

villa@villa-portatil pruebas $ time ./busqueda_portage firefox

---------------------------------

NOMBRE :        mozilla-firefox-bin

DESCRIPCION :   Firefox Web Browser

VER     alpha   amd64   arm     hppa    ia64    mips    ppc     ppc64   macos   s390    sh      sparc   x86

>1.5.0  >-<     >~<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >~<

>1.5-r  >-<     >~<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >~<

>1.0.7  >-<     >+<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >+<

---------------------------------

NOMBRE :        mozilla-firefox

DESCRIPCION :   Firefox Web Browser

VER     alpha   amd64   arm     hppa    ia64    mips    ppc     ppc64   macos   s390    sh      sparc   x86

>1.5.0  >-<     >~<     >-<     >-<     >~<     >-<     >~<     >-<     >-<     >-<     >-<     >-<     >~<

>1.5-r  >-<     >~<     >-<     >-<     >-<     >-<     >~<     >-<     >-<     >-<     >-<     >-<     >~<

>1.5-r  >-<     >~<     >-<     >-<     >-<     >-<     >~<     >-<     >-<     >-<     >-<     >-<     >~<

>1.0.7  >+<     >+<     >~<     >+<     >+<     >-<     >+<     >-<     >-<     >-<     >-<     >+<     >+<

---------------------------------

NOMBRE :        mozilla-launcher

DESCRIPCION :   Script that launches mozilla or firefox

VER     alpha   amd64   arm     hppa    ia64    mips    ppc     ppc64   macos   s390    sh      sparc   x86

>1.47<  >~<     >~<     >~<     >~<     >~<     >~<     >~<     >~<     >-<     >-<     >-<     >~<     >~<

>1.45<  >+<     >+<     >+<     >+<     >+<     >+<     >+<     >+<     >-<     >-<     >-<     >+<     >+<

real    0m3.129s

user    0m0.114s

sys     0m0.008s

villa@villa-portatil pruebas $ time emerge -s firefox

Searching...

[ Results for search key : firefox ]

[ Applications found : 2 ]

*  www-client/mozilla-firefox

      Latest version available: 1.5.0.1-r1

      Latest version installed: [ Not Installed ]

      Size of files: 117,945 kB

      Homepage:      http://www.mozilla.org/projects/firefox/

      Description:   Firefox Web Browser

      License:       MPL-1.1 NPL-1.1

*  www-client/mozilla-firefox-bin

      Latest version available: 1.5.0.1

      Latest version installed: 1.0.7

      Size of files: 40,939 kB

      Homepage:      http://www.mozilla.org/projects/firefox

      Description:   Firefox Web Browser

      License:       MPL-1.1 NPL-1.1

real    0m21.102s

user    0m0.756s

sys     0m0.146s

```

Yo lo uso como complemento a las herramientas que dispone gentoo para la busqueda, bueno , el codigo del script, está en python.

```

#!/usr/bin/python

# -*- coding: UTF-8 -*- 

#villa-3-2006

import urllib2

import sys

import re 

def coger_argumentos():#coge los paquetes a buscar de la linea de comandos

    palabra = sys.argv[1:]

    if len(palabra)>1:

        palabra='+'.join(palabra)

        return palabra

    elif len(palabra)==1: return palabra[0]

    else:

        print 'inserte el paquete a buscar'

    

def mostrar_busqueda(busqueda):#realiza la separacion de toda la pagina a solo las tablas donde estan los datos

    respuesta = []

    encontrado= -1

    segPasada=0

    for linea in busqueda:

        '''primera pasada del bucle'''

        encontrado = linea.find('<table class="ebuild">')

        if (encontrado > -1) or (segPasada==1):

            segPasada=1

            if linea.find('<tr><td class="fields">')>=0:

                respuesta.append(linea)

            if linea.find('<tr><td class="item"><b>Description: </b>')>=0:

                respuesta.append(linea)

            if linea.find('<th class="releases"><a')>=0:

                respuesta.append(linea)

            if linea.find('<td class="archcell')>=0:

                respuesta.append(linea)

            if linea.find('<!-- #exec cmd="/usr/bin/python -O search.py $QUERY_STRING" -->')>=0:

                return respuesta

    

def separar_busqueda(busqueda):#separa la gran lista en elementos de cada paquete encontrado

    elementos = 0

    lineas=[]

    paketes=[]

    for linea in range(len(busqueda)):

        if '<tr><td class="fields">' in busqueda[linea]:

            elementos=elementos+1

            lineas.append(linea)

    actual=0

    while (actual<elementos-1):

        paketes.append(busqueda[lineas[actual]:lineas[actual+1]])

        actual = actual + 1

    paketes.append(busqueda[lineas[actual]:])

    return paketes

    #except TypeError:

        #print "Â¡Huy! No es un nÃºmero. Prueba de nuevo..."

        

    

def tratar_elemento(elemento):#analiza y trata cada uno de los elementos sacando la informacion de cada uno

    rex=re.compile("\>.*?\<")

    caracteristicas=[]

    estados=[]

    versiones=[]

    for linea in elemento:

        linea =linea.replace('<tr><td class="fields">','')

        linea = linea.replace('</td></tr>','')

        linea = linea.replace('<tr><td class="item"><b>Description: </b>','')

        linea = linea.replace('\n','')

        caracteristicas.append(linea)

    print '---------------------------------'

    print 'NOMBRE :'+caracteristicas[0]

    print 'DESCRIPCION :'+caracteristicas[1]

    titulo = 'VER alpha  amd64   arm   hppa  ia64    mips    ppc ppc64   macos   s390    sh  sparc   x86'

    titulo = titulo.split()

    titulo = '\t'.join(titulo)

    print titulo

    for linea in caracteristicas[2:]:

        if '<th class="releases">' in linea:

            version = rex.findall(linea)

            if len(version[1]) > 6:

                version[1] = version[1][0:6]

            versiones.append(version)

        if '<td class="archcell"' in linea:

            estado = rex.findall(linea)

            estados.append('\t'.join(estado))  

    estados = tratar_estados(estados)

    for num in range(len(versiones)):

        print versiones[num][1]+'  '+estados[num]

    

def tratar_estados(estados):

    tablas = len(estados)/13

    numero = 1

    lis = []

    respuesta=[]

    while (numero <= tablas):

        principio = 13*(numero-1)

        final = 13*numero

        lis.append(estados[principio:final])

        numero = numero + 1

    for elem in lis:

        estados = '\t'.join(elem)

        respuesta.append(estados)

    return respuesta

    

def comprobar_resultados(busqueda):

    for linea in busqueda:

        if 'Nothing found.' in linea:return 0

    return 1

            

    

    

parametros = 'sstring='+coger_argumentos()

busqueda = urllib2.urlopen('http://packages.gentoo.org/search/?'+parametros)

bus = busqueda

estado = comprobar_resultados(bus)

if estado :

    busqueda = urllib2.urlopen('http://packages.gentoo.org/search/?'+parametros)

    respuesta = mostrar_busqueda(busqueda)

    elementos = separar_busqueda(respuesta)

    for elemento in elementos:

        tratar_elemento(elemento)

else:

    print 'No se han encontrado resultados en el portage para : '+coger_argumentos()

    

```

El script esta testeado lo poco que le he dicho buscar en estos dias y de cuando lo programé, pero bueno , que si le salen fallos pues los intentamos corregir.

El fallo que sé que tiene es que si el paquete a buscar, en la pagina web del portage tiene mas de una pagina , el script solo mira la primera, los 9 primeros resultados creo que son.

Bueno, por si hay algun novato que no creo , copiar el script , guardar como busqueda_portage o el nombre que se quiera, y teclear : chmod +x busqueda_portage y luego añadir al path.

Saludos

----------

## Ferdy

Siempre se agradecen este tipo de scripts, de todas formas quizá quieras echarle un vistazo a:

http://dev.gentoo.org/~ciaranm/toys/eshowkw

Saludos.Ferdy

----------

## eviltwin

 *v1ll4 wrote:*   

> Visto que siempre que buscaba algo en el portage, lo hacia a traves de su pagina web que es muchisimo mas rápido que buscarlo a traves de emerge, me decidí a intentar implementarlo para usarlo en consola. 

 

¿No has probado eix? Yo (al igual que mucha gente) lo uso, va como un tiro  :Smile:  A mí me hace el apaño muy bien, jeje. Igualmente, gracias por compartir el script.

Un saludo!!

----------

## quelcom

 *eviltwin wrote:*   

> 
> 
> ¿No has probado eix? Yo (al igual que mucha gente) lo uso, va como un tiro  A mí me hace el apaño muy bien, jeje. Igualmente, gracias por compartir el script.
> 
> 

 

No creo que el proposito del script sea sustituir a eix. Piensa que eix trabaja sobre tu árbol local y, por lo tanto, nunca tienes la última información que si aparece en packages.gentoo.org Es especialmente útil para los que, como yo, no syncean a diario y quieran ver que hay de nuevo sin recurrir a la web.

v1ll4, está muy bien el script, aunque hay el problema que si el resultado devuelve más de una página estos no aparecen (por lo tanto está limitado a las 20 primeras ocurrencias).

Da la casualidad que hace tiempo hice una cosa parecida, aunque no está solucionado el problema de la limitación de resultados (algun día lo tendría que arreglar).

Mi script está doblemente guarro (por ser Perl y por no haber comentarios) pero lo dejo por si sirve de inspiración. Intentaré coger ideas de tu script, pero yo de Python ni papa  :Embarassed: 

```

#!/usr/bin/env perl

use strict;

use WWW::Mechanize;

use Term::ANSIColor;

my $count = 0;

my $version;

my $liner;

my %archs = ("alpha"=>1,"amd64"=>2,"arm"=>3,"hppa"=>4,"ia64"=>5,

        "mips"=>6,"ppc"=>7,"ppc64"=>8,"ppc_macos"=>9,"s390"=>10,

        "sh"=>11,"sparc"=>12,"x86"=>13);

my $mech = WWW::Mechanize->new( autocheck => 1 );

my $url = "http://packages.gentoo.org/search/?sstring=".$ARGV[0];

$mech->agent_alias ( 'Linux Mozilla' );

$mech->get( $url );

if ($mech->success()) {

   print "\nRetrieved ".$mech->uri();

}

$mech->save_content("query.txt");

open LOG, "query.txt";

while (<LOG>) {

   if (/<table class="ebuild">/) {

      $count++;

      print "\n";

   }

   if (/<tr><td class="fields">(\S+)<\/td><\/tr>/) {

      print color 'reset bold';

      print "\n$1 ";

      print color 'reset';

      $liner = <LOG>;

      if ($liner =~ /<b>Description:(\s+)<\/b>(.*)<\/td><\/tr>/) {

         print "\nDescription: $2\nVersions:";

      }

         

   }

   if (/<a href="http:\/\/packages\.gentoo\.org\/ebuilds\/\?(\S+)-(\d+\S*)"/) {

      $version = $2;

      $liner = <LOG>;

      my $contador=0;

      while ($contador != $archs{$ARGV[1]}) {

         $liner = <LOG>;

         $contador++;

      }

      if ($liner =~ /<td class="archcell" arch="(\S+)">(\S+)<\/td>/) {

         $_ = $1;

         SWITCH: {

            if (/\+/) { print color 'green'; last SWITCH; };

            if (/M(\S+)/) { print color 'red'; last SWITCH; };

            if (/~/) { print color 'yellow'; last SWITCH; };

            print color 'reset';

         }

         print " $version ";

      }   

   }

   if (/class="homepage" href="(.*)">Homepage/) {

      print color 'reset';

      print "\nHomepage: $1";

   }

   

}

close LOG;

print color 'reset';

print "\n\n$count Register(s) Found\n";

```

Requisitos: 

dev-perl/WWW-Mechanize

dev-perl/Term-ANSIColor

Uso:

./peix.pl <paquete> <arch>

Saludos

----------

## alexlm78

Gracias por los datos, como dijo Ferdy, esto siempre se agradece, vamos a ver que se puede modificar con esto y que mas provecho se le puede sacar.

Saluditos.

----------

## pacho2

Script interesante  :Smile: 

Saludos

----------

## v1ll4

Después de comer me he puesto a ver si arreglaba el fallo de que solo mostraba los 20 primeros resultados en caso de que la busqueda diera como resultado mas de 20.

Lo he ido cambiando sobre la marcha ahora mismo y he hecho unas cuantas busquedas de prueba y ya hace las busquedas completas.

```

#!/usr/bin/python

# -*- coding: UTF-8 -*- 

#-villa-11-03-06 - v.2

import urllib2

import sys

import re 

def coger_argumentos():#coge los paquetes a buscar de la linea de comandos

    palabra = sys.argv[1:]

    if len(palabra)>1:

        palabra='+'.join(palabra)

        return palabra

    elif len(palabra)==1: return palabra[0]

    else:

        print 'ERROR SINTAXIS . TRY -> '+sys.argv[0]+ ' NAME'

        

def mostrar_busqueda(busqueda):#realiza la separacion de toda la pagina a solo las tablas donde estan los datos

    respuesta = []

    encontrado= -1

    segPasada=0

    for linea in busqueda:

        '''primera pasada del bucle'''

        encontrado = linea.find('<table class="ebuild">')

        if (encontrado > -1) or (segPasada==1):

            segPasada=1

            if linea.find('<tr><td class="fields">')>=0:

                respuesta.append(linea)

            if linea.find('<tr><td class="item"><b>Description: </b>')>=0:

                respuesta.append(linea)

            if linea.find('<th class="releases"><a')>=0:

                respuesta.append(linea)

            if linea.find('<td class="archcell')>=0:

                respuesta.append(linea)

            if linea.find('<!-- #exec cmd="/usr/bin/python -O search.py $QUERY_STRING" -->')>=0:

                return respuesta

    

def separar_busqueda(busqueda):#separa la gran lista en elementos de cada paquete encontrado

    elementos = 0

    lineas=[]

    paketes=[]

    for linea in range(len(busqueda)):

        if '<tr><td class="fields">' in busqueda[linea]:

            elementos=elementos+1

            lineas.append(linea)

    actual=0

    while (actual<elementos-1):

        paketes.append(busqueda[lineas[actual]:lineas[actual+1]])

        actual = actual + 1

    paketes.append(busqueda[lineas[actual]:])

    return paketes

        

    

def tratar_elemento(elemento):#analiza y trata cada uno de los elementos sacando la informacion de cada uno

    rex=re.compile("\>.*?\<")

    caracteristicas=[]

    estados=[]

    versiones=[]

    for linea in elemento:

        linea =linea.replace('<tr><td class="fields">','')

        linea = linea.replace('</td></tr>','')

        linea = linea.replace('<tr><td class="item"><b>Description: </b>','')

        linea = linea.replace('\n','')

        caracteristicas.append(linea)

    print '---------------------------------'

    print 'NOMBRE :'+caracteristicas[0]

    print 'DESCRIPCION :'+caracteristicas[1]

    titulo = 'VER alpha  amd64   arm   hppa  ia64    mips    ppc ppc64   macos   s390    sh  sparc   x86'

    titulo = titulo.split()

    titulo = '\t'.join(titulo)

    print titulo

    for linea in caracteristicas[2:]:

        if '<th class="releases">' in linea:

            version = rex.findall(linea)

            if len(version[1]) > 6:

                version[1] = version[1][0:6]

            versiones.append(version)

        if '<td class="archcell"' in linea:

            estado = rex.findall(linea)

            estados.append('\t'.join(estado))  

    estados = tratar_estados(estados)

    for num in range(len(versiones)):

        print versiones[num][1]+'  '+estados[num]

    

def tratar_estados(estados):

    tablas = len(estados)/13

    numero = 1

    lis = []

    respuesta=[]

    while (numero <= tablas):

        principio = 13*(numero-1)

        final = 13*numero

        lis.append(estados[principio:final])

        numero = numero + 1

    for elem in lis:

        estados = '\t'.join(elem)

        respuesta.append(estados)

    return respuesta

    

def comprobar_resultados(busqueda):

    numeros = []

    for linea in busqueda:

        if 'Nothing found.' in linea:return 0

        if '<b>Results' in linea:

            linea =linea.replace('<b>','')

            linea = linea.replace('</b><br>','')

            return linea.split()

            

            

    

argumentos=coger_argumentos()

if argumentos!=None:

    parametros = 'sstring='+argumentos

    busqueda = urllib2.urlopen('http://packages.gentoo.org/search/?'+parametros)

    bus = busqueda

    estado = comprobar_resultados(bus)

    if estado :

        print estado[1]+' - '+estado[3]+' of '+estado[5]

        busqueda = urllib2.urlopen('http://packages.gentoo.org/search/?'+parametros)

        respuesta = mostrar_busqueda(busqueda)

        elementos = separar_busqueda(respuesta)

        for elemento in elementos:

            tratar_elemento(elemento)

        if estado[5] > 20:

            vueltas = int(float(estado[5])/20)

            for num in range(vueltas):

                print'----------------------------------------------------------------------\n'

                print ' '+str(20*num+21)+' - '+str(estado[5])

                entrada=raw_input('PRESS ENTER OR "n" to exit\n')

                print'----------------------------------------------------------------------\n'            

                if entrada=='n':break

                busqueda = urllib2.urlopen('http://packages.gentoo.org/search/?'+parametros+';offset='+str(num*20+20))

                respuesta = mostrar_busqueda(busqueda)

                elementos = separar_busqueda(respuesta)

                for elemento in elementos:

                    tratar_elemento(elemento)

            

    else:

        print 'I could not find any ebuild to '+argumentos

```

El script es el mismo , lo unico que cambia respecto al anterior es que cada vez que los resultados pasan de 20 saca esto por pantalla :

```

---------------------------------

NOMBRE :        tvtime

DESCRIPCION :   High quality television application for use with video capture cards.

VER     alpha   amd64   arm     hppa    ia64    mips    ppc     ppc64   macos   s390    sh      sparc   x86

>1.0.2  >-<     >~<     >-<     >-<     >-<     >-<     >~<     >-<     >-<     >-<     >-<     >-<     >~<

>1.0.1  >-<     >~<     >-<     >-<     >-<     >-<     >~<     >-<     >-<     >-<     >-<     >-<     >~<

>0.99<  >-<     >~<     >-<     >-<     >-<     >-<     >~<     >-<     >-<     >-<     >-<     >-<     >~<

>0.9.1  >-<     >+<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >+<

>0.9.1  >-<     >+<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >+<

---------------------------------

NOMBRE :        dfbsee

DESCRIPCION :   DFBSee is image viewer and video player based on DirectFB

VER     alpha   amd64   arm     hppa    ia64    mips    ppc     ppc64   macos   s390    sh      sparc   x86

>0.7.4  >-<     >~<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >~<

>0.7.4  >-<     >~<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >+<

----------------------------------------------------------------------

 21 - 165

PRESS ENTER OR "n" to exit

----------------------------------------------------------------------

---------------------------------

NOMBRE :        avidemux

DESCRIPCION :   Great Video editing/encoding tool

VER     alpha   amd64   arm     hppa    ia64    mips    ppc     ppc64   macos   s390    sh      sparc   x86

>2.1_p  >-<     >M~<    >-<     >-<     >-<     >-<     >M~<    >-<     >-<     >-<     >-<     >-<     >M~<

>2.0.4  >-<     >~<     >-<     >-<     >-<     >-<     >~<     >-<     >-<     >-<     >-<     >-<     >~<

>2.0.2  >-<     >~<     >-<     >-<     >-<     >-<     >+<     >-<     >-<     >-<     >-<     >-<     >+<

---------------------------------

NOMBRE :        binkplayer

DESCRIPCION :   Bink Video! Player

VER     alpha   amd64   arm     hppa    ia64    mips    ppc     ppc64   macos   s390    sh      sparc   x86

>1.8h<  >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >+<

>1.8c<  >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >-<     >+<

---------------------------------

```

En este caso , la parte de arriba ha mostrado hasta la 20 y en caso de que no pulses la tecla 'n' , mostraría las 20 siguientes y volvería a preguntar, así hasta llegar al total.

Saludos

----------

