Implement ACL logic.

This commit is contained in:
László Valkó 2018-02-03 08:49:42 +01:00
parent eff4f2822d
commit 02e324723c
2 changed files with 98 additions and 9 deletions

View file

@ -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;

View file

@ -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);
}