App-ClusterSSH
view release on metacpan or search on metacpan
lib/App/ClusterSSH.pm view on Meta::CPAN
my ( $state, $code ) = ( $1, $2 );
$self->debug( 2, "keyboardmap=:", $keyboardmap{$keysym}, ":" );
$self->debug( 2, "state=$state, code=$code" );
SWITCH: for ($state) {
/^n$/ && do {
$state = 0;
last SWITCH;
};
/^s$/ && do {
$state = Shift();
last SWITCH;
};
/^a$/ && do {
$state = Mod5();
last SWITCH;
};
/^sa$/ && do {
$state = Shift() + Mod5();
last SWITCH;
};
die("Should never reach here");
}
$self->debug( 2, "returning state=:$state: code=:$code:" );
return ( $state, $code );
}
sub resolve_names(@) {
my ( $self, @servers ) = @_;
$self->debug( 2, 'Resolving cluster names: started' );
foreach (@servers) {
my $dirty = $_;
my $username = q{};
$self->debug( 3, 'Checking tag ', $_ );
if ( $dirty =~ s/^(.*)@// ) {
$username = $1;
}
my @tag_list = $self->cluster->get_tag($dirty);
if ( $self->config->{use_all_a_records}
&& $dirty !~ m/^(\d{1,3}\.?){4}$/
&& !@tag_list )
{
my $hostobj = gethostbyname($dirty);
if ( defined($hostobj) ) {
my @alladdrs = map { inet_ntoa($_) } @{ $hostobj->addr_list };
$self->cluster->register_tag( $dirty, @alladdrs );
if ( $#alladdrs > 0 ) {
$self->debug( 3, 'Expanded to ',
join( ' ', $self->cluster->get_tag($dirty) ) );
@tag_list = $self->cluster->get_tag($dirty);
}
else {
# don't expand if there is only one record found
$self->debug( 3, 'Only one A record' );
}
}
}
if (@tag_list) {
$self->debug( 3, '... it is a cluster' );
foreach my $node (@tag_list) {
if ($username) {
$node =~ s/^(.*)@//;
$node = $username . '@' . $node;
}
push( @servers, $node );
}
$_ = q{};
}
}
# now run everything through the external command, if one is defined
if ( $self->config->{external_cluster_command} ) {
$self->debug( 4, 'External cluster command defined' );
# use a second array here in case of failure so previously worked
# out entries are not lost
my @new_servers;
eval {
@new_servers = $self->cluster->get_external_clusters(@servers);
};
if ($@) {
warn $@, $/;
}
else {
@servers = @new_servers;
}
}
# now clean the array up
@servers = grep { $_ !~ m/^$/ } @servers;
if ( $self->config->{unique_servers} ) {
$self->debug( 3, 'removing duplicate server names' );
@servers = remove_repeated_servers(@servers);
}
$self->debug( 3, 'leaving with ', $_ ) foreach (@servers);
$self->debug( 2, 'Resolving cluster names: completed' );
return (@servers);
}
sub remove_repeated_servers {
my %all = ();
@all{@_} = 1;
return ( keys %all );
}
sub change_main_window_title() {
my ($self) = @_;
my $number = keys(%servers);
$windows{main_window}->title( $self->config->{title} . " [$number]" );
}
sub show_history() {
my ($self) = @_;
if ( $self->config->{show_history} ) {
$windows{history}->packForget();
$windows{history}->selectAll();
$windows{history}->deleteSelected();
$self->config->{show_history} = 0;
}
else {
$windows{history}->pack(
-fill => "x",
-expand => 1,
);
$self->config->{show_history} = 1;
}
}
sub update_display_text($) {
my ( $self, $char ) = @_;
return if ( !$self->config->{show_history} );
$self->debug( 2, "Dropping :$char: into display" );
SWITCH: {
foreach ($char) {
/^Return$/ && do {
$windows{history}->insert( 'end', "\n" );
last SWITCH;
};
/^BackSpace$/ && do {
$windows{history}->delete('end - 2 chars');
last SWITCH;
};
/^(:?Shift|Control|Alt)_(:?R|L)$/ && do {
last SWITCH;
};
length($char) > 1 && do {
$windows{history}
->insert( 'end', chr( $keysymtocode{$char} ) )
if ( $keysymtocode{$char} );
last SWITCH;
};
do {
$windows{history}->insert( 'end', $char );
last SWITCH;
};
}
}
return $self;
}
sub substitute_macros {
my ( $self, $svr, $text ) = @_;
return $text unless ( $self->config->{macros_enabled} eq 'yes' );
{
my $macro_servername = $self->config->{macro_servername};
( my $servername = $svr ) =~ s/\s+//;
$text =~ s!$macro_servername!$servername!xsmg;
}
{
my $macro_hostname = $self->config->{macro_hostname};
my $hostname = $servers{$svr}{givenname};
$text =~ s!$macro_hostname!$hostname!xsmg;
}
{
lib/App/ClusterSSH.pm view on Meta::CPAN
# get current number of clients
$self->config->{internal_total} = int( keys(%servers) );
#$self->debug( 3, "Number after tidy is: ", $config{internal_total} );
# get current number of clients
$self->config->{internal_total} = int( keys(%servers) );
#$self->debug( 3, "Number after tidy is: ", $config{internal_total} );
# If there are no hosts in the list and we are set to autoquit
if ( $self->config->{internal_total} == 0
&& $self->config->{auto_quit} =~ /yes/i )
{
# and some clients were actually opened...
if ( $self->config->{internal_activate_autoquit} ) {
$self->debug( 2, "Autoquitting" );
$self->exit_prog;
}
}
# rebuild host menu if something has changed
$self->build_hosts_menu() if ($build_menu);
# clean out text area, anyhow
$menus{entrytext} = "";
#$self->debug( 3, "repeat completed" );
}
);
$self->debug( 2, "Repeat setup" );
return $self;
}
### Window and menu definitions ###
sub create_windows() {
my ($self) = @_;
$self->debug( 2, "create_windows: started" );
$windows{main_window}
= MainWindow->new( -title => "ClusterSSH", -class => 'cssh', );
$windows{main_window}->withdraw; # leave withdrawn until needed
if ( defined( $self->config->{console_position} )
&& $self->config->{console_position} =~ /[+-]\d+[+-]\d+/ )
{
$windows{main_window}->geometry( $self->config->{console_position} );
}
$menus{entrytext} = "";
$windows{text_entry} = $windows{main_window}->Entry(
-textvariable => \$menus{entrytext},
-insertborderwidth => 4,
-width => 25,
-class => 'cssh',
)->pack(
-fill => "x",
-expand => 1,
);
$windows{history} = $windows{main_window}->Scrolled(
"ROText",
-insertborderwidth => 4,
-width => $self->config->{history_width},
-height => $self->config->{history_height},
-state => 'normal',
-takefocus => 0,
-class => 'cssh',
);
$windows{history}->bindtags(undef);
if ( $self->config->{show_history} ) {
$windows{history}->pack(
-fill => "x",
-expand => 1,
);
}
$windows{main_window}->bind( '<Destroy>' => sub { $self->exit_prog } );
# remove all Paste events so we set them up cleanly
$windows{main_window}->eventDelete('<<Paste>>');
# Set up paste events from scratch
if ( $self->config->{key_paste} && $self->config->{key_paste} ne "null" )
{
$windows{main_window}->eventAdd(
'<<Paste>>' => '<' . $self->config->{key_paste} . '>' );
}
if ( $self->config->{mouse_paste}
&& $self->config->{mouse_paste} ne "null" )
{
$windows{main_window}->eventAdd(
'<<Paste>>' => '<' . $self->config->{mouse_paste} . '>' );
}
$windows{main_window}->bind(
'<<Paste>>' => sub {
$self->debug( 2, "PASTE EVENT" );
$menus{entrytext} = "";
my $paste_text = '';
# SelectionGet is fatal if no selection is given
Tk::catch {
$paste_text = $windows{main_window}->SelectionGet;
};
if ( !length($paste_text) ) {
warn("Got empty paste event\n");
return;
}
$self->debug( 2, "Got text :", $paste_text, ":" );
$self->update_display_text($paste_text);
# now sent it on
foreach my $svr ( keys(%servers) ) {
$self->send_text( $svr, $paste_text )
if ( $servers{$svr}{active} == 1 );
}
}
);
$windows{help} = $windows{main_window}->Dialog(
-popover => $windows{main_window},
-overanchor => "c",
-popanchor => "c",
-class => 'cssh',
-font => [
-family => "interface system",
-size => 10,
],
( run in 1.745 second using v1.01-cache-2.11-cpan-97f6503c9c8 )