Archive for the ‘Perl’ Tag

DEB Banyak Yg Rusak?

Menjengkelkan sekali! Setelah diperiksa dg md5sum, ternyata banyak berkas deb yg rusak (md5sum FAILED). Jika hanya satu-dua berkas hal ini tidak masalah namun jika belasan?

Di tulisan sebelumnya, hasil pemeriksaan saya simpan di /tmp/cekmd5sum.txt, maka untuk mendapatkan daftar berkas yg rusak dpt dg cara:

grep FAILED /tmp/cekmd5sum.txt | sort -k2 > /tmp/chkfailed.txt

Selanjutnya, adalah menggandakan ulang berkas-2 yg ada di /tmp/chkfailed.txt. Untuk membantu pekerjaan yg menjemukan ini, kamu bisa menggunkan skrip kesayanganmu.

Saya tulis skrip berikut:


#!/usr/bin/perl

my $badfile = $ARGV[0];
my $md5sum = $ARGV[1];

if (! -r $badfile or ! -r $md5sum)
{
print “Usage: mymd5.pl badfilelist md5sumfile\n”;
exit;
}

my @bads;
my @md5;

die “Can not open $badfile” if (!open(BADF,”<$badfile”));
while (my $l=)
{
chomp($l);
my @f = split /: /,$l;
$bads[$#bads+1] = $f[0];
}
close BADF;

die “Can not open $md5sum” if (!open(MD5,”<$md5sum”));
while (my $l=)
{
chomp($l);

foreach my $i (@bads)
{ $md5[$#md5+1] = $l if (index($l,” $i”)>=0); }
}
close MD5;

print join (“\n”,@md5);

Simpan dg nama mymd5.pl (atau nama lain, sesukamu). Skrip ini berfungsi untuk mendapatkan daftar md5sum dari berkas-2 yg rusak (FAILED). Cara memakainya adalah:

mymd5.pl /tmp/chkfailed.txt /home/sihab/ubuntu/MD5SUMS > /tmp/badmd5.txt

Lanjut….

#!/usr/bin/perl

my $md5sum = $ARGV[0];
my $src=”/media/cdrom”;

die “Can not open \”$md5sum\”” if (!open(MD5,”<$md5sum”));
while (my $l=)
{
chomp($l);
my @f = split ‘ ‘,$l;
print “* “.$f[1].”\n”;
my $m = readpipe (‘md5sum ‘.$f[1]);
chomp ($m);
if ($m ne $l)
{
print “-exp: $l\n-act: $m\n”;
if (-r “$src/”.$f[1])
{
my $cmd = “cp $src/”.$f[1].” “.$f[1];
system ($cmd);
print ” copy\n”;
my $m = readpipe (‘md5sum ‘.$f[1]);
chomp ($m);
if ($m ne $l) { print “ERROR: checksum is different after copy!\n”; }
}
else
{ print ” * Pls use another source!\n”; }
}
else { print ” ok\n”; }
}
close MD5;

Simpan dg nama copyifbad.pl. Masukkan DVD Repo, lalu jalankan:

copyifbad.pl /tmp/badmd5.txt

Bila muncul : * Pls use another source! maka DVD harus diganti dg yg lain.

* N.B. : Jgn lupa untuk mengubah hak akses ke excutable tiap-2 skrip.

Powered by ScribeFire.

Membuat Berkas MD5SUMS Repo Lokal

Menyambung tulisan sebelumnya , untuk memastikan bahwa berkas-2 yg digandakan ke HD tidak ada kerusakan atau sama dg yg di DVD adalah dg memeriksa checksum tiap-2 berkas.

Ada beberapa cara untuk mendapatkan daftar checksum. Yg pertama adalah menggabungkan berkas-2 MD5SUMS tiap-2 DVD.

1. Masukkan DVD 1
2. Di Terminal, masuk ke direktori repo
cd /home/sihab/ubuntu

3. Gandakan berkas MD5SUMS
cp /media/cdrom/MD5SUMS .

4. Masukkan DVD 2
5. Tambahkan berkas di DVD ke HD
cat /media/cdrom/MD5SUMS >> MD5SUMS

6. Lakukan hal yg sama untuk DVD 3,4,5

Namun Anda harus melakukan proses pembersihan karena MD5SUMS di DVD berisi juga checksum berkas-2 Packages*.

Cara lainnya adalah mengambil checksum yg tertera di berkas-2 Packages di tiap-2 komponen. Cara ini agak rumit, namun saya tulis di sini karena akan saya gunakan untuk keperluan lain.

Salin skrip Perl berikut:

#!/usr/bin/perl

my $VERSION = ‘1.0-20071220’;
my $DISTRO = ‘gutsy’;

my $main_Path = ‘/home/sihab/ubuntu’;
my @packfiles = (
“$main_Path/dists/$DISTRO/main/binary-i386/Packages”,
“$main_Path/dists/$DISTRO/multiverse/binary-i386/Packages”,
“$main_Path/dists/$DISTRO/restricted/binary-i386/Packages”,
“$main_Path/dists/$DISTRO/universe/binary-i386/Packages” );

my %packlist;

sub doReadPackages
{
my $packf = $_[0];
return if (!open (PACKF, “<$packf”));
while (my $l=)
{
my @f = split /: /,$l;
if ( $f[0] eq ‘Package’)
{
chomp ($f[1]);
$packlist{$f[1]} = $l;

READDESC: while ($l=)
{
last READDESC if ( $l eq “\n”);
$packlist{$f[1]} .= $l;
}
}
}
close PACKF;
}

sub getfield #(f,packagestr)
{
my $f = $_[0];
my $packagestr = $_[1];
my @l = split /\n/,$packagestr;
my $desc;
foreach my $i (@l)
{
my @x = split /: /,$i;
if ($f eq ‘Description’)
{
if ($x[0] eq $f)
{ $desc = $x[1]; }
elsif ($i =~ /^ /)
{ $desc .= “\n”.$i; }
elsif ($desc)
{ return $desc; }
}
elsif ($f eq $x[0])
{
return $x[1];
}
}
return $desc;
}

sub createMD5SUMFile
{
my @l;
foreach my $i (keys(%packlist))
{
my $md = getfield (‘MD5sum’, $packlist{$i});
my $fn = getfield (‘Filename’, $packlist{$i});
$l[$#l+1] = “$md $fn”;
}
return if (!open(MD5,”>MD5SUMS”));
print MD5 join “\n”,@l;
close MD5;
}

sub doCreateDistroMD5DUM
{
foreach my $i (@packfiles) { doReadPackages ($i); }
createMD5SUMFile;
exit;
}

doCreateDistroMD5DUM;

Lalu simpan. Jgn lupa merubah akses ke executable. Jalankan di lokasi repo.

Periksa checksum dg:
md5sum -c MD5SUMS | tee /tmp/cekmd5sum.txt

Untuk mencari berkas yg bermasalah gunakan grep:
grep FAILED /tmp/cekmd5sum.txt

Powered by ScribeFire.

%d blogger menyukai ini: