mirror of
https://github.com/duncs/clusterssh.git
synced 2025-04-22 17:32:24 +00:00
Start using new cluster module
This commit is contained in:
parent
cd4c59b12e
commit
015e130d77
3 changed files with 70 additions and 130 deletions
|
@ -11,6 +11,7 @@ use base qw/ App::ClusterSSH::Base /;
|
|||
use App::ClusterSSH::Host;
|
||||
use App::ClusterSSH::Config;
|
||||
use App::ClusterSSH::Helper;
|
||||
use App::ClusterSSH::Cluster;
|
||||
|
||||
use FindBin qw($Script);
|
||||
|
||||
|
@ -54,8 +55,9 @@ sub new {
|
|||
|
||||
my $self = $class->SUPER::new(%args);
|
||||
|
||||
$self->{config} = App::ClusterSSH::Config->new();
|
||||
$self->{helper} = App::ClusterSSH::Helper->new();
|
||||
$self->{config} = App::ClusterSSH::Config->new();
|
||||
$self->{helper} = App::ClusterSSH::Helper->new();
|
||||
$self->{cluster} = App::ClusterSSH::Cluster->new();
|
||||
|
||||
# catch and reap any zombies
|
||||
$SIG{CHLD} = \&REAPER;
|
||||
|
@ -68,6 +70,11 @@ sub config {
|
|||
return $self->{config};
|
||||
}
|
||||
|
||||
sub cluster {
|
||||
my ($self) = @_;
|
||||
return $self->{cluster};
|
||||
}
|
||||
|
||||
sub helper {
|
||||
my ($self) = @_;
|
||||
return $self->{helper};
|
||||
|
@ -110,7 +117,6 @@ my @options_spec = (
|
|||
'use_all_a_records|A',
|
||||
);
|
||||
my %options;
|
||||
my %clusters; # hash for resolving cluster names
|
||||
my %windows; # hash for all window definitions
|
||||
my %menus; # hash for all menu definitions
|
||||
my @servers; # array of servers provided on cmdline
|
||||
|
@ -266,12 +272,6 @@ sub check_config() {
|
|||
}
|
||||
}
|
||||
|
||||
sub list_tags {
|
||||
print( 'Available cluster tags:', $/ );
|
||||
print "\t", $_, $/ foreach ( sort( keys(%clusters) ) );
|
||||
exit_prog;
|
||||
}
|
||||
|
||||
sub evaluate_commands {
|
||||
my ($self) = @_;
|
||||
my ( $return, $user, $port, $host );
|
||||
|
@ -432,107 +432,6 @@ SWITCH: for ($state) {
|
|||
return ( $state, $code );
|
||||
}
|
||||
|
||||
# read in all cluster definitions
|
||||
sub get_clusters() {
|
||||
my %config;
|
||||
warn 'TODO: rework clusters code';
|
||||
|
||||
# first, read in global file
|
||||
my $cluster_file = '/etc/clusters';
|
||||
|
||||
logmsg( 3, "Logging for $cluster_file" );
|
||||
|
||||
if ( -f $cluster_file ) {
|
||||
logmsg( 2, "Loading clusters in from $cluster_file" );
|
||||
open( CLUSTERS, $cluster_file ) || die("Couldnt read $cluster_file");
|
||||
my $l;
|
||||
while ( defined( $l = <CLUSTERS> ) ) {
|
||||
next
|
||||
if ( $l =~ /^\s*$/ || $l =~ /^#/ )
|
||||
; # ignore blank lines & commented lines
|
||||
chomp $l;
|
||||
if ( $l =~ s/\\\s*$// ) {
|
||||
$l .= <CLUSTER>;
|
||||
redo unless eof(CLUSTERS);
|
||||
}
|
||||
my @line = split( /\s/, $l );
|
||||
|
||||
#s/^([\w-]+)\s*//; # remote first word and stick into $1
|
||||
|
||||
logmsg(
|
||||
3,
|
||||
"cluster $line[0] = ",
|
||||
join( " ", @line[ 1 .. $#line ] )
|
||||
);
|
||||
$clusters{ $line[0] } = join( " ", @line[ 1 .. $#line ] )
|
||||
; # Now bung in rest of line
|
||||
}
|
||||
close(CLUSTERS);
|
||||
}
|
||||
|
||||
# Now get any definitions out of %config
|
||||
logmsg( 2, "Looking for csshrc" );
|
||||
if ( $config{clusters} ) {
|
||||
logmsg( 2, "Loading clusters in from csshrc" );
|
||||
|
||||
foreach ( split( /\s+/, $config{clusters} ) ) {
|
||||
if ( !$config{$_} ) {
|
||||
warn(
|
||||
"WARNING: missing cluster definition in .csshrc file ($_)"
|
||||
);
|
||||
}
|
||||
else {
|
||||
logmsg( 3, "cluster $_ = $config{$_}" );
|
||||
$clusters{$_} = $config{$_};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# and any clusters defined within the config file or on the command line
|
||||
if ( $config{extra_cluster_file} || $options{'cluster-file'} ) {
|
||||
|
||||
# check for multiple entries and push it through glob to catch ~'s
|
||||
foreach my $item ( split( /,/, $config{extra_cluster_file} ),
|
||||
$options{'cluster-file'} )
|
||||
{
|
||||
next unless ($item);
|
||||
|
||||
# cater for people using '$HOME'
|
||||
$item =~ s/\$HOME/$ENV{HOME}/;
|
||||
foreach my $file ( glob($item) ) {
|
||||
if ( !-r $file ) {
|
||||
warn("Unable to read cluster file '$file': $!\n");
|
||||
next;
|
||||
}
|
||||
logmsg( 2, "Loading clusters in from '$file'" );
|
||||
|
||||
open( CLUSTERS, $file ) || die("Couldnt read '$file': $!\n");
|
||||
my $l;
|
||||
while ( defined( $l = <CLUSTERS> ) ) {
|
||||
next if ( $l =~ /^\s*$/ || $l =~ /^#/ );
|
||||
chomp $l;
|
||||
if ( $l =~ s/\\\s*$// ) {
|
||||
$l .= <CLUSTER>;
|
||||
redo unless eof(CLUSTERS);
|
||||
}
|
||||
|
||||
my @line = split( /\s/, $l );
|
||||
logmsg(
|
||||
3,
|
||||
"cluster $line[0] = ",
|
||||
join( " ", @line[ 1 .. $#line ] )
|
||||
);
|
||||
$clusters{ $line[0] } = join( " ", @line[ 1 .. $#line ] )
|
||||
; # Now bung in rest of line
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
logmsg( 2, "Finished loading clusters" );
|
||||
}
|
||||
|
||||
sub resolve_names(@) {
|
||||
my ( $self, @servers ) = @_;
|
||||
logmsg( 2, 'Resolving cluster names: started' );
|
||||
|
@ -547,23 +446,23 @@ sub resolve_names(@) {
|
|||
}
|
||||
if ( $self->config->{use_all_a_records}
|
||||
&& $dirty !~ m/^(\d{1,3}\.?){4}$/
|
||||
&& !defined( $clusters{$dirty} ) )
|
||||
&& !defined( $self->cluster->get_tag($dirty) ) )
|
||||
{
|
||||
my $hostobj = gethostbyname($dirty);
|
||||
if ( defined($hostobj) ) {
|
||||
my @alladdrs = map { inet_ntoa($_) } @{ $hostobj->addr_list };
|
||||
if ( $#alladdrs > 0 ) {
|
||||
$clusters{$dirty} = join ' ', @alladdrs;
|
||||
logmsg( 3, 'Expanded to ', $clusters{$dirty} );
|
||||
$self->cluster->register_tag($dirty, @alladdrs);
|
||||
logmsg( 3, 'Expanded to ', $self->cluster->get_tag($dirty) );
|
||||
}
|
||||
else {
|
||||
logmsg( 3, 'Only one A record' );
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( $clusters{$dirty} ) {
|
||||
if ( $self->cluster->get_tag($dirty) ) {
|
||||
logmsg( 3, '... it is a cluster' );
|
||||
foreach my $node ( split( / /, $clusters{$dirty} ) ) {
|
||||
foreach my $node ( $self->cluster->get_tag($dirty) ) {
|
||||
if ($username) {
|
||||
$node =~ s/^(.*)@//;
|
||||
$node = $username . '@' . $node;
|
||||
|
@ -1556,14 +1455,14 @@ sub create_windows() {
|
|||
);
|
||||
|
||||
if ( $self->config->{max_addhost_menu_cluster_items}
|
||||
&& scalar keys %clusters )
|
||||
&& scalar $self->cluster->list_tags() )
|
||||
{
|
||||
if (scalar
|
||||
keys %clusters < $self->config->{max_addhost_menu_cluster_items} )
|
||||
scalar $self->cluster->list_tags() < $self->config->{max_addhost_menu_cluster_items} )
|
||||
{
|
||||
$menus{listbox} = $windows{addhost}->Listbox(
|
||||
-selectmode => 'extended',
|
||||
-height => scalar keys %clusters,
|
||||
-height => scalar $self->cluster->list_tags(),
|
||||
)->pack();
|
||||
}
|
||||
else {
|
||||
|
@ -1574,7 +1473,7 @@ sub create_windows() {
|
|||
-height => $self->config->{max_addhost_menu_cluster_items},
|
||||
)->pack();
|
||||
}
|
||||
$menus{listbox}->insert( 'end', sort keys %clusters );
|
||||
$menus{listbox}->insert( 'end', sort $self->cluster->list_tags() );
|
||||
}
|
||||
|
||||
$windows{host_entry} = $windows{addhost}->add(
|
||||
|
@ -1970,17 +1869,41 @@ sub run {
|
|||
|
||||
load_keyboard_map();
|
||||
|
||||
get_clusters();
|
||||
# read in normal cluster files
|
||||
$self->cluster->read_cluster_file('/etc/clusters');
|
||||
if ( $self->config->{extra_cluster_file} || $options{'cluster-file'} ) {
|
||||
foreach my $item ( split( /,/, $self->config->{extra_cluster_file} ),
|
||||
$options{'cluster-file'} )
|
||||
{
|
||||
next unless ($item);
|
||||
$item =~ s/\$HOME/$ENV{HOME}/;
|
||||
foreach my $file ( glob($item) ) {
|
||||
if ( !-r $file ) {
|
||||
warn("Unable to read cluster file '$file': $!\n");
|
||||
next;
|
||||
}
|
||||
|
||||
list_tags() if ( $options{'list'} );
|
||||
$self->cluster->read_cluster_file($file);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$self->cluster->get_clusters( $self->config->{extra_cluster_file} );
|
||||
|
||||
if ( $options{'list'} ) {
|
||||
print( 'Available cluster tags:', $/ );
|
||||
print "\t", $_, $/ foreach ( sort( $self->cluster->list_tags ) );
|
||||
exit_prog();
|
||||
}
|
||||
|
||||
if (@ARGV) {
|
||||
@servers = $self->resolve_names(@ARGV);
|
||||
}
|
||||
else {
|
||||
if ( $clusters{default} ) {
|
||||
if ( $self->cluster->get_tag('default') ) {
|
||||
@servers
|
||||
= $self->resolve_names( split( /\s+/, $clusters{default} ) );
|
||||
= $self->resolve_names( $self->cluster->get_tag('default') );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -24,18 +24,21 @@ sub new {
|
|||
}
|
||||
|
||||
sub get_clusters {
|
||||
my ($self) = @_;
|
||||
my ( $self, @files ) = @_;
|
||||
|
||||
$self->read_cluster_file('/etc/clusters');
|
||||
for my $file ( '/etc/clusters', @files ) {
|
||||
$self->debug(3, 'Loading in config from: ', $file);
|
||||
$self->read_cluster_file($file);
|
||||
}
|
||||
|
||||
return $self;
|
||||
}
|
||||
|
||||
sub read_cluster_file {
|
||||
my ( $self, $filename ) = @_;
|
||||
$self->debug( 2, 'Reading clusters from file ', $filename );
|
||||
|
||||
if ( -f $filename ) {
|
||||
$self->debug( 2, 'Reading clusters from file ', $filename );
|
||||
open( my $fh, '<', $filename )
|
||||
|| croak(
|
||||
App::ClusterSSH::Exception::Cluster->throw(
|
||||
|
@ -56,7 +59,7 @@ sub read_cluster_file {
|
|||
$line .= <$fh>;
|
||||
redo unless eof($fh);
|
||||
}
|
||||
my @line = split( /\s/, $line );
|
||||
my @line = split( /\s+/, $line );
|
||||
|
||||
#s/^([\w-]+)\s*//; # remote first word and stick into $1
|
||||
|
||||
|
@ -66,6 +69,9 @@ sub read_cluster_file {
|
|||
|
||||
close($fh);
|
||||
}
|
||||
else {
|
||||
$self->debug( 2, 'No file found to read');
|
||||
}
|
||||
return $self;
|
||||
}
|
||||
|
||||
|
@ -85,13 +91,19 @@ sub get_tag {
|
|||
if ( $self->{$tag} ) {
|
||||
$self->debug( 2, "Retrieving tag $tag: ",
|
||||
join( ' ', $self->{$tag} ) );
|
||||
return $self->{$tag};
|
||||
|
||||
return @{ $self->{$tag} };
|
||||
}
|
||||
|
||||
$self->debug( 2, "Tag $tag is not registered" );
|
||||
return;
|
||||
}
|
||||
|
||||
sub list_tags {
|
||||
my ($self) = @_;
|
||||
return keys(%$self);
|
||||
}
|
||||
|
||||
sub resolve_all_tags {
|
||||
my ($self) = @_;
|
||||
|
||||
|
|
|
@ -12,8 +12,9 @@ use Try::Tiny;
|
|||
use FindBin qw($Script);
|
||||
|
||||
use base qw/ App::ClusterSSH::Base /;
|
||||
use App::ClusterSSH::Cluster;
|
||||
|
||||
my %clusters;
|
||||
my $clusters;
|
||||
my @app_specific = (qw/ command title comms method ssh rsh telnet ccon /);
|
||||
my %default_config = (
|
||||
terminal => "xterm",
|
||||
|
@ -94,6 +95,8 @@ sub new {
|
|||
|
||||
$self->{title} = uc($Script);
|
||||
|
||||
$clusters=App::ClusterSSH::Cluster->new();
|
||||
|
||||
return $self->validate_args(%args);
|
||||
}
|
||||
|
||||
|
@ -175,10 +178,12 @@ sub parse_config_file {
|
|||
|
||||
# grab any clusters from the config before validating it
|
||||
if ( $read_config{clusters} ) {
|
||||
carp("TODO: deal with clusters");
|
||||
$self->debug( 3, "Picked up clusters defined in $config_file" );
|
||||
foreach my $cluster ( sort split / /, $read_config{clusters} ) {
|
||||
if($read_config{$cluster}) {
|
||||
$clusters->register_tag($cluster,$read_config{$cluster});
|
||||
delete( $read_config{$cluster} );
|
||||
}
|
||||
}
|
||||
delete( $read_config{clusters} );
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue