script zum erstellen einer pkgtools.conf

d4mi4n

volksoperator on duty
hiho, ich hab mir ein script gebastelt das mir in die pkgtools.conf alle make argumente der auf einem system installierten ports einträgt.

jetz die frage: ist es falsch wenn ich für alle versionen eines ports die gleichen argumente nehme?

ist halt blöd wenn ein installierter port durch portupgrade einen erheblichen versionssprung macht, neue argumente werden nicht beachtet und veraltete stehen unnütz da drin
 
Hallo d4mi4n,

ist halt blöd wenn ein installierter port durch portupgrade einen erheblichen versionssprung macht, neue argumente werden nicht beachtet und veraltete stehen unnütz da drin
Du hast Dir die Antwort gerade selbst gegeben :D


Viele Grüße

Jürgen
 
so habs endlich fertig, danke an die ircler :D

man sollte nur ein MAKE_ARGS in der datei haben, wenn aus der sample datei zufällig noch ein "# MAKE_ARGS blah" drinsteht bekommt man die liste 2mal in seine datei geklatscht, also überall da wo MAKE_ARGS {} steht

nicht sonderlich schön aber es funzt

edit:
die make args gelten dann für alle versionen der einzelnen ports, also am besten doch noch drüberschaun wenn ein großer versionssprung eines ports ansteht

Code:
#!/usr/bin/perl
use strict;

my $optfile = "/var/db/ports/*/options";
my @filelist;
my @portname;
my @args;
my $stringargs;
my $pkgtools = "/usr/local/etc/pkgtools.conf";
my $contentpkgtools;
my @out;


# gespeicherte make args auslesen und alles pkgtoolskonform zusammenbasteln
@filelist = glob($optfile);
push(@args, "MAKE_ARGS = {\n");
foreach (@filelist){
	
	@portname = split(/\//,$_);
	push(@args, "'$portname[4]-*' => [");
	open (F, $_);
	foreach (<F>){
		if ($_ =~/^WITH/){
			chomp($_);
			push(@args, "'$_',\n");
		}
	}
	push(@args, "],\n\n");
}
push(@args, "}\n");

#pkgtools.conf auslesen
open (F, "<$pkgtools") or die "ERROR: $!";
$contentpkgtools = join("",<F>); #array -> string
close F;
	
#make_args ersetzten
$stringargs = join("",@args); #array -> string
$contentpkgtools =~ s/MAKE_ARGS.*\}/$stringargs/s;	

#datei schreiben
@out = split("\n",$contentpkgtools); #string -> array
open (F, ">$pkgtools") or die "ERROR: $!";
foreach(@out){
	print F $_,"\n";
}
close F;
 
Zuletzt bearbeitet:
Perl arbeitet zwar nach dem Timtowtdi-Prinzip, aber dennoch sollte man auf seinen Code etwas acht geben. :)

So koennte das Ganze aussehen, wenn man sich etwas an perlstyle(1) haelt und auf Orgien mit Datenstrukturen verzichtet:
Code:
#!/usr/bin/perl -w
# vim: set sw=4 ts=4
use strict;
use warnings;

my $portsdir    = '/var/db/ports/';
my $conffile    = '/usr/local/etc/pkgtools.conf';
my $options             = {};
my $make_args   = "MAKE_ARGS = {\n";

# da globs deprecated und unsicher sind, sollte man auf readdir zurueckgreifen.
opendir(DIR, $portsdir) || die "da fehlt etwas: $!";
foreach my $dir (readdir(DIR))
{
        my $optfile = $portsdir . $dir . '/options';
        next unless -f $optfile;

        # datei gibts -> WITH krams holen..
        open(FILE, '<', $optfile) || next;
        chomp(my @targets = grep m/^WITH/, <FILE>);
        close(FILE);

        # keine optionen -> kein eintrag noetig
        next unless @targets;
        $make_args .= "'$dir' => '". join(" ", @targets). "', \n";
}
closedir(DIR);
$make_args .= '}';

open(FILE, '<', $conffile) || die "hier fehlt auch etwas: $!";
my @temp = <FILE>;
close(FILE);

# wenn man zeilenweise nach anfang und ende sucht, kann man sehr vielen
# problemen aus dem weg gehen.
# - kein aerger mit interpolation / evaluation
# - gierige ausdruecke sind 'weniger' gefaehrlich
# - man kann kommentare auch ohne /msg beachten
# ...
my ($from, $to);
for my $lc (0 .. $#temp)
{
        # anfang finden, kommentare beachten!
        $from = $lc if $temp[$lc] =~ m/^\s*MAKE_ARGS/;

        # kein anfang -> kein ende
        next unless $from;

        # ende finden
        $to = $lc if $temp[$lc] =~ m/^\s*\}/;

        # beides da -> die suche hat ein ende
        last if $to;
}

# MAKE_ARGS entfernen
splice @temp, $from, ($to - $from) +1;

# MAKE_ARGS einfuegen
splice @temp, $from, 0, $make_args;

# datei ausgeben (STDOUT durch anderes filehandle ersetzen)
print STDOUT @temp;

Viel Spass beim Perlen! :)

Sebastian
 
Zurück
Oben