2003-04-17 10:36:05 +02:00
|
|
|
#!/usr/bin/env python
|
|
|
|
|
|
|
|
from fix import *
|
|
|
|
|
|
|
|
import time
|
|
|
|
|
|
|
|
import conf
|
|
|
|
import debug
|
2003-04-18 10:24:25 +02:00
|
|
|
import ircdb
|
2003-04-17 10:36:05 +02:00
|
|
|
import drivers
|
|
|
|
import ircmsgs
|
|
|
|
|
|
|
|
from twisted.internet import reactor
|
2003-04-18 10:24:25 +02:00
|
|
|
from twisted.manhole.telnet import Shell, ShellFactory
|
2003-04-17 10:36:05 +02:00
|
|
|
from twisted.protocols.basic import LineReceiver
|
|
|
|
from twisted.internet.protocol import ReconnectingClientFactory
|
|
|
|
|
|
|
|
class TwistedRunnerDriver(drivers.IrcDriver):
|
|
|
|
def run(self):
|
|
|
|
try:
|
|
|
|
reactor.iterate(conf.poll)
|
|
|
|
except:
|
|
|
|
debug.msg('Except caught outside reactor.', 'normal')
|
|
|
|
debug.recoverableException()
|
|
|
|
|
|
|
|
class SupyIrcProtocol(LineReceiver):
|
|
|
|
delimiter = '\n'
|
|
|
|
MAX_LENGTH = 1024
|
|
|
|
def __init__(self):
|
|
|
|
reactor.callLater(1, self.checkIrcForMsgs)
|
|
|
|
|
|
|
|
def lineReceived(self, line):
|
|
|
|
start = time.time()
|
|
|
|
msg = ircmsgs.IrcMsg(line)
|
|
|
|
debug.msg('Time to parse IrcMsg: %s' % (time.time()-start), 'verbose')
|
|
|
|
try:
|
|
|
|
self.factory.irc.feedMsg(msg)
|
|
|
|
except:
|
|
|
|
debug.msg('Exception caught outside Irc object.', 'normal')
|
|
|
|
debug.recoverableException()
|
|
|
|
|
|
|
|
def checkIrcForMsgs(self):
|
|
|
|
if self.connected:
|
|
|
|
msg = self.factory.irc.takeMsg()
|
|
|
|
while msg:
|
|
|
|
self.transport.write(str(msg))
|
|
|
|
msg = self.factory.irc.takeMsg()
|
2003-04-18 10:24:25 +02:00
|
|
|
self.mostRecentCall = reactor.callLater(1, self.checkIrcForMsgs)
|
|
|
|
|
|
|
|
def connectionLost(self):
|
|
|
|
self.mostRecentCall.cancel()
|
|
|
|
|
|
|
|
def die(self):
|
|
|
|
self.transport.loseConnection()
|
2003-04-17 10:36:05 +02:00
|
|
|
|
|
|
|
class SupyReconnectingFactory(ReconnectingClientFactory):
|
|
|
|
maxDelay = 600
|
|
|
|
protocol = SupyIrcProtocol
|
|
|
|
def __init__(self, (server, port), irc):
|
|
|
|
self.irc = irc
|
|
|
|
reactor.connectTCP(server, port, self)
|
|
|
|
|
|
|
|
|
2003-04-18 10:24:25 +02:00
|
|
|
class MyShell(Shell):
|
|
|
|
def checkUserAndPass(self, username, password):
|
|
|
|
debug.printf(repr(username))
|
|
|
|
debug.printf(repr(password))
|
|
|
|
try:
|
|
|
|
u = ircdb.users.getUser(username)
|
|
|
|
debug.printf(u)
|
|
|
|
if u.checkPassword(password) and u.checkCapability('owner'):
|
|
|
|
debug.printf('returning True')
|
|
|
|
return True
|
|
|
|
else:
|
|
|
|
return False
|
|
|
|
except KeyError:
|
|
|
|
return False
|
|
|
|
|
|
|
|
class MyShellFactory(ShellFactory):
|
|
|
|
protocol = MyShell
|
|
|
|
|
|
|
|
if conf.telnetEnable and __name__ != '__main__':
|
|
|
|
reactor.listenTCP(conf.telnetPort, MyShellFactory())
|
|
|
|
|
|
|
|
|
2003-04-17 10:36:05 +02:00
|
|
|
try:
|
|
|
|
ignore(poller)
|
|
|
|
except NameError:
|
|
|
|
poller = TwistedRunnerDriver()
|
|
|
|
# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78:
|