diff --git a/gosa-si/gosa-si-client b/gosa-si/gosa-si-client
index f048269b98e04a6a8560601464effb227197a275..56200d9964557078bc8530c094f7acf8de4b250f 100755 (executable)
--- a/gosa-si/gosa-si-client
+++ b/gosa-si/gosa-si-client
#
#*********************************************************************
+=head1 NAME
+
+gosa-si-client - Client for GOsa support infrastructure
+
+=head1 SYNOPSIS
+
+gosa-si-client [-hvf] [-c config]
+
+=head1 OPTIONS
+
+B<-h>, B<--help>
+ print out this help message
+
+B<-v>, B<--verbose>
+ be verbose (multiple v's will increase verbosity)
+ -v ERROR level
+ -vvv WARNING + ERROR level
+ -vvvvv INFO + WARNING level
+ -vvvvvvv DEBUG + INFO level
+ -vvvvvvvvv in and out going xml messages will be displayed
+
+B<-f>, B<--foreground>
+ foregroud, process will not be forked to background
+
+B<-c> I<file>, B<--config=>I<file>
+ configuration file, default F</etc/gosa-si/client.conf>
+
+B<-x> <dump>
+ dump configuration to stdout
+ ( 1 = current, 2 = default )
+
+=head1 DESCRIPTION
+
+B<gosa-si-client> belongs to the support infrastructure of GOsa.
+The client registrates at a GOsa-SI-server and accepts messages from it.
+Each message is related to a working instruction which will be executed on the client.
+Depending on the message an answer can be send back to the server.
+
+=head1 BUGS
+
+Please report any bugs, or post any suggestions, to the GOsa mailing list <gosa-devel@oss.gonicus.de> or to <https://oss.gonicus.de/labs/gosa>
+
+
+=head1 LICENCE AND COPYRIGHT
+
+This code is part of GOsa (L<http://www.gosa-project.org>)
+
+Copyright (C) 2003-2010 GONICUS GmbH
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+=cut
+
use strict;
use warnings;
use IO::Socket::INET;
use NetAddr::IP;
use Crypt::Rijndael;
-use GOsaSI::GosaSupportDaemon;
use Digest::MD5 qw(md5_hex md5 md5_base64);
use MIME::Base64;
use XML::Simple;
use File::Basename;
use File::Spec;
+use File::Pid;
use Net::ARP;
+use GOsaSI::GosaSupportDaemon;
use POE qw(Component::Server::TCP Wheel::FollowTail Wheel::Run);
use Fcntl;
my $event_dir = "/usr/lib/gosa-si/client/events";
use lib "/usr/lib/gosa-si/client/events";
-my (%cfg_defaults, $foreground, $verbose, $pid_file, $procid, $pid, $log_file, $fai_logpath);
+my (%cfg_defaults, $foreground, $pid_file, $procid, $pid, $log_file, $fai_logpath);
my ($server_ip, $server_port, $server_timeout, $server_domain, $server_key_lifetime);
my ($client_port, $ldap_enabled, $ldap_config, $pam_config, $nss_config);
my ($root_uid, $adm_gid);
my $gotoHardwareChecksum;
my $system_com;
my $servers_string;
-$verbose= 1;
+
+my $client_status_hash = { 'developmental'=>'revision', 'stable'=>'release'};
# globalise variables which are used in imported events
our $global_kernel;
our $server_key;
our $terminal_server_hash;
our $opts_dnslookup;
+our $verbose= 0;
# where is the config stored by default and his name
-our $config = '/etc/fts/fts.conf';
+our $config = '/etc/gosa-si/client.conf';
# by default dumping of config is undefined
our $dump_config = undef;
-
# default variables
my $REGISTERED = 0;
# path to fifo for non-gosa-si-client messages to gosa-si-server
-my $fai_com_fifo = "/var/run/gosa-si-client.socket";
-my $system_com_fifo = "/var/run/gosa-si-client-system-com.socket";
+my $fai_com_fifo = "/var/run/gosa-si/gosa-si-client.socket";
+my $system_com_fifo = "/var/run/gosa-si/gosa-si-client-system-com.socket";
my %files_to_watch = (fai_fifo => $fai_com_fifo, system_fifo => $system_com_fifo);
# in function register_at_gosa_si_server, after which period of seconds a new registration should be tried if a registration was not successful until now
}
}
-
-#=== FUNCTION ================================================================
-# NAME: check_cmdline_param
-# PARAMETERS:
-# RETURNS:
-# DESCRIPTION:
-#===============================================================================
-sub check_cmdline_param () {
- my $err_config;
- my $err_counter = 0;
- if(not defined($cfg_file)) {
- $cfg_file = "/etc/gosa-si/client.conf";
- if(! -r $cfg_file) {
- $err_config = "please specify a config file";
- $err_counter += 1;
- }
- }
- if( $err_counter > 0 ) {
- &usage( "", 1 );
- if( defined( $err_config)) { print STDERR "$err_config\n"}
- print STDERR "\n";
- exit( -1 );
- }
-}
-
-
-#=== FUNCTION ================================================================
-# NAME: check_pid
-# PARAMETERS:
-# RETURNS:
-# DESCRIPTION:
-#===============================================================================
-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( $0 eq $stat ) {
- 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(LOCK_FILE, $pid_file, O_WRONLY|O_CREAT|O_EXCL, 0644)) {
- my($msg) = "Couldn't obtain lockfile '$pid_file' ";
- if (open(my $LOCK_FILE2, '<', $pid_file)
- && ($pid = <$LOCK_FILE2>))
- {
- 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 );
- }
-}
-
#############################
#
# @brief When caching an interrupt remove file pid and stopping gosa-si
daemon_log("shutting down gosa-si-client", 1);
-# to be changed crude !!
-# system("kill `ps -C gosa-si-server -o pid=`");
+ # shtudown the client by telling the poe kernel
$global_kernel->yield('shutdown');
-
-# $pid->remove or warn "Could not remove $pidfile\n";
+
+ #removing the opts file
+ unlink ('/var/run/gosa-si/gosa-si-client.opts');
+
+ #removing the fifo for communication
+ unlink ($fai_com_fifo);
+
+ #removing the pid
+ $pid->remove or warn "Could not remove $pid_file\n";
exit(0);
}
@logged_in_user_list = split(/\s/, $result);
}
- system("echo 'CURRENTLY_LOGGED_IN ".join(" ", @logged_in_user_list)."' > /var/run/gosa-si-client.socket");
+ system("echo 'CURRENTLY_LOGGED_IN ".join(" ", @logged_in_user_list)."' > /var/run/gosa-si/gosa-si-client.socket");
$kernel->delay_set('trigger_logged_in_users_report', $trigger_logged_in_users_report_delay);
} else {
# try it in 10 sec again
sub find_servers {
# add gosa-si-server address from config file at first position of server list
- my $server_check_cfg = Config::IniFiles->new( -file => $cfg_file );
+ my $server_check_cfg = Config::IniFiles->new( -file => $config );
# Parse servers string
my @conf_servers = split(',', $servers_string);
}
}
+
+sub start_daemon {
+
+ 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
+ $client_version =~ /^\$HeadURL: (\S+) \$:\$Rev: (\d+) \$$/;
+ $client_headURL = defined $1 ? $1 : 'unknown' ;
+ $client_revision = defined $2 ? $2 : 'unknown' ;
+ if ($client_headURL =~ /\/tag\// ||
+ $client_headURL =~ /\/branches\// ) {
+ $client_status = "stable";
+ } else {
+ $client_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 create_pid {
+ # Create the PID object
+ $pid = File::Pid->new({ file => $pid_file });
+
+ # Write the PID file
+ $pid->write;
+
+ return;
+}
+
#
#==== MAIN = main ==============================================================
#
}
# read and set config parameters
-#&check_cmdline_param ;
-&read_configfile($cfg_file, %cfg_defaults);
-&check_pid;
-
-
-# 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 = $$;
-}
+&read_configfile($config, %cfg_defaults);
-# 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 )
- };
-}
+# daemonize the program
+&start_daemon($foreground);
-# parse head url and revision from svn
-my $client_status_hash = { 'developmental'=>'revision', 'stable'=>'release'};
-$client_version =~ /^\$HeadURL: (\S+) \$:\$Rev: (\d+) \$$/;
-$client_headURL = defined $1 ? $1 : 'unknown' ;
-$client_revision = defined $2 ? $2 : 'unknown' ;
-if ($client_headURL =~ /\/tag\// ||
- $client_headURL =~ /\/branches\// ) {
- $client_status = "stable";
-} else {
- $client_status = "developmental" ;
-}
+# create pid file
+&create_pid($pid, $pid_file);
# 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');
-}
+&get_perms_admin($root_uid, $adm_gid);
+
+# put version
+&put_version($client_status_hash, $client_version, $client_version, $client_headURL, $client_status);
daemon_log(" ", 1);
-daemon_log("gosa-si-client started!", 1);
+daemon_log("$0 started!", 1);
daemon_log("INFO: status: $client_status", 1);
daemon_log("INFO: ".$client_status_hash->{$client_status}.": $client_revision", 1);
-# delete old DBsqlite lock files
-system('rm -f /tmp/gosa_si_lock*gosa-si-client*');
+# to be changed maybe not trace of it when running
+#system('rm -f /tmp/gosa_si_lock*gosa-si-client*');
# detect ip and mac address and complete host address
$client_address = $client_ip.":".$client_port;
my $network_interface= &get_interface_for_ip($client_ip);
$client_mac_address= &get_mac($network_interface);
+
daemon_log("INFO: ip address detected: $client_ip", 1);
-daemon_log("INFO: gosa-si-client mac address detected: $client_mac_address", 1);
+daemon_log("INFO: $0 mac address detected: $client_mac_address", 1);
# import events
POE::Session->create(
inline_states => {
- _start => \&_start,
- _default => \&_default,
- sig_handler => \&sig_handler,
- register_at_gosa_si_server => \®ister_at_gosa_si_server,
+ _start => \&_start,
+ _default => \&_default,
+ sig_handler => \&sig_handler,
+ register_at_gosa_si_server => \®ister_at_gosa_si_server,
- # trigger periodical tasks
- trigger_new_key => \&trigger_new_key,
- trigger_logged_in_users_report => \&trigger_logged_in_users_report,
- trigger_seen_messages => \&trigger_seen_messages,
+ # trigger periodical tasks
+ trigger_new_key => \&trigger_new_key,
+ trigger_logged_in_users_report => \&trigger_logged_in_users_report,
+ trigger_seen_messages => \&trigger_seen_messages,
# trigger non periodical tasks
trigger_set_terminal_server => \&trigger_set_terminal_server,
-
- # handle records from each defined file differently
- fai_fifo_record => \&fai_fifo_got_record,
+
+ # handle records from each defined file differently
+ fai_fifo_record => \&fai_fifo_got_record,
system_fifo_record => \&system_fifo_got_record,
- # handle file resets and errors the same way for each file
- file_reset => \&generic_file_reset,
- file_error => \&generic_file_error,
+ # handle file resets and errors the same way for each file
+ file_reset => \&generic_file_reset,
+ file_error => \&generic_file_error,
}
);