You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
212 lines
5.9 KiB
212 lines
5.9 KiB
#!/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 '<head>'
|
|
print '<title>'+cfg.title+'</title>'
|
|
print '<h1 id="blogtitle"><a href="'+script+'">'+cfg.blogtitle+'</a></h1>'
|
|
print '<h2 id="subtitle">'+cfg.subtitle+'</h2>'
|
|
print cfg.header
|
|
print '</head>'
|
|
|
|
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('<h1><a class="entryheader" href="'+script+'?')
|
|
sys.stdout.write(urllib.urlencode({'path': os.path.normpath(os.path.dirname(f)), \
|
|
'disp':os.path.normpath(f)})+'">')
|
|
print name+'</a> - <span class="entrydate">',
|
|
print datetime.fromtimestamp(int(k)).strftime(cfg.datefmt),
|
|
print '</span></h1>'
|
|
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 '<html>'
|
|
header()
|
|
print '<body>'
|
|
|
|
print '<div id="menu">'
|
|
process_dirs(cfg.contentdir,path)
|
|
print '</div>'
|
|
print '<div id="content">'
|
|
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('<h1><span class="entryheader">')
|
|
print name+'</span> - <span class="entrydate">',
|
|
print datetime.fromtimestamp( \
|
|
int(os.path.getctime(validdisp)) \
|
|
).strftime(cfg.datefmt),
|
|
print '</span></h1>'
|
|
|
|
disp_actions[typ](validdisp)
|
|
else:
|
|
disp_list(path)
|
|
except OSError:
|
|
pass
|
|
|
|
print '</div>'
|
|
print '</body>'
|
|
print '</html>'
|
|
|