diff --git a/AUTHORS b/AUTHORS index 41fef67..3902d46 100644 --- a/AUTHORS +++ b/AUTHORS @@ -2,5 +2,5 @@ N:Johann Dréo P:nojhan E:nojhan@gmail.com D:2009-06-23 -C:Initial code, maintener +C:Initial code, lead developper diff --git a/CHANGELOG b/CHANGELOG index ec69559..3691590 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +current: +* added a via_host field (show on which host the tunnel is build) +* don't try to show connections if the user is not root + 0.2: * update from the deprecated popen3 functions to the subprocess module (need python >= 2.4) * html help page diff --git a/ereshkigal.py b/ereshkigal.py index eb2d8c7..1aff738 100644 --- a/ereshkigal.py +++ b/ereshkigal.py @@ -4,18 +4,18 @@ # Ereshkigal is an AutoSSH tunnel monitor # It gives a curses user interface to monitor existing SSH tunnel that are managed with autossh. # -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . # # Author : Johann "nojhan" Dréo # @@ -31,18 +31,9 @@ import subprocess from operator import itemgetter class SSHTunnel(dict): - """A dictionary that stores an SSH connection related to a tunnel""" + """A dictionary that stores an SSH connection related to a tunnel""" - def __init__(self, - local_address = '1.1.1.1', - local_port = 0, - foreign_address = '1.1.1.1', - foreign_port = 0, - target_host = "Unknown", - status = 'UNKNOWN', - ssh_pid = 0, - autossh_pid = 0 - ): + def __init__(self, local_address = '1.1.1.1', local_port = 0, foreign_address = '1.1.1.1', foreign_port = 0, target_host = "Unknown", status = 'UNKNOWN', ssh_pid = 0, autossh_pid = 0 ): # informations available with netstat self['local_address'] = local_address @@ -69,7 +60,7 @@ class SSHTunnel(dict): class AutoSSHInstance(dict): - """A dictionary that stores an autossh process""" + """A dictionary that stores an autossh process""" def __init__(self, pid = 0, local_port = 0, via_host="Unknown", target_host = "Unknown",foreign_port = 0): @@ -98,7 +89,7 @@ class AutoSSHInstance(dict): class AutoSSHTunnelMonitor(list): - """List of existing autossh processes and ssh connections""" + """List of existing autossh processes and ssh connections""" def __init__(self): """Warning: the initialization does not gather tunnels informations, use update() to do so""" @@ -150,19 +141,19 @@ class AutoSSHTunnelMonitor(list): # use the operator module self[:] = sorted( self, key=itemgetter( key ) ) - def get_autossh_instances(self): - """Gather and parse autossh processes""" + def get_autossh_instances(self): + """Gather and parse autossh processes""" def get_autossh_instances(self): """Gather and parse autossh processes""" # call the command - #status = os.popen3( self.ps_cmd ) + #status = os.popen3( self.ps_cmd ) - p = subprocess.Popen( self.ps_cmd, shell=True, - stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True) + p = subprocess.Popen( self.ps_cmd, shell=True, + stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True) - status = (p.stdin, p.stdout, p.stderr) + status = (p.stdin, p.stdout, p.stderr) # list of processes with the "autossh" string @@ -201,13 +192,13 @@ class AutoSSHTunnelMonitor(list): def get_connections(self): """Gather and parse ssh connections related to a tunnel""" - #status = os.popen3( self.network_cmd ) + #status = os.popen3( self.network_cmd ) - p = subprocess.Popen( self.network_cmd, shell=True, - stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True) + p = subprocess.Popen( self.network_cmd, shell=True, + stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True) - status = (p.stdin, p.stdout, p.stderr) - + status = (p.stdin, p.stdout, p.stderr) + status_list = status[1].readlines() list = [i.split() for i in status_list if 'ssh' in i] @@ -274,23 +265,7 @@ class AutoSSHTunnelMonitor(list): # add to the list of tunnels of the AutoSSHInstance instance i['tunnels'] += [t] - return autosshs - - # instanciation - tunnels += [ SSHTunnel( local_addr, local_port, foreign_addr, foreign_port, autohost, status, sshpid, ppid ) ] - - return tunnels - - - def bind_tunnels(self, autosshs, tunnels): - """Bind autossh process to the related ssh connections, according to the pid""" - for t in tunnels: - for i in autosshs: - if i['pid'] == t['autossh_pid']: - # add to the list of tunnels of the AutoSSHInstance instance - i['tunnels'] += [t] - - return autosshs + return tunnels ################################################################################################# @@ -302,7 +277,7 @@ import time import signal class monitorCurses: - """Textual user interface to display up-to-date informations about current tunnels""" + """Textual user interface to display up-to-date informations about current tunnels""" def __init__(self, scr): # curses screen @@ -359,6 +334,8 @@ class monitorCurses: if kc != -1: # if keypress pass + ch = chr(0) + if 0 < kc < 256: # if ascii key # ascii character from the keycode ch = chr(kc) @@ -516,8 +493,8 @@ class monitorCurses: self.scr.clrtoeol() - def add_autossh_info( self, key, line ): - """Add an information of an autossh process, in the configured color""" + def add_autossh_info( self, key, line ): + """Add an information of an autossh process, in the configured color""" def add_autossh_info( self, key, line ): """Add an information of an autossh process, in the configured color""" @@ -538,14 +515,14 @@ class monitorCurses: self.scr.addstr( '\t', curses.color_pair(colors[key]) ) if __name__ == "__main__": - import sys - from optparse import OptionParser + import sys + from optparse import OptionParser - usage = """%prog [options] -A user interface to monitor existing SSH tunnel that are managed with autossh. -Called without options, ereshkigal displays a list of tunnels on the standard output. -Note: Users other than root will not see tunnels connections""" - parser = OptionParser(usage=usage) + usage = """%prog [options] + A user interface to monitor existing SSH tunnel that are managed with autossh. + Called without options, ereshkigal displays a list of tunnels on the standard output. + Note: Users other than root will not see tunnels connections""" + parser = OptionParser(usage=usage) parser.add_option("-c", "--curses", action="store_true", dest="curses", default=False, help="start the user interface in text mode") @@ -554,7 +531,7 @@ Note: Users other than root will not see tunnels connections""" parser.add_option("-a", "--autossh", action="store_true", dest="autossh", default=False, help="display only the list of autossh processes") - (options, args) = parser.parse_args() + (options, args) = parser.parse_args() # unfortunately, options class has no __len__ method in python 2.4.3 (bug?) #if len(options) > 1: