APLInfo: split out code into read_aplinfo_from_fh
So that we can call the parser for any $fh. Add new type 'lxc'.
This commit is contained in:
parent
2b2502c06c
commit
bfc517c083
144
PVE/APLInfo.pm
144
PVE/APLInfo.pm
@ -48,82 +48,86 @@ sub logmsg {
|
||||
}
|
||||
}
|
||||
|
||||
sub read_aplinfo_from_fh {
|
||||
my ($fh, $list, $source, $update) = @_;
|
||||
|
||||
local $/ = "";
|
||||
|
||||
while (my $rec = <$fh>) {
|
||||
chomp $rec;
|
||||
|
||||
my $res = {};
|
||||
|
||||
while ($rec) {
|
||||
|
||||
if ($rec =~ s/^Description:\s*([^\n]*)(\n\s+.*)*$//si) {
|
||||
$res->{headline} = $1;
|
||||
my $long = $2;
|
||||
$long =~ s/\n\s+/ /g;
|
||||
$long =~ s/^\s+//g;
|
||||
$long =~ s/\s+$//g;
|
||||
$res->{description} = $long;
|
||||
} elsif ($rec =~ s/^Version:\s*(.*\S)\s*\n//i) {
|
||||
my $version = $1;
|
||||
if ($version =~ m/^(\d[a-zA-Z0-9\.\+\-\:\~]*)-(\d+)$/) {
|
||||
$res->{version} = $version;
|
||||
} else {
|
||||
my $msg = "unable to parse appliance record: version = '$version'\n";
|
||||
$update ? die $msg : warn $msg;
|
||||
}
|
||||
} elsif ($rec =~ s/^Type:\s*(.*\S)\s*\n//i) {
|
||||
my $type = $1;
|
||||
if ($type =~ m/^(openvz|lxc)$/) {
|
||||
$res->{type} = $type;
|
||||
} else {
|
||||
my $msg = "unable to parse appliance record: unknown type '$type'\n";
|
||||
$update ? die $msg : warn $msg;
|
||||
}
|
||||
} elsif ($rec =~ s/^([^:]+):\s*(.*\S)\s*\n//) {
|
||||
$res->{lc $1} = $2;
|
||||
} else {
|
||||
my $msg = "unable to parse appliance record: $rec\n";
|
||||
$update ? die $msg : warn $msg;
|
||||
$res = {};
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
||||
if ($res->{'package'} eq 'pve-web-news' && $res->{description}) {
|
||||
$list->{'all'}->{$res->{'package'}} = $res;
|
||||
next;
|
||||
}
|
||||
|
||||
$res->{section} = 'unknown' if !$res->{section};
|
||||
|
||||
if ($res->{'package'} && $res->{type} && $res->{os} && $res->{version} &&
|
||||
$res->{infopage}) {
|
||||
my $template;
|
||||
if ($res->{location}) {
|
||||
$template = $res->{location};
|
||||
$template =~ s|.*/([^/]+.tar.gz)|$1|;
|
||||
} else {
|
||||
$template = "$res->{os}-$res->{package}_$res->{version}_i386.tar.gz";
|
||||
$template =~ s/$res->{os}-$res->{os}-/$res->{os}-/;
|
||||
}
|
||||
$res->{source} = $source;
|
||||
$res->{template} = $template;
|
||||
$list->{$res->{section}}->{$template} = $res;
|
||||
$list->{'all'}->{$template} = $res;
|
||||
} else {
|
||||
my $msg = "found incomplete appliance records\n";
|
||||
$update ? die $msg : warn $msg;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub read_aplinfo {
|
||||
my ($filename, $list, $source, $update) = @_;
|
||||
|
||||
my $fh = IO::File->new("<$filename") ||
|
||||
die "unable to open file '$filename' - $!\n";
|
||||
|
||||
local $/ = "";
|
||||
|
||||
eval {
|
||||
while (my $rec = <$fh>) {
|
||||
chomp $rec;
|
||||
|
||||
my $res = {};
|
||||
|
||||
while ($rec) {
|
||||
|
||||
if ($rec =~ s/^Description:\s*([^\n]*)(\n\s+.*)*$//si) {
|
||||
$res->{headline} = $1;
|
||||
my $long = $2;
|
||||
$long =~ s/\n\s+/ /g;
|
||||
$long =~ s/^\s+//g;
|
||||
$long =~ s/\s+$//g;
|
||||
$res->{description} = $long;
|
||||
} elsif ($rec =~ s/^Version:\s*(.*\S)\s*\n//i) {
|
||||
my $version = $1;
|
||||
if ($version =~ m/^(\d[a-zA-Z0-9\.\+\-\:\~]*)-(\d+)$/) {
|
||||
$res->{version} = $version;
|
||||
} else {
|
||||
my $msg = "unable to parse appliance record: version = '$version'\n";
|
||||
$update ? die $msg : warn $msg;
|
||||
}
|
||||
} elsif ($rec =~ s/^Type:\s*(.*\S)\s*\n//i) {
|
||||
my $type = $1;
|
||||
if ($type =~ m/^(openvz)$/) {
|
||||
$res->{type} = $type;
|
||||
} else {
|
||||
my $msg = "unable to parse appliance record: unknown type '$type'\n";
|
||||
$update ? die $msg : warn $msg;
|
||||
}
|
||||
} elsif ($rec =~ s/^([^:]+):\s*(.*\S)\s*\n//) {
|
||||
$res->{lc $1} = $2;
|
||||
} else {
|
||||
my $msg = "unable to parse appliance record: $rec\n";
|
||||
$update ? die $msg : warn $msg;
|
||||
$res = {};
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
||||
if ($res->{'package'} eq 'pve-web-news' && $res->{description}) {
|
||||
$list->{'all'}->{$res->{'package'}} = $res;
|
||||
next;
|
||||
}
|
||||
|
||||
$res->{section} = 'unknown' if !$res->{section};
|
||||
|
||||
if ($res->{'package'} && $res->{type} && $res->{os} && $res->{version} &&
|
||||
$res->{infopage}) {
|
||||
my $template;
|
||||
if ($res->{location}) {
|
||||
$template = $res->{location};
|
||||
$template =~ s|.*/([^/]+.tar.gz)|$1|;
|
||||
} else {
|
||||
$template = "$res->{os}-$res->{package}_$res->{version}_i386.tar.gz";
|
||||
$template =~ s/$res->{os}-$res->{os}-/$res->{os}-/;
|
||||
}
|
||||
$res->{source} = $source;
|
||||
$res->{template} = $template;
|
||||
$list->{$res->{section}}->{$template} = $res;
|
||||
$list->{'all'}->{$template} = $res;
|
||||
} else {
|
||||
my $msg = "found incomplete appliance records\n";
|
||||
$update ? die $msg : warn $msg;
|
||||
}
|
||||
}
|
||||
};
|
||||
eval { read_aplinfo_from_fh($fh, $list, $source, $update); };
|
||||
my $err = $@;
|
||||
|
||||
close($fh);
|
||||
|
@ -27,7 +27,7 @@ Package, Section, Version, Maintainer, Description
|
||||
|
||||
Additionally we define the following fields:
|
||||
|
||||
Type: openvz | qemu
|
||||
Type: openvz | qemu | lxc
|
||||
OS: Operating system type
|
||||
Location: download url
|
||||
Infopage: url to additional info
|
||||
|
Loading…
Reference in New Issue
Block a user