Posted to tcl by kostix at Wed Nov 01 00:23:51 GMT 2006view pretty
#! /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;