Misc fixes

Add CVE snarfer
Malone -> Launchpad rename
This commit is contained in:
Dennis Kaarsemaker 2007-06-08 20:16:37 +02:00
parent 10022b2a42
commit d218ddad74
8 changed files with 71 additions and 25 deletions

View File

@ -72,11 +72,12 @@ class BugNotFoundError(Exception):
"""Pity, bug isn't there"""
pass
cvere = re.compile(r'<td><font[^>]*>description</font></td>\s*<td><font[^>]*>(.*?)\s*</font>', re.I | re.DOTALL)
class Bugtracker(callbacks.PluginRegexp):
"""Show a link to a bug report with a brief description"""
threaded = True
callBefore = ['URL']
regexps = ['turlSnarfer', 'bugSnarfer', 'oopsSnarfer']
regexps = ['turlSnarfer', 'bugSnarfer', 'oopsSnarfer', 'cveSnarfer']
def __init__(self, irc):
callbacks.PluginRegexp.__init__(self, irc)
@ -155,9 +156,9 @@ class Bugtracker(callbacks.PluginRegexp):
if tag not in bugs:
bugs[tag] = {}
# Determine bugtracker type (currently only Malone is supported anyway)
# Determine bugtracker type (currently only Launchpad is supported anyway)
if bug['X-Launchpad-Bug']:
tracker = self.db['malone']
tracker = self.db['launchpad']
id = int(bug['Reply-To'].split()[1])
if self.is_new(tracker, tag, id):
component = bug['X-Launchpad-Bug']
@ -171,6 +172,8 @@ class Bugtracker(callbacks.PluginRegexp):
bugs[tag][id] = self.get_bug('',tracker, id, False)[0].replace('"','(%s) "' % component, 1)
else:
bugs[tag][id] = self.get_bug('',tracker, id, False)[0]
if '[apport]' in bugs[tag][id]:
bugs[tag].pop(id)
except:
self.log.info("Unable to get new bug %d" % id)
pass
@ -185,12 +188,13 @@ class Bugtracker(callbacks.PluginRegexp):
continue
for b in sorted(bugs[tag].keys()):
irc.queueMsg(ircmsgs.privmsg(c,'New bug: #%s' % bugs[tag][b][bugs[tag][b].find('bug ')+4:]))
print "Reported!"
def add(self, irc, msg, args, name, trackertype, url, description):
"""<name> <type> <url> [<description>]
Add a bugtracker <url> to the list of defined bugtrackers. <type> is the
type of the tracker (currently only Malone, Debbugs, Bugzilla,
type of the tracker (currently only Launchpad, Debbugs, Bugzilla,
Issuezilla and Trac are known). <name> is the name that will be used to
reference the bugzilla in all commands. Unambiguous abbreviations of
<name> will be accepted also. <description> is the common name for the
@ -373,9 +377,26 @@ class Bugtracker(callbacks.PluginRegexp):
# Only useful for launchpad developers
def oopsSnarfer(self, irc, msg, match):
r"OOPS-(?P<oopsid>\d*[A-Z]\d+)"
if msg.args[0][0] == '#' and not self.registryValue('bugSnarfer', msg.args[0]):
return
oopsid = match.group(1)
irc.reply("https://devpad.canonical.com/~jamesh/oops.cgi/%s" % oopsid, prefixNick=False)
def cveSnarfer(self, irc, msg, match):
r"(cve[- ]\d{4}[- ]\d{4})"
if msg.args[0][0] == '#' and not self.registryValue('bugSnarfer', msg.args[0]):
return
cve = match.group(1).replace(' ','-').upper()
url = 'http://cve.mitre.org/cgi-bin/cvename.cgi?name=%s' % cve
cvedata = utils.web.getUrl(url)
m = cvere.search(cvedata)
if m:
cve = m.group(1).replace('\n', ' ')
irc.reply("%s (%s)" % (cve,url))
def cveUrlSnarfer(self, irc, msg, match):
pass
def get_tracker(self,snarfurl,sfdata):
snarfurl = snarfurl.replace('sf.net','sourceforge.net')
snarfhost = snarfurl.replace('http://','').replace('https://','')
@ -517,7 +538,7 @@ class Issuezilla(IBugtracker):
raise BugtrackerError, s
return [(id, component, title, severity, status, assignee, "%s/show_bug.cgi?id=%d" % (self.url, id))]
class Malone(IBugtracker):
class Launchpad(IBugtracker):
def _parse(self, task):
parser = email.FeedParser.FeedParser()
parser.feed(task)
@ -525,7 +546,7 @@ class Malone(IBugtracker):
def _sort(self, task1, task2):
# Status sort:
try:
statuses = ['Rejected', 'Fix Released', 'Fix Committed', 'Unconfirmed', 'Needs Info', 'In Progress', 'Confirmed']
statuses = ['Rejected', 'Fix Released', 'Fix Committed', 'Unconfirmed','Needs Info','Confirmed','In Progress']
severities = ['Undecided', 'Wishlist', 'Minor', 'Low', 'Normal', 'Medium', 'Major', 'High', 'Critical']
if task1['status'] not in statuses and task2['status'] in statuses: return -1
if task1['status'] in statuses and task2['status'] not in statuses: return 1
@ -544,7 +565,8 @@ class Malone(IBugtracker):
return 0
def get_bug(self, id):
try:
bugdata = utils.web.getUrl("%s/%d/+text" % (self.url.replace('malone','bugs'),id))
print("%s/bugs/%d/+text" % (self.url,id))
bugdata = utils.web.getUrl("%s/bugs/%d/+text" % (self.url,id))
except Exception, e:
if '404' in str(e):
raise BugNotFoundError
@ -576,9 +598,9 @@ class Malone(IBugtracker):
if bugdata['duplicate-of']:
dupbug = self.get_bug(int(bugdata['duplicate-of']))
return [(id, t, bugdata['title'] + (' (dup-of: %d)' % dupbug[0][0]), taskdata['importance'],
taskdata['status'], taskdata['assignee'], "%s/bugs/%s" % (self.url.replace('/malone',''), id))] + dupbug
taskdata['status'], taskdata['assignee'], "%s/bugs/%s" % (self.url, id))] + dupbug
return [(id, t, bugdata['title'], taskdata['importance'],
taskdata['status'], taskdata['assignee'], "%s/bugs/%s" % (self.url.replace('/malone',''), id))]
taskdata['status'], taskdata['assignee'], "%s/bugs/%s" % (self.url, id))]
# <rant>
# Debbugs sucks donkeyballs
@ -784,7 +806,9 @@ registerBugtracker('ximian', 'http://bugzilla.ximian.com', 'Ximian', 'bugzilla')
registerBugtracker('freedesktop', 'http://bugzilla.freedesktop.org', 'Freedesktop', 'bugzilla')
registerBugtracker('freedesktop2', 'http://bugs.freedesktop.org', 'Freedesktop', 'bugzilla')
registerBugtracker('openoffice', 'http://openoffice.org/issues', 'OpenOffice.org', 'issuezilla')
registerBugtracker('malone', 'https://launchpad.net/malone', 'Malone', 'malone')
registerBugtracker('launchpad', 'https://launchpad.net', 'Launchpad', 'launchpad')
registerBugtracker('lp', 'https://launchpad.net', 'Launchpad', 'launchpad')
registerBugtracker('malone', 'https://launchpad.net', 'Launchpad', 'launchpad')
registerBugtracker('debian', 'http://bugs.debian.org', 'Debian', 'debbugs')
registerBugtracker('trac', 'http://trac.edgewall.org/ticket', 'Trac', 'trac')
registerBugtracker('django', 'http://code.djangoproject.com/ticket', 'Django', 'trac')

View File

@ -51,7 +51,9 @@ if 'search' in form:
# Select factoids
if search:
keys = [x.strip() for x in search.split() if len(x.strip()) >2][:5]
keys = [urllib2.unquote(x.strip()) for x in search.split() if len(x.strip()) >2][:5]
if not keys:
keys = ['']
query1 = "SELECT name, value, author, added, popularity FROM facts WHERE name NOT LIKE '%-also' AND ("
query2 = "SELECT COUNT(name) FROM facts WHERE "
bogus = False

View File

@ -318,7 +318,7 @@ class Encyclopedia(callbacks.Plugin):
text, target, retmsg = self.get_target(msg.nick, orig_text, target)
if text.startswith('bug ') and text != ('bug 1'):
return
if text == self.registryValue('alert') and msg.args[0][0] == '#':
if text == self.registryValue('alert') and msg.args[0][0] == '#' and not display_info:
msg.tag('alert')
ret = self.factoid_lookup(text, channel, display_info)
@ -348,7 +348,7 @@ class Encyclopedia(callbacks.Plugin):
queue(irc, target, retmsg + ret[0])
if msg.tagged('alert'):
queue(irc, self.registryValue('relayChannel'), '%s called the ops in %s' % (msg.nick, msg.args[0]))
queue(irc, self.registryValue('relayChannel'), retmsg + ret[0])
#queue(irc, self.registryValue('relayChannel'), retmsg + ret[0])
for r in ret[1:]:
queue(irc, target, r)

View File

@ -3,6 +3,7 @@
DIR=/home/dennis/ubotu/data/apt
for DIST in "$DIR"/*.list; do
test -h $DIST && continue
DIST=${DIST:${#DIR}}
DIST=${DIST/.list}
touch "$DIR/$DIST.status"

View File

@ -60,6 +60,7 @@ class Lart(plugins.ChannelIdDatabasePlugin):
(target, reason) = map(str.strip, text.split(' for ', 1))
else:
(target, reason) = (text, '')
print target
if id is not None:
try:
lart = self.db.get(channel, id)
@ -74,8 +75,8 @@ class Lart(plugins.ChannelIdDatabasePlugin):
return
text = self._replaceFirstPerson(lart.text, msg.nick)
if ircutils.strEqual(target, irc.nick) or \
'ubotu' in target.lower() or 'ubugtu' in target.lower() or \
'seveas' in target.lower() or \
'ubotu' in ircutils.stripFormatting(target).lower() or \
'seveas' in ircutils.stripFormatting(target).lower() or \
((not msg.prefix.endswith('seveas')) and random.uniform(0,100) < 25):
target = msg.nick
reason = ''

View File

@ -28,7 +28,7 @@ class LpLogin(callbacks.Plugin):
except:
pass
# Reload every 6 hours
schedule.addPeriodicEvent(lambda: self.reportnewbugs(irc), 60*60*6, name=self.name() + '.nickreload')
#schedule.addPeriodicEvent(lambda: self.reportnewbugs(irc), 60*60*6, name=self.name() + '.nickreload')
def loadnicks(self):
uf = self.registryValue('UserList')
@ -66,6 +66,8 @@ class LpLogin(callbacks.Plugin):
def do376(self, irc, msg):
irc.queueMsg(ircmsgs.IrcMsg('CAPAB IDENTIFY-MSG'))
def do422(self, irc, msg): # MOTD missing
irc.queueMsg(ircmsgs.IrcMsg('CAPAB IDENTIFY-MSG'))
def inFilter(self, irc, msg):
if getattr(irc,'_Freenode_capabed',None) and msg.command == 'PRIVMSG':

View File

@ -19,6 +19,7 @@ import supybot.ircutils as ircutils
import supybot.callbacks as callbacks
import random, re, time, commands, urllib2
import supybot.ircmsgs as ircmsgs
import supybot.conf as conf
mess = {
't': ('http://4q.cc/?pid=fact&person=mrt', r'</h1>.*?<p>(?P<fact>.*?)</p>', False),
@ -37,10 +38,12 @@ mess = {
'mjg59': ('http://www.angryfacts.com', r'</p><h1>(?P<fact>.*?)</h1>', False),
'vmjg': ('http://www.rjek.com/vmjg59.cgi', r'<body>(?P<fact>.*?)<p>', True),
'vmjg59': ('http://www.rjek.com/vmjg59.cgi', r'<body>(?P<fact>.*?)<p>', True),
'bofh': ('/home/dennis/ubotu/plugins/Mess/bofh.txt', 'BOFH Excuse #%d: ', False),
'42': ('/home/dennis/ubotu/plugins/Mess/42.txt', '', False),
'magic8ball': ('/home/dennis/ubotu/plugins/Mess/ball.txt', '', False),
'ferengi': ('/home/dennis/ubotu/plugins/Mess/ferengi.txt', 'Ferengi rule of acquisition ', False)
'shakespeare': ('http://www.pangloss.com/seidel/Shaker/', r'<font.*?>(?P<fact>.*?)</font>', False),
'lugradio': ('http://planet.lugradio.org/facts/', r'<h2>\s*(?P<fact>.*?)</h2>', False),
'bofh': ('/home/dennis/ubotu/plugins/Mess/bofh.txt', 'BOFH Excuse #%d: ', False),
'42': ('/home/dennis/ubotu/plugins/Mess/42.txt', '', False),
'magic8ball': ('/home/dennis/ubotu/plugins/Mess/ball.txt', '', False),
'ferengi': ('/home/dennis/ubotu/plugins/Mess/ferengi.txt', 'Ferengi rule of acquisition ', False)
}
data = {}
for m in mess.keys():
@ -53,7 +56,7 @@ for m in mess.keys():
badwords = ['sex','masturbate','fuck','rape','dick','pussy','prostitute','hooker',
'orgasm','sperm','cunt','penis','shit','piss','urin','bitch','semen','cock',
'retarded']
'retard']
tagre = re.compile(r'<.*?>')
def filter(txt,off):
_txt = txt.lower()
@ -119,12 +122,25 @@ class Mess(callbacks.PluginRegexp):
return callbacks.PluginRegexp.getCommandMethod(self, command)
except AttributeError:
return self.messcb
def _callCommand(self, command, irc, msg, *args, **kwargs):
method = self.getCommandMethod(command)
if command[0] in mess:
msg.tag('messcmd', command[0])
try:
method(irc, msg, *args, **kwargs)
except Exception, e:
self.log.exception('Uncaught exception in %s.', command)
if conf.supybot.reply.error.detailed():
irc.error(utils.exnToString(e))
else:
irc.replyError()
@ok
def messcb(self, irc, msg, args):
def messcb(self, irc, msg, args, text):
"""General mess"""
global data
cmd = msg.args[1].split()[-1]
cmd = msg.tagged('messcmd')
try:
(loc, tx, off) = mess[cmd]
except:
@ -147,7 +163,7 @@ class Mess(callbacks.PluginRegexp):
if '%d' in tx:
tx = tx % i
irc.reply(tx + data[loc][i])
messcb = wrap(messcb)
messcb = wrap(messcb, [additional('text')])
# WARNING: depends on an alteration in supybot/callbacks.py - don't do
# str(s) if s is unicode!

View File

@ -12,7 +12,7 @@
#
###
import cgi, cgitb, re, sys, math, os, md5, sqlite, random, time, datetime, pytz, Cookie, StringIO
import cgi, cgitb, re, sys, math, os, md5, sqlite, random, time, datetime, pytz, Cookie, StringIO, urllib2
import cPickle as pickle
cgitb.enable()