#!/usr/local/bin/perl # cluster.cgi # Optionally copy to and run the configuration on all managed hosts require './cfengine-lib.pl'; &foreign_require("servers", "servers-lib.pl"); &ReadParse(); &ui_print_header(undef, $text{'cluster_title'}, ""); $| = 1; # Build options string $args .= " -v" if ($in{'verbose'}); $args .= " --dry-run" if ($in{'dry'}); $args .= " -i" if ($in{'noifc'}); $args .= " -m" if ($in{'nomnt'}); $args .= " -s" if ($in{'nocmd'}); $args .= " -t" if ($in{'notidy'}); $args .= " -X" if ($in{'nolinks'}); # Setup error handler for down hosts sub run_error { $run_error_msg = join("", @_); } &remote_error_setup(\&run_error); # Run on all hosts print "$text{'cluster_header'}

\n"; @hosts = &list_cfengine_hosts(); @servers = &list_servers(); $p = 0; foreach $h (@hosts) { local ($s) = grep { $_->{'id'} == $h->{'id'} } @servers; local ($rh = "READ$p", $wh = "WRITE$p"); pipe($rh, $wh); if (!fork()) { close($rh); &remote_foreign_require($s->{'host'}, "cfengine", "cfengine-lib.pl"); if ($run_error_msg) { # Host is down print $wh &serialise_variable([ 0, $run_error_msg ]); exit; } local $rconf = &remote_eval($s->{'host'}, "cfengine", "\$cfengine_conf"); # Copy the config if requested and if not local if ($in{'copy'} && $s->{'id'}) { $lst = [ stat($cfengine_conf) ]; $rst = &remote_eval($s->{'host'}, "cfengine", '[ stat($cfengine_conf) ]'); if ($lst->[1] != $rst->[1] || $lst->[7] != $rst->[7] || $lst->[9] != $rst->[9]) { &remote_write($s->{'host'}, $cfengine_conf, $rconf); } } # Execute code to run cfengine $out = &remote_eval($s->{'host'}, "cfengine", "\$ENV{'CFINPUTS'} = \$config{'cfengine_dir'}; `\$config{'cfengine'} -f \$cfengine_conf $args 2>&1 {'id'} == $h->{'id'} } @servers; local $d = $s->{'desc'} ? $s->{'desc'} : $s->{'host'}; local $rh = "READ$p"; local $line = <$rh>; local $rv = &unserialise_variable($line); close($rh); print &ui_hr(); if ($rv && $rv->[0]) { # Run ok! Show the output print "",&text('cluster_success', $d),"
\n"; print "

$rv->[1]
\n"; } else { # Something went wrong print &text('cluster_failed', $d, $rv->[1]),"
\n"; } $p++; } &remote_finished(); &ui_print_footer("list_hosts.cgi", $text{'hosts_return'});