Implement ACL logic.
This commit is contained in:
parent
eff4f2822d
commit
02e324723c
14
logging.pm
14
logging.pm
|
@ -207,13 +207,6 @@ sub get_win_version ()
|
|||
return $osmajor.'.'.$osminor;
|
||||
}
|
||||
|
||||
sub get_win_build ()
|
||||
{
|
||||
my ($osver, $osmajor, $osminor, $osbuild) = Win32::GetOSVersion();
|
||||
|
||||
return $osbuild;
|
||||
}
|
||||
|
||||
sub get_default_vars (;$)
|
||||
{
|
||||
my ($config) = @_;
|
||||
|
@ -233,8 +226,11 @@ sub get_default_vars (;$)
|
|||
}
|
||||
$$vars{arch} = $arch;
|
||||
$$vars{xarch} = $xarch;
|
||||
$$vars{osversion} = get_win_version();
|
||||
$$vars{osbuild} = get_win_build();
|
||||
my ($osver, $osmajor, $osminor, $osbuild) = Win32::GetOSVersion();
|
||||
$$vars{osversion} = $osmajor.'.'.$osminor;
|
||||
$$vars{osmajor} = $osmajor;
|
||||
$$vars{osminor} = $osmajor;
|
||||
$$vars{osbuild} = $osbuild;
|
||||
$$vars{programfiles32} = $programfiles32;
|
||||
$$vars{pkgtooldir} = $pkgtool_dir;
|
||||
$$vars{logdir} = $log_base_dir if defined $log_base_dir;
|
||||
|
|
93
pkgtool.pm
93
pkgtool.pm
|
@ -478,6 +478,18 @@ my $global_cfg_syntax = {
|
|||
Type => 'string'
|
||||
}
|
||||
},
|
||||
'directory' => {
|
||||
Type => 'string'
|
||||
},
|
||||
'acls' => {
|
||||
Type => 'list',
|
||||
Elements => {
|
||||
Type => 'list',
|
||||
Elements => {
|
||||
Type => 'string'
|
||||
}
|
||||
}
|
||||
},
|
||||
'user' => {
|
||||
Type => 'string'
|
||||
},
|
||||
|
@ -2890,6 +2902,84 @@ sub handle_mbr ($$$$)
|
|||
return 1;
|
||||
}
|
||||
|
||||
sub do_acls ($$$)
|
||||
{
|
||||
my ($pkg, $directory, $acls) = @_;
|
||||
|
||||
foreach my $acl (@$acls) {
|
||||
my $sourcefile = $ENV{systemroot}.'\\System32\\icacls.exe';
|
||||
my $paramlist = [$directory, @$acl];
|
||||
my $result = [];
|
||||
my ($error, $exitcode) = run_exe('global', undef, undef, undef, $sourcefile, $paramlist, 0, $result);
|
||||
if (defined $error) {
|
||||
print_log('global', ERROR, 'Error setting ACL %s for directory %s: %s', join(',', map { '"'.$_.'"' } @$acl), $directory, $error);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub do_directory ($$)
|
||||
{
|
||||
my ($pkg, $directory) = @_;
|
||||
|
||||
if (! -d $directory) {
|
||||
print_log('global', DEBUG1, 'Creating directory %s', $directory);
|
||||
if (! mkdir($directory)) {
|
||||
print_log('global', ERROR, 'Error creating directory %s: %s', $directory, $!);
|
||||
return 0;
|
||||
}
|
||||
my $acls = $$pkg{acls};
|
||||
if (defined $acls) {
|
||||
my $rc = do_acls($pkg, $directory, $acls);
|
||||
if (! $rc) {
|
||||
print_log('global', DEBUG1, 'Removing directory %s', $directory);
|
||||
if (! rmdir($directory)) {
|
||||
print_log('global', ERROR, 'Error removing directory %s: %s', $directory, $!);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub handle_directory ($$$$$)
|
||||
{
|
||||
my ($config, $pkg, $base_directory, $counters, $update) = @_;
|
||||
|
||||
my $name = $$pkg{name};
|
||||
my $vars = get_default_vars($config);
|
||||
set_datetime_vars($vars);
|
||||
my $directory = substitute_variables($vars, $$pkg{'directory'}, 1, $base_directory, 'global');
|
||||
|
||||
my $found = -d $directory;
|
||||
if ($found) {
|
||||
print_log('global', WARNING, 'Directory %s to create: %s exists - OK',
|
||||
$name, $directory);
|
||||
}
|
||||
else {
|
||||
print_log('global', DEBUG1, 'Directory %s not found', $directory);
|
||||
print_log('global', WARNING, 'Directory %s to create: %s does not exist - %s',
|
||||
$name, $directory, $update? 'creating' : 'CREATE');
|
||||
if ($update) {
|
||||
my $rc = do_directory($pkg, $directory);
|
||||
if (! $rc) {
|
||||
push @{$$counters{FailList}}, $name;
|
||||
$$counters{FailCount}++;
|
||||
return 0;
|
||||
}
|
||||
push @{$$counters{InstalledList}}, $name;
|
||||
$$counters{InstalledCount}++;
|
||||
}
|
||||
else {
|
||||
push @{$$counters{ToInstallList}}, $name;
|
||||
$$counters{ToInstallCount}++;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub handle_user ($$$)
|
||||
{
|
||||
my ($pkg, $counters, $update) = @_;
|
||||
|
@ -3047,6 +3137,9 @@ sub handle_pkg ($$$$$$)
|
|||
if (defined $$pkg{'user'}) {
|
||||
return handle_user($pkg, $counters, $update);
|
||||
}
|
||||
if (defined $$pkg{'directory'}) {
|
||||
return handle_directory($config, $pkg, $base_directory, $counters, $update);
|
||||
}
|
||||
if (defined $$pkg{'mbr-source-file'}) {
|
||||
return handle_mbr($config, $pkg, $counters, $update);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue