#!/usr/bin/python
# encoding: utf-8
import os, time, group, glob, interface, cgi, sys
from glob import glob
from urllib import quote
from shutil import copy
from crypt import crypt
import Cookie as cookie
try:
import sqlite3
except ImportError:
try:
from pysqlite2 import dbapi2 as sqlite3
except:
import sqlite as sqlite3
try:
import cgitb
cgitb.enable()
except ImportError:
sys.stderr = sys.stdout
def matchOne(where,start,end):
i0 = where.find(start)
i1 = where.find(end,i0+len(start))
if (i0 == -1) or (i1 == -1):
return ''
return where[i0 + len(start):i1]
def fromXml(name='config.xml'):
xmlCfg = {}
handle = open(name)
for line in handle:
key = matchOne(line,'<','>')
value = matchOne(line,'<%s>' % key,'</%s>' % key)
xmlCfg[key] = value
return xmlCfg
def runDict():
cmd = 'python makedict.py > temp/makedict.log &'
os.system(cmd)
return 1
def runReltv():
cmd = 'python relative.py > temp/relative.log &'
os.system(cmd)
return 1
def runNew(tid):
cmd = 'python new.py %s' % tid
pope = os.popen(cmd,'r',1)
interface.logNew()
print pope.read()
pope.close()
return 1
def runImg():
cmd = 'python images.py > /dev/null &'
os.system(cmd)
return 1
def getRelative(keyword):
relatives = []
connect = sqlite3.connect('relatives/relatives.db')
connect.text_factory = str
cursor = connect.cursor()
cursor.execute('select "%s" from relatives where "%s" glob \'*\'' % (keyword,keyword))
for row in cursor:
relatives.append(row[0].decode('utf_8'))
return relatives
def getRelativeList():
columns = []
connect = sqlite3.connect('relatives/relatives.db')
cursor = connect.cursor()
cursor.execute("pragma table_info(relatives)")
for row in cursor:
columns.append(row[1])
return columns
def delColumn(db,table,column):
connect = sqlite3.connect(db)
cursor = connect.cursor()
cursor.execute('pragma table_info(%s)' % table)
columns = []
for row in cursor:
columns.append(row[1])
columns.remove(column)
for i in xrange(0,len(columns)):
columns[i] = '"%s"' % columns[i]
cursor.execute('create temporary table backup(%s)' % ','.join(columns))
cursor.execute('insert into backup select %s from %s' % (','.join(columns),table))
cursor.execute('drop table %s' % table)
cursor.execute('create table %s(%s)' % (table,','.join(columns)))
cursor.execute('insert into %s select %s from backup' % (table,','.join(columns)))
cursor.execute('drop table backup')
connect.commit()
def delRelative(keyword):
keyword = keyword.decode('utf_8')
delColumn('relatives/relatives.db','relatives',keyword)
def getRelativeCount(keyword):
connect = sqlite3.connect('relatives/relatives.db')
cursor = connect.cursor()
cursor.execute('select count("%s") from relatives' % keyword)
for row in cursor:
count = row[0]
return count
def changeRelatives(keyword,relatives):
try:
delRelative(keyword)
except:
pass
connect = sqlite3.connect('relatives/relatives.db')
cursor = connect.cursor()
cursor.execute('alter table relatives add "%s"' % keyword)
for relative in relatives:
cursor.execute('insert into relatives("%s") values("%s")' % (keyword,relative))
connect.commit()
def reltvListOut():
inf = {}
for word in getRelativeList():
inf[word] = getRelativeCount(word)
interface.reltvList(inf)
def doorsInf():
total = []
connect = sqlite3.connect('system/doorways.db')
cursor = connect.cursor()
cursor.execute('select * from doorways order by "group"')
for row in cursor:
total.append({'name':row[0],'group':row[1],'domain':row[2],'path':row[3],'date':row[4]})
return total
def doorOneInf(name):
connect = sqlite3.connect('system/doorways.db')
cursor = connect.cursor()
cursor.execute('select * from doorways where name="%s"' % name)
for row in cursor:
inf = {'name':row[0],'group':row[1],'domain':row[2],'path':row[3],'date':row[4]}
return inf
def getDoorActiv(name,path):
active,passive,freeze = 0,0,0
db = '%s/system/%s.dw' % (path,name.decode('utf_8'))
connect = sqlite3.connect(db.encode('utf_8'))
cursor = connect.cursor()
cursor.execute('select * from doorway')
for row in cursor:
if row[2] == 1:
active += 1
elif row[2] == 0:
passive += 1
elif row[2] == -1:
freeze += 1
return active, passive, freeze
def getDoorReq(name,path):
req = 0
db = '%s/system/%s.dw' % (path,name.decode('utf_8'))
connect = sqlite3.connect(db.encode('utf_8'))
cursor = connect.cursor()
cursor.execute('select * from doorway')
for row in cursor:
req += row[4]
return req
def getDoorLast(name,path):
times = []
db = '%s/system/%s.dw' % (path,name.decode('utf_8'))
connect = sqlite3.connect(db.encode('utf_8'))
cursor = connect.cursor()
cursor.execute('select * from doorway')
for row in cursor:
times.append(row[5])
return max(times)
def makeUrl(page,doorway='',domain=''):
url = cfg['urlmask'].replace('{domain}',domain)
url = url.replace('{doorway}',doorway)
url = url.replace('{page}',pagenames[relatives.index(page)])
return url
def getDoorUrls(name,format,mode='all'):
links = []
info = doorOneInf(name)
connect = sqlite3.connect('%s/system/%s.gp' % (info['path'],info['group']))
cursor = connect.cursor()
cursor.execute('select keyword,name from mygroup where keyword="%s"' % name)
for row in cursor:
doorway = row[1]
cfg = fromXml('%s/system/config.xml' % info['path'])
db = '%s/system/%s.dw' % (info['path'],name)
connect = sqlite3.connect(db.encode('utf_8'))
cursor = connect.cursor()
if mode == 'all':
cursor.execute('select * from doorway')
elif mode == 'uf':
cursor.execute('select * from doorway where status>-1')
for row in cursor:
url = cfg['urlmask'].replace('{domain}',info['domain'])
url = url.replace('{page}',row[1]).replace('{doorway}',doorway)
links.append(format.replace('{url}',url).replace('{anchor}',row[0]))
return links
def cleanCache(name,path):
db = '%s/system/%s.dw' % (path,name)
connect = sqlite3.connect(db.encode('utf_8'))
cursor = connect.cursor()
cursor.execute('update doorway set status=0')
connect.commit()
try:
cached = glob('%s/cache/%s*' % (path,quote(name)))
for todel in cached:
os.remove(todel)
except:
pass
def delDoor(name,group,path):
try:
connect = sqlite3.connect('system/doorways.db')
cursor = connect.cursor()
cursor.execute('delete from doorways where name="%s" and "group"="%s"' % (name,group))
connect.commit()
connect = sqlite3.connect('%s/system/%s.gp' % (path,group))
cursor = connect.cursor()
cursor.execute('delete from mygroup where keyword="%s"' % name)
connect.commit()
db = '%s/system/%s.dw' % (path,name)
os.remove(db.encode('utf_8'))
try:
cached = glob('%s/cache/%s*' % (path,quote(name)))
for todel in cached:
os.remove(todel)
except:
pass
except:
pass
def redirectTo(major,minor):
print '''
<script type="text/javascript">
window.location = "?q=%s&p=%s"
</script>''' % (major,minor)
def newPwd(password):
handle = open('system/.pwd','w')
handle.write(password)
handle.close()
def validPwd(password):
handle = open('system/.pwd')
orig = handle.read()
handle.close()
if orig == password:
return True
else:
return False
# # # #
query = cgi.FieldStorage()
major = query.getvalue('q')
minor = query.getvalue('p')
session = cookie.Cookie(os.environ.get("HTTP_COOKIE", ""))
try:
password = session['password'].value
if not validPwd(password):
raise
else:
interface.contentType()
interface.header()
except:
if minor == 'enter':
password = crypt(query.getvalue('password'),'foo')
if not os.path.exists('system/.pwd'):
newPwd(password)
if validPwd(password):
session['password'] = password
print session.output()
interface.contentType()
interface.header()
major = minor = None
else:
interface.authoriz()
sys.exit(0)
else:
interface.authoriz()
sys.exit(0)
if major == 'dicts':
interface.subMenu(major,{'list':'Exitings Dictionaries','new':'New Dictionary','config':'Configuration'})
if minor == 'list' or minor == None:
interface.dictsList()
if minor == 'config':
interface.dictsConfig(fromXml('dicts/config/config.xml'))
if minor == 'saveconfig':
handle = open('dicts/config/config.xml','w')
for item in ('lang','googlest','googleft','sites','filetypes','wiki','wikiserver','wikilimit'):
handle.write('<%s>%s</%s>\n' % (item,query.getvalue(item),item))
handle.close()
redirectTo('dicts','config')
if minor == 'new':
interface.dictsNew()
if minor == 'run':
handle = open('dicts/config/new.task','w')
handle.write(query.getvalue('task'))
handle.close()
runDict()
redirectTo('dicts','list')
if minor == 'del':
for dic in glob('dicts/base/*.dict'):
if query.getvalue(dic) == 'on':
os.remove(dic)
redirectTo('dicts','list')
if major == 'relatives':
interface.subMenu(major,{'list':'Exitings Relatives','add':'Add Relatives','new':'Search Relatives','config':'Configuration'})
if minor == 'list' or minor == None:
reltvListOut()
if minor == 'config':
interface.reltvConfig(fromXml('relatives/config/config.xml'))
if minor == 'saveconfig':
handle = open('relatives/config/config.xml','w')
for item in ('source','wtlogin','wtpass','path','filtres','maxlen'):
handle.write('<%s>%s</%s>\n' % (item,query.getvalue(item),item))
handle.close()
redirectTo('relatives','config')
if minor == 'edit':
keyword = query.getvalue('keyword')
interface.reltvEdit(keyword,getRelative(keyword))
if minor == 'savechanges':
changeRelatives(query.getvalue('keyword'),query.getvalue('list').split('\n'))
redirectTo('relatives','list')
if minor == 'del':
for keyword in getRelativeList():
if query.getvalue(keyword.encode('utf_8')) == 'on':
delRelative(keyword.encode('utf_8'))
redirectTo('relatives','list')
if minor == 'new':
interface.reltvNew()
if minor == 'run':
handle = open('relatives/config/new.task','w')
handle.write(query.getvalue('task'))
handle.close()
runReltv()
redirectTo('relatives','list')
if minor == 'add':
interface.reltvAdd()
if minor == 'addsave':
changeRelatives(query.getvalue('keyword'),query.getvalue('list').split('\n'))
redirectTo('relatives','list')
if major == 'profiles':
interface.subMenu(major,{'view':'Profiles','ping':'Ping'})
if minor == 'view' or minor == None or minor == 'Edit':
profile = query.getvalue('profile')
if profile == None:
profile = 'default'
interface.profView(profile,fromXml('profiles/%s.xml' % quote(profile)))
if minor == 'save':
profile = query.getvalue('profile')
handle = open('profiles/%s.xml' % quote(profile),'w')
for item in ('lang','dict','check','tags','template','tolent','updnum','updhrs','toping',\
'mainname','ufmin','ufmax','ufhrs','ufnum','indexname','mapname','rssname',\
'replspice','pagename','doorname','urlmask'):
handle.write('<%s>%s</%s>\n' % (item,query.getvalue(item),item))
handle.close()
interface.profView(profile,fromXml('profiles/%s.xml' % quote(profile)))
if minor == 'Delete':
profile = query.getvalue('profile')
if profile != 'default':
os.remove('profiles/%s.xml' % quote(profile))
redirectTo('profiles','view')
if minor == 'Make':
profile = quote(query.getvalue('newprofile'))
copy('profiles/default.xml','profiles/%s.xml' % profile)
interface.profView(profile,fromXml('profiles/%s.xml' % profile))
if minor == 'ping':
handle = open('system/pingrpc.txt')
interface.pingList(handle.read())
handle.close()
if minor == 'pingsave':
handle = open('system/pingrpc.txt','w')
handle.write(query.getvalue('list'))
handle.close()
redirectTo('relatives','ping')
if major == 'doors' or major == None:
interface.subMenu('doors',{'new':'New Doorways','list':'Exiting Doorways'})
if minor == 'new':
step = query.getvalue('step')
if step == None or step == '1':
interface.doorsNewStep1()
if step == '2':
tid = str(int(time.time()))
handle = open('temp/%s.task' % tid,'w')
for item in ('profile','group','realpath','domain'):
handle.write('<%s>%s</%s>\n' % (item,query.getvalue(item),item))
handle.close()
interface.doorsNewStep2(tid)
if step == '3':
tid = query.getvalue('tid')
handle = open('temp/%s.kws' % tid,'w')
handle.write(query.getvalue('keywords'))
handle.close()
runNew(tid)
#redirectTo('doors','list')
if minor == 'list' or minor == None:
interface.doorsList(doorsInf())
if minor == 'info':
name = query.getvalue('name')
info = doorOneInf(name)
info['active'], info['passive'], info['freeze'] = getDoorActiv(name,info['path'])
info['request'] = getDoorReq(name,info['path'])
info['last'] = getDoorLast(name,info['path'])
info['age'] = int(time.time()) - int(info['date'])
interface.doorsInf(info)
if minor == 'urls':
urls = []
for info in doorsInf():
if query.getvalue(info['name'].encode('utf_8')) == 'on':
urls += getDoorUrls(info['name'],query.getvalue('format'))
interface.doorsUrls(urls)
if minor == 'ufurls':
urls = []
for info in doorsInf():
if query.getvalue(info['name'].encode('utf_8')) == 'on':
urls += getDoorUrls(info['name'],query.getvalue('format'),'uf')
interface.doorsUrls(urls)
if minor == 'clean':
fullinf = doorsInf()
for info in fullinf:
if query.getvalue(info['name'].encode('utf_8')) == 'on':
cleanCache(info['name'],info['path'])
redirectTo('doors','list')
if minor == 'del':
for info in doorsInf():
if query.getvalue(info['name'].encode('utf_8')) == 'on':
delDoor(info['name'],info['group'],info['path'])
redirectTo('doors','list')
if major == 'images':
interface.subMenu(major,{'list':'Exiting Images','new':'Add Images'})
if minor == 'list' or minor == None:
interface.imgList()
if minor == 'new':
interface.imgNew()
if minor == 'run':
handle = open('images/config.xml','w')
for item in ('count','size'):
handle.write('<%s>%s</%s>\n' % (item,query.getvalue(item),item))
handle.close()
handle = open('images/new.task','w')
handle.write(query.getvalue('keywords'))
handle.close()
runImg()
redirectTo('images','list')
if minor == 'del':
for xml in glob('images/*.xml'):
xml = xml.replace('images/','').replace('.xml','')
if query.getvalue(xml) == 'on':
os.remove('images/%s.xml' % xml)
for img in glob('images/%s_*.jpg' % xml):
os.remove(img)
redirectTo('images','list')
interface.footer()