From b49a2322d94d32fc115ec3d54282f78d1619c360 Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Fri, 6 Sep 2013 05:28:54 +0200 Subject: [PATCH] Can synchronize multiple target of ssh_keys --- process/ldap/sync_ssh_keys.pl | 135 ++++++++++++++++++++++++++++ process/ldap/sync_ssh_keys_forge.pl | 1 + process/ldap/sync_ssh_keys_git.pl | 1 + 3 files changed, 137 insertions(+) create mode 100644 process/ldap/sync_ssh_keys.pl create mode 120000 process/ldap/sync_ssh_keys_forge.pl create mode 120000 process/ldap/sync_ssh_keys_git.pl diff --git a/process/ldap/sync_ssh_keys.pl b/process/ldap/sync_ssh_keys.pl new file mode 100644 index 0000000..1653feb --- /dev/null +++ b/process/ldap/sync_ssh_keys.pl @@ -0,0 +1,135 @@ +#! /usr/bin/env perl + +use v5.10.1; +use strict; +use warnings; +use XML::LibXML; + +use lib "../../"; + +use ACU::LDAP; +use ACU::Log; +use ACU::Process; +use ACU::VCS::Git; + +my %master_actions = +( + "update" => \&master_update, + "register" => \&master_register, +); + +my %node_actions = +( + "git" => { "update" => \&node_git_update, }, +); + +my @nodes; +my $service; + +sub master_register +{ + my $args = shift; + + if ($args->{param}{nodename}) { + my $nodename = "sync_ssh_keys_".$args->{param}{nodename}; + + log INFO, "New node: $nodename"; + push @nodes, "$nodename"; + } + else { + log WARN, "nodename empty, cannot register new node"; + } +} + +sub master_update +{ + my $args = shift; + + my %params = ("action" => "update"); + + for (my $i = $args->{unamed}; $i > 0; $i--) { + $params{"__$i"} = $args->{param}{$i}; + } + + log TRACE, %params; + log DEBUG, "Start updating nodes..."; + + Process::Client::paralaunch(\@nodes, \%params); +} + +sub process_master +{ + my ($given_args, $args) = @_; + + my $action = $args->{param}{action} // "update"; + + if (! exists $master_actions{$action}) { + log WARN, "Unknown action '$action' for sync_ssh_keys master process."; + } + return $master_actions{$action}($args); +} + + +sub node_git_update +{ + my $args = shift; + + Git::init_conf(); + + my $commit_msg = "Updating keys for "; + for (my $i = $args->{unamed}; $i > 0; $i--) + { + Git::user_add($args->{param}{$i}, 1); + $commit_msg .= $args->{param}{$i}.", "; + } + + Git::save_conf("$commit_msg from sync_ssh_keys"); + + return 1; +} + +sub process_node +{ + my ($given_args, $args) = @_; + + my $action = $args->{param}{action} // "update"; + + if (! exists $node_actions{$service}{$action}) { + log WARN, "Unknown action '$action' for sync_ssh_keys $service node process."; + } + + return $node_actions{$service}{$action}($args); +} + + +if ($0 =~ /^(?:.*\/)?sync_ssh_keys_(?:([a-zA-Z0-9]+)_)?([a-zA-Z0-9]+).pl$/) { + $service = $1 // "git"; + + log INFO, "Starting sync_ssh_keys.pl as $service for server $2"; + + if ($service eq "git") + { + $Git::git_server = $2; + + log INFO, "Start by syncing all users key..."; + + Git::users_update(); + + log INFO, "Registering a new sync_ssh_keys node..."; + + Process::Client::launch("sync_ssh_keys", {"action" => "register", "nodename" => $service."_".$2}); + + Process::register("sync_ssh_keys_".$service."_$2", \&process_node); + } + else { + log FATAL, "Unknown service '$service', exiting."; + } +} +elsif ($0 =~ /^(?:.*\/)?sync_ssh_keys/) { + log INFO, "Starting sync_ssh_keys.pl as master process"; + + Process::register("sync_ssh_keys", \&process_master); +} +else { + die ("Bad filename."); +} diff --git a/process/ldap/sync_ssh_keys_forge.pl b/process/ldap/sync_ssh_keys_forge.pl new file mode 120000 index 0000000..a07f9c6 --- /dev/null +++ b/process/ldap/sync_ssh_keys_forge.pl @@ -0,0 +1 @@ +sync_ssh_keys.pl \ No newline at end of file diff --git a/process/ldap/sync_ssh_keys_git.pl b/process/ldap/sync_ssh_keys_git.pl new file mode 120000 index 0000000..a07f9c6 --- /dev/null +++ b/process/ldap/sync_ssh_keys_git.pl @@ -0,0 +1 @@ +sync_ssh_keys.pl \ No newline at end of file