my newsgroup base database. (test)
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
Project: Network News Transport Protocol Server Program
Description:
基于数据库的新闻组,实现BBS前端使用NNTP协议来访问贴子
Reference:
NNTP协议: http://www.mibsoftware.com/userkt/0099.htm
正则表达式:
http://wiki.woodpecker.org.cn/moin/RegExpInPython#head-2358765384844ed72f01658cbcde24613d941e9d
-
python-chinese
Post: send [EMAIL PROTECTED]
Subscribe: send subscribe to [EMAIL PROTECTED]
Unsubscribe: send unsubscribe to
[EMAIL PROTECTED]
Detail Info: http://python.cn/mailman/listinfo/python-chinese
-
"""
import sys
import socket
import threading
import time
import asyncore, asynchat
import string, StringIO, re
#from netkiller import *
#import testMessages
from messages import Messages
#print Messages.banner
class nntp_server (asyncore.dispatcher):
channel_counter = 0
def __init__ (self, host, port):
asyncore.dispatcher.__init__ (self)
self.create_socket (socket.AF_INET, socket.SOCK_STREAM)
self.set_reuse_addr()
self.there = (host, port)
self.bind (self.there)
self.listen (5)
def handle_connect(self):
pass
def handle_accept (self):
conn, addr = self.accept()
nntp_receiver (self, (conn, addr))
def handle_error(self):
pass
def handle_close (self):
self.close()
class nntp_receiver (asynchat.async_chat):
def __init__ (self, server, (conn, addr)):
asynchat.async_chat.__init__ (self, conn)
self.set_terminator ('\r\n')
self.server = server
self.server.channel_counter = self.server.channel_counter + 1
self.id = self.server.channel_counter
#self.sender = nntp_sender (self, server.there)
#self.sender.id = self.id
self.buffer = ''
self.handle_connect()
self.current_group = group_selected(None)
def handle_connect (self):
if self.connected :
self.push(Messages.banner)
def collect_incoming_data (self, data):
self.buffer = self.buffer + data
def found_terminator (self):
data = self.buffer
self.buffer = ''
if self.get_terminator() == '\r\n':
parse = self.isCommand(data)
if parse:
parse[0] = parse[0].lower()
self.log('command:'+parse[0])
usenet(self,parse,self.current_group)
if parse[0] == 'post':
self.set_terminator ('.\r\n')
if parse[0] == 'quit':
self.handle_close()
else:
usenet(self,['post',data],self.current_group)
self.set_terminator ('\r\n')
message = '<== (%d) %s' % (self.server.channel_counter,
repr(data))
self.log(message)
#self.log('current:'+self.current_group.get_group())
#self.sender.push (data + '\n')
def close_when_done():
pass
def handle_close (self):
self.log('Closing')
self.server.channel_counter = self.server.channel_counter - 1
#self.sender.close()
self.close()
def isCommand(self,data):
rcommand = (
r'^mode [reader|stream]',
r'^list$',r'^list
[active|active.times|newsgroups|subscriptions]',
r'^xover [0-9]+-[0-9]+',
r'^newgroups [0-9]+ [0-9]+ ',
r'^group .+',
r'^newgroups [0-9]+ [0-9]+ [a-zA-Z]',
r'^head [0-9]+',
r'^body [0-9]+',
r'^article [0-9]+',
r'^post$',r'^next$',r'^last$',
r'^ihave$',r'^slave$',
r'^help$',r'^quit$'
)
parse = []
for command in rcommand:
digs = re.compile(command,re.IGNORECASE)
if digs.match(data):
parse = data.split(' ')
return parse
self.push("500 command not recognized\r\n")
return None
"""
class nntp_sender (asynchat.async_chat):
def __init__ (self, receiver, address):
asynchat.async_chat.__init__ (self)
self.receiver = receiver
self.set_terminator (None)
self.create_socket (socket.AF_INET, socket.SOCK_STREAM)
self.buffer = ''
self.set_terminator ('\n')
self.connect (address)
def handle_connect (self):
print 'Connected'
def collect_incoming_data (self, data):
self.buffer = self.buffer + data
def found_terminator (self):
data = self.buf
Re: my newsgroup base database. (test)
Netkiller 写道:
> #!/usr/bin/python
> # -*- coding: utf-8 -*-
> """
> Project: Network News Transport Protocol Server Program
> Description:
> 基于数据库的新闻组,实现BBS前端使用NNTP协议来访问贴子
import sys,re
import MySQLdb
class NewsDB:
conn = None
cursor = None
def connect(self):
try:
conn = MySQLdb.connect (host = "localhost",
user = "root",
passwd = "chen",
db = "usenet")
except MySQLdb.Error, e:
print "Error %d: %s" % (e.args[0], e.args[1])
sys.exit (1)
def fetchone(self,sql):
self.connect()
self.cursor = conn.cursor ()
self.cursor.execute (sql)
row = self.cursor.fetchone ()
#print "server version:", row[0]
self.close()
return row
def fetchall(self):
self.connect()
self.cursor = conn.cursor ()
self.cursor.execute (sql)
all = self.cursor.fetchall ()
#print "server version:", row[0]
self.close()
return all
def close(self):
self.cursor.close ()
self.conn.close()
class abstract:
subject = None
mail_from = None
rcpt_to = None
data = None
group = ""
grouplist = (
("cn.comp.linux", 5, 2, "y"),
("cn.comp.freebsd", 3, 2, "y"),
("cn.comp.dos", 10, 4, "y"),
("cn.test", 5, 2, "y"),
("comp.lang.python", 5, 2, "y")
)
def welcome(self):
return 'Welcome'
def list (self):
lists = []
for name, last, first, mode in self.grouplist:
lists.append(name+ " " + str(last) + " " + str(first) +" "+
mode)
return lists
def group(self,groupname):
group_rang = ""
for name, last, first, mode in self.grouplist:
if name == groupname:
group_rang = str(last - first)+" "+ str(first)+"
"+str(last)
break
return group_rang
def xover(self,first,last):
xover_tmp = []
xover_tmp.append("""2 Mozilla programmer needed for
children's learning program "John Fodor, PhD" <[EMAIL PROTECTED]>
Mon, 23 Jan 2006 12:01:09 -0500
<[EMAIL PROTECTED]>10532
276 Xref: number1.nntp.dca.giganews.com mozilla.jobs:2""")
xover_tmp.append("""3 mozilla expert needed "Paul
Sponagl" <[EMAIL PROTECTED]> Tue, 7 Mar 2006 20:00:52 +0100
<[EMAIL PROTECTED]>2913
41 Xref: number1.nntp.dca.giganews.com mozilla.jobs:10""")
return xover_tmp
def head(self):
self.xover(first,last)
def xhdr(self,first,last):
xover_tmp = []
xover_tmp.append('1 HI "NNTP.HK"
<[EMAIL PROTECTED]> 14 Jun 2006 14:43:05 +0800
<[EMAIL PROTECTED]> 115131 Xref:
news.nntp.hk vip.cicefans:1\r\n')
return xover_tmp
def newgroups(self,data,time,gmt):
lists = []
lists.append("cn.test.os")
lists.append("cn.test.qa")
return lists
class Messages(abstract):
banner = '200 \"Welcome to Netkiler News server\"\r\n'
conn= None
def __init__(self):
#self.db=_mysql.connect(host="localhost",user="root",passwd="chen",db="usenet")
self.conn=MySQLdb.connect(host="localhost",user="root",passwd="chen",db="usenet")
def list (self):
sql = """SELECT id,`group`,(select max(Number) from article) as
last, (select min(Number) from article) as first, p FROM list"""
#print sql
self.conn.query(sql)
result=self.conn.use_result()
group = []
for id, name, last, first, mode, in result.fetch_row(10):
group.append(name+ " " + str(last) + " " + str(first) +" "+
mode)
return group
def group(self,newsgroup):
sql = "SELECT `group`,(select count(Number) from article) as
number, (select max(Number) from article) as last, (select min(Number)
from article) as first FROM list where `group` = '%s' limit 1" %
(newsgroup)
#print sql
self.conn.query(sql)
result=self.conn.use_result()
#print result.fetch_row();
for name, number, last, first in result.fetch_row():
return (str(number),str(first),str(last),name)
def xover(self,first,last):
sql = "select * from article where Number BETWEEN %
Re: my newsgroup base database. (test)
Netkiller 写道: > Netkiller 写道: > > > #!/usr/bin/python > > # -*- coding: utf-8 -*- > > """ > > Project: Network News Transport Protocol Server Program > > Description: > > 基于数据库的新闻组,实现BBS前端使用NNTP协议来访问贴子 > > Database SQL Script follow: -- phpMyAdmin SQL Dump -- version 2.7.0-rc1 -- http://www.phpmyadmin.net -- -- Host: localhost -- Generation Time: Jul 04, 2006 at 02:47 PM -- Server version: 4.1.18 -- PHP Version: 5.0.5 -- -- Database: `usenet` -- -- -- -- Table structure for table `article` -- DROP TABLE IF EXISTS `article`; CREATE TABLE IF NOT EXISTS `article` ( `Number` int(10) unsigned NOT NULL auto_increment, `MessageID` varchar(255) NOT NULL default '', `body` text NOT NULL, `Date` datetime NOT NULL default '-00-00 00:00:00', PRIMARY KEY (`Number`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=40 ; -- -- Dumping data for table `article` -- INSERT INTO `article` VALUES (25, '', 'From: "NEO" <[EMAIL PROTECTED]>\r\nNewsgroups: cn.test\r\nSubject: test\r\nDate: Fri, 30 Jun 2006 17:14:17 +0800\r\nLines: 3\r\nX-Priority: 3\r\nX-MSMail-Priority: Normal\r\nX-Newsreader: Microsoft Outlook Express 6.00.2900.2180\r\nX-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180\r\nX-RFC2646: Format=Flowed; Original\r\n\r\ntest ! \r\n\r\n\r\n', '2006-06-30 17:14:17'); INSERT INTO `article` VALUES (26, '', 'Date: Tue, 04 Jul 2006 11:34:54 +0800\r\nFrom: My Usenet <[EMAIL PROTECTED]>\r\nUser-Agent: Thunderbird 1.5.0.4 (Windows/20060516)\r\nMIME-Version: 1.0\r\nNewsgroups: cn.test\r\nSubject: Re: aa\r\nContent-Type: text/plain; charset=ISO-8859-1; format=flowed\r\nContent-Transfer-Encoding: 7bit\r\n\r\n wrote:\r\n> test ! \r\n> \r\n> \r\n-\r\n', '2006-07-04 11:34:54'); INSERT INTO `article` VALUES (27, '', 'Date: Tue, 04 Jul 2006 13:57:07 +0800\r\nFrom: My Usenet <[EMAIL PROTECTED]>\r\nUser-Agent: Thunderbird 1.5.0.4 (Windows/20060516)\r\nMIME-Version: 1.0\r\nNewsgroups: cn.test\r\nSubject: bb\r\nContent-Type: text/plain; charset=ISO-8859-1; format=flowed\r\nContent-Transfer-Encoding: 7bit\r\n\r\nbbb\r\n', '2006-07-04 13:57:07'); INSERT INTO `article` VALUES (28, '', 'Date: Tue, 04 Jul 2006 13:58:17 +0800\r\nFrom: My Usenet <[EMAIL PROTECTED]>\r\nUser-Agent: Thunderbird 1.5.0.4 (Windows/20060516)\r\nMIME-Version: 1.0\r\nNewsgroups: cn.test\r\nSubject: Re: bb\r\nContent-Type: text/plain; charset=ISO-8859-1; format=flowed\r\nContent-Transfer-Encoding: 7bit\r\n\r\nMy Usenet wrote:\r\n> bbb\r\n', '2006-07-04 13:58:17'); INSERT INTO `article` VALUES (29, '', 'Date: Tue, 04 Jul 2006 14:28:00 +0800\r\nFrom: My Usenet <[EMAIL PROTECTED]>\r\nUser-Agent: Thunderbird 1.5.0.4 (Windows/20060516)\r\nMIME-Version: 1.0\r\nNewsgroups: cn.test\r\nSubject: cc\r\nContent-Type: text/plain; charset=ISO-8859-1; format=flowed\r\nContent-Transfer-Encoding: 7bit\r\n\r\ncc\r\n', '2006-07-04 14:28:00'); INSERT INTO `article` VALUES (30, '', 'Date: Tue, 04 Jul 2006 14:29:02 +0800\r\nFrom: My Usenet <[EMAIL PROTECTED]>\r\nUser-Agent: Thunderbird 1.5.0.4 (Windows/20060516)\r\nMIME-Version: 1.0\r\nNewsgroups: cn.test\r\nSubject: Re: cc My Usenet <[EMAIL PROTECTED]>\r\nContent-Type: text/plain; charset=ISO-8859-1; format=flowed\r\nContent-Transfer-Encoding: 7bit\r\n\r\nTue wrote:\r\n> cc\r\n', '2006-07-04 14:29:02'); INSERT INTO `article` VALUES (31, '', 'Date: Tue, 04 Jul 2006 14:29:22 +0800\r\nFrom: My Usenet <[EMAIL PROTECTED]>\r\nUser-Agent: Thunderbird 1.5.0.4 (Windows/20060516)\r\nMIME-Version: 1.0\r\nNewsgroups: cn.test\r\nSubject: Re: cc My Usenet\r\nContent-Type: text/plain; charset=ISO-8859-1; format=flowed\r\nContent-Transfer-Encoding: 7bit\r\n\r\nTue wrote:\r\n> Tue wrote:\r\n>> cc\r\n', '2006-07-04 14:29:22'); INSERT INTO `article` VALUES (32, '', 'Date: Tue, 04 Jul 2006 14:29:55 +0800\r\nFrom: My Usenet <[EMAIL PROTECTED]>\r\nUser-Agent: Thunderbird 1.5.0.4 (Windows/20060516)\r\nMIME-Version: 1.0\r\nNewsgroups: cn.test\r\nSubject: d\r\nContent-Type: text/plain; charset=ISO-8859-1; format=flowed\r\nContent-Transfer-Encoding: 7bit\r\n\r\nd\r\n', '2006-07-04 14:29:55'); INSERT INTO `article` VALUES (33, '', 'Date: Tue, 04 Jul 2006 14:31:32 +0800\r\nFrom: My Usenet <[EMAIL PROTECTED]>\r\nUser-Agent: Thunderbird 1.5.0.4 (Windows/20060516)\r\nMIME-Version: 1.0\r\nNewsgroups: cn.test\r\nSubject: Re: dMy Usenet <[EMAIL PROTECTED]>\r\nContent-Type: text/plain; charset=ISO-8859-1; format=flowed\r\nContent-Transfer-Encoding: 7bit\r\n\r\nTue wrote:\r\n&g
