#!/usr/bin/python
import os,os.path, sys
import urllib, cgi,time
import cgitb
cgitb.enable()
form = cgi.FieldStorage()
from datetime import datetime
from pylog_action import *
import pylog_config as cfg
import comment_section
__version = "v0.1-(2012-03-15)"
def get_dir_name_type(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)
return (name,typ)
def dir_entry(f,path,depth,hidden):
name,typ = get_dir_name_type(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:
# don't list directories with unknown action
name,typ = get_dir_name_type(path)
if not typ in dir_actions:
return
dir_begin(disppath,hidden,depth)
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 the directory is a part of the path we want
# to show -> show it, if not -> hide it's contents
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,depth)
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 get_valid_path(f)==cfg.contentdir:
continue
if not os.path.isdir(f):
if not os.path.getmtime(f) in files:
files[os.path.getmtime(f)]=[f]
else:
files[os.path.getmtime(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('
'
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.getmtime(f) in files:
files[os.path.getmtime(f)]=[f]
else:
files[os.path.getmtime(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)
if not 'rss' in form:
sys.stdout.write('Content-type: text/html; charset=utf-8\n\n')
else:
import xml.etree.ElementTree as ET
sys.stdout.write('Content-type: text/xml\n\n')
script = sys.argv[0][sys.argv[0].rindex('/')+1:]
files,keys=get_newest(cfg.numofposts)
tz = time.timezone
tzHHMM = "%0+3d%02d" % (tz/-3600,abs((tz%3600)/60))
print '''
'
print (" "+cfg.blogtitle+"").encode(cfg.encoding)
print (" "+cfg.subtitle+"").encode(cfg.encoding)
print " "+cfg.topurl+script+""
print " Pylog "+__version+""
if len(keys)>0:
date=datetime.fromtimestamp(int(keys[0])).strftime("%a, %d %b %Y %H:%M:%S ")
print " "+date+tzHHMM+""
for k in keys:
date=datetime.fromtimestamp(int(k)).strftime("%a, %d %b %Y %H:%M:%S ")
for f in 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)
print " "
print " "+name+""
link = ET.Element("link")
link.text = cfg.topurl+script+'?'+'disp='+os.path.normpath(f)
print " ",
ET.dump(link)
link.tag="guid"
print " ",
ET.dump(link)
print " "+date+tzHHMM+""
print " "
print ""
print ""
sys.exit(0)
script = sys.argv[0][sys.argv[0].rindex('/')+1:]
path = cfg.contentdir
if 'path' in form:
path=form['path'].value
elif 'disp' in form:
validdisp = get_valid_path(form['disp'].value)
path=os.path.dirname(validdisp)
path=get_valid_path(path)
print ''
print ''
print ''
print ''
print (''+cfg.title+'').encode(cfg.encoding)
print ''
print cfg.header.encode(cfg.encoding)
comment_section.comments_init()
print ''
print ''
print ('
'
try:
if 'disp' in form:
validdisp = get_valid_path(form['disp'].value)
disp=os.path.basename(validdisp)
print "" % 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('
'
disp_actions[typ](validdisp)
print ''
print ''
comment_section.disp_comments(validdisp)
else:
disp_list(path)
except OSError as ose:
# This is here for various errors that
# may occur when accessing files
print '