diff --git a/gosa-si/gosa-si-server b/gosa-si/gosa-si-server
index acc399fb8766c459e015ca9f88679cbafe0c8658..7c689a3229ff41ae765363bc48b7bde0cb41f375 100755 (executable)
--- a/gosa-si/gosa-si-server
+++ b/gosa-si/gosa-si-server
my $modules_path = "/usr/lib/gosa-si/modules";
use lib "/usr/lib/gosa-si/modules";
+my $server_version = '$HeadURL$:$Rev$';
+my $server_headURL;
+my $server_revision;
+my $server_status;
+
# TODO es gibt eine globale funktion get_ldap_handle
# - ist in einer session dieses ldap handle schon vorhanden, wird es zurückgegeben
# create outgoing messages
my $message_to = @{$hit}[3];
-
# translate message_to to plain login name
-# TODO implement reciever translation
- my @reciever_l = split(/,/, $message_to);
+ my @message_to_l = split(/,/, $message_to);
+ my %receiver_h;
+ foreach my $receiver (@message_to_l) {
+ if ($receiver =~ /^u_([\s\S]*)$/) {
+ $receiver_h{$1} = 0;
+ } elsif ($receiver =~ /^g_([\s\S]*)$/) {
+# TODO implement receiver translation
+ } else {
+ my $sbjct = &encode_base64(@{$hit}[1]);
+ my $msg = &encode_base64(@{$hit}[7]);
+ &daemon_log("M WARNING: unknown receiver '$receiver' for a user-message 'sbjct - msg'", 3);
+ }
+ }
+ my @receiver_l = keys(%receiver_h);
+
my $message_id = @{$hit}[0];
#add each outgoing msg to messaging_db
- my $reciever;
- foreach $reciever (@reciever_l) {
+ my $receiver;
+ foreach $receiver (@receiver_l) {
my $sql_statement = "INSERT INTO $messaging_tn (id, subject, message_from, message_to, flag, direction, delivery_time, message, timestamp) ".
"VALUES ('".
$message_id."', '". # id
@{$hit}[1]."', '". # subject
@{$hit}[2]."', '". # message_from
- $reciever."', '". # message_to
+ $receiver."', '". # message_to
"none"."', '". # flag
"out"."', '". # direction
@{$hit}[6]."', '". # delivery_time
")";
&daemon_log("M DEBUG: $sql_statement", 1);
my $res = $messaging_db->exec_statement($sql_statement);
- &daemon_log("M INFO: message '".@{$hit}[0]."' is prepared for delivery to reciever '$reciever'", 5);
+ &daemon_log("M INFO: message '".@{$hit}[0]."' is prepared for delivery to receiver '$receiver'", 5);
}
# set incoming message to flag d=deliverd
# reciver is logged in nowhere
if (not ref(@$res[0]) eq "ARRAY") { next; }
- # receiver is logged in at host
- my $receiver_host = @{@{$res}[0]}[0];
-
- # fetch key to encrypt msg propperly for usr/host
- $sql = "SELECT * FROM $known_clients_tn WHERE (hostname='$receiver_host')";
- &daemon_log("0 DEBUG: $sql", 7);
- $res = $known_clients_db->exec_statement($sql);
- my $receiver_key = @{@{$res}[0]}[2];
-
- my %data = ('subject' => $subject, 'message' => $message, 'usr' => $receiver);
- my $out_msg = &build_msg("usr_msg", $server_address, $receiver_host, \%data );
- my $error_state = &send_msg_to_target($out_msg, $receiver_host, $receiver_key, "usr_msg", 0);
+ my $send_succeed = 0;
+ foreach my $hit (@$res) {
+ my $receiver_host = @$hit[0];
+ &daemon_log("M DEBUG: user '$receiver' is logged in at host '$receiver_host'", 7);
+
+ # fetch key to encrypt msg propperly for usr/host
+ my $sql = "SELECT * FROM $known_clients_tn WHERE (hostname='$receiver_host')";
+ &daemon_log("0 DEBUG: $sql", 7);
+ my $res = $known_clients_db->exec_statement($sql);
+
+ # host is already down
+ if (not ref(@$res[0]) eq "ARRAY") { next; }
+
+ # host is on
+ my $receiver_key = @{@{$res}[0]}[2];
+ my %data = ('subject' => $subject, 'message' => $message, 'usr' => $receiver);
+ my $out_msg = &build_msg("usr_msg", $server_address, $receiver_host, \%data );
+ my $error = &send_msg_to_target($out_msg, $receiver_host, $receiver_key, "usr_msg", 0);
+ if ($error == 0 ) {
+ $send_succeed++ ;
+ }
+ }
- if ($error_state == 0) {
- # set outgoing msg at db to deliverd
- my $sql = "UPDATE $messaging_tn SET flag='d' WHERE (id='$msg_id' AND direction='out' AND message_to='$receiver')";
- &daemon_log("0 DEBUG: $sql", 7);
- my $res = $messaging_db->exec_statement($sql);
- }
- }
+ if ($send_succeed) {
+ # set outgoing msg at db to deliverd
+ my $sql = "UPDATE $messaging_tn SET flag='d' WHERE (id='$msg_id' AND direction='out' AND message_to='$receiver')";
+ &daemon_log("0 DEBUG: $sql", 7);
+ my $res = $messaging_db->exec_statement($sql);
+ }
+ }
$kernel->delay_set('watch_for_delivery_messages', $messaging_db_loop_delay);
return;
sub run_create_packages_list_db {
- my ($session, $heap) = @_[SESSION, HEAP];
+ my ($kernel, $session, $heap) = @_[KERNEL, SESSION, HEAP];
my $session_id = $session->ID;
my $task = POE::Wheel::Run->new(
+ Priority => +20,
Program => sub {&create_packages_list_db(undef, undef, $session_id)},
StdoutEvent => "session_run_result",
StderrEvent => "session_run_debug",
close (CONFIG);
find(\&cleanup_and_extract, keys( %repo_dirs ));
+ &main::strip_packages_list_statements();
unshift @packages_list_statements, "VACUUM";
- unshift @packages_list_statements, "DELETE FROM $packages_list_tn";
$packages_list_db->exec_statementlist(\@packages_list_statements);
unlink($packages_list_under_construction);
daemon_log("$session_id INFO: create_packages_list_db: finished", 5);
return;
}
+# This function should do some intensive task to minimize the db-traffic
+sub strip_packages_list_statements {
+ my @existing_entries= @{$packages_list_db->exec_statement("SELECT * FROM $main::packages_list_tn")};
+ my @new_statement_list=();
+ my $hash;
+ my $insert_hash;
+ my $update_hash;
+ my $delete_hash;
+ my $local_timestamp=get_time();
+
+ foreach my $existing_entry (@existing_entries) {
+ $hash->{@{$existing_entry}[0]}->{@{$existing_entry}[1]}->{@{$existing_entry}[2]}= $existing_entry;
+ }
+
+ foreach my $statement (@packages_list_statements) {
+ if($statement =~ /^INSERT/i) {
+ # Assign the values from the insert statement
+ my ($distribution,$package,$version,$section,$description,$template,$timestamp) = ($1,$2,$3,$4,$5,$6,$7) if $statement =~
+ /^INSERT\s+?INTO\s+?$main::packages_list_tn\s+?VALUES\s*?\('(.*?)',\s*?'(.*?)',\s*?'(.*?)',\s*?'(.*?)',\s*?'(.*?)',\s*?'(.*?)',\s*?'(.*?)'\s*?\)$/si;
+ if(exists($hash->{$distribution}->{$package}->{$version})) {
+ # If section or description has changed, update the DB
+ if(
+ (! (@{$hash->{$distribution}->{$package}->{$version}}[3] eq $section)) or
+ (! (@{$hash->{$distribution}->{$package}->{$version}}[4] eq $description))
+ ) {
+ @{$update_hash->{$distribution}->{$package}->{$version}} = ($distribution,$package,$version,$section,$description,undef);
+ }
+ } else {
+ # Insert a non-existing entry to db
+ @{$insert_hash->{$distribution}->{$package}->{$version}} = ($distribution,$package,$version,$section,$description,$template);
+ }
+ } elsif ($statement =~ /^UPDATE/i) {
+ my ($template,$package,$version) = ($1,$2,$3) if $statement =~
+ /^update\s+?$main::packages_list_tn\s+?set\s+?template\s*?=\s*?'(.*?)'\s+?where\s+?package\s*?=\s*?'(.*?)'\s+?and\s+?version\s*?=\s*?'(.*?)'\s*?;$/si;
+ foreach my $distribution (keys %{$hash}) {
+ if(exists($insert_hash->{$distribution}->{$package}->{$version})) {
+ # update the insertion hash to execute only one query per package (insert instead insert+update)
+ @{$insert_hash->{$distribution}->{$package}->{$version}}[5]= $template;
+ } elsif(exists($hash->{$distribution}->{$package}->{$version})) {
+ if( ! (@{$hash->{$distribution}->{$package}->{$version}}[5] eq $template)) {
+ my $section;
+ my $description;
+ if(defined(@{$update_hash->{$distribution}->{$package}->{$version}}[3]) and
+ length(@{$update_hash->{$distribution}->{$package}->{$version}}[3]) > 0 ) {
+ $section= @{$update_hash->{$distribution}->{$package}->{$version}}[3];
+ }
+ if(defined(@{$update_hash->{$distribution}->{$package}->{$version}}[4])) {
+ $description= @{$update_hash->{$distribution}->{$package}->{$version}}[4];
+ }
+ @{$update_hash->{$distribution}->{$package}->{$version}} = ($distribution,$package,$version,$section,$description,$template);
+ }
+ }
+ }
+ }
+ }
+
+ # TODO: Check for orphaned entries
+
+ # unroll the insert_hash
+ foreach my $distribution (keys %{$insert_hash}) {
+ foreach my $package (keys %{$insert_hash->{$distribution}}) {
+ foreach my $version (keys %{$insert_hash->{$distribution}->{$package}}) {
+ push @new_statement_list, "INSERT INTO $main::packages_list_tn VALUES ('$distribution','$package','$version',"
+ ."'@{$insert_hash->{$distribution}->{$package}->{$version}}[3]',"
+ ."'@{$insert_hash->{$distribution}->{$package}->{$version}}[4]',"
+ ."'@{$insert_hash->{$distribution}->{$package}->{$version}}[5]',"
+ ."'$local_timestamp')";
+ }
+ }
+ }
+
+ # unroll the update hash
+ foreach my $distribution (keys %{$update_hash}) {
+ foreach my $package (keys %{$update_hash->{$distribution}}) {
+ foreach my $version (keys %{$update_hash->{$distribution}->{$package}}) {
+ my $set = "";
+ if(defined(@{$update_hash->{$distribution}->{$package}->{$version}}[3])) {
+ $set .= "section = '@{$update_hash->{$distribution}->{$package}->{$version}}[3]', ";
+ }
+ if(defined(@{$update_hash->{$distribution}->{$package}->{$version}}[4])) {
+ $set .= "description = '@{$update_hash->{$distribution}->{$package}->{$version}}[4]', ";
+ }
+ if(defined(@{$update_hash->{$distribution}->{$package}->{$version}}[5])) {
+ $set .= "template = '@{$update_hash->{$distribution}->{$package}->{$version}}[5]', ";
+ }
+ if(defined($set) and length($set) > 0) {
+ $set .= "timestamp = '$local_timestamp'";
+ } else {
+ next;
+ }
+ push @new_statement_list,
+ "UPDATE $main::packages_list_tn SET $set WHERE"
+ ." distribution = '$distribution'"
+ ." AND package = '$package'"
+ ." AND version = '$version'";
+ }
+ }
+ }
+
+ @packages_list_statements = @new_statement_list;
+}
+
sub parse_package_info {
my ($baseurl, $dist, $section, $session_id)= @_;
# Trigger for description
if ($line =~ /^Description:\s/){
- ($description)= ($line =~ /^Description: (.*)$/);
+ ($description)= &encode_base64(($line =~ /^Description: (.*)$/));
next;
}
mkpath($dir);
system( "dpkg -e '$File::Find::name' '$dir/DEBIAN'" );
- if( -f "$dir/DEBIAN/templates" ) {
+ if( -f "$dir/DEBIAN/templates" ) {
- daemon_log("DEBUG: Found debconf templates in '$package' - $newver", 5);
+ daemon_log("DEBUG: Found debconf templates in '$package' - $newver", 5);
- my $tmpl= "";
- {
- local $/=undef;
- open FILE, "$dir/DEBIAN/templates";
- $tmpl = &encode_base64(<FILE>);
- close FILE;
- }
- rmtree("$dir/DEBIAN/templates");
-
- $sql= "update $main::packages_list_tn set template = '$tmpl' where package = '$package' and version = '$newver';";
-
- } else {
- $sql= "update $main::packages_list_tn set template = '' where package = '$package' and version = '$newver';";
- }
+ my $tmpl= "";
+ {
+ local $/=undef;
+ open FILE, "$dir/DEBIAN/templates";
+ $tmpl = &encode_base64(<FILE>);
+ close FILE;
+ }
+ rmtree("$dir/DEBIAN/templates");
- push @packages_list_statements, $sql;
+ $sql= "update $main::packages_list_tn set template = '$tmpl' where package = '$package' and version = '$newver';";
+ push @packages_list_statements, $sql;
+ }
}
return;
};
}
+# 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" ;
+}
+
+
daemon_log(" ", 1);
daemon_log("$0 started!", 1);
+daemon_log("status: $server_status", 1);
+daemon_log($server_status_hash->{$server_status}.": $server_revision", 1);
if ($no_bus > 0) {
$bus_activ = "false"
$fai_release_db->create_table($fai_release_tn, \@fai_release_col_names);
# connect to packages_list_db
-unlink($packages_list_file_name);
+#unlink($packages_list_file_name);
unlink($packages_list_under_construction);
$packages_list_db = GOSA::DBsqlite->new($packages_list_file_name);
$packages_list_db->create_table($packages_list_tn, \@packages_list_col_names);