Dropping the --server switch and supporting code, as part of fdo#39747. I didn't see any problems running autogen / make / make dev-install after this. (Ubuntu 11.04 build env.)
There were some other dead function in there from before, but I'll send a separate patch since they were unrelated to the --server switch. LGPLv3+/MPL Jordan Ayers
From 5626f1468f646d118d51b8c3ac1f6bfb1e2a2b35 Mon Sep 17 00:00:00 2001 From: Jordan Ayers <jordan.ay...@gmail.com> Date: Wed, 10 Aug 2011 08:17:55 -0500 Subject: [PATCH] Remove --server mode and supporting code from build.pl. --- bootstrap.1 | 2 - set_soenv.in | 4 +- solenv/bin/build.pl | 290 +----------------------------- solenv/bin/build_client.pl | 436 -------------------------------------------- 4 files changed, 6 insertions(+), 726 deletions(-) delete mode 100755 solenv/bin/build_client.pl diff --git a/bootstrap.1 b/bootstrap.1 index 069b995..19a9d1e 100755 --- a/bootstrap.1 +++ b/bootstrap.1 @@ -11,7 +11,6 @@ fi unalias mkout unalias deliver unalias build -unalias build_client unalias zipdep # executables are *.exe for WNT. This variable is necessary since Cygwin 1.5.x @@ -71,7 +70,6 @@ fi #make sure build.pl is executable chmod +x "$SRC_ROOT/solenv/bin/build.pl" -chmod +x "$SRC_ROOT/solenv/bin/build_client.pl" chmod +x "$SRC_ROOT/solenv/bin/zipdep.pl" chmod +x "$SRC_ROOT/solenv/bin/gccinstlib.pl" diff --git a/set_soenv.in b/set_soenv.in index 729241c..1a9539d 100755 --- a/set_soenv.in +++ b/set_soenv.in @@ -89,7 +89,7 @@ my ( $oldPATH, $SRC_ROOT, $SO_HOME, $JAVA_HOME, $JDK, $JAVAFLAGS, $OOO_SHELL, # IId. Declaring the aliases. #------------------------------------------- # -my ( $dmake, $build, $build_client, $mkout, $deliver, $zipdep ); +my ( $dmake, $build, $mkout, $deliver, $zipdep ); # #------------------------------------------------------------- @@ -1455,7 +1455,6 @@ else $mkout = '"perl $SOLARENV/bin/mkout.pl"'; $deliver = '"perl $SOLARENV/bin/deliver.pl"'; $build = '"perl $SOLARENV/bin/build.pl"'; - $build_client = '"perl $SOLARENV/bin/build_client.pl"'; $zipdep = '"perl $SOLARENV/bin/zipdep.pl"'; # @@ -2106,7 +2105,6 @@ ToFile( "Don't set aliases when bootstrapping", $empty, "c" ); ToFile( "alias mkout", $mkout, "a" ); ToFile( "alias deliver", $deliver, "a" ); ToFile( "alias build", $build, "a" ); -ToFile( "alias build_client",$build_client, "a" ); ToFile( "alias zipdep", $zipdep, "a" ); # on Solaris, MacOSX and FreeBSD, set GNUCOPY and GNUPATCH diff --git a/solenv/bin/build.pl b/solenv/bin/build.pl index cc53a5d..fdf316b 100755 --- a/solenv/bin/build.pl +++ b/solenv/bin/build.pl @@ -159,20 +159,12 @@ my $stop_build_on_error = 0; # for multiprocessing mode: do not build further module if there is an error my $interactive = 0; # for interactive mode... (for testing purpose enabled by default) my $parent_process = 1; - my $server_mode = 0; - my $setenv_string = ''; # string for configuration of the client environment - my $ports_string = ''; # string with possible ports for server my @server_ports = (); my $html_port = 0; - my $server_socket_obj = undef; # socket object for server my $html_socket_obj = undef; # socket object for server - my %clients_jobs = (); - my %clients_times = (); my $client_timeout = 0; # time for client to build (in sec)... # The longest time period after that # the server considered as an error/client crash - my %lost_client_jobs = (); # hash containing lost jobs - my %job_jobdir = (); # hash containing job-dir pairs my $reschedule_queue = 0; my %module_build_queue = (); my %reversed_dependencies = (); @@ -688,9 +680,6 @@ sub build_all { build_multiprocessing(); return; }; - if ($server_mode) { - run_server(); - }; while ($prj = pick_prj_to_build(\%global_deps_hash)) { if (!defined $dead_parents{$prj}) { if (scalar keys %broken_build) { @@ -719,11 +708,7 @@ sub build_all { my $info_hash = $html_info{$initial_module}; $$info_hash{DIRS} = check_deps_hash(\%local_deps_hash, $initial_module); $module_by_hash{\%local_deps_hash} = $initial_module; - if ($server_mode) { - run_server(); - } else { - build_dependent(\%local_deps_hash); - }; + build_dependent(\%local_deps_hash); }; }; @@ -1283,7 +1268,7 @@ sub find_indep_prj { $all_dependent = 1; handle_dead_children(0) if ($processes_to_run); my $children = children_number(); - return '' if (!$server_mode && $children && ($children >= $processes_to_run)); + return '' if ($children && ($children >= $processes_to_run)); $dependencies = shift; if (scalar keys %$dependencies) { foreach my $job (keys %$dependencies) { @@ -1402,14 +1387,12 @@ sub print_error { sub usage { print STDERR "\nbuild\n"; - print STDERR "Syntax: build [--all|-a[:prj_name]]|[--from|-f prj_name1[:prj_name2] [prj_name3 [...]]]|[--since|-c prj_name] [--with_branches prj_name1[:prj_name2] [--skip prj_name1[:prj_name2] [prj_name3 [...]] [prj_name3 [...]|-b]|[--prepare|-p][:platform] [--deliver|-d [--dlv_switch deliver_switch]]] [-P processes|--server [--setenvstring \"string\"] [--client_timeout MIN] [--port port1[:port2:...:portN]]] [--show|-s] [--help|-h] [--file|-F] [--ignore|-i] [--version|-V] [--mode|-m OOo[,SO[,EXT]] [--html [--html_path html_file_path] [--dontgraboutput]] [--pre_job=pre_job_sring] [--job=job_string|-j] [--post_job=post_job_sring] [--stoponerror] [--genconf [--removeall|--clear|--remove|--add [module1,module2[,...,moduleN]]]] [--exclude_branch_from prj_name1[:prj_name2] [prj_name3 [...]]] [--interactive] [--verbose]\n"; + print STDERR "Syntax: build [--all|-a[:prj_name]]|[--from|-f prj_name1[:prj_name2] [prj_name3 [...]]]|[--since|-c prj_name] [--with_branches prj_name1[:prj_name2] [--skip prj_name1[:prj_name2] [prj_name3 [...]] [prj_name3 [...]|-b]|[--prepare|-p][:platform] [--deliver|-d [--dlv_switch deliver_switch]]] [-P processes] [--show|-s] [--help|-h] [--file|-F] [--ignore|-i] [--version|-V] [--mode|-m OOo[,SO[,EXT]] [--html [--html_path html_file_path] [--dontgraboutput]] [--pre_job=pre_job_sring] [--job=job_string|-j] [--post_job=post_job_sring] [--stoponerror] [--genconf [--removeall|--clear|--remove|--add [module1,module2[,...,moduleN]]]] [--exclude_branch_from prj_name1[:prj_name2] [prj_name3 [...]]] [--interactive] [--verbose]\n"; print STDERR "Example1: build --from sfx2\n"; print STDERR " - build all projects dependent from sfx2, starting with sfx2, finishing with the current module\n"; print STDERR "Example2: build --all:sfx2\n"; print STDERR " - the same as --all, but skip all projects that have been already built when using \"--all\" switch before sfx2\n"; - print STDERR "Example3: build --all --server\n"; - print STDERR " - build all projects in server mode, use first available port from default range 7890-7894 (running clients required!!)\n"; - print STDERR "Example4(for unixes):\n"; + print STDERR "Example3(for unixes):\n"; print STDERR " build --all --pre_job=echo\\ Starting\\ job\\ in\\ \\\$PWD --job=some_script.sh --post_job=echo\\ Job\\ in\\ \\\$PWD\\ is\\ made\n"; print STDERR " - go through all projects, echo \"Starting job in \$PWD\" in each module, execute script some_script.sh, and finally echo \"Job in \$PWD is made\"\n"; print STDERR "\nSwitches:\n"; @@ -1426,11 +1409,6 @@ sub usage { print STDERR " --file - generate command file file_name\n"; print STDERR " --deliver - only deliver, no build (usable for \'-all\' and \'-from\' keys)\n"; print STDERR " -P - start multiprocessing build, with number of processes passed\n"; - print STDERR " --server - start build in server mode (clients required)\n"; - print STDERR " --setenvstring - string for configuration of the client environment\n"; - print STDERR " --port - set server port, default is 7890. You may pass several ports, the server will be started on the first available\n"; - print STDERR " otherwise the server will be started on first available port from the default range 7890-7894\n"; - print STDERR " --client_timeout - time frame after which the client/job is considered to be lost. Default is 120 min\n"; print STDERR " --dlv_switch - use deliver with the switch specified\n"; print STDERR " --help - print help info\n"; print STDERR " --ignore - force tool to ignore errors\n"; @@ -1527,10 +1505,6 @@ sub get_options { $arg =~ /^--dontgraboutput$/ and $dont_grab_output = 1 and next; $arg =~ /^--html_path$/ and $html_path = shift @ARGV and next; $arg =~ /^-i$/ and $ignore = 1 and next; - $arg =~ /^--server$/ and $server_mode = 1 and next; - $arg =~ /^--client_timeout$/ and $client_timeout = (shift @ARGV)*60 and next; - $arg =~ /^--setenvstring$/ and $setenv_string = shift @ARGV and next; - $arg =~ /^--port$/ and $ports_string = shift @ARGV and next; $arg =~ /^--version$/ and do_exit(0); $arg =~ /^-V$/ and do_exit(0); $arg =~ /^-m$/ and get_modes() and next; @@ -1573,20 +1547,9 @@ sub get_options { if (!$enable_multiprocessing) { print_error("Cannot load Win32::Process module for multiprocessing build"); }; - if ($server_mode) { - print_error("Switches -P and --server collision"); - }; } elsif ($stop_build_on_error) { print_error("Switch --stoponerror is only for multiprocessing builds"); }; - if ($server_mode) { - $html++; - $client_timeout = 60 * 60 * 2 if (!$client_timeout); - } else { - print_error("--ports switch is for server mode only!!") if ($ports_string); - print_error("--setenvstring switch is for server mode only!!") if ($setenv_string); - print_error("--client_timeout switch is for server mode only!!") if ($client_timeout); - }; if (!$generate_config) { my $error_message = ' switch(es) should be used only with "--genconf"'; @@ -2935,7 +2898,6 @@ sub generate_html_file { print HTML ' top.innerFrame.frames[1].document.write(" <td width=* align=center><strong style=color:blue>Job</strong></td>");' . "\n"; print HTML ' top.innerFrame.frames[1].document.write(" <td width=* align=center><strong style=color:blue>Start Time</strong></td>");' . "\n"; print HTML ' top.innerFrame.frames[1].document.write(" <td width=* align=center><strong style=color:blue>Finish Time</strong></td>");' . "\n"; - print HTML ' top.innerFrame.frames[1].document.write(" <td width=* align=center><strong style=color:blue>Client</strong></td>");' . "\n" if ($server_mode); print HTML ' top.innerFrame.frames[1].document.write(" </tr>");' . "\n"; print HTML ' var dir_info_strings = Message2.split("<br><br>");' . "\n"; print HTML ' for (i = 0; i < dir_info_strings.length; i++) {' . "\n"; @@ -2951,7 +2913,6 @@ sub generate_html_file { print HTML ' };' . "\n"; print HTML ' top.innerFrame.frames[1].document.write(" <td align=center>" + dir_info_array[2] + "</td>");' . "\n"; print HTML ' top.innerFrame.frames[1].document.write(" <td align=center>" + dir_info_array[3] + "</td>");' . "\n"; - print HTML ' top.innerFrame.frames[1].document.write(" <td align=center>" + dir_info_array[5] + "</td>");' . "\n" if ($server_mode); print HTML ' top.innerFrame.frames[1].document.write(" </tr>");' . "\n"; print HTML ' };' . "\n"; print HTML ' top.innerFrame.frames[1].document.write("</table>");' . "\n"; @@ -2969,7 +2930,6 @@ sub generate_html_file { print HTML ' };' . "\n"; print HTML ' DirectoryInfos[2].innerHTML = dir_info_array[2];' . "\n"; print HTML ' DirectoryInfos[3].innerHTML = dir_info_array[3];' . "\n"; - print HTML ' DirectoryInfos[4].innerHTML = dir_info_array[5];' . "\n" if ($server_mode); print HTML ' };' . "\n"; print HTML ' };' . "\n"; print HTML ' };' . "\n"; @@ -3119,7 +3079,6 @@ sub get_dirs_info_line { $dirs_info_line .= $log_path_string; }; $dirs_info_line .= '<br>'; - $dirs_info_line .= $jobs_hash{$job}->{CLIENT} . '<br>' if ($server_mode); return $dirs_info_line; }; @@ -3247,249 +3206,10 @@ sub accept_html_connection { return $new_socket_obj; }; -sub accept_connection { - my $new_socket_obj = undef; - do { - $new_socket_obj = $server_socket_obj->accept(); - if (!$new_socket_obj) { - print "Timeout on incoming connection\n"; - check_client_jobs(); - }; - } while (!$new_socket_obj); - return $new_socket_obj; -}; - -sub check_client_jobs { - foreach (keys %clients_times) { - if (time - $clients_times{$_} > $client_timeout) { - print "Client's $_ Job: \"$clients_jobs{$_}\" apparently got lost...\n"; - print "Scheduling for rebuild...\n"; - print "You might need to check the $_\n"; - $lost_client_jobs{$clients_jobs{$_}}++; - delete $processes_hash{$_}; - delete $clients_jobs{$_}; - delete $clients_times{$_}; - }; - }; -}; - sub get_server_ports { # use port 7890 as default my $default_port = 7890; - if ($ports_string) { - @server_ports = split( /:/, $ports_string); - } else { - @server_ports = ($default_port .. $default_port + 4); - }; -}; - -sub run_server { - my @build_queue = (); # array, containing queue of projects - # to build - my $error = 0; - if (scalar @server_ports) { - foreach (@server_ports) { - $error = start_server_on_port($_, \$server_socket_obj); - if ($error) { - print STDERR "port $_: $error\n"; - } else { - last; - }; - }; - print_error('Unable to start server on port(s): ' . "@server_ports\n") if ($error); - } else { - print_error('No ports for server to start'); - }; - - my $client_addr; - my $job_string_base = get_job_string_base(); - my $new_socket_obj; - while ($new_socket_obj = accept_connection()) { - check_client_jobs(); - # find out who connected - my $client_ipnum = $new_socket_obj->peerhost(); - my $client_host = gethostbyaddr(inet_aton($client_ipnum), AF_INET); - # print who is connected - # send them a message, close connection - my $client_message = <$new_socket_obj>; - chomp $client_message; - my @client_data = split(/ /, $client_message); - my %client_hash = (); - foreach (@client_data) { - /(=)/; - $client_hash{$`} = $'; #' - } - my $pid = $client_hash{pid} . '@' . $client_host; - if (defined $client_hash{platform}) { - if ($client_hash{platform} ne $ENV{OUTPATH} || (defined $client_hash{osname} && ($^O ne $client_hash{osname}))) { - print $new_socket_obj "Wrong platform"; - close($new_socket_obj); - next; - }; - } else { - if ($client_hash{result} eq "0") { - } else { - print "Error $client_hash{result}\n"; - if (store_error($pid, $client_hash{result})) { - print $new_socket_obj $job_string_base . $clients_jobs{$pid}; - close($new_socket_obj); - $clients_times{$pid} = time; - next; - }; - }; - delete $clients_times{$pid}; - clear_from_child($pid); - delete $clients_jobs{$pid}; - $verbose_mode && print 'Running processes: ', children_number(), "\n"; - # Actually, next 3 strings are only for even distribution - # of clients if there are more than one build server running - print $new_socket_obj 'No job'; - close($new_socket_obj); - next; - }; - my $job_string; - my @lost_jobs = keys %lost_client_jobs; - if (scalar @lost_jobs) { - $job_string = $lost_jobs[0]; - delete $lost_client_jobs{$lost_jobs[0]}; - } else { - $job_string = get_job_string(\@build_queue); - }; - if ($job_string) { - my $job_dir = $job_jobdir{$job_string}; - $processes_hash{$pid} = $job_dir; - $jobs_hash{$job_dir}->{CLIENT} = $pid; - print "$pid got $job_dir\n"; - print $new_socket_obj $job_string_base . $job_string; - $clients_jobs{$pid} = $job_string; - $clients_times{$pid} = time; - my $children_running = children_number(); - $verbose_mode && print 'Running processes: ', $children_running, "\n"; - $maximal_processes = $children_running if ($children_running > $maximal_processes); - } else { - print $new_socket_obj 'No job'; - }; - close($new_socket_obj); - }; -}; - -# -# Procedure returns the part of the job string that is similar for all clients -# -sub get_job_string_base { - if ($setenv_string) { - return "setenv_string=$setenv_string "; - }; - my $job_string_base = "server_pid=$$ setsolar_cmd=$ENV{SETSOLAR_CMD} "; - $job_string_base .= "source_root=$ENV{SOURCE_ROOT} " if (defined $ENV{SOURCE_ROOT}); - $job_string_base .= "updater=$ENV{UPDATER} " if (defined $ENV{UPDATER}); - return $job_string_base; -}; - -sub get_job_string { - my $build_queue = shift; - my $job = $dmake; - my ($job_dir, $dependencies_hash); - if ($build_all_parents) { - fill_modules_queue($build_queue); - do { - ($job_dir, $dependencies_hash) = pick_jobdir($build_queue); - return '' if (!$job_dir); - $jobs_hash{$job_dir}->{START_TIME} = time(); - $jobs_hash{$job_dir}->{STATUS} = 'building'; - if ($job_dir =~ /(\s)$pre_job/o) { - do_custom_job($job_dir, $dependencies_hash); - $job_dir = ''; - }; - } while (!$job_dir); - } else { - $dependencies_hash = \%local_deps_hash; - do { - $job_dir = pick_prj_to_build(\%local_deps_hash); - if (!$job_dir && !children_number()) { - cancel_build() if (scalar keys %broken_build); - mp_success_exit(); - }; - return '' if (!$job_dir); - $jobs_hash{$job_dir}->{START_TIME} = time(); - $jobs_hash{$job_dir}->{STATUS} = 'building'; - if ($job_dir =~ /(\s)$pre_job/o) { - do_custom_job($job_dir, $dependencies_hash); - $job_dir = ''; - }; - } while (!$job_dir); - }; - $running_children{$dependencies_hash}++; - $folders_hashes{$job_dir} = $dependencies_hash; - my $log_file = $jobs_hash{$job_dir}->{LONG_LOG_PATH}; - my $full_job_dir = $job_dir; - if ($job_dir =~ /(\s)/o) { - $job = $'; #' - print $echo . "determine if we need to deliver $job_dir\n"; - if ($job eq $post_job) { - if( $is_gbuild{$job_dir} ) { - print "Skip deliver for gmake-built module $job_dir\n"; - return''; - }; - $job = $deliver_command - }; - $full_job_dir = $module_paths{$`}; - } - my $log_dir = File::Basename::dirname($log_file); - if (!-d $log_dir) { - chdir $full_job_dir; - getcwd(); - system("$perl $mkout"); - }; - my $job_string = "job_dir=$full_job_dir job=$job log=$log_file"; - $job_jobdir{$job_string} = $job_dir; - return $job_string; -}; - -sub pick_jobdir { - my $build_queue = shift; - my $i = 0; - foreach (@$build_queue) { - my $prj = $$build_queue[$i]; - my $prj_deps_hash = $projects_deps_hash{$prj}; - if (defined $modules_with_errors{$prj_deps_hash} && !$ignore) { - push (@broken_modules_names, $prj); - splice (@$build_queue, $i, 1); - next; - }; - $running_children{$prj_deps_hash} = 0 if (!defined $running_children{$prj_deps_hash}); - my $child_nick = pick_prj_to_build($prj_deps_hash); - if ($child_nick) { - return ($child_nick, $prj_deps_hash); - } - if ((!scalar keys %$prj_deps_hash) && !$running_children{$prj_deps_hash}) { - if (!defined $modules_with_errors{$prj_deps_hash} || $ignore) - { - remove_from_dependencies($prj, \%global_deps_hash); - $build_is_finished{$prj}++; - splice (@$build_queue, $i, 1); - next; - }; - }; - $i++; - }; -}; - -sub fill_modules_queue { - my $build_queue = shift; - my $prj; - while ($prj = pick_prj_to_build(\%global_deps_hash)) { - push @$build_queue, $prj; - $projects_deps_hash{$prj} = {}; - get_module_dep_hash($prj, $projects_deps_hash{$prj}); - my $info_hash = $html_info{$prj}; - $$info_hash{DIRS} = check_deps_hash($projects_deps_hash{$prj}, $prj); - $module_by_hash{$projects_deps_hash{$prj}} = $prj; - }; - if (!$prj && !children_number() && (!scalar @$build_queue)) { - cancel_build() if (scalar keys %broken_build); - mp_success_exit(); - }; + @server_ports = ($default_port .. $default_port + 4); }; sub is_gnumake_module { diff --git a/solenv/bin/build_client.pl b/solenv/bin/build_client.pl deleted file mode 100755 index 5119f60..0000000 --- a/solenv/bin/build_client.pl +++ /dev/null @@ -1,436 +0,0 @@ -: -eval 'exec perl -S $0 ${1+"$@"}' - if 0; -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2000, 2010 Oracle and/or its affiliates. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org 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 Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# <http://www.openoffice.org/license.html> -# for a copy of the LGPLv3 License. -# -#************************************************************************* -# -# build_client - client for the build tool in server mode -# - -use strict; -use Socket; -use Sys::Hostname; -use File::Temp qw(tmpnam); -use POSIX; -use Cwd qw (cwd); - -$SIG{KILL} = \&handle_temp_files; -$SIG{INT} = \&handle_temp_files; - -### main ### -my $enable_multiprocessing = 1; -my $server_list_file; -my $server_list_time_stamp = 0; -my %ENV_BACKUP; -$ENV_BACKUP{$_} = $ENV{$_} foreach (keys %ENV); - -if ($^O eq 'MSWin32') { - eval { require Win32::Process; import Win32::Process; }; - $enable_multiprocessing = 0 if ($@); -} else { - use Cwd 'chdir'; -}; -my $processes_to_run = 1; - -my %hosts_ports = (); -my $default_port = 7890; -my @ARGV_COPY = @ARGV; # @ARGV BACKUP -print "arguments: @ARGV\n"; -get_options(); - -my $proto = getprotobyname('tcp'); -my $paddr; -my $host = hostname(); -my $current_server = ''; -my $got_job = 0; -my %job_temp_files = (); -my %environments = (); # hash containing all environments -my $env_alias; -my %platform_rejects = (); # hash containing paddr of server, that replied "Wrong platform" - -my $child = 0; -if ($processes_to_run > 1) { - my $started_processes = 1; - if ($^O eq 'MSWin32') { - my $process_obj = undef; - my $child_args = "perl $0"; - foreach (@ARGV_COPY) { - /^-P(\d+)$/ and next; - /^-P$/ and shift @ARGV_COPY and next; - $child_args .= " $_"; - }; - do { - my $rc = Win32::Process::Create($process_obj, $^X, - $child_args, - 0, 0, #NORMAL_PRIORITY_CLASS, - "."); - print_error("Cannot start child process") if (!$rc); - $started_processes++; - } while ($started_processes < $processes_to_run); - } else { - my $pid; - do { - if ($pid = fork) { # parent - $started_processes++; - print $started_processes . "\n"; - } elsif (defined $pid) { # child - $child++; - }; - } while (($started_processes < $processes_to_run) && !$child); - }; -}; - -run_client(); -### end of main procedure ### - -######################### -# # -# Procedures # -# # -######################### -sub handle_temp_files { - print STDERR "Got signal - clearing up...\n"; - foreach (keys %job_temp_files) { - if ($job_temp_files{$_}) { - rename($_, $job_temp_files{$_}) or system("mv", $_, $job_temp_files{$_}); - print STDERR "Could not rename $_ to $job_temp_files{$_}\n" if (-e $_); - } else { - unlink $_ or system("rm -rf $_"); - print STDERR "Could not remove $_\n" if (-e $_); - }; - }; - exit($?); -}; - -sub run_client { -# initialize host and port - if (!scalar keys %hosts_ports) { - $hosts_ports{localhost} = $default_port; - } - - print "Started client with PID $$, hostname $host\n"; - - my $message = ''; - my $current_port = ''; - my %active_servers = (); - - do { - $got_job = 0; - foreach $current_server (keys %hosts_ports) { - foreach $current_port (keys %{$hosts_ports{$current_server}}) { - - #before each "inactive" server/port connect - connect to each "active" server/port - next if (defined ${$active_servers{$current_server}}{$current_port}); - # "active" cycle - foreach my $active_server (keys %active_servers) { - foreach my $active_port (keys %{$active_servers{$active_server}}) { - my $iaddr = inet_aton($active_server); - $paddr = sockaddr_in($active_port, $iaddr); - do { - my $server_is_active = 0; - $message = request_job($message, $active_server, $active_port); - $server_is_active++ if ($message); - if (!$server_is_active) { - delete ${$active_servers{$active_server}}{$active_port}; - # throw away obsolete environments - foreach (keys %environments) { - /^\d+@/; - if ($' eq "$active_server:$active_port") { - delete $environments{$_}; - }; - }; - }; - $message = '' if ($message eq 'No job'); - } while ($message); - }; - }; - - # "inactive" cycle - my $iaddr = inet_aton($current_server); - $paddr = sockaddr_in($current_port, $iaddr); - do { - $message = request_job($message, $current_server, $current_port); - if ($message) { - if (!defined $active_servers{$current_server}) { - my %ports; - $active_servers{$current_server} = \%ports; - }; - ${$active_servers{$current_server}}{$current_port}++; - }; - $message = '' if ($message eq 'No job'); - } while ($message); - }; - }; - sleep 5 if (!$got_job); - read_server_list(); - } while(1); -}; - -sub usage { - my $error = shift; - print STDERR "\nbuild_client\n"; - print STDERR "Syntax: build_client [-PN] host1[:port1:...:portN] [host2[:port1:...:portN] ... hostN[:port1:...:portN]]|\@server_list_file\n"; - print STDERR " -P - start multiprocessing build, with number of processes passed\n"; - print STDERR "Example1: build_client myserver1 myserver2:7891:7892\n"; - print STDERR " the client will be asking for jobs on myserver1's default ports (7890-7894)\n"; - print STDERR " and on myserver2's ports 7891 and 7892\n"; - print STDERR "Example2: build_client -P2 myserver1:7990 myserver2\n"; - print STDERR " start 2 clients which will be asking for jobs myserver1's port 7990\n"; - print STDERR " and myserver2's default ports (7890-7894)\n"; - exit ($error); -}; - -sub get_options { - my $arg; - usage(1) if (!scalar @ARGV); - while ($arg = shift @ARGV) { - usage(0) if /^--help$/; - usage(0) if /^-h$/; - $arg =~ /^-P(\d+)$/ and $processes_to_run = $1 and next; - $arg =~ /^-P$/ and $processes_to_run = shift @ARGV and next; - $arg =~ /^@(\S+)$/ and $server_list_file = $1 and next; - store_server($arg); - }; - if (($processes_to_run > 1) && (!$enable_multiprocessing)) { - print_error("Cannot load Win32::Process module for multiple client start"); - }; - if ($server_list_file) { - print_error("$server_list_file is not a regular file!!") if (!-f $server_list_file); - read_server_list(); - } - print_error("No server info") if (!scalar %hosts_ports); -}; - -sub store_server { - my $server_string = shift; - my @server_params = (); - @server_params = split (/:/, $server_string); - my $host = shift @server_params; - my @names = gethostbyname($host); - my $host_full_name = $names[0]; - my %ports = (); - if (defined $hosts_ports{$host_full_name}) { - %ports = %{$hosts_ports{$host_full_name}}; - }; - # To do: implement keys in form server:port -> priority - if (defined $hosts_ports{$host_full_name}) { - if (!$server_list_time_stamp) { - print "The $host with ip address " . inet_ntoa(inet_aton($host)) . " is at least two times in the server list\n"; - }; - } else { - print "Added server $host as $host_full_name\n"; - }; - if (scalar @server_params) { - $ports{$_}++ foreach (@server_params); - } else { - $ports{$_}++ foreach ($default_port .. $default_port + 4); - }; - $hosts_ports{$host_full_name} = \%ports; -}; - -sub read_server_list { - open(SERVER_LIST, "<$server_list_file") or return; - my $current_time_stamp = (stat($server_list_file))[9]; - return if ($server_list_time_stamp >= $current_time_stamp); - my @server_array = (); - foreach my $file_string(<SERVER_LIST>) { - while ($file_string =~ /(\S+)/) { - $file_string = $'; - store_server($1); - }; - }; - close SERVER_LIST; - $server_list_time_stamp = $current_time_stamp; -}; - -sub request_job { - my ($message, $current_server, $current_port) = @_; - $message = "platform=$ENV_BACKUP{OUTPATH} pid=$$ osname=$^O" if (!$message); - # create the socket, connect to the port - socket(SOCKET, PF_INET, SOCK_STREAM, $proto) or die "socket: $!"; - connect(SOCKET, $paddr) or return ''; - my $error_code = 1; - $message .= "\n"; - syswrite SOCKET, $message, length $message; - while (my $line = <SOCKET>) { - chomp $line; - if ($line eq 'No job') { - close SOCKET or die "close: $!"; - return $line; - }; - if ($line eq "Wrong platform") { - if (!defined $platform_rejects{$paddr}) { - $platform_rejects{$paddr}++; - print STDERR $line . "\n"; - } - close SOCKET or die "close: $!"; - delete $hosts_ports{$current_server}; - return ''; - } elsif (defined $platform_rejects{$paddr}) { - delete $platform_rejects{$paddr}; - }; - $got_job++; - $error_code = do_job($line . " server=$current_server port=$current_port"); - } - close SOCKET or die "close: $!"; - return("result=$error_code pid=$$"); -} - -sub do_job { - my @job_parameters = split(/ /, shift); - my %job_hash = (); - my $last_param; - my $error_code; - print "Client $$@" . "$host\n"; - foreach (@job_parameters) { - if (/(=)/) { - $job_hash{$`} = $'; - $last_param = $`; - } else { - $job_hash{$last_param} .= " $_"; - }; - }; - $env_alias = $job_hash{server_pid} . '@' . $job_hash{server} . ':' . $job_hash{port}; - my $result = "1"; # default value - my $cmd_file = File::Temp::tmpnam($ENV_BACKUP{TMP}); - my $tmp_log_file = File::Temp::tmpnam($ENV_BACKUP{TMP}); - $job_temp_files{$tmp_log_file} = $job_hash{log}; - my $setenv_string = ''; - if (defined $job_hash{setenv_string}) { - # use configuration string from server - $setenv_string .= $job_hash{setenv_string}; - print "Environment: $setenv_string\n"; - - my $directory = $job_hash{job_dir}; - open (COMMAND_FILE, ">$cmd_file"); - print COMMAND_FILE "$setenv_string\n"; - if (!defined $job_hash{job_dir}) { - close COMMAND_FILE; - print "No job_dir, cmd file: $cmd_file\n"; - foreach (keys %job_hash) { - print "key: $_ $job_hash{$_}\n"; - }; - exit (1); - }; - - print COMMAND_FILE "pushd $job_hash{job_dir} && "; - print COMMAND_FILE $job_hash{job} ." >& $tmp_log_file\n"; - print COMMAND_FILE "exit \$?\n"; - close COMMAND_FILE; - $job_temp_files{$cmd_file} = 0; - $job_temp_files{$tmp_log_file} = $job_hash{log}; - $error_code = system($ENV{SHELL}, $cmd_file); - unlink $cmd_file or system("rm -rf $cmd_file"); - delete $job_temp_files{$cmd_file}; - } else { - # generate setsolar string - if (!defined $environments{$env_alias}) { - $error_code = get_setsolar_environment(\%job_hash); - return($error_code) if ($error_code); - }; - my $solar_vars = $environments{$env_alias}; - - delete $ENV{$_} foreach (keys %ENV); - $ENV{$_} = $$solar_vars{$_} foreach (keys %$solar_vars); - print 'Workspace: '; - print $ENV{SOLARSRC}; - - print "\nplatform: $ENV{INPATH} $^O"; - print "\ndir: $job_hash{job_dir}\n"; - print "job: $job_hash{job}\n"; - chdir $job_hash{job_dir}; - getcwd(); - my $job_string = $job_hash{job} . ' > ' . $tmp_log_file . ' 2>&1'; - $error_code = system($job_string); - }; - rename($tmp_log_file, $job_hash{log}) or system("mv", $tmp_log_file, $job_hash{log}); - delete $job_temp_files{$tmp_log_file}; - - if ($error_code) { - print "Error code = $error_code\n\n"; - } else { - print "Success!!\n\n"; - }; - return $error_code; -}; - -sub get_setsolar_environment { - my $job_hash = shift; - my $server_pid = $$job_hash{server_pid}; - my $setsolar_string = $$job_hash{setsolar_cmd}; - # Prepare the string for the client - $setsolar_string =~ s/\s-file\s\S+//g; - my $error_code = 0; - my $cmd_file = File::Temp::tmpnam($ENV_BACKUP{TMP}); - my $tmp_log_file = File::Temp::tmpnam($ENV_BACKUP{TMP}); - if (defined $$job_hash{updater}) { - $ENV{UPDATER} = $$job_hash{updater}; - } else { - undef $ENV{UPDATER} if (defined $ENV{UPDATER}); - }; - if (defined $$job_hash{source_root}) { - $ENV{SOURCE_ROOT} = $$job_hash{source_root}; - } else { - undef $ENV{SOURCE_ROOT} if (defined $ENV{SOURCE_ROOT}); - }; - $error_code = system("$setsolar_string -file $cmd_file"); - store_env_hash($cmd_file); - return $error_code; -}; - -sub print_error { - my $message = shift; - print STDERR "\nERROR: $message\n"; - exit(1); -}; -sub store_env_hash { - my $ss_setenv_file = shift; - my %solar_vars = (); - my $cmd_file = File::Temp::tmpnam($ENV_BACKUP{TMP}); - my $env_vars_file = File::Temp::tmpnam($ENV_BACKUP{TMP}); - print "$cmd_file $env_vars_file\n"; - #get all env variables in $env_vars_file - open (COMMAND_FILE, ">$cmd_file"); - print COMMAND_FILE "source $ss_setenv_file\n"; - print COMMAND_FILE "env > $env_vars_file\n"; - close COMMAND_FILE; - system($ENV{SHELL}, $cmd_file); - print_error($?) if ($?); - unlink $cmd_file or system("rm -rf $cmd_file"); - unlink $ss_setenv_file or system("rm -rf $ss_setenv_file"); - - open SOLARTABLE, "<$env_vars_file" or die "can“t open solarfile $env_vars_file"; - while(<SOLARTABLE>) { - chomp; - s/\r\n//o; - /(=)/; - $solar_vars{$`} = $'; - }; - close SOLARTABLE; - unlink $env_vars_file or system("rm -rf $env_vars_file"); - $environments{$env_alias} = \%solar_vars; -}; -- 1.7.4.1
_______________________________________________ LibreOffice mailing list LibreOffice@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice