From 02e324723c077287c3a8151ccffe7d46d1861e3a Mon Sep 17 00:00:00 2001 From: Valko Laszlo Date: Sat, 3 Feb 2018 08:49:42 +0100 Subject: [PATCH] Implement ACL logic. --- logging.pm | 14 +++----- pkgtool.pm | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 9 deletions(-) diff --git a/logging.pm b/logging.pm index 3a08db9..440071f 100644 --- a/logging.pm +++ b/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; diff --git a/pkgtool.pm b/pkgtool.pm index 7509514..15e4ca4 100644 --- a/pkgtool.pm +++ b/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); }