use strict;
use warnings;
+
+use Carp;
use Digest::SHA;
+
use PVE::Exception qw(raise_param_exc);
use PVE::JSONSchema qw(get_standard_option);
-use Data::Dumper;
-
my $defaultData = {
options => {},
plugins => {},
sub options {
return {};
-}
+}
sub plugindata {
return {};
-}
+}
sub createSchema {
my ($class, $skip_type) = @_;
sub lookup {
my ($class, $type) = @_;
+ croak "cannot lookup undefined type!" if !defined($type);
+
my $pdata = $class->private();
my $plugin = $pdata->{plugins}->{$type};
my ($class) = @_;
my $pdata = $class->private();
-
+
return [ sort keys %{$pdata->{plugins}} ];
}
return $value if $key eq 'type' && $type eq $value;
my $opts = $pdata->{options}->{$type};
- die "unknown section type '$type'\n" if !$opts;
+ die "unknown section type '$type'\n" if !$opts;
die "unexpected property '$key'\n" if !defined($opts->{$key});
$raw = '' if !defined($raw);
my $digest = Digest::SHA::sha1_hex($raw);
-
+
my $pri = 1;
my $lineno = 0;
my @lines = split(/\n/, $raw);
my $nextline = sub {
- while (my $line = shift @lines) {
+ while (defined(my $line = shift @lines)) {
$lineno++;
- return $line if $line !~ /^\s*(?:#|$)/;
+ return $line if ($line !~ /^\s*#/);
}
};
- while (my $line = &$nextline()) {
+ my $errors = [];
+ while (@lines) {
+ my $line = $nextline->();
+ next if !$line;
+
my $errprefix = "file $filename line $lineno";
my ($type, $sectionId, $errmsg, $config) = $class->parse_section_header($line);
}
}
- while ($line = &$nextline()) {
+ while ($line = $nextline->()) {
next if $ignore; # skip
$errprefix = "file $filename line $lineno";
if ($line =~ m/^\s+(\S+)(\s+(.*\S))?\s*$/) {
my ($k, $v) = ($1, $3);
-
+
eval {
die "duplicate attribute\n" if defined($config->{$k});
$config->{$k} = $plugin->check_value($type, $k, $v, $sectionId);
};
- warn "$errprefix (section '$sectionId') - unable to parse value of '$k': $@" if $@;
+ if (my $err = $@) {
+ warn "$errprefix (section '$sectionId') - unable to parse value of '$k': $err";
+ push @$errors, {
+ context => $errprefix,
+ section => $sectionId,
+ key => $k,
+ err => $err,
+ };
+ }
} else {
warn "$errprefix (section '$sectionId') - ignore config line: $line\n";
}
}
-
- my $cfg = { ids => $ids, order => $order, digest => $digest};
+ my $cfg = {
+ ids => $ids,
+ order => $order,
+ digest => $digest
+ };
+ $cfg->{errors} = $errors if scalar(@$errors) > 0;
return $cfg;
}
my $maxpri = 0;
foreach my $sectionId (keys %$ids) {
- my $pri = $order->{$sectionId};
+ my $pri = $order->{$sectionId};
$maxpri = $pri if $pri && $pri > $maxpri;
}
foreach my $sectionId (keys %$ids) {
if (!defined ($order->{$sectionId})) {
$order->{$sectionId} = ++$maxpri;
- }
+ }
}
foreach my $sectionId (sort {$order->{$a} <=> $order->{$b}} keys %$ids) {