X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=gosa-si%2Fgosa-si-server;h=9d92dc9971e4d9fe7c5f66a4cce57c8c4eca45d4;hb=d077b1abf78c1919e7f949c50b155d35d321e82a;hp=b822c4b655e02bc2f7a3c46a2a058b344b870a2d;hpb=f4b42c2d143c0f4a43b0f6272a22ba83b7ba87fa;p=gosa.git diff --git a/gosa-si/gosa-si-server b/gosa-si/gosa-si-server index b822c4b65..9d92dc997 100755 --- a/gosa-si/gosa-si-server +++ b/gosa-si/gosa-si-server @@ -144,6 +144,8 @@ my %repo_files=(); my $repo_path; my %repo_dirs=(); +my $server_status_hash = { 'developmental'=>'revision', 'stable'=>'release'}; + # Variables declared in config file are always set to 'our' our (%cfg_defaults, $log_file, $pid_file, $pid, $server_ip, $server_port, $ClientPackages_key, $dns_lookup, @@ -275,7 +277,6 @@ my $messaging_file_name; our $client_fai_log_dir = "/var/log/fai"; # queue which stores taskes until one of the $max_children children are ready to process the task -#my @tasks = qw(); my @msgs_to_decrypt = qw(); my $max_children = 2; @@ -564,93 +565,6 @@ sub daemon_log { } } - -#=== FUNCTION ================================================================ -# NAME: check_cmdline_param -# PARAMETERS: nothing -# RETURNS: nothing -# DESCRIPTION: validates commandline parameter -#=============================================================================== -sub check_cmdline_param () { - my $err_counter = 0; - - # Check configuration file - if(not defined($cfg_file)) { - $cfg_file = "/etc/gosa-si/server.conf"; - if(! -r $cfg_file) { - print STDERR "Please specify a config file.\n"; - $err_counter++; - } - } - - # Prepare identification which gosa-si parts should be debugged and which not - if (defined $debug_parts) - { - if ($debug_parts =~ /^\d+$/) - { - $debug_parts_bitstring = unpack("B32", pack("N", $debug_parts)); - } - else - { - print STDERR "Value '$debug_parts' invalid for option d (number expected)\n"; - $err_counter++; - } - } - - # Exit if an error occour - if( $err_counter > 0 ) { &usage( "", 1 ); } -} - - -#=== FUNCTION ================================================================ -# NAME: check_pid -# PARAMETERS: nothing -# RETURNS: nothing -# DESCRIPTION: handels pid processing -#=============================================================================== -sub check_pid { - $pid = -1; - # Check, if we are already running - if( open( my $LOCK_FILE, "<", "$pid_file" ) ) { - $pid = <$LOCK_FILE>; - if( defined $pid ) { - chomp( $pid ); - if( -f "/proc/$pid/stat" ) { - my($stat) = `cat /proc/$pid/stat` =~ m/$pid \((.+)\).*/; - if( $stat ) { - print STDERR "\nERROR: Already running!\n"; - close( $LOCK_FILE ); - exit -1; - } - } - } - close( $LOCK_FILE ); - unlink( $pid_file ); - } - - # create a syslog msg if it is not to possible to open PID file - if (not sysopen(my $LOCK_FILE, $pid_file, O_WRONLY|O_CREAT|O_EXCL, 0644)) { - my($msg) = "Couldn't obtain lockfile '$pid_file' "; - if (open(my $LOCK_FILE, '<', $pid_file) - && ($pid = <$LOCK_FILE>)) - { - chomp($pid); - $msg .= "(PID $pid)\n"; - } else { - $msg .= "(unable to read PID)\n"; - } - if( ! ($foreground) ) { - openlog( $0, "cons,pid", "daemon" ); - syslog( "warning", $msg ); - closelog(); - } - else { - print( STDERR " $msg " ); - } - exit( -1 ); - } -} - #=== FUNCTION ================================================================ # NAME: import_modules # PARAMETERS: module_path - string - abs. path to the directory the modules @@ -735,23 +649,22 @@ sub password_check { # DESCRIPTION: handle tasks to be done before signal becomes active #=============================================================================== sub sig_int_handler { - my ($signal) = @_; + my ($signal) = @_; # if (defined($ldap_handle)) { # $ldap_handle->disconnect; # } - # TODO alle verbliebenden ldap verbindungen aus allen heaps beenden +# TODO all ldap connections shoudl be closed - daemon_log("shutting down gosa-si-server", 1); - - $global_kernel->yield('shutdown'); + daemon_log("shutting down gosa-si-server", 1); - # to be removed rather crude !! - #system("kill `ps -C gosa-si-server -o pid=`"); + # asking the poe kernel to shutdown the server + $global_kernel->yield(TCP_SERVER => 'shutdown'); - $pid->remove or warn "Could not remove $pid_file\n"; + # removing the pidfile + $pid->remove or warn "Could not remove $pid_file\n"; - exit(0); + exit(0); } $SIG{INT} = \&sig_int_handler; @@ -1870,25 +1783,25 @@ sub process_task { } sub session_start { - my ($kernel) = $_[KERNEL]; - $global_kernel = $kernel; - $kernel->yield('register_at_foreign_servers'); + my ($kernel) = $_[KERNEL]; + $global_kernel = $kernel; + $kernel->yield('register_at_foreign_servers'); $kernel->yield('create_fai_server_db', $fai_server_tn ); $kernel->yield('create_fai_release_db', $fai_release_tn ); $kernel->sig(USR1 => "sig_handler"); $kernel->sig(USR2 => "recreate_packages_db"); $kernel->delay_set('watch_for_new_jobs', $job_queue_loop_delay); $kernel->delay_set('watch_for_done_jobs', $job_queue_loop_delay); - $kernel->delay_set('watch_for_modified_jobs', $modified_jobs_loop_delay); + $kernel->delay_set('watch_for_modified_jobs', $modified_jobs_loop_delay); $kernel->delay_set('watch_for_new_messages', $messaging_db_loop_delay); - $kernel->delay_set('watch_for_delivery_messages', $messaging_db_loop_delay); + $kernel->delay_set('watch_for_delivery_messages', $messaging_db_loop_delay); $kernel->delay_set('watch_for_done_messages', $messaging_db_loop_delay); - $kernel->delay_set('watch_for_old_known_clients', $job_queue_loop_delay); + $kernel->delay_set('watch_for_old_known_clients', $job_queue_loop_delay); - # Start opsi check - if ($opsi_enabled eq "true") { - $kernel->delay_set('watch_for_opsi_jobs', $job_queue_opsi_delay); - } + # Start opsi check + if ($opsi_enabled eq "true") { + $kernel->delay_set('watch_for_opsi_jobs', $job_queue_opsi_delay); + } } @@ -3620,6 +3533,69 @@ sub control_server_registration { return; } +sub start_daemon { + + #to prevent zombie child + $SIG{CHLD} = 'IGNORE'; + + if( ! $foreground ) { + chdir '/' or die "Can't chdir to /: $!"; + umask 0; + open STDIN, '+>/dev/null' or die "Can't read /dev/null: $!"; + open STDOUT, '+>&STDIN' or die "Can't write to /dev/null: $!"; + open STDERR, '+>&STDIN' or die "Can't write to /dev/null: $!"; + defined($pid = fork) or die "Can't fork: $!"; + exit if $pid; + setsid or die "Can't start a new session: $!"; + } + return; +} + +sub put_version { + + # parse head url and revision from svn + $server_version =~ /^\$HeadURL: (\S+) \$:\$Rev: (\d+) \$$/; + $server_headURL = defined $1 ? $1 : 'unknown' ; + $server_revision = defined $2 ? $2 : 'unknown' ; + if ($server_headURL =~ /\/tag\// || + $server_headURL =~ /\/branches\// ) { + $server_status = "stable"; + } else { + $server_status = "developmental" ; + } + return; +} + +sub get_perms_admin { +# Determine root uid and adm gid, used for creating log files + $root_uid = getpwnam('root'); + $adm_gid = getgrnam('adm'); + if(not defined $adm_gid){ + $adm_gid = getgrnam('root'); + } + return; +} + +sub open_log { + # Prepare log file and set permissions + open(my $log, ">>", "$log_file"); + close($log); + chmod(0440, $log_file); + chown($root_uid, $adm_gid, $log_file); + + return; +} + +sub create_pid { + # Create the PID object + $pid = File::Pid->new({ file => $pid_file }); + + # Write the PID file + $pid->write; + + return; +} + # #==== MAIN = main ============================================================== # @@ -3645,68 +3621,24 @@ if( defined $dump_config ) { # read and set config parameters &read_configfile($config, %cfg_defaults); -#&check_pid; - -# not sure but seems to be for igonring phantom -$SIG{CHLD} = 'IGNORE'; - -# Create the PID object -# -$pid = File::Pid->new({ - file => $pid_file, -}); - -# Write the PID file -$pid->write; - -# forward error messages to logfile -if( ! $foreground ) { - open( STDIN, '+>/dev/null' ); - open( STDOUT, '+>&STDIN' ); - open( STDERR, '+>&STDIN' ); -} - -# Just fork, if we are not in foreground mode -if( ! $foreground ) { - chdir '/' or die "Can't chdir to /: $!"; - $pid = fork; - setsid or die "Can't start a new session: $!"; - umask 0; -#} else { -# $pid = $$; -} - -# Do something useful - put our PID into the pid_file -#if( 0 != $pid ) { -# open( my $LOCK_FILE, ">", "$pid_file" ); -# print $LOCK_FILE "$pid\n"; -# close( $LOCK_FILE ); -# if( !$foreground ) { -# exit( 0 ) -# }; -#} - -# parse head url and revision from svn -my $server_status_hash = { 'developmental'=>'revision', 'stable'=>'release'}; -$server_version =~ /^\$HeadURL: (\S+) \$:\$Rev: (\d+) \$$/; -$server_headURL = defined $1 ? $1 : 'unknown' ; -$server_revision = defined $2 ? $2 : 'unknown' ; -if ($server_headURL =~ /\/tag\// || - $server_headURL =~ /\/branches\// ) { - $server_status = "stable"; -} else { - $server_status = "developmental" ; -} -# Prepare log file and set permissions -$root_uid = getpwnam('root'); -$adm_gid = getgrnam('adm'); -open(my $FH, ">>", "$log_file"); -close($FH); -chmod(0440, $log_file); -chown($root_uid, $adm_gid, $log_file); + +# daemonize the program +&start_daemon($pid, $foreground); + +# create pid file +&create_pid($pid, $pid_file); + +# Determine root uid and adm gid, used for creating log files +&get_perms_admin($root_uid, $adm_gid); + +# put version +&put_version($server_status_hash, $server_version, $server_headURL, $server_revision, $server_status); + +#open log file +&open_log($root_uid, $adm_gid, $log_file); # prepare directory for databases -mkpath('/var/lib/gosa-si', 0, {owner=>'root', group=>'root'}); +mkpath('/var/lib/gosa-si', 0, {owner=>'root', group=>'root', mode=> '0755'}); # remove leftover files in tmp for packaged.db populate rmtree( '/tmp/packages_list_db',0,1); @@ -3717,7 +3649,6 @@ unlink '/tmp/gosa_si_tmp_sources_list'; # remove marker that the list creation is in progress unlink '/tmp/packages_list_creation_in_progress'; - daemon_log(" ", 1); daemon_log("$0 started!", 1); daemon_log("status: $server_status", 1); @@ -3765,67 +3696,40 @@ daemon_log($server_status_hash->{$server_status}.": $server_revision", 1); daemon_log("0 INFO: Removing SQLlite lock files", 1); - # delete old DBsqlite lock files - system('rm -f /var/lib/gosa-si/*.si_lock*'); - + # delete old DBsqlite lock files to be replace by rmtree !! + system('rm -f /var/lib/gosa-si/*.si.lock*'); + #rmtree( '/var/lib/gosa-si/',0,1); + # connect to incoming_db unlink($incoming_file_name); $incoming_db = ("GOsaSI::".$db_module)->new($incoming_file_name); - #chmod(0640, $incoming_file_name); - #chown($root_uid, $adm_gid, $incoming_file_name); - + # connect to gosa-si job queue $job_db = ("GOsaSI::".$db_module)->new($job_queue_file_name); - #chmod(0640, $job_queue_file_name); - #chown($root_uid, $adm_gid, $job_queue_file_name); # connect to known_clients_db - #unlink($known_clients_file_name); $known_clients_db = ("GOsaSI::".$db_module)->new($known_clients_file_name); - #chmod(0640, $known_clients_file_name); - #chown($root_uid, $adm_gid, $known_clients_file_name); # connect to foreign_clients_db - #unlink($foreign_clients_file_name); $foreign_clients_db = ("GOsaSI::".$db_module)->new($foreign_clients_file_name); - #chmod(0640, $foreign_clients_file_name); - #chown($root_uid, $adm_gid, $foreign_clients_file_name); # connect to known_server_db - #unlink($known_server_file_name); # do not delete, gosa-si-server should be forced to check config file and dns at each start $known_server_db = ("GOsaSI::".$db_module)->new($known_server_file_name); - #chmod(0640, $known_server_file_name); - #chown($root_uid, $adm_gid, $known_server_file_name); # connect to login_usr_db - #unlink($login_users_file_name); $login_users_db = ("GOsaSI::".$db_module)->new($login_users_file_name); - #chmod(0640, $login_users_file_name); - #chown($root_uid, $adm_gid, $login_users_file_name); # connect to fai_server_db - #unlink($fai_server_file_name); $fai_server_db = ("GOsaSI::".$db_module)->new($fai_server_file_name); - #chmod(0640, $fai_server_file_name); - #chown($root_uid, $adm_gid, $fai_server_file_name); # connect to fai_release_db - #unlink($fai_release_file_name); $fai_release_db = ("GOsaSI::".$db_module)->new($fai_release_file_name); - #chmod(0640, $fai_release_file_name); - #chown($root_uid, $adm_gid, $fai_release_file_name); # connect to packages_list_db - #unlink($packages_list_under_construction); $packages_list_db = ("GOsaSI::".$db_module)->new($packages_list_file_name); - #chmod(0640, $packages_list_file_name); - #chown($root_uid, $adm_gid, $packages_list_file_name); # connect to messaging_db - #unlink($messaging_file_name); $messaging_db = ("GOsaSI::".$db_module)->new($messaging_file_name); - #chmod(0640, $messaging_file_name); - #chown($root_uid, $adm_gid, $messaging_file_name); } } @@ -3876,6 +3780,7 @@ if ($opsi_enabled eq "true") { $opsi_client = new JSON::RPC::Client; } +daemon_log("0 INFO: start socket for incoming xml messages at port '$server_port' ", 1); POE::Component::Server::TCP->new( Alias => "TCP_SERVER", @@ -3911,8 +3816,6 @@ POE::Component::Server::TCP->new( } ); -daemon_log("0 INFO: start socket for incoming xml messages at port '$server_port' ", 1); - # create session for repeatedly checking the job queue for jobs POE::Session->create( inline_states => {