#!/usr/bin/python import os,os.path, sys import urllib, cgi import cgitb cgitb.enable() form = cgi.FieldStorage() from datetime import datetime from pylog_action import * import pylog_config as cfg def header(): script = sys.argv[0][sys.argv[0].rindex('/')+1:] print '' print ''+cfg.title+'' print '

'+cfg.blogtitle+'

' print '

'+cfg.subtitle+'

' print cfg.header print '' def dir_entry(f,path,depth,hidden): if '_' in os.path.basename(f): typ = f[f.rindex('_')+1:] name = os.path.basename(f)[:-(len(typ)+1)] else: typ = '' name = os.path.basename(f) if typ in dir_actions: dir_actions[typ](name,f,depth,hidden) def file_entry(f,path,depth,hidden): if '.' in os.path.basename(f): typ = f[f.rindex('.')+1:] name = os.path.basename(f)[:-(len(typ)+1)] else: typ = '' name = os.path.basename(f) if typ in disp_actions: file_link(name,f,depth,hidden) def process_dirs(path='.',disppath='.',depth=0,hidden=False): dirlist = os.listdir(path) if len(dirlist)!=0: dir_begin(disppath,hidden) dirs = [] files = [] for f in dirlist: f = os.path.normpath(os.path.join(path,f)) if os.path.isdir(f): dirs.append(f) else: files.append(f) dirs.sort() files.sort() for f in dirs+files: if os.path.isdir(f): dir_entry(f,disppath,depth,hidden) if disppath[:len(f)]==f: process_dirs(f,disppath,depth+1,False) else: process_dirs(f,disppath,depth+1,True) else: file_entry(f,disppath,depth,hidden) dir_end(disppath,hidden) def disp_list(path): if path==cfg.contentdir: files,keys=get_newest(cfg.numofposts) disp_file_dict(files,keys) return files = {} for f in os.listdir(path): f = os.path.normpath(os.path.join(path,f)) if not os.path.isdir(f): if not os.path.getctime(f) in files: files[os.path.getctime(f)]=[f] else: files[os.path.getctime(f)].append(f) keys = files.keys() keys.sort() keys.reverse() disp_file_dict(files,keys) def disp_file_dict(d,keys): script = sys.argv[0][sys.argv[0].rindex('/')+1:] for k in keys: for f in d[k]: if '.' in os.path.basename(f): typ = f[f.rindex('.')+1:] name = os.path.basename(f)[:-(len(typ)+1)] else: typ = '' name = os.path.basename(f) if typ in prev_actions and not os.path.isdir(f): sys.stdout.write('

') print name+' - ', print datetime.fromtimestamp(int(k)).strftime(cfg.datefmt), print '

' prev_actions[typ](f) def get_all(path=cfg.contentdir): dicts = [] files = [] for f in os.listdir(path): f = os.path.normpath(os.path.join(path,f)) if not os.path.isdir(f): if '.' in os.path.basename(f): typ = f[f.rindex('.')+1:] name = os.path.basename(f)[:-(len(typ)+1)] else: typ = '' name = os.path.basename(f) if typ in prev_actions: files.append(f) else: if '_' in os.path.basename(f): typ = f[f.rindex('_')+1:] name = os.path.basename(f)[:-(len(typ)+1)] else: typ = '' name = os.path.basename(f) if typ in dir_actions: dicts.append(f) for d in dicts: files+=get_all(d) return files def get_newest(n): allfiles=get_all() files = {} for f in allfiles: if not os.path.getctime(f) in files: files[os.path.getctime(f)]=[f] else: files[os.path.getctime(f)].append(f) keys = files.keys() keys.sort() keys.reverse() return files,keys[0:n] def get_valid_path(path): if '..' in path or os.path.normpath(path)=='.': return cfg.contentdir valid_chars='.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/_0123456789' for c in path: if not c in valid_chars: return cfg.contentdir return os.path.normpath(path) print 'Content-type: text/html\n\n' path = cfg.contentdir if 'path' in form: path=form['path'].value path=get_valid_path(path) print '' header() print '' print '' print '
' try: if 'disp' in form: validdisp = get_valid_path(form['disp'].value) disp=os.path.basename(validdisp) if not os.path.isdir(disp): if '.' in disp: typ = disp[disp.rindex('.')+1:] name = disp[:-(len(typ)+1)] else: typ = '' name = disp if typ in disp_actions: sys.stdout.write('

') print name+' -

' disp_actions[typ](validdisp) else: disp_list(path) except OSError: pass print '
' print '' print ''