#!/usr/bin/perl
my $var;

#open(ARCH,">introd") or die;
#poner close en otros exit

# reemplazar con esto lo anterior y sacar los @@, poner distro tambien en summabase, o poner pkac.dat en share
my $DIRBIN=system("summabase");

my $prefix=$ENV{'prefix'};
if (not $prefix){
    $prefix="/usr/local";
}
my $DIRDATO=$ENV{'DIRDATO'};
if (not $DIRDATO){
    $DIRDATO="${prefix}/share/sumapack"
}
my $DIRVAR=$ENV{'DIRVAR'};
if (not $DIRVAR){
    $DIRVAR="/usr/local/var/sumapack";
}
my $DISTRO=$ENV{'DISTRO'};
if (not $DISTRO){
    $DISTRO="SUSE"
}
my $DVERSION=$ENV{'DVERSION'};
if (not $DVERSION){
    $DVERSION="DVERSION@"
}

sub sistema{
    my ($sis)=@_;  
    my $pro="/bin/sh $packlet/";
    #	$pro="";
    print "SE EJECUTA: $pro$sis\n";
    system("$pro$sis");  

  # print ARCH "$pro$sis\n";
}

# quizas algunas cosas pueda hacer sin ser supervisor, ver si hacer una etapa de prepara y otra de install
# quizas pueda instalar en directorios locales


#-I install: bin src osrc repo -A add repo
#   -S search -Q query: s-names s-all  -R remove 
#-F fix  -D del repo
# conjuntos de paquetes predefinidos: 
#world: los instalados menos los ssystem
#sword: incluye los critcos
#system: los basicos ( menos los ssystem?)
#all: todo el repo


# i es info o install?

# stats (see /var/lib/pacman/local)	(see /var/lib/rpm/Packages)	apt-cache stats	rug dump	n/a 	emerge --info 
#podria agregarse pero es tan variado
 
use Getopt::Long;
my %moo=();
GetOptions(
"opts=s" =>\$moo{optionsvar},
"remove" =>\$moo{comremoveflag},
"install"=>\$moo{cominstallflag}, #en opts  nd:nu:f:bd_dwld como NNFB o 0000 los 4 primeros
# nodeps no update force builddeps
# instala lo que venga, sea repo, paquete de la distro, fuente original, svn, etc

"search" =>\$moo{comsearchflag}, #en opts names|all esto involucra info
"info"   =>\$moo{cominfoflag}, 
"stats"   =>\$moo{comstatsflag}, 
# quizas debamos armar una opcion info independiente
"fix"    =>\$moo{comfixflag},        
"refresh"    =>\$moo{comrefreshflag}, # renovar los caches            #zypper refresh debian update
"clean"  =>\$moo{comcleanflag},       # limpiar los caches de los repos 
"depclean"  =>\$moo{comdepcleanflag},       # sacar los paquetes no usados 
"special=s"=>\$moo{comspecialvar},
"help"   =>\$moo{comhelp},
"version"=>\$moo{comversion},
#"v!"     =>\$moo{version},
#x
    );


#o sea addrepo es parte de packlet pero no de babel

### PARECE QUE FALTA UN remove obsolete, esta en slapt
#falta buildped o buildrequiers

#ver el tema install
#opciones por si o no: reinstall, reinstallwithconf(force), nodeps, noupgrade


# ver que hacemos con los sistemas que sugieren paquetes

#update lo hace siempre antes de algo pero seria
#"updatecache!"=>\$moo{updatecacheflag},

#upgrade es --install world
#distupgrade es --install word ssystem 

# install hara si no instala una busqueda
# install forzara y hara update


my $accion='';
my $accioninfo='';
if ($moo{comremoveflag}    ) {$accion="remove"}
elsif ($moo{cominstallflag} ) {$accion="install";} 
elsif ($moo{comsearchflag}  ) {$accion="search";}   
elsif ($moo{cominfoflag}  ) {$accion="info";}  
elsif ($moo{comstatsflag}  ) {$accion="stats";}  
elsif ($moo{comfixflag}    ) {$accion="fix"}       
elsif ($moo{comrefreshflag}) {$accion="refresh"}  
elsif ($moo{comcleanflag}  ) {$accion="clean"} 
elsif ($moo{comdepcleanflag}  ) {$accion="depclean"} 
elsif ($moo{comspecialvar} ) {$accion="special";$accioninfo=$moo{comspecialvar}} 
elsif ($moo{comhelp}       ) {$accion="help";
                           print "Help\n";
			   exit;
                           } 
elsif ($moo{comversion}    ) {$accion="version";
                            print "Version 0.01\n";
                            exit;
                           } 
else{                       
                           $accion="install"
                            #print "Nada para hacer.\n";
                            #exit;
                           }


