detectvnc.pl

#!/usr/bin/perl -w
##############################################################################
## FILE:  detectvnc.pl 
## DESC:  display information about VNC server instances
## VERS:  01
## DATE:  2009-05-13
## AUTH:  pdw@thesoftwaremaster.com
##############################################################################
##  USAGE NOTES:
##
##    This is a script to find out the connection port number and screen
##    geometry of any VNC server instances currently running on a host.  
##
##    This functionality is most useful to a user who needs to know what VNC
##    server instance(s) is(are) running, and on what port(s) - E.G.  at logon
##    (to a shell) time when a vncserver has been left running.
##
##    For convenience, the geometry of the X interface, the PID of Xvnc (the
##    actual X server invoked by vncserver), and such other info as we can
##    glean from the process listing on the host.
##
##    Note that this script only returns information about VNC instances
##    running under the UID of the user who runs the script.  The value of
##    the environment variable $USER is used to filter the process listing.
##    The user's $UID value is displayed, but is not used.
##
##    This program is designed to be run on a remote, ssh-accessible host
##    computer during the login and user account initialization process.
##
##  EXAMPLE:
##
##    I place this script in the .bash_login shell script that runs at user
##    login.
##
##
##  _TODO_: there is no buglist, yet, but there are some things need done to
##          this script right to begin with (i.e. the functionality is
##          marginal, and will almost certainly "break" the first time someone
##          tries to use it on some other platform or environment.  First on
##          the list of things to do must be: Fix the regular expression
##          parsing which finds the data in the process listing.  As the code
##          is now, these regex statements will break e.g. if the Xvnc command
##          line doesn't look like it expects. 2nd on the list has to be the
##          addtion of command line parameters to modify the output of the
##          script. :_TODO_
##
#############################################################################
##  REVISION HISTORY:
##
##     02: 2014-06-13 pdw@gmail.com
##     01: 2009-05-13 pdw
##         Initial version
##
#############################################################################
##
##   8258 pts/3    S      5:22 Xtightvnc :12 -desktop X
##      -httpd /usr/share/tightvnc-java 
##      -auth /home/mint/.Xauthority 
##      -geometry 800x600 -depth 24 -rfbwait 120000 
##      -rfbauth /home/mint/.vnc/passwd 
##      -rfbport 5912 
##      -fp /usr/share/fonts/X11/misc/,
##          /usr/share/fonts/X11/Type1/,
##          /usr/share/fonts/X11/75dpi/,
##          /usr/share/fonts/X11/100dpi/ 
##      -co /etc/X11/rgb
##
## Load up some environmental info...
$curruid = `echo \$UID`;
$curruser = `echo \$USER`;
@processes = `ps x -u \$USER`;
chomp($curruid);
chomp($curruser);
## @displays gets the data about whatever VNC displays are running
@displays = ();
while ($_ = shift(@processes)) {
 my $d = {};
 my $found = 0;
 chomp;
 next unless ($_);
 next unless (/^\s*(\d+).+Xtightvnc\s*(\:\d+)/)
  && ( $display = $2, $vncpid = $1 );
 # get desktop 
 m/-desktop(.+)-httpd/ 
  && ($desktop = $1);
 m/-geometry\s+(\d+x\d+)/
  && ( $geometry = $1 );
 m/-depth\s+(\d+)/
  && ( $depth = $1 );
 $d = {
  'Display'  => $display,
  'VNC PID'  => $vncpid,
  'Desktop'  => $desktop,
  'Geometry' => $geometry,
  'Depth'    => $depth,
 };
 push(@displays, $d);
}
## Display what we found out 
print "VNC server info for USER \'$curruser\':\n";
if (scalar(@displays)) {
 foreach my $disp (@displays) {
  foreach my $k (keys(%$disp))
  {
   print"  $k: \t".$disp->{$k}."\n";
  }
 }
} else {
 print "
  VNC server not found in process listing.
"
}