#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
Python Module Info CGI
Zeigt alle installierten Module an und gibt details dazu aus.
Zur Info:
In PyLucid gibt es diese Modul in einer besseren Variante
schon eingebaut: http://www.pylucid.org
"""
__author__ = "Jens Diemer (www.jensdiemer.de)"
__license__ = "GNU General Public License (GPL)"
__url__ = "http://www.python-forum.de/viewtopic.php?t=3816"
__version__ = "0.4"
__history__ = """
v0.4
- Geht nun auch, wenn modPython (?) im Spiel ist!
v0.3.1
- Mehr Info's am Ende der Seite
v0.3
- spuckt auch in moduleinfo den help() Text aus
v0.2
- Informationen eines Moduls können angezeigt werden
- umgebaut zum CGI Progie
v0.1
- erste Version
"""
import cgitb;cgitb.enable()
print "Content-type: text/html; charset=utf-8\r\n"
print "
Module Info v%s
" % __version__
import os, sys, glob, imp
class modules:
"""
Auflisten aller installierten Module
"""
def __init__( self ):
self.glob_suffixes = self.get_suffixes()
filelist = self.scan()
modulelist = self.test( filelist )
self.print_result( modulelist )
def get_suffixes( self ):
"""
Liste aller Endungen aufbereitet für glob()
"""
suffixes = ["*"+i[0] for i in imp.get_suffixes()]
suffixes = "[%s]" % "|".join(suffixes)
return suffixes
def get_files( self, path ):
"""
Liefert alle potentiellen Modul-Dateien eines Verzeichnisses
"""
files = []
for suffix in self.glob_suffixes:
searchstring = os.path.join( path, suffix )
files += glob.glob(searchstring)
return files
def scan( self ):
"""
Verzeichnisse nach Modulen abscannen
"""
filelist = []
pathlist = sys.path
for path_item in pathlist:
if not os.path.isdir( path_item ):
continue
for file in self.get_files( path_item ):
file = os.path.split( file )[1]
if file == "__init__.py":
continue
filename = os.path.splitext( file )[0]
if filename in filelist:
continue
else:
filelist.append( filename )
return filelist
def test( self, filelist ):
"""
Testet ob alle gefunden Dateien auch als Modul
importiert werden können
"""
modulelist = []
for filename in filelist:
try:
imp.find_module( filename )
except:
continue
modulelist.append( filename )
return modulelist
def print_result( self, modulelist ):
"""
Anzeigen der Ergebnisse
"""
print ''
Link = 'more Info'
modulelist.sort()
for modulename in modulelist:
print ""
print "| %s | " % modulename
print "%s | " % Link % modulename
print "
"
print "
"
print "%s Modules found." % len( modulelist )
class moduleinfo:
"""
Information über ein bestimmtes Modul anzeigen
"""
def __init__( self, module_name, backurl ):
self.print_info( module_name, backurl )
def print_info( self, module_name, backurl ):
try:
t = imp.find_module( module_name )
except Exception,e:
print "Can't import '%s':" % module_name
print e
return
print ""
print "- pathname: %s
" % t[1]
print "- description: %s
" % str(t[2])
print "
"
print backurl
try:
module = __import__( module_name )
except Exception,e:
self.response.write("Can't import module ;(
")
return
print "help:
"
print "
"
help(module)
print "
"
print backurl
print "SourceCode:
"
filehandle = t[0]
print "
"
for i in filehandle:
sys.stdout.write( i )
print "
"
print backurl
def print_information():
print "Python v%s
" % sys.version
print "os.uname():
%s
" % " - ".join(os.uname())
print "sys.path:
"
sys_path = sys.path[:]
sys_path.sort()
for p in sys_path:
print "%s
" % p
print "OS-Enviroment:
"
print ''
keys = os.environ.keys()
keys.sort()
for key in keys:
value = os.environ[key]
print "- %s
" % key
print "- %s
" % value
print "
"
#~ print_information()
if __name__ != "__main__":
# Kann passieren, wenn das Skript nicht als CGI läuft, sondern
# evtl. über modPython
print "
Error:
"
print "__name__ == %s (should be __main__!)
" % __name__
gateway = os.environ.get(
"GATEWAY_INTERFACE", "[Error:GATEWAY_INTERFACE not in os.environ!]"
)
if gateway!="CGI/1.1":
print "Running not as CGI!
"
print "GATEWAY_INTERFACE: %s
" % gateway
print "
"
## Nutzt extra kein import-Hook, wie:
## if __name__ == "__main__":
## damit das Skript auch mit modPython (?) funktioniert
query_string = os.environ["QUERY_STRING"]
if query_string == "":
# Alle Module auflisten
print "module list:
"
modules()
# Zusätzliche Informationen ausgeben:
print "
"
print_information()
else:
# Information über ein Modul anzeigen
backurl = 'back
' % \
os.environ['REQUEST_URI'].split("?",1)[0]
moduleinfo( query_string, backurl )