if ($moo{optionsvar}){$accioninfo=$moo{optionsvar}}

    if (not scalar @ARGV){
         print "Nada para hacer \n";
         exit;
    }


my $ultimo=scalar @ARGV - 1;


print "Ejecuta: $accion, $accioninfo, @ARGV\n";
#my  $todo="$accion-$accioninfo";


#cambiar infosis por detectasistema
#if (not $DISTRO){
#    $DISTROVER=`PATH="/usr/local/bin:\$PATH";  infosis -s|\
#      awk -F'=' '/^export DIRDATO=/ {print "R;" \$2};\
#                 /^export VARDATO=/ {print "A;" \$2};\
#                 /^export DISTRO=/ {print "D;" \$2};\
#                 /^export DVERSION=/ {print "V;" \$2}; '| tr '\n' ';'`;
#    chomp($DISTROVER);
#    #print "DISTROVER $DISTROVER\n";
#    ($N[0],$D[0],$N[1],$D[1],$N[2],$D[2],$N[3],$D[3])=split(/;/,$DISTROVER);
#    foreach my $nn (0 ..scalar @N -1){
#        #print "HH $nn\n";
#	if 	 ($N[$nn] eq 'R') {$DIRDATO=$D[$nn]} 
#        elsif	 ($N[$nn] eq 'D') {$DISTRO=$D[$nn]}
#        elsif	 ($N[$nn] eq 'V') {$VERSION=$D[$nn]}
#        elsif	 ($N[$nn] eq 'A') {$DIRVAR=$D[$nn]}
#        else {print "ERROR infosis en sumapack\n"}
#    }
#}


# sacar de aca leer rosetta
#print "DISTRO=$DISTRO\nVERSION=$VERSION\nDIRDATO=$DIRDATO\nDIRVAR=$DIRVAR\n";


#esto pasarlo a systeminfo y vincularlo con la candidad de paquetes  por base de datos y luego
#si estan las herramientas

my $TOOLSET='';
if ($DISTRO eq 'UTUTO'){ 
$TOOLSET='uget'
}elsif($DISTRO eq 'DEBIAN'){ 
$TOOLSET='apt'
}elsif ($DISTRO eq 'SUSE'){ 
$TOOLSET='zypper'
}elsif ($DISTRO eq 'REDHAT'){ 
$TOOLSET='yum'
}elsif ($DISTRO eq'MANDRIVA'){
$TOOLSET='urpmi'
}elsif ($DISTRO eq 'SLACKWARE'){ 
$TOOLSET='slapt'
}elsif ($DISTRO eq 'GENTOO'){ 
$TOOLSET='emerge'
}elsif ($DISTRO eq 'ARCH'){ 
$TOOLSET='pacman'
}

# if smart usar smart, sino instalarlo????

local $packlet=$DIRDATO."/packlet";
#local mientras transicion por rutina sistema

#poner package sudo
my $PACKS="/tmp/packs";
#mkdir $PACKS;

my $pack=$DIRVAR."/source";

#my $packlet="./scripts/packlet";

#(@ARGV) 

#print "TOOLSET $DISTRO - $TOOLSET\n";


cargafunciones();
###################################################################################################33





