Big collection 2

This commit is contained in:
Mario Fetka
2026-05-22 09:07:47 +02:00
parent 58a2e8da04
commit 2529e0e9dd
2 changed files with 236 additions and 27 deletions

236
apply.pl
View File

@@ -22,6 +22,8 @@
#
#
use Fcntl qw( O_WRONLY O_CREAT O_TRUNC );
sub read_smart_bindery_values()
{
my( $bind_server, $bind_user, $bind_pass ) = ( '', '', '' );
@@ -594,6 +596,39 @@ sub redirect_msg( $$ )
}
sub smart_log_level_value( $ )
{
my $level = $_[0];
$level = 'info' unless defined( $level ) && $level ne '';
$level = lc( $level );
return 0 if $level eq 'error';
return 1 if $level eq 'warning' || $level eq 'warn';
return 2 if $level eq 'info';
return 3 if $level eq 'debug';
return 4 if $level eq 'trace';
return 2;
}
sub smart_current_log_level()
{
my $level = 'info';
$level = $smart_debug_level if defined( $smart_debug_level ) && $smart_debug_level ne '';
$level = $smart_log_level if defined( $smart_log_level ) && $smart_log_level ne '';
return smart_log_level_value( $level );
}
sub smart_log_enabled( $ )
{
my $level = $_[0];
return smart_log_level_value( $level ) <= smart_current_log_level();
}
sub apply_log_line( $$ )
{
my( $level, $msg ) = @_;
@@ -601,12 +636,17 @@ sub apply_log_line( $$ )
$level = 'INFO' unless defined( $level ) && $level ne '';
$msg = '' unless defined( $msg );
return if ! smart_log_enabled( $level );
my( $sec, $min, $hour, $mday, $mon, $year ) = localtime( time() );
my $ts = sprintf( "%04d-%02d-%02d %02d:%02d:%02d",
$year + 1900, $mon + 1, $mday, $hour, $min, $sec );
my $version = defined( $smart_version ) && $smart_version ne '' ? $smart_version : '0.99.pl28';
my $line = '[' . $ts . '] [' . $level . '] [SMArT ' . $version . '] [apply.pl] ' . $msg . "\n";
my $level_text = uc( $level );
$level_text = 'WARNING' if $level_text eq 'WARN';
my $line = '[' . $ts . '] [' . $level_text . '] [SMArT ' . $version . '] [apply.pl] ' . $msg . "\n";
if( defined( $bindery_log_fh ) )
{
@@ -789,6 +829,17 @@ sub run_bindery_cmd( @ )
if( $rc != 0 )
{
my $exit = $rc >> 8;
# nwbprm is used as cleanup before setting a property again. If the
# property is already absent, nwbprm can return a failure with
# "Could not delete the property". That is harmless here and should not
# abort the whole save operation.
if( defined( $cmd[0] ) && $cmd[0] eq 'nwbprm' && $output =~ /Could not delete the property/i )
{
apply_log_line( 'INFO', 'bindery command skipped missing property cmd=' . $cmdline . ' output=' . $output );
return 1;
}
apply_log_line( 'ERROR', 'bindery command failed rc=' . $exit . ' cmd=' . $cmdline . ' output=' . $output );
bindery_error_page( 'Bindery command failed', $cmdline, $output );
return 0;
@@ -800,6 +851,144 @@ sub run_bindery_cmd( @ )
return 1;
}
sub apply_trace_log( $ )
{
apply_log_line( 'TRACE', $_[0] );
}
sub apply_debug_log( $ )
{
apply_log_line( 'DEBUG', $_[0] );
}
sub run_bindery_pipe( $$ )
{
my( $cmd, $payload ) = @_;
my $eval_error = '';
my $result = eval
{
$cmd = '' unless defined( $cmd );
$payload = '' unless defined( $payload );
apply_log_line( 'INFO', 'bindery pipe command: ' . $cmd );
my $log_payload = $payload;
$log_payload =~ s/\r/\\r/g;
$log_payload =~ s/\n/\\n/g;
$log_payload = substr( $log_payload, 0, 500 ) . '...' if length( $log_payload ) > 500;
apply_trace_log( 'bindery pipe payload=' . $log_payload );
apply_trace_log( 'bindery pipe trace: entered run_bindery_pipe' );
my $tmpdir = '/run/mars-nwe-webui';
$tmpdir = '/tmp' if ! -d $tmpdir || ! -w $tmpdir;
my $tmp = $tmpdir . '/smart-bindery-' . $$ . '-' . int( rand( 1000000 ) ) . '.in';
apply_trace_log( 'bindery pipe trace: temp file ' . $tmp );
my $tfh;
if( ! sysopen( $tfh, $tmp, O_WRONLY | O_CREAT | O_TRUNC, 0600 ) )
{
my $output = 'could not create temporary input file ' . $tmp . ': ' . $!;
apply_log_line( 'ERROR', 'bindery pipe command failed cmd=' . $cmd . ' output=' . $output );
bindery_error_page( 'Bindery command failed', $cmd, $output );
return 0;
}
apply_trace_log( 'bindery pipe trace: temp file opened' );
apply_trace_log( 'bindery pipe trace: writing payload via syswrite length=' . length( $payload ) );
my $offset = 0;
my $len = length( $payload );
while( $offset < $len )
{
my $written = syswrite( $tfh, $payload, $len - $offset, $offset );
if( ! defined( $written ) )
{
my $output = 'could not write temporary input file ' . $tmp . ': ' . $!;
close( $tfh );
unlink( $tmp );
apply_log_line( 'ERROR', 'bindery pipe command failed cmd=' . $cmd . ' output=' . $output );
bindery_error_page( 'Bindery command failed', $cmd, $output );
return 0;
}
if( $written == 0 )
{
my $output = 'could not write temporary input file ' . $tmp . ': zero bytes written';
close( $tfh );
unlink( $tmp );
apply_log_line( 'ERROR', 'bindery pipe command failed cmd=' . $cmd . ' output=' . $output );
bindery_error_page( 'Bindery command failed', $cmd, $output );
return 0;
}
$offset += $written;
}
apply_trace_log( 'bindery pipe trace: payload written bytes=' . $offset );
if( ! close( $tfh ) )
{
my $output = 'could not close temporary input file ' . $tmp . ': ' . $!;
unlink( $tmp );
apply_log_line( 'ERROR', 'bindery pipe command failed cmd=' . $cmd . ' output=' . $output );
bindery_error_page( 'Bindery command failed', $cmd, $output );
return 0;
}
apply_trace_log( 'bindery pipe trace: temp file closed' );
my $shell_cmd = $cmd . ' < ' . apply_shell_quote( $tmp );
apply_trace_log( 'bindery pipe shell command: ' . $shell_cmd );
my $output = `$shell_cmd 2>&1`;
my $rc = $?;
apply_trace_log( 'bindery pipe trace: shell command returned rc=' . ( $rc >> 8 ) );
unlink( $tmp );
apply_trace_log( 'bindery pipe trace: temp file removed' );
$output = '' unless defined( $output );
$output =~ s/\r//g;
if( $rc != 0 )
{
my $exit = $rc >> 8;
apply_log_line( 'ERROR', 'bindery pipe command failed rc=' . $exit . ' cmd=' . $cmd . ' output=' . $output );
bindery_error_page( 'Bindery command failed', $cmd, $output );
return 0;
}
$bindery_cmd_ok_count++;
apply_log_line( 'INFO', 'bindery pipe command ok cmd=' . $cmd . ( $output ne '' ? ' output=' . $output : '' ) );
return 1;
};
if( ! $result )
{
$eval_error = $@ if defined( $@ ) && $@ ne '';
if( $eval_error ne '' )
{
apply_log_line( 'ERROR', 'bindery pipe command died cmd=' . $cmd . ' error=' . $eval_error );
bindery_error_page( 'Bindery command failed', $cmd, 'internal error while running bindery pipe command: ' . $eval_error );
return 0;
}
return 0;
}
return 1;
}
sub run_shell_bindery_cmd( $ )
{
my $cmd = $_[0];
@@ -1001,7 +1190,7 @@ sub handle_request()
{
apply_log_line( 'INFO', 'UNIX_USER removal skipped for existing user ' . $c[2] );
}
return( 1 ) if ! run_bindery_cmd( 'nwbprm', '-S', $server, '-t', '1', '-o', $c[2], '-p', 'IDENTIFICATION' );
return( 1 ) if ! run_bindery_cmd( 'nwbprm', '-S', $server, '-t', '1', '-o', $c[2], '-p', 'IDENTIFICATION' );
return( 1 ) if ! run_bindery_cmd( 'nwbprm', '-S', $server, '-t', '1', '-o', $c[2], '-p', 'GROUPS_I\'M_IN' );
return( 1 ) if ! run_bindery_cmd( 'nwbprm', '-S', $server, '-t', '1', '-o', $c[2], '-p', 'SECURITY_EQUALS' );
}
@@ -1017,14 +1206,13 @@ return( 1 ) if ! run_bindery_cmd( 'nwbprm', '-S', $server, '-t', '1', '-o', $c[2
}
else
{
if( $should_update_unix_user )
if( $should_update_unix_user )
{
write_property_string( $c[2], 1, 'UNIX_USER', 0, 30, $p{unix_user} );
}
write_property_string( $c[2], 1, 'IDENTIFICATION', 0, 30, $p{fullname} );
open( FILE, '|' . 'nwbpset -S ' . $server );
print FILE <<EOF;
my $bindery_pipe_payload = <<EOF;
0001
$c[2]
GROUPS_I'M_IN
@@ -1035,14 +1223,13 @@ EOF
foreach $g ( @g )
{
$g =~ s/^group_//;
print( FILE '0002' . "\n", $g . "\n" );
$bindery_pipe_payload .= '0002' . "\n" . $g . "\n";
system( 'nwbpadd -S ' . $server . ' -o ' . $g . ' -t 2 -p GROUP_MEMBERS ' . $id . ' > /dev/null' );
}
close( FILE );
return( 1 ) if ! run_bindery_pipe( 'nwbpset -S ' . $server, $bindery_pipe_payload );
open( FILE, '|' . 'nwbpset -S ' . $server );
print FILE <<EOF;
my $bindery_pipe_payload = <<EOF;
0001
$c[2]
SECURITY_EQUALS
@@ -1053,9 +1240,9 @@ EOF
foreach $g ( @g )
{
$g =~ s/^group_//;
print( FILE '0002' . "\n", $g . "\n" );
$bindery_pipe_payload .= '0002' . "\n" . $g . "\n";
}
close( FILE );
return( 1 ) if ! run_bindery_pipe( 'nwbpset -S ' . $server, $bindery_pipe_payload );
if( $p{password} ne '' )
{
@@ -1084,15 +1271,14 @@ EOF
if( $c[2] eq 'add_new' )
{
return( 1 ) if ! run_bindery_cmd( 'nwbocreate', '-S', $server, '-t', '2', '-o', $p{name} );
open( FILE, '|' . 'nwbpset -S ' . $server );
print FILE <<EOF;
my $bindery_pipe_payload = <<EOF;
0002
$p{name}
GROUP_MEMBERS
2
31
EOF
close( FILE );
return( 1 ) if ! run_bindery_pipe( 'nwbpset -S ' . $server, $bindery_pipe_payload );
$c[2] = $p{name};
}
else
@@ -1109,8 +1295,7 @@ EOF
{
write_property_string( $c[2], 2, 'IDENTIFICATION', 0, 30, $p{fullname} );
open( FILE, '|' . 'nwbpset -S ' . $server );
print FILE <<EOF;
my $bindery_pipe_payload = <<EOF;
0002
$c[2]
OBJ_SUPERVISORS
@@ -1122,9 +1307,9 @@ EOF
{
my @g = split( '_', $g );
print( FILE $g[1] . "\n", $g[2] . "\n" );
$bindery_pipe_payload .= $g[1] . "\n" . $g[2] . "\n";
}
close( FILE );
return( 1 ) if ! run_bindery_pipe( 'nwbpset -S ' . $server, $bindery_pipe_payload );
}
bindery_success_page( 'Group saved', 'Group bindery settings were saved successfully.', '/settings/groups' );
@@ -1146,18 +1331,16 @@ EOF
return( 1 ) if ! run_bindery_cmd( 'nwbocreate', '-S', $server, '-t', '3', '-o', $p{name} );
$c[2] = $p{name};
open( FILE, '|' . 'nwbpset -S ' . $server );
print FILE <<EOF;
my $bindery_pipe_payload = <<EOF;
0003
$c[2]
Q_SERVERS
2
31
EOF
close( FILE );
return( 1 ) if ! run_bindery_pipe( 'nwbpset -S ' . $server, $bindery_pipe_payload );
open( FILE, '|' . 'nwbpset -S ' . $server );
print FILE <<EOF;
my $bindery_pipe_payload = <<EOF;
0003
$c[2]
Q_USERS
@@ -1166,10 +1349,9 @@ Q_USERS
0002
EVERYONE
EOF
close( FILE );
return( 1 ) if ! run_bindery_pipe( 'nwbpset -S ' . $server, $bindery_pipe_payload );
open( FILE, '|' . 'nwbpset -S ' . $server );
print FILE <<EOF;
my $bindery_pipe_payload = <<EOF;
0003
$c[2]
Q_OPERATORS
@@ -1178,7 +1360,7 @@ Q_OPERATORS
0001
SUPERVISOR
EOF
close( FILE );
return( 1 ) if ! run_bindery_pipe( 'nwbpset -S ' . $server, $bindery_pipe_payload );
}
else
{