]>
git.proxmox.com Git - pve-manager.git/blob - PVE/APLInfo.pm
9 use POSIX
qw(strftime);
12 my $logfile = "/var/log/pveam.log";
13 my $aplinfodir = "/var/lib/pve-manager/apl-info";
16 my ($logfd, $msg) = @_;
20 my $tstr = strftime
("%F %H:%M:%S", localtime);
22 foreach my $line (split (/\n/, $msg)) {
23 print $logfd "$tstr $line\n";
27 sub read_aplinfo_from_fh
{
28 my ($fh, $list, $source, $update) = @_;
32 while (my $rec = <$fh>) {
39 if ($rec =~ s/^Description:\s*([^\n]*)(\n\s+.*)*$//si) {
40 $res->{headline
} = $1;
45 $res->{description
} = $long;
46 } elsif ($rec =~ s/^Version:\s*(.*\S)\s*\n//i) {
48 if ($version =~ m/^(\d[a-zA-Z0-9\.\+\-\:\~]*)(-(\d+))?$/) {
49 $res->{version
} = $version;
51 my $msg = "unable to parse appliance record: version = '$version'\n";
52 $update ?
die $msg : warn $msg;
54 } elsif ($rec =~ s/^Type:\s*(.*\S)\s*\n//i) {
56 if ($type =~ m/^(openvz|lxc)$/) {
59 my $msg = "unable to parse appliance record: unknown type '$type'\n";
60 $update ?
die $msg : warn $msg;
62 } elsif ($rec =~ s/^([^:]+):\s*(.*\S)\s*\n//) {
65 my $msg = "unable to parse appliance record: $rec\n";
66 $update ?
die $msg : warn $msg;
72 if ($res->{'package'} eq 'pve-web-news' && $res->{description
}) {
73 $list->{'all'}->{$res->{'package'}} = $res;
77 $res->{section
} = 'unknown' if !$res->{section
};
79 if ($res->{'package'} && $res->{type
} && $res->{os
} && $res->{version
} &&
82 if ($res->{location
}) {
83 $template = $res->{location
};
84 $template =~ s
|.*/([^/]+.tar
.[gx
]z
)$|$1|;
85 if ($res->{location
} !~ m
|^([a-zA-Z
]+)\
://|) {
86 # relative localtion (no http:// prefix)
87 $res->{location
} = "$source/$res->{location}";
90 my $arch = $res->{architecture
} || 'i386';
91 $template = "$res->{os}-$res->{package}_$res->{version}_$arch.tar.gz";
92 $template =~ s/$res->{os}-$res->{os}-/$res->{os}-/;
93 $res->{location
} = "$source/$res->{section}/$template";
95 $res->{source
} = $source;
96 $res->{template
} = $template;
97 $list->{$res->{section
}}->{$template} = $res;
98 $list->{'all'}->{$template} = $res;
100 my $msg = "found incomplete appliance records\n";
101 $update ?
die $msg : warn $msg;
107 my ($filename, $list, $source, $update) = @_;
109 my $fh = IO
::File-
>new("<$filename") ||
110 die "unable to open file '$filename' - $!\n";
112 eval { read_aplinfo_from_fh
($fh, $list, $source, $update); };
123 my ($ua, $url, $file, $logfh) = @_;
125 my $req = HTTP
::Request-
>new(GET
=> $url);
127 logmsg
($logfh, "start download $url");
128 my $res = $ua->request($req, $file);
130 if ($res->is_success) {
131 logmsg
($logfh, "download finished: " . $res->status_line);
135 logmsg
($logfh, "download failed: " . $res->status_line);
140 sub download_aplinfo
{
141 my ($ua, $aplurl, $host, $logfd) = @_;
143 my $aplsrcurl = "$aplurl/aplinfo.dat.gz";
144 my $aplsigurl = "$aplurl/aplinfo.dat.asc";
146 my $tmp = "$aplinfodir/pveam-${host}.tmp.$$";
147 my $tmpgz = "$tmp.gz";
148 my $sigfn = "$tmp.asc";
152 if (url_get
($ua, $aplsigurl, $sigfn, $logfd) != 0) {
153 die "update failed - no signature file '$sigfn'\n";
156 if (url_get
($ua, $aplsrcurl, $tmpgz, $logfd) != 0) {
157 die "update failed - no data file '$aplsrcurl'\n";
161 PVE
::Tools
::run_command
(["gunzip", "-f", $tmpgz]);
163 die "update failed: unable to unpack '$tmpgz'\n" if $@;
168 my $trustedkeyring = "/usr/share/doc/pve-manager/trustedkeys.gpg";
169 my $cmd = "/usr/bin/gpgv -q --keyring $trustedkeyring $sigfn $tmp";
174 logmsg
($logfd, "signature verification: $line");
177 PVE
::Tools
::run_command
($cmd,
179 errfunc
=> $logfunc);
181 die "unable to verify signature - $@\n" if $@;
185 read_aplinfo
($tmp, {}, $aplurl, 1);
187 die "update failed: $@" if $@;
189 if (!rename($tmp, "$aplinfodir/$host")) {
190 die "update failed: unable to store data\n";
193 logmsg
($logfd, "update successful");
205 sub get_apl_sources
{
208 push @$urls, "http://download.proxmox.com/images";
209 push @$urls, "https://releases.turnkeylinux.org/pve";
218 if (($size = (-s
$logfile) || 0) > (1024*50)) {
219 rename($logfile, "$logfile.0");
221 my $logfd = IO
::File-
>new (">>$logfile");
222 logmsg
($logfd, "starting update");
224 my $ua = LWP
::UserAgent-
>new;
225 my $release = PVE
::pvecfg
::release
();
226 $ua->agent("PVE/$release");
229 $ua->proxy(['http', 'https'], $proxy);
234 my $urls = get_apl_sources
();
239 foreach my $aplurl (@$urls) {
241 my $uri = URI-
>new($aplurl);
242 my $host = $uri->host();
243 download_aplinfo
($ua, $aplurl, $host, $logfd);
246 logmsg
($logfd, $err);
247 push @dlerr, $aplurl;
253 return 0 if scalar(@dlerr);
260 my $urls = get_apl_sources
();
264 foreach my $aplurl (@$urls) {
268 my $uri = URI-
>new($aplurl);
269 my $host = $uri->host();
270 read_aplinfo
("$aplinfodir/$host", $list, $aplurl);