#sacar pero verificar que exista
if (($accion eq 'install') or ($accion eq 'remove') or   ($accion eq 'fix') or   ($accion eq 'search')
       or ($accion eq 'special') or ($accion eq 'info') or ($accion eq 'clean')) {

@data=@ARGV;


print "DATA=\"@data\" \n";

my $i=-1;
my $ejecute;
my $dato;
use feature switch;
#foreach my $dat (@data){
    #print "WWWWWWWWW $dat->[3]\n";
#@{$dat->[1]}
foreach my $datint (@data){
  my  ($orden,$res)=split(/ /,$datint,2);
  $ejecute=$orden;
  $dato=$res;
  given ($orden){
      when ('ALL'){}
      when ('SYSTEM'){}
      when ('WORD'){}
      when ('DEP'){}
 #     when ('PATCH'){}
      when ('EBUILD'){}
 #     when ('CONFIG'){}
      when ('MAKE'){}
      when ('INSTALL'){}
      when ('PROJECT'){}
      when ('SUMMA'){}
      when ('RPM'){}
      when ('GET'){}
#     when ('SOURCE'){}
      when ('SVN'){}
      when ('CPAN'){}
      when ('DEB'){}
      when ('REPO'){}
      when ('TXZ'){}
      when ('PKG'){}
      when ('TGZ'){}
      when ('TBZ'){}
      when ('SH'){}      #pakete sh
      when ('LSH'){}     #ejecutar ese comando
      when ('COMMAND'){} #script de instalacion propia de sumapack
      default{
	  if ($accion ne 'search'){
	    $ejecute='PAQ';
            $dato=$datint;
	  }else{
            $ejecute='NAME';
            $dato=$datint;
	  }
         
      }
  }
   $info= [$dato,$dat->[0],$dat->[2],$dat->[3],$dat->[4]]; 
   #print "iiiiiiiiiiiiii $ejecute $ordenvieja $i $dato\n";

  if ($ejecute eq 'REPO'){
      $repos->{$dato}=$info;
  }
  if ($ejecute eq $ordenvieja){
      @{$actual->[$i]}=(@{$actual->[$i]},$info);
      @{$actuallis->[$i]}=(@{$actuallis->[$i]},$dato);
  } else{
      $i++;
      @{$actuallis->[$i]}=(@{$actuallis->[$i]},$dato);
      @{$actual->[$i]}=(@{$actual->[$i]},$info);
      @secuencia=(@secuencia,[$ejecute,$actual->[$i],$actuallis->[$i]]);
  }

    $ordenvieja=$ejecute;
    $ordena->{$dato}=$info;
    $opd->{$ejecute}=[@{$opd->{$ejecute}},$dato];
    print "ORDEN $ejecute : $dato, $dat->[0],$dat->[2],$dat->[3],$dat->[4]\n";
    }

##############################################################
#print Dumper $ordena;
#print  "OPD\n",Dumper $opd;
#print  "SEQ\n",Dumper \@secuencia;
#print Dumper $repos;

if (scalar  keys %$repos){
 print "|========================================================== REPO: ", keys %$repos," ============|\n";
 $funcion->{'REPO'}($accion,keys %$repos);
}

foreach my $seq (@secuencia){

    my $ord=$seq->[0]; 
    if ($ord ne 'REPO'){

#elsif ($accion eq 'originalsourceinstall' ){
    # ver opciones #nd:nu:f:bd_dwld|tar|configure|all|srcinstall|install
   # ver aca no en source lo de los force update y dependencias
   # pasar dwld|tar|configure|all|srcinstall|install

#    if ($accion eq 'install'){    
#    my ($optuno,$optsdos)=split(/_/,$optionsvar);
    #procesar $optsuno
#    my $make='install';
#    if ($optsdos){$make=$optsdos}
    #if ($optuno eq 'svn'){
    #funcion->{'SVN'}($accion,$make,@DATA);
    #else{
    #funcion->{'GET'}($accion,$make,@DATA);
    #
    # source.sh
#    }
    if ($accioninfo){
        $accion="$accion-$accioninfo";
    }  
     
        print "|========================================================== $ord: @{$seq->[2]} ============|\n";	

       # verificar que la funcion exista

        $funcion->{$ord}($accion,@{$seq->[2]});
    } 
}

#####################################################################################33

#install world es hacer update
#install sworld - distupdate

#install all es instalar todos los paquetes existentes, no lo hacemos


#remove, MUY PELIGROSO NO

# resto sin sentido
#    print " $accion, $accioninfo, $DISTRO, $TOOLSET $packlet\n";
#hacer las cosas que se puede hacer con eso: update upgrade 
# las arriesgadas como install o remove para despues.
########################################################################################################

# ojo con ututo que solo maneja un paquet aunqeu no hay repos asi que no ahy prob   
#       sistema("PAQ-$TOOLSET.sh $accion-$accioninfo");
#}elsif($accion eq 'search'){
#  if ($accioninfo){
#        $accion="search-$accioninfo";
#    }  #
#
# sistema("PAQ-$TOOLSET.sh $accion $PAQS");


}else{

   print "Error accion: $accion no prevista\n";
	}

############################################################# funciones



#    print "PAQ  @_ \n";
#    if($DISTRO eq 'UTUTO'){
#	foreach my $sss (@_){
#             sistema("PAQU-$DISTRO.sh $todo $sss");
#	}
#    }else{
#       sistema("PAQ-$DISTRO.sh $todo @_");
#       # ver slack no es install sino --install
#    }


#    if ($DISTRO eq 'MANDRIVA'){
#       sistema("urpmi.sh $todo @_");
#    if ($DISTRO eq 'SUSE'){
#       sistema("zypper.sh $todo @_");
#    }elsif($DISTRO eq 'REDHAT'){
#       sistema("yum.sh -y $todo @_");
#    }elsif($DISTRO eq 'DEBIAN'){
#       sistema("apt-get.sh $todo @_");
#    }elsif($DISTRO eq 'GENTOO'){
#       sistema("emerge.sh  @_");
#    }elsif($DISTRO eq 'SLACKWARE'){
#       sistema("slapt-apt.sh  @_");


