App-ClusterSSH

 view release on metacpan or  search on metacpan

lib/App/ClusterSSH/Cluster.pm  view on Meta::CPAN


    for my $file ( '/etc/tags', $ENV{HOME} . '/.clusterssh/tags', @files ) {
        $self->debug( 3, 'Loading in tags from: ', $file );
        $self->read_tag_file($file);
    }

    return $self;
}

sub list_external_clusters {
    my ( $self, ) = @_;

    my @list = $self->_run_external_clusters('-L');
    return wantarray
        ? sort @list
        : scalar @list;
}

sub get_external_clusters {
    my ( $self, @tags ) = @_;

    return $self->_run_external_clusters(@tags);
}

sub _run_external_clusters {
    my ( $self, @args ) = @_;

    my $external_command = $self->parent->config->{external_cluster_command};

    if ( !$external_command || !-x $external_command ) {
        $self->debug(
            1,
            'Cannot run external cluster command: ',
            $external_command || ''
        );
        return;
    }

    $self->debug( 3, 'Running tags through external command' );
    $self->debug( 4, 'External command: ', $external_command );
    $self->debug( 3, 'Args ', join( ',', @args ) );

    my $command = "$external_command @args";

    $self->debug( 3, 'Running ', $command );

    my $result;
    my $return_code;
    {
        local $SIG{CHLD} = undef;
        $result      = qx/ $command /;
        $return_code = $CHILD_ERROR >> 8;
    }
    chomp($result);

    $self->debug( 3, "Result: $result" );
    $self->debug( 3, "Return code: $return_code" );

    if ( $return_code != 0 ) {
        croak(
            App::ClusterSSH::Exception::Cluster->throw(
                error => $self->loc(
                    "External command failure.\nCommand: [_1]\nReturn Code: [_2]",
                    $command,
                    $return_code,
                ),
            )
        );
    }

    my @results = split / /, $result;

    return @results;
}

sub expand_filename {
    my ( $self, $filename ) = @_;
    my $home;

    # try to determine the home directory
    if ( !defined( $home = $ENV{'HOME'} ) ) {
        $home = ( getpwuid($>) )[5];
    }
    if ( !defined($home) ) {
        $self->debug( 3, 'No home found so leaving filename ',
            $filename, ' unexpanded' );
        return $filename;
    }
    $self->debug( 4, 'Using ', $home, ' as home directory' );

    # expand ~ or $HOME
    my $new_name = $filename;
    $new_name =~ s!^~/!$home/!g;
    $new_name =~ s!^\$HOME/!$home/!g;

    $self->debug( 2, 'Expanding ', $filename, ' to ', $new_name )
        unless ( $filename eq $new_name );

    return $new_name;
}

sub read_tag_file {
    my ( $self, $filename ) = @_;

    $filename = $self->expand_filename($filename);

    $self->debug( 2, 'Reading tags from file ', $filename );
    if ( -f $filename ) {
        my %hosts
            = $self->load_file( type => 'cluster', filename => $filename );
        foreach my $host ( keys %hosts ) {
            $self->debug( 4, "Got entry for $host on tags $hosts{$host}" );
            $self->register_host( $host, split( /\s+/, $hosts{$host} ) );
        }
    }
    else {
        $self->debug( 2, 'No file found to read' );
    }
    return $self;
}



( run in 0.769 second using v1.01-cache-2.11-cpan-39bf76dae61 )