mirror of
https://github.com/xcat2/xNBA.git
synced 2024-11-22 01:21:45 +00:00
[errcode] Remove unused contrib/errcode scripts
The new errdb error code database is more accurate than the regular expression-based errcode scripts. This patch removes errcode scripts in favor of errdb. The gpxebot.py script is no longer needed, gpxebot has been released as a separate open source codebase: http://git.etherboot.org/?p=people/stefanha/gpxebot.git;a=summary Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
parent
519a4be189
commit
232c208882
@ -1,35 +0,0 @@
|
||||
Error Code Lookup for iPXE
|
||||
==========================
|
||||
This program looks up iPXE error codes so you can locate the line of source
|
||||
code which produced the error.
|
||||
|
||||
Setup
|
||||
-----
|
||||
You must run:
|
||||
./build_errcodedb.py >errcodedb.py
|
||||
|
||||
This extracts error code definitions from the iPXE source code and produces a
|
||||
"database" which is used by the main program.
|
||||
|
||||
Once you have done this errcode.py and errcodedb.py are the only files you
|
||||
need. They are now independent of the iPXE source code and can be moved
|
||||
anywhere.
|
||||
|
||||
[OPTIONAL]
|
||||
A PHP script is provided as a web interface. First edit errcode.php to point
|
||||
$ERRCODE_PATH to the errcode.py script. Then move errcode.php to a location
|
||||
visible from your web server.
|
||||
|
||||
[OPTIONAL]
|
||||
A simple IRC bot is provided. Edit ipxebot.py to fill in the IRC details.
|
||||
|
||||
Usage
|
||||
-----
|
||||
Looking up error codes on the command-line:
|
||||
./errcode.py 0x12345678
|
||||
|
||||
Further information
|
||||
-------------------
|
||||
See http://etherboot.org/.
|
||||
|
||||
Released under the GPL and written by Stefan Hajnoczi <stefanha@gmail.com>.
|
@ -1,93 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
# Copyright (C) 2008 Stefan Hajnoczi <stefanha@gmail.com>.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License as
|
||||
# published by the Free Software Foundation; either version 2 of the
|
||||
# License, or any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
import sys
|
||||
import re
|
||||
|
||||
pxenv_status_files = ('../../src/include/errno.h', )
|
||||
errfile_files = ('../../src/include/ipxe/errfile.h',
|
||||
'../../src/arch/i386/include/bits/errfile.h')
|
||||
posix_errno_files = ('../../src/include/errno.h', )
|
||||
|
||||
PXENV_STATUS_RE = re.compile(r'^#define\s+(PXENV_STATUS_[^\s]+)\s+(.+)$', re.M)
|
||||
ERRFILE_RE = re.compile(r'^#define\s+(ERRFILE_[^\s]+)\s+(.+)$', re.M)
|
||||
POSIX_ERRNO_RE = re.compile(r'^#define\s+(E[A-Z0-9]+)\s+(?:\\\n)?.*(0x[0-9a-f]+).*$', re.M)
|
||||
|
||||
def err(msg):
|
||||
sys.stderr.write('%s: %s\n' % (sys.argv[0], msg))
|
||||
sys.exit(1)
|
||||
|
||||
def to_pxenv_status(errno):
|
||||
return errno & 0xff
|
||||
|
||||
def to_errfile(errno):
|
||||
return (errno >> 13) & 0x7ff
|
||||
|
||||
def to_posix_errno(errno):
|
||||
return (errno >> 24) & 0x7f
|
||||
|
||||
def load_header_file(filename, regexp):
|
||||
defines = {}
|
||||
data = open(filename, 'r').read()
|
||||
for m in regexp.finditer(data):
|
||||
key, val = m.groups()
|
||||
defines[key] = val
|
||||
return defines
|
||||
|
||||
def evaluate(defines, expr):
|
||||
pyexpr = ''
|
||||
for token in expr.split():
|
||||
if token in '()':
|
||||
pass
|
||||
elif token.startswith('/*') or token.startswith('//'):
|
||||
break
|
||||
elif token.startswith('0x') or token == '|':
|
||||
pyexpr += token
|
||||
else:
|
||||
if token in defines:
|
||||
pyexpr += '0x%x' % defines[token]
|
||||
else:
|
||||
return -1
|
||||
if not re.match(r'^[0-9a-zA-Z_|]+$', pyexpr):
|
||||
err('invalid expression')
|
||||
return eval(pyexpr)
|
||||
|
||||
def build(filenames, regexp, selector):
|
||||
unevaluated = {}
|
||||
for filename in filenames:
|
||||
unevaluated.update(load_header_file(filename, regexp))
|
||||
|
||||
evaluated = {}
|
||||
changed = True
|
||||
while changed:
|
||||
changed = False
|
||||
for key in list(unevaluated.keys()):
|
||||
val = evaluate(evaluated, unevaluated[key])
|
||||
if val != -1:
|
||||
del unevaluated[key]
|
||||
evaluated[key] = val
|
||||
changed = True
|
||||
if unevaluated:
|
||||
err('unable to evaluate all #defines')
|
||||
|
||||
lookup = {}
|
||||
for key, val in evaluated.iteritems():
|
||||
lookup[selector(val)] = key
|
||||
return lookup
|
||||
|
||||
print 'pxenv_status =', repr(build(pxenv_status_files, PXENV_STATUS_RE, to_pxenv_status))
|
||||
print 'errfile =', repr(build(errfile_files, ERRFILE_RE, to_errfile))
|
||||
print 'posix_errno =', repr(build(posix_errno_files, POSIX_ERRNO_RE, to_posix_errno))
|
@ -1,83 +0,0 @@
|
||||
<?
|
||||
/*
|
||||
* Copyright (C) 2008 Stefan Hajnoczi <stefanha@gmail.com>.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
// The path to the errcode.py script.
|
||||
$ERRCODE_PATH = './errcode.py';
|
||||
?>
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>iPXE Error Code Lookup</title>
|
||||
<style>
|
||||
body, pre, div, form, p, h2, b, tt {
|
||||
padding: 0;
|
||||
border: 0;
|
||||
margin: 0;
|
||||
}
|
||||
body {
|
||||
padding: 0.5em;
|
||||
width: 750px;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
pre {
|
||||
margin: 0.2em;
|
||||
padding: 0.1em;
|
||||
background-color: #ddd;
|
||||
}
|
||||
form {
|
||||
margin: 0.2em;
|
||||
}
|
||||
div {
|
||||
margin: 0.2em;
|
||||
padding: 0.4em;
|
||||
border: 1px dashed black;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<?
|
||||
if (!empty($_REQUEST['e']) && preg_match('/^(0x)?[0-9a-f]{8}$/', $_REQUEST['e'])) {
|
||||
?>
|
||||
<pre>
|
||||
<?
|
||||
system($ERRCODE_PATH . " " . $_REQUEST['e']);
|
||||
?>
|
||||
</pre>
|
||||
<?
|
||||
}
|
||||
?>
|
||||
<form action="" method="post">
|
||||
<label for="e">Error code:</label>
|
||||
<input type="text" name="e" id="e" value="0x12345678"></input>
|
||||
<input type="submit" value="Lookup"></input>
|
||||
</form>
|
||||
|
||||
<div>
|
||||
<h2>Hint:</h2>
|
||||
<p>
|
||||
Firefox users can right-click on the <b>Error code</b>
|
||||
text box and select <b>Add a Keyword for this Search...</b>.
|
||||
Set <b>name</b> to <tt>iPXE Error Code Lookup</tt> and
|
||||
<b>keyword</b> to <tt>gxpe</tt> Then you can look up error
|
||||
codes by typing something like the following in your address
|
||||
bar: <tt>ipxe 0x3c018003</tt>
|
||||
<p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -1,78 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
# Copyright (C) 2008 Stefan Hajnoczi <stefanha@gmail.com>.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License as
|
||||
# published by the Free Software Foundation; either version 2 of the
|
||||
# License, or any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
import sys
|
||||
|
||||
try:
|
||||
import errcodedb
|
||||
except ImportError:
|
||||
sys.stderr.write('Please run this first: ./build_errcodedb.py >errcodedb.py\n')
|
||||
sys.exit(1)
|
||||
|
||||
def to_pxenv_status(errno):
|
||||
return errno & 0xff
|
||||
|
||||
def to_uniq(errno):
|
||||
return (errno >> 8) & 0x1f
|
||||
|
||||
def to_errfile(errno):
|
||||
return (errno >> 13) & 0x7ff
|
||||
|
||||
def to_posix_errno(errno):
|
||||
return (errno >> 24) & 0x7f
|
||||
|
||||
def lookup_errno_component(defines, component):
|
||||
if component in defines:
|
||||
return defines[component]
|
||||
else:
|
||||
return '0x%x' % component
|
||||
|
||||
class Errcode(object):
|
||||
def __init__(self, errno):
|
||||
self.pxenv_status = to_pxenv_status(errno)
|
||||
self.uniq = to_uniq(errno)
|
||||
self.errfile = to_errfile(errno)
|
||||
self.posix_errno = to_posix_errno(errno)
|
||||
|
||||
def rawstr(self):
|
||||
return 'pxenv_status=0x%x uniq=%d errfile=0x%x posix_errno=0x%x' % (self.pxenv_status, self.uniq, self.errfile, self.posix_errno)
|
||||
|
||||
def prettystr(self):
|
||||
return 'pxenv_status=%s uniq=%d errfile=%s posix_errno=%s' % (
|
||||
lookup_errno_component(errcodedb.pxenv_status, self.pxenv_status),
|
||||
self.uniq,
|
||||
lookup_errno_component(errcodedb.errfile, self.errfile),
|
||||
lookup_errno_component(errcodedb.posix_errno, self.posix_errno)
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return self.prettystr()
|
||||
|
||||
def usage():
|
||||
sys.stderr.write('usage: %s ERROR_NUMBER\n' % sys.argv[0])
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) != 2:
|
||||
usage()
|
||||
|
||||
try:
|
||||
errno = int(sys.argv[1], 16)
|
||||
except ValueError:
|
||||
usage()
|
||||
|
||||
print Errcode(errno)
|
||||
sys.exit(0)
|
@ -1,124 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
# Copyright (C) 2008 Stefan Hajnoczi <stefanha@gmail.com>.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License as
|
||||
# published by the Free Software Foundation; either version 2 of the
|
||||
# License, or any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
import re
|
||||
import socket
|
||||
import errcode
|
||||
|
||||
HOST = 'irc.freenode.net'
|
||||
PORT = 6667
|
||||
NICK = 'ipxebot'
|
||||
CHAN = '#etherboot'
|
||||
NICKSERV_PASSWORD = None
|
||||
IDENT = 'ipxebot'
|
||||
REALNAME = 'iPXE bot'
|
||||
|
||||
ERRCODE_RE = re.compile(r'(errcode|Error)\s+((0x)?[0-9a-fA-F]{8})')
|
||||
|
||||
NO_ARGS = -1
|
||||
|
||||
handlers = {}
|
||||
|
||||
def nick_from_mask(mask):
|
||||
return (mask.find('!') > -1 and mask.split('!', 1)[0]) or mask
|
||||
|
||||
def autojoin():
|
||||
del handlers['376']
|
||||
if NICKSERV_PASSWORD:
|
||||
pmsg('nickserv', 'identify %s' % NICKSERV_PASSWORD)
|
||||
if CHAN:
|
||||
cmd('JOIN %s' % CHAN)
|
||||
|
||||
def ping(_, arg):
|
||||
cmd('PONG %s' % arg)
|
||||
|
||||
def privmsg(_, target, msg):
|
||||
if target == CHAN:
|
||||
replyto = target
|
||||
if msg.find(NICK) == -1:
|
||||
return
|
||||
elif target == NICK:
|
||||
replyto = nick_from_mask(who)
|
||||
m = ERRCODE_RE.search(msg)
|
||||
if m:
|
||||
try:
|
||||
pmsg(replyto, str(errcode.Errcode(int(m.groups()[1], 16))))
|
||||
except ValueError:
|
||||
pass
|
||||
if msg.find('help') > -1:
|
||||
pmsg(replyto, 'I look up iPXE error codes. Message me like this:')
|
||||
pmsg(replyto, 'errcode 0x12345678 OR Error 0x12345678')
|
||||
|
||||
def add_handler(command, handler, nargs):
|
||||
handlers[command] = (handler, nargs)
|
||||
|
||||
def cmd(msg):
|
||||
sock.sendall('%s\r\n' % msg)
|
||||
|
||||
def pmsg(target, msg):
|
||||
cmd('PRIVMSG %s :%s' % (target, msg))
|
||||
|
||||
def dispatch(args):
|
||||
command = args[0]
|
||||
if command in handlers:
|
||||
h = handlers[command]
|
||||
if h[1] == NO_ARGS:
|
||||
h[0]()
|
||||
elif len(args) == h[1]:
|
||||
h[0](*args)
|
||||
|
||||
def parse(line):
|
||||
if line[0] == ':':
|
||||
who, line = line.split(None, 1)
|
||||
who = who[1:]
|
||||
else:
|
||||
who = None
|
||||
args = []
|
||||
while line and line[0] != ':' and line.find(' ') != -1:
|
||||
fields = line.split(None, 1)
|
||||
if len(fields) == 1:
|
||||
fields.append(None)
|
||||
arg, line = fields
|
||||
args.append(arg)
|
||||
if line:
|
||||
if line[0] == ':':
|
||||
args.append(line[1:])
|
||||
else:
|
||||
args.append(line)
|
||||
return who, args
|
||||
|
||||
add_handler('376', autojoin, NO_ARGS)
|
||||
add_handler('PING', ping, 2)
|
||||
add_handler('PRIVMSG', privmsg, 3)
|
||||
|
||||
sock = socket.socket()
|
||||
sock.connect((HOST, PORT))
|
||||
cmd('NICK %s' % NICK)
|
||||
cmd('USER %s none none :%s' % (IDENT, REALNAME))
|
||||
|
||||
rbuf = ''
|
||||
while True:
|
||||
r = sock.recv(4096)
|
||||
if not r:
|
||||
break
|
||||
rbuf += r
|
||||
|
||||
while rbuf.find('\r\n') != -1:
|
||||
line, rbuf = rbuf.split('\r\n', 1)
|
||||
if not line:
|
||||
continue
|
||||
who, args = parse(line)
|
||||
dispatch(args)
|
Loading…
Reference in New Issue
Block a user