#######################################################################################################
sub cargafunciones{

$funcion->{'PAQ'}= sub {
      #print "/bin/sh $packlet/PAQ.sh  $packlet - $TOOLSET - $todo - @_\n";

#####333 aca unico lugar donde la opcion instalar source de pqute puede servir
#"sourceinstall"=>\$moo{comsinstallflag}, #en opts  s:nd:nu:f:nbd_dwld|tar|configure|all|srcinstall|install
######################
     $accion= shift;
      #    my $todo=$accion;
      #my $fin=scalar @_;
      #sistema("PAQ.sh $packlet $TOOLSET $accion  @_");
      sistema("PAQ-$TOOLSET.sh $accion  @_");
     # nosera mejor llamar a PAQ-$TOOLSET directo????
};



$function->{'WORLD'}= sub {
    my $accion=shift;
 if ($accion eq 'install'){
       sistema("PAQ-$TOOLSET update");
 }elsif ($accion eq 'clean'){
       sistema("PAQ-$TOOLSET depclean");
 }elsif ($accion eq 'info'){
       sistema("PAQ-$TOOLSET stats");
 }elsif ($accion eq 'fix'){
       sistema("PAQ-$TOOLSET fix");
 }else{
     print "No habilitamos otras acciones, como $accion WORLD\n";
	}
};



$function->{'NAME'}= sub {
    my $accion=shift;
    sistema("PAQ-$TOOLSET $accion @_");
};

$function->{'CACHE'}= sub {
    my $accion=shift;
 if ($accion eq 'install'){
       sistema("PAQ-$TOOLSET refresh");
 }elsif ($accion eq 'clean'){
       sistema("PAQ-$TOOLSET clean");

 }else{
       print "No habilitamos otras acciones, como $accion CACHE\n;"
	}
};

$function->{'SYSTEM'}= sub {
    my $accion=shift;
 if ($accion eq 'install'){
       sistema("PAQ-$TOOLSET distupdate");
    }else{
        print "No habilitamos otras acciones, como $accion SYSTEM\n;"
	}
};

$function->{'ALL'}= sub {
    my $accion=shift;
        print "No se hace nada, como $accion ALL\n;"

};


$funcion->{'EBUILD'}= sub {
   # usar ebuild ver si funciona en otros sistemas
   sistema("ebuild  @_");
};

$funcion->{'INSTALL'}= sub {
   # usar ebuild ver si funciona en otros sistemas
   sistema("install  @_");
};
$funcion->{'CONFIG'}= sub {
   # usar ebuild ver si funciona en otros sistemas
   sistema("config  @_");
};
$funcion->{'MAKE'}= sub {
   # usar ebuild ver si funciona en otros sistemas
   sistema("make  @_");
};

$funcion->{'PROJECT'}= sub {
# esto esta puesto para mostrar a la salida y eventual archivo info sobre lo que se pidio a rosetta 

  # usar ebuild ver si funciona en otros sistemas

# accion no le sacan la segunda parte antes???? ver
    my $accion=shift;
    my ($acc,$info)=split(/-/,$accion);
    my ($E1,$E2)=split(/_/,$info);
    my $make=$E2;
    if (not $make){$make='install'}

#ACCIONES="down config make install  pkg pkginstall "
# down: get patch 
# config: autoreconf prepare configure # ver prepare que hace
# make 
# dist distpublish
# pkg pkgpublish pkginstall
# install
# ambos publish y dist son cosa del make interno no del externo

#fetch unpack prepare configure compile test preinst install postinst qmerge
#merge es fectch unpack compile install qmerge
# rpm package manifest/digest
# prerm postrm unmerge

# EN ROSETTA GET PATCH CONFIG MAKE INSTALL
#   sistema("PROJECT  @_ $accion $make");
};


$funcion->{'PATCH'}= sub {
   # usar ebuild ver si funciona en otros sistemas
   sistema("patch  @_[1,scalar @_]");
};


$funcion->{'RPM'}= sub {
   #  usar rpm para poder usarlo en otros sistemas
       sistema("rpm -i  @_");
};

$funcion->{'DEB'}= sub {
       sistema("dpkg  @_");

};

# cambiar nombre scripts y pasar inteligencia alli
$funcion->{'REPO'}= sub {

    my $accion=shift;
    my $packletorder;
#    print "REPO  @_ \n";
   if ($accion eq "install"){
       $packletorder="addrepo";
   }elsif($accion eq "remove"){  
       $packletorder="delrepo";
   }else{
   print "El comando no es el adecuado para un repositorio @_";
   }

    if ($DISTRO eq 'SUSE'){

# http://download.opensuse.org/repositories/openSUSE:/%DISTROVER%:/Contrib/standard Contrib
    foreach  $ss (@_){
	my ($distro,$nombre)=split(/ /,$ss);

        if ($nombre eq ''){
        	$nombre=$distro;
                # ver mirrors
                $distro="http://download.opensuse.org/repositories/openSUSE:/".$VERSION."/$nombre/standard";
	}else{

        	if ($distro =~ /%DISTROVER%/){          
                    ($pri,$cero,$seg)=split(/\%/,$distro); 
                    $distro=$pri.$VERSION.$seg;
                    #print "PP $pri - $cero-  $seg\n  ";
             	}
            
        }

      #print "Repo:  ar $distro $nombre\n";
      sistema("PAQ-$TOOLSET $packletorder $distro $nombre");
    }
    }elsif($DISTRO eq 'DEBIAN'){


       foreach my $ss (@_){


    $solo="";
    $ssb=$ss;
    $ssb=~s/\s//g;
    $ss=~/non-free/;
    if ($ss eq $ssb){ 
	$solo="non-free";
    }
     $ssb=~s/\s//g;
     $ss=~/contrib/;
    if ($ss eq $ssb){ 
	$solo="contrib";
    }

     if ($solo){
  
	 $repodir="http://ftp.de.debian.org/debian/pool/main/d/dpkg/";
	   $version=$VERSION;
           $cat=$solo;
           #  NOTA: buscar otros espejos
           #netselect-apt (por saltos, mejor sources.list) apt-spy (por ancho de banda)
     }else{

      ($repodir,$version,$cat)=split(/ /,$ss);

      }
       if ($version =~/\%DISTROVER\%/){
          $version=$VERSION;        
# seguiremos la politica de agregar repos con nombres de codigo lenny squeezy, etc no stable unstable testing
# aunque esto se puede cambiar, tomando una decision segun la inspeccion de /apt/sources.list, pero podria ser mucy complejo esto

#25 Para buscar el paquete que tiene un programa
#dpkg -S `which dig`


#/bin/sh: Can't open /usr/local/share/sumapack/packlet/apt-get-repo-update.sh

             
	}
  #    print "RRRRRRRRRRR  $repodir $version $cat\n";
       
       sistema("PAQ-$TOOLSET $packletorder $repodir $version $cat ");
       }
       sistema("PAQ-$TOOLSET refresh");
}
};

##################

$funcion->{'TXZ'}= sub {
#    print "TXZ  @_ \n";

};
$funcion->{'TGZ'}= sub {
#    print "TGZ  @_ \n";

};
$funcion->{'TBZ'}= sub {
#    print "TBZ  @_ \n";

};
$funcion->{'SH'}= sub {
#    print "SH  @_ \n";

};
$funcion->{'LSH'}= sub {
#    print "LSH  @_ \n";



};
$funcion->{'COMMAND'}= sub {
       my $accion= shift;
       my $comando= shift;
       # $pack= es global OJO
       print "COMMAND  $comando $accion $pack - @_ \n";
       sistema("$comando $accion $pack @_ ");      
};


$funcion->{'SVN'}= sub {
    my $accion=shift;
   # funciona asi?
   # my ($acc,$info)=split(/-/,$accion);
   # my ($E1,$E2)=split(/_/,$info);
   # my $make=$E2;
   # if (not $make){$make='install'}
    print "$acc, $E1, $make en: @_\n";
    foreach my $ss (@_){
       sistema("svn $ss $pack $accion");      
    }
};


$funcion->{'CPAN'}= sub {
#print "GET  @_ \n";
    my $accion=shift;
    #my ($acc,$info)=split(/-/,$accion);
    #my ($E1,$E2)=split(/_/,$info);
    #my $make=$E2;
    #if (not $make){$make='install'}
    sistema("cpan $accion @_");
};





sub getlast{
    my ($site,$pname,$ext)=@_;
	    #my $prepack="dpkg";
            #my $letraprev="d"; # calcular  
            #  ftp://ftp.de.debian.org/debian/pool/main/$letraprev/$prepack/

            #print "$site $pname \n";
	    #`echo dir |ftp $site >/tmp/listaprov`;	      
	    my $res1=`cat /tmp/listaprov| awk -F' ' '{print \$9}'|grep "^${pname}" | sed 's/^${pname}//' | grep "${ext}\$"|sed 's/${ext}\$//'`;
            
            @vers=split(/\n/,$res1);
            foreach my $ver (@vers){
		@nver=split(/\./,$ver);
                
                my $dimen=1;
                my $val=0;
                foreach my $nnn (reverse(@nver)){
		    $val=$val+$nnn * $dimen;
		    $dimen=$dimen*1000;
                }
		if ($gvalor<$val){ $gvalor=$val; $gversion=$ver}
         	#    print "MMMMMM @nver $valor $gvalor $gversion\n";
	    }
	    return $gvalor;
	}


$funcion->{'GET'}= sub {
print "SOURCE  $_[0] - $_[1] -  $_[2]\n";
    my $accion=$_[0];
#my @acciones=split(/\$/,$_[0]);
#print "SOURCE  $acciones[0] \n";
#print "SOURCE  $acciones[1] \n";
#print "SOURCE  $acciones[2] \n";
#    foreach my $ss (@acciones){
#        $NAMEDEB=0

my $ss=$_[1];
my ($site,$pname,$ext,$nombre)=split(/\s+/,$ss);

#print "--- $site - $pname - $ext - $nombre\n";

$realname=$pname;
	if ($pname =~ /\%LAST\%/){
          if ($site =~/^ftp:\/\//) {
	      $pname=~s/%LAST%//;
              $gversion=getlast($pname,$site,$ext);
              $realname=$pname.$gversion;              
	  }else{
	      print "Todavia no se last con http\n";
	  }
          }

       sistema("get.sh $site $realname $ext  $nombre");      

#	if ($orden eq 'NAME'){
#          $PAQUETENAME=$resto
#        }elsif($orden eq 'NAMEDEB'){#
#	    $NAMEDEB=1;
 #       }elsif($orden eq 'GET'){
#            $SRCDIR=$resto
#        }elsif($orden eq 'PATCH'){
#            $INFOPATCH=$resto
#         }elsif($orden eq 'CONFIG'){
#            $INFOCONFIG=$resto
#         }else{
#            print "error lectura rosetta source\n"
#          }
#    }

    #my ($acc,$info)=split(/-/,$accion);
    #my ($E1,$E2)=split(/_/,$info);
    #my $make=$E2;
    #if (not $make){$make='install'}
    while (1==0){
    foreach my $ss (@_){
           my $gvalor=0;
            my $gversion;
        # en source %LAST% se puede usar en sitios ftp
        my ($site,$pname,$ext,$esdebian)=split(/ /,$ss);
       #PACKS=`mktemp --tmpdir=/tmp -qd buildroot.XXXXXX| sed 's/\/tmp\///'` # buildroot.LDf0U6

       #sistema("get $site $pname$gversion $ext $esdebian $pack $make");      
       # saco el $pack y agrego directorio como $pname en el futuro sacar el esdebian y setear $pname
       sistema("get $site $pname$gversion $ext $esdebian $pname");      
    }
    }



};



}
# sudo esta demas pues esto va sobre sudo

