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