#!/usr/bin/perl -w
require Digest::MD5;
my $base = $ARGV[0];
my $arg1 = $ARGV[1] || die((“\\t”x3).”Deb2Droid v0.1 by Xianur0\\n\\nUse: ./export.pl [pool dir] [deb]\\n”);
my @packages = ($arg1);
our @extraidos = ();
our @depsinstaladas = ();
my $install = 1;
system(“mkdir var && mkdir var/lib && mkdir var/lib/dpkg && mkdir var/lib/dpkg/info”);
open STATUS,”>>var/lib/dpkg/status”;
sub copiar {
my ($origen,$destino) = @_;
open(FILES,”<”.$origen) || return 0;
my $contenido = “”;
binmode FILES;
while(<FILES>) {
$contenido .=$_;
}
close(FILES);
open FILED,”>”.$destino;
binmode FILED;
print FILED $contenido;
close(FILED);
}
sub locatedep {
my ($dir,$dep) = @_;
$dir .= “/” if($dir !~ /\\/$/);
my @files = <$dir*>;
foreach my $file (@files) {
my $tmpfile = $file;
$tmpfile =~ s/^.+\\///g;
if(-d $file) {
if($file !~ /^\\.+$/){
return 1 if(locatedep($file,$dep));
}
}
elsif(-f $file && $dep eq substr($tmpfile,0,length($dep)) && $file =~ /u?deb$/) {
print “[-] Posible paquete encontrado: “.$dep.” ? “.$file.”\\n”;
print “ar x “.$file.” && (tar -xzvf data.tar.gz > archivos.list) && tar -xzvf control.tar.gz 2>&1\\n”;
if($install == 1){
print “[-] Extrayendo paquete…\\n”;
return 1 if(extract($file,$dep));
}
}
}
return 0;
}
sub in_array
{
my ($arr,$search_for) = @_;
my %items = map {$_ => 1} @$arr; # create a hash out of the array values
return (exists($items{$search_for}))?1:0;
}
sub finddeps {
my $searchpackagename = “”;
$searchpackagename = $_[0] if($#_ >= 0);
$searchpackagename = “” unless defined $searchpackagename;
open CONTROL,”<control” || return;
open MD5,”<md5sums”;
open CONFFILES,”<conffiles”;
my $control = “”;
my $md5 = “”;
my $conffiles = “”;
return unless(fileno(MD5));
while(<CONTROL>) {
$control.=$_;
}
close(CONTROL);
my $packagename = “”;
$packagename = $1 if($control =~ /Package: ([^\\r\\n]+)/);
print “Paquete: “.$searchpackagename.”=? “.$packagename.”\\n”;
if($searchpackagename ne “” && $searchpackagename ne $packagename) {
return 0;
}
if(fileno(MD5)){
while(<MD5>) {
$md5.=$_;
}
close(MD5);
}
my $status = “Status: install ok not-installed”;
if(fileno(CONFFILES)) {
while(<CONFFILES>) {
my $f = $_;
$f =~ s/[\\r\\n]+//g;
open F, “.”.$f;
my $cf = “”;
while(<F>){
$cf .= $_;
}
$conffiles.=” “.$f.” “.Digest::MD5::md5_hex($cf).”\\n”;
}
close(CONFFILES);
$control =~ s/(Description:\\s+)/Conffiles:\\n$conffiles$1/;
$status = “Status: install reinstreq half-configured”;
}
checkmd5($md5);
my $depsstring = “”;
$depsstring = $1 if($control =~ /Depends: ([^\\r\\n]+)/);
copiar(“archivos.list”,”var/lib/dpkg/info/”.$packagename.”.list”);
copiar(“postinst”,”var/lib/dpkg/info/”.$packagename.”.postinst”);
copiar(“preinst”,”var/lib/dpkg/info/”.$packagename.”.preinst”);
copiar(“postrm”,”var/lib/dpkg/info/”.$packagename.”.postrm”);
copiar(“prerm”,”var/lib/dpkg/info/”.$packagename.”.prerm”);
open MD5OUT,”>>var/lib/dpkg/info/”.$packagename.”.md5sums”;
print MD5OUT $md5;
$md5 = “”;
if($depsstring eq “”){
print “[-] Sin dependencias… continuando…\\n”;
return 1;
}
my @deps = ($depsstring =~ /[^\\,]+/g);
my $i = 0;
for $dep (@deps) {
$dep =~ s/^\\s+//g;
my $version = $dep;
$version =~ s/(.+\\()//g;
$version =~ s/\\)//g;
my $condicion = “”;
if($version=~/^(>|>=|<=|==|<)\\s+([\\:\\.\\d]+)$/){
($condicion,$version) = ($1,$2);
} else {$version=”";}
$dep =~ s/\\s+.+$//g;
$deps[$i] = $dep;
$i++;
}
print “[-]Instalando dependencias….\\n\\n”;
for $dep (@deps) {
my $cdep = $#deps;
if(!in_array(\\@depsinstaladas,$dep)){
push(@depsinstaladas,$dep);
print “[-] Buscando paquete: “.$dep.”…\\n”;
if(!locatedep($base,$dep)) {
die(“\\n[!] No se pudo resolver la dependencia: “.$dep.”\\n”);
}
}
}
print “[-] Agregando a status…\\n”;
$control =~s/^Package\\:([^\\r\\n]+)/Package:$1\\n$status/;
print $control.”\\n”;
print STATUS $control.”\\n\\n”;
print “[-] Instaladas!\\n”;
return 1;
}
sub extract {
my ($p,$packname) = @_;
if(in_array(\\@extraidos,$p)){
return 1;
}
push(@extraidos,$p);
my $descarte = “”;
system(“ar x “.$p.” && (tar -xzvf data.tar.gz > archivos.list) && tar -xzvf control.tar.gz 2>&1″);
my $estado = finddeps($packname);
system(“rm md5sums 2>&1 | rm control 2>&1 | rm archivos.list 2>&1 | rm debian 2>&1 | rm debian-binary 2>&1 | rm conffiles 2>&1 | rm postinst 2>&1 | rm preinst 2>&1 | rm postrm 2>&1 | rm prerm 2>&1 | rm data.tar.gz 2>&1 | rm control.tar.gz 2>&1 | echo “);
return $estado;
}
sub checkmd5 {
my $md5 = $_[0];
my @lineas = split(/[\\r\\n]/,$md5);
for $linea (@lineas) {
my ($md5,$objeto) = ($linea =~ /^([\\w\\d]+)\\s+(.+)$/);
open OBJETO,”<”.$objeto;
binmode OBJETO;
my $bin = “”;
while(<OBJETO>){
$bin .=$_;
}
my $md5real = Digest::MD5::md5_hex($bin);
unless($md5 eq $md5real) {
die(“\\n[!] MD5 incorrecto: “.$md5.”!=”.$md5real.” en: ${objeto}\\n”);
} else {
print “\\r[-] Probando MD5: ${md5} ${md5real} ${objeto}\\r”;
}
}
print “\\n[-] MD5′s correctos!\\n”;
}
for $package (@packages){
extract($base.$package);
}
print “[-] Paquete y dependencias extraidos correctamente!\\n”;