####################3

#close ARCH;
exit;









######################################3


#               'REDHAT-RPM'   =>['svn2cl'           ,'gral'],

#el pack o sea primer argumento del array no sirve para nada 
#si el segundo no es gral

my $paquetes={
   'detecta' =>{'ALL'          =>['detecta'          ,'detecta']},
   'rpm'     =>{'REDHAT-RPM'   =>['rpm'              ,'rpm'],
                'GENTOO-EBUILD'=>['rpm'              ,'rpm']},
   'latex2html'
             =>{'DEBIAN-DEB   '=>['latex2html'       ,'latex2html'],
                'GENTOO-EBUILD'=>['latex2html'       ,'latex2html']},
   'xz'      =>{'GENTOO-EBUILD'=>['xz'               ,'xz']},
   'muse-el' =>{'GENTOO-EBUILD'=>['app-emacs/muse'   ,'gral'],
                'SUSE-RPM'     =>['muse-el'          ,'muse-el'],
                'DEBIAN-DEB   '=>['app-emacs/muse'   ,'gral'],
                'REDHAT-RPM'   =>[' emacs-muse'      ,'gral']},
   'latex'   =>{'GENTOO-EBUILD'=>['latex'            ,'latex']},
   'svn2cl'  =>{'GENTOO-EBUILD'=>['dev-util/svn2cl'  ,'gral'],
                'SUSE-RPM'     =>['svn2cl'           ,'svn2cl'],
                'DEBIAN-DEB'   =>['subversion-tools' ,'gral'],
                'REDHAT-RPM'   =>['subversion-svn2cl','gral']},
   'dpkg'    =>{'SUSE-RPM'     =>['dpkg'             ,'dpkg'],
                'GENTOO-EBUILD'=>['app-arch/dpkg'    ,'gral']},
   'tgif'    =>{'SUSE-RPM'     =>['tgif'             ,'tgif'],
                'GENTOO-EBUILD'=>['tgif'             ,'tgif']}
};

