Arsip ‘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.
Komentar (1)









