diff options
Diffstat (limited to 'scripts/vyatta-update-cluster.pl')
-rwxr-xr-x | scripts/vyatta-update-cluster.pl | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/scripts/vyatta-update-cluster.pl b/scripts/vyatta-update-cluster.pl new file mode 100755 index 0000000..c90dcf8 --- /dev/null +++ b/scripts/vyatta-update-cluster.pl @@ -0,0 +1,78 @@ +#!/usr/bin/perl + +use strict; +use lib "/opt/vyatta/share/perl5/"; +use VyattaClusterConfig; + +my $HA_DIR = "/etc/ha.d"; +my $HA_INIT = "/etc/init.d/heartbeat"; +my $SERVICE_DIR = "/etc/init.d"; + +my $config = new VyattaClusterConfig; +$config->setup("cluster"); +if ($config->isEmpty()) { + # config is empty => deleted. + # shutdown clustering. + system("$HA_INIT stop"); + exit 0; +} + +open(OUT, ">>/tmp/cl.log") or exit 1; + +my ($authkeys, $haresources, $ha_cf, $err, @init_services); +while (1) { + ($authkeys, $err) = $config->authkeys(); + last if (!defined($authkeys)); + ($haresources, $err, @init_services) = $config->haresources(); + last if (!defined($haresources)); + ($ha_cf, $err) = $config->ha_cf(); + last; +} +if (defined($err)) { + print STDERR "Cluster configuration error: $err\n"; + exit 1; +} + +my $ret = system("mkdir -p $HA_DIR"); +if ($ret >> 8) { + print STDERR "Error: cannot create $HA_DIR\n"; + exit 1; +} + +if (!open(CONF_AUTH, ">$HA_DIR/authkeys")) { + print STDERR "Error: cannot create $HA_DIR/authkeys\n"; + exit 1; +} +if (!open(CONF_RES, ">$HA_DIR/haresources")) { + print STDERR "Error: cannot create $HA_DIR/haresources\n"; + exit 1; +} +if (!open(CONF_CF, ">$HA_DIR/ha.cf")) { + print STDERR "Error: cannot create $HA_DIR/ha.cf\n"; + exit 1; +} +print CONF_AUTH $authkeys; +print CONF_RES $haresources; +print CONF_CF $ha_cf; +close CONF_AUTH; +close CONF_RES; +close CONF_CF; +if (!chmod(0600, "$HA_DIR/authkeys")) { + print STDERR "Error: cannot change $HA_DIR/authkeys permissions\n"; + exit 1; +} + +# stop each service in case it is already started +foreach (@init_services) { + system("$SERVICE_DIR/$_ stop"); +} + +# restart clustering. +# using "stop" + "start" ("restart" will cause a long wait). +# (may need to change to "restart".) +system("$HA_INIT stop"); +system("$HA_INIT start"); + +close OUT; +exit 0; + |