Code

Tagged 2.7.3
[gosa.git] / gosa-si / gosa-si-server
index 9765c3ebe9679d38b40530f417ac2e440f19838c..093acd2a956fd00958955b7fec31a0087b6e0dfe 100755 (executable)
@@ -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,
@@ -163,7 +165,6 @@ our $server_mac_address;
 our $gosa_address;
 our $no_arp;
 our $forground;
-our $cfg_file;
 our ($ldap_uri, $ldap_base, $ldap_admin_dn, $ldap_admin_password, $ldap_server_dn, $ldap_version, $ldap_retry_sec);
 our ($mysql_username, $mysql_password, $mysql_database, $mysql_host);
 our $known_modules;
@@ -174,7 +175,7 @@ our $verbose= 0;
 our $global_kernel;
 
 # where is the config stored by default and his name
-our $config = '/etc/gosa-si/server.conf';
+our $cfg_file = '/etc/gosa-si/server.conf';
 
 # by default dumping of config is undefined
 our $dump_config = undef;
@@ -275,7 +276,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 +564,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,24 +648,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);
+       daemon_log("shutting down gosa-si-server", 1);
 
-# should be done with the alias TCP_SERVER
-               $global_kernel->yield('shutdown');
+       # asking the poe kernel to shutdown the server
+       $global_kernel->yield(TCP_SERVER => 'shutdown');
 
-               # to be removed rather crude !!
-               #system("kill `ps -C gosa-si-server -o pid=`");
+       # removing the pidfile
+       $pid->remove or warn "Could not remove $pid_file\n";
 
-               $pid->remove or warn "Could not remove $pid_file\n";
-
-               exit(0);
+       exit(0);
 }
 $SIG{INT} = \&sig_int_handler;
 
@@ -1871,25 +1782,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);
+       }
 
 }
 
@@ -3621,6 +3532,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 ==============================================================
 #
@@ -3628,7 +3602,7 @@ sub control_server_registration {
 Getopt::Long::Configure( 'bundling' );
 GetOptions( 'v|verbose+' => \$verbose,
             'h|help' => \&usage,
-            'c|config=s' => \$config,
+            'c|config=s' => \$cfg_file,
             'x|dump-config=i' => \$dump_config,
             'f|foreground' => \$foreground,
                                                'd=s' => \$debug_parts)
@@ -3645,69 +3619,25 @@ 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);
+&read_configfile($cfg_file, %cfg_defaults);
+
+# 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);
@@ -3718,7 +3648,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);
@@ -3773,61 +3702,33 @@ daemon_log($server_status_hash->{$server_status}.": $server_revision", 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);
     }
 }
 
@@ -3878,6 +3779,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",
@@ -3913,8 +3815,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 => {