Posted to tcl by kostix at Wed Nov 01 00:23:51 GMT 2006view raw
- #! /usr/bin/perl
- # Minimalistic start-up frontend for SCREEN.
- # At first, asks the screen whether there're some lingering screen sessions.
- # If there is none, just starts screen, otherwise asks the user
- # to select desired session (or opt for creating a new one).
- # Given the user choice, arranges to make the user connected to what he/she chose.
- # v1.0, 06-Aug-2005, kostix. Initial version.
- # TODO extract PTY and host from the screen's output, show them to the user.
- # TODO (?) add options processing.
- use strict;
- use warnings;
- open SCREENS, 'screen -ls 2>&1 |';
- my (@screens, $complaint);
- push @screens, [ '<make new session>', 'new' ];
- while(<SCREENS>) {
- # $1 -> screen id, $2 -> mode:
- if (/^\s+(\d+).*\s+\((\w+)\)$/) {
- push @screens, [ $1, lc $2 ];
- } else {
- $complaint .= $_;
- }
- }
- my $ok = close SCREENS;
- $ok >>= 8, die "screen -ls returned $ok and said: $complaint" unless $ok != 1;
- exec 'screen' unless @screens; # just spawn screen making new session.
- my $no = 0;
- foreach my $ref (@screens) {
- my $id = $ref->[0]; my $state = $ref->[1];
- print "$no: $id -> $state\n";
- ++$no;
- }
- require Term::ReadLine;
- my $rl = Term::ReadLine->new('Screen Selector');
- my $resp = undef;
- while ('forever') {
- $resp = $rl->readline('Pick one or give EOF: ');
- exit 1 unless defined $resp; # bail out on EOF
- last if $resp =~ qr/^\d+$/;
- print "Never learned how to type a number?\n";
- }
- exec 'screen' if $resp == 0; # user has opted for new session
- # Reattach to a running session:
- my @spell = ('screen');
- push @spell, '-d' if $screens[$resp][1] eq 'attached';
- push @spell, '-r', $screens[$resp][0];
- exec @spell;