#multiples opciones para cada nombre generico
#multiples paquetes en cada opcion

#suse
#cc      gcc
#latex   texlive texlive-latex
#fortran gcc-fortran

#debian
#cc      gcc
#fortran gfortran

#gentoo
#emacs   virtual/emacs 

#redhat
#svn2cl  subversion-svn2cl
#fortran gcc-gfortran
#latex   texlive-latex

# como es makeinfo
#httpd   es apache
# accion-distro

################################3 #ALL

$funcion{'detecta-ALL'}=sub {
 #   system("cp contrib/detectahttpd /usr/bin");
                     #== 0  or die "System fail: $?\n";
 #   system("cp contrib/infosis /usr/bin");
                     #== 0  or die "System fail: $?\n";
};

############################## GRAL

$funcion{'gral-SUSE-RPM'}=sub {
       print "zypper install @_\n";
       system("zypper install @_");
       #autoconf automake gcc make texlive wget lsb-release svn2cl\
       #texlive-latex latex2html emacs gcc-fortran xz makeinfo 
};

$funcion{'gral-DEBIAN-DEB'}=sub {
       print "apt-get install @_\n";
       system("apt-get install @_");
#DEBIAN
#      system("apt-get install subversion lsb-release autoconf 
#         automake gcc gfortran\
#          texlive-latex-base tgif  emacs sudo rpm texinfo");

};
$funcion{'gral-GENTOO-DEB'}=sub {
       print "emerge @_\n";
       system("emerge @_");
#GENTOO
#system("emerge subversion sudo lsb-release wget 
#		virtual/emacs app-emacs/muse dev-util/svn2cl app-arch/dpkg");
};

