A lightweight FCGI blog written in python
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.
 
 
 
pylog/pylog.py

159 lines
4.3 KiB

#!/usr/bin/python
import os,os.path, sys
import urllib, cgi
from datetime import datetime
from pylog_action import *
import pylog_config as cfg
form = {}
def init():
global form
import cgitb
cgitb.enable()
form = cgi.FieldStorage()
print 'Content-type: text/html\n\n'
def header():
print '<head>'
print '<title>'+cfg.title+'</title>'
print '<h1>'+cfg.blogtitle+'</h1>'
print '<h2>'+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):
script = sys.argv[0][sys.argv[0].rindex('/')+1:]
files = {}
for f in os.listdir(path):
f = os.path.normpath(os.path.join(path,f))
if not os.path.isdir(f):
files[os.path.getctime(f)]=f
keys = files.keys()
keys.sort()
keys.reverse()
for k in keys:
f=files[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('<h3><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></h3>'
prev_actions[typ](f)
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)
init()
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('<h3><span class="entryheader">')
print name+'</span> - <span class="entrydate">',
print datetime.fromtimestamp( \
int(os.path.getctime(validdisp)) \
).strftime(cfg.datefmt),
print '</span></h3>'
disp_actions[typ](validdisp)
else:
disp_list(path)
except OSError:
pass
print '</div>'
print '</body>'
print '</html>'