$funcion{'gral-REDHAT-RPM'}=sub {
       print "yum -y install @_\n";
       system("yum -y install @_");
#REDHAT
#  system("yum -y install subversion subversion-svn2cl autoconf automake \
#   make gcc redhat-lsb gcc-gfortran wget\
#	 texinfo texlive-latex tgif emacs-muse httpd emacs latex2html xz");
#     system("rpmdev-setuptree")
};


#ojo con _ por - entre nombre de paquete y directorio debian
# el "gral" baja 112M

########### ordenar por paquete
################### SUSE

# sudo esta demas pues esto va sobre sudo
$funcion{'svn2cl-SUSE-RPM'}=sub {
   my $DIR="svn2cl-0.12";
   system("wget -P$PACKS -c http://arthurdejong.org/svn2cl/$DIR.tar.gz");
   system("sudo tar -zxvf $PACKS/$DIR.tar.gz -C /opt");
   system("sudo ln -s /opt/$DIR/svn2cl.sh /usr/local/bin");
   
};


$funcion{'muse-el-SUSE-RPM'}=sub {
   my $DIR="muse-latest";
   system("wget -P$PACKS -c http://mwolson.org/static/dist/$DIR.tar.gz");
   system("tar -zxvf $PACKS/$DIR.tar.gz -C$PACKS");
   system("make -C $PACKS/$DIR");
   system("sudo make install -C $PACKS/$DIR");
};

$funcion{'dpkg-SUSE-RPM'}=sub {
   my $DIR="dpkg_1.15.5.5";
   system("wget -P$PACKS-c http://ftp.de.debian.org/debian/pool/main/d/dpkg/$DIR.tar.bz2");
   system("tar -jxvf $PACKS/$DIR.tar.bz2 -C$PACKS");
   system("make -C $PACKS/$DIR");
   system("sudo make install -C $PACKS/$DIR");
};

$funcion{'tgif-SUSE-RPM'}=sub {
    system("zypper ar http://download.opensuse.org/repositories/openSUSE:/11.2:/Contrib/standard Contrib");
             # == 0  or die "System fail: $?\n";
   system("zypper install tgif");#== 0  or die "System fail: $?\n";
};

###########################3 REDHAT

$funcion{'rpm-REDHAT-RPM'}=sub {
    system("yum -y install rpm rpm-build rpmdevtools");
    system("rpmdev-setuptree");
    #rpm siempre esta, pero ... asi actualiza
};


##########################3 GENTOO

$funcion{'tgif-GENTOO-EBUILD'}=sub {
    system("emerge /usr/portage/media-gfx/tgif/tgif-4.1.45-r1.ebuild");#== 0  or die "System fail: $?\n";
};

$funcion{'latex2html-GENTOO-EBUILD'}=sub {
   
};

$funcion{'latex-GENTOO-EBUILD'}=sub {
    system("emerge USE=\"kpathsea\" texlive");
    system("emerge USE=\"kpathsea\" --nodeps latex-unicode");
};

$funcion{'xz-GENTOO-EBUILD'}=sub {
   system("emerge /usr/portage/app-arch/tar/tar-1.22.ebuild");
   system("emerge /usr/portage/app-arch/xz-utils/xz-utils-9999.ebuild");
};

$funcion{'rpm-GENTOO-EBUILD'}=sub {
#"rpm ultimo sin falla por magic"; 
    system("emerge /usr/portage/app-arch/rpm/rpm-5.1.6.ebuild");
};

################################3 DEBIAN

$funcion{'latex2html-DEBIAN-DEB'}=sub {
  #cat /etc/apt/sources.list| grep non-free>haynonfree
  #if ! test -s haynonfree; then
     system("echo deb http://http.us.debian.org/debian sid non-free >>/etc/apt/sources.list");
     system("apt-get update");
  #fi
  #esto se podria hacer en general y tener dos pasos, el previo y el general
  system("apt-get install latex2html");
}; 

##########################################3


my %accionesdistro;
my %accionesall;

my $estaen;
foreach (@faltan){
    #print "PACK $_\n";
    my $pack   =$paquetes->{$_}->{$DISTRO}->[0];
    my $accion =$paquetes->{$_}->{$DISTRO}->[1];
    $estaen='';
    if ($pack){
       $estaen=$DISTRO;
       if (scalar @{$accionesdistro{$accion}} == 0){
         $accionesdistro{$accion}=[$pack];  
       }else{
         $accionesdistro{$accion}=[@$accionesdistro{$accion},$pack];  
       }
      }else{
       $pack   =$paquetes->{$_}->{'ALL'}->[0];
       $accion =$paquetes->{$_}->{'ALL'}->[1];
       if ($pack){
           $estaen='ALL';
           if (scalar @{$accionesall{$accion}} == 0){
             $accionesall{$accion}=[$pack];  
           }else{
             $accionesall{$accion}=[@{$accionesall{$accion}},$pack];  
           }
       }
    }
    if ($estaen){
      print "$_: $pack - $estaen -$accion\n";
    }else{
      print "$_: Package no registrado\n";
      $accionesdistro{'gral'}=[@{$accionesdistro{'gral'}},$_];  
    }
}

print "GENERAL\n";
foreach my $accion (keys %accionesall){
    print "$accion: (";
    foreach (@{$accionesall{$accion}}){
        print "$_,";     
    }
    print ")";
    if (exists $funcion{"$accion-ALL"}){
	print "Funcion $accion-ALL:\n";
            $funcion{"$accion-ALL"}(@{$accionesall{$accion}});
        }else{
	    print "Sin funcion";
        }
    print "\n";
}

print "DISTRO: $DISTRO\n";
foreach my $accion (keys %accionesdistro){
    print "$accion: (";
    foreach (@{$accionesdistro{$accion}}){
        print "$_,";
        }
     print ")";
     if (exists $funcion{"$accion-$DISTRO"}){
	 print "Funcion $accion-$DISTRO:\n";
          $funcion{"$accion-$DISTRO"}(@{$accionesdistro{$accion}});
         }else{
	    print "Sin funcion: $accion-$DISTRO";
    }
    print "\n";
}




# en Fedora "rpm" puede ser rpm y rpm-build, raro que rpm no este pero el
#  rpm-build no viene por defecto
#rpmdev-setuptree crea la estructura de directorios en el dir de usuario
# en este caso root

$funcion{'svn2cl-SUSE-RPM'}=sub {
   my $DIR="svn2cl-0.12";
 
};

$funcion{'dpkg-SUSE-RPM'}=sub {
   my $DIR="dpkg_1.15.5.5";
   system("wget -P$PACKS-c http://ftp.de.debian.org/debian/pool/main/d/dpkg/$DIR.tar.bz2");
   system("tar -jxvf $PACKS/$DIR.tar.bz2 -C$PACKS");
   system("make -C $PACKS/$DIR");
   system("sudo make install -C $PACKS/$DIR");
};

$funcion{'tgif-SUSE-RPM'}=sub {
    system("zypper ar http://download.opensuse.org/repositories/openSUSE:/11.2:/Contrib/standard Contrib");
             # == 0  or die "System fail: $?\n";
   system("zypper install tgif");#== 0  or die "System fail: $?\n";
};













# avisar si estoy borrando ARGV

#foreach (@ARGV) {
# print "vvv $_ \n";
#}
#
#my $todo;
#if (not defined $moo{'installvar'}){
#    exit;
#}else{
## quizas un prepare para hacer sin sudo en forma previa a install
#    $todo="install";
#}
#--verbose --quiet --debug


#            "string=s"=>\$moo{stringmandatory},
#            "optional:s"=>\$moo{optionalstring},
#            "int=i"=> \$moo{mandatoryinteger},
#            "optint:i"=> \$moo{optionalinteger},
#            "float=f"=> \$moo{mandatoryfloat},
#            "optfloat:f"=> \$moo{optionalfloat});#

#foreach (keys %moo) {
# print "$_ = $moo{$_}\n";
#}

#print "Unprocessed by Getopt::Long\n" if $ARGV[0];


#exit;

#use Getopt::Std;
#%options=();
#getopts("hvi",\%options);
# like the shell getopt, "d:" means d takes an argument
#print "-i $options{o}\n" if defined $options{i};
#print "-h $options{d}\n" if defined $options{d};
#print "-v $options{f}\n" if defined $options{f};


