summaryrefslogtreecommitdiffstats
path: root/third_party/buildbot/pylibs/twisted/scripts/tkmktap.py
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/buildbot/pylibs/twisted/scripts/tkmktap.py')
-rw-r--r--third_party/buildbot/pylibs/twisted/scripts/tkmktap.py558
1 files changed, 0 insertions, 558 deletions
diff --git a/third_party/buildbot/pylibs/twisted/scripts/tkmktap.py b/third_party/buildbot/pylibs/twisted/scripts/tkmktap.py
deleted file mode 100644
index 5fceb46..0000000
--- a/third_party/buildbot/pylibs/twisted/scripts/tkmktap.py
+++ /dev/null
@@ -1,558 +0,0 @@
-
-# Copyright (c) 2001-2004 Twisted Matrix Laboratories.
-# See LICENSE for details.
-
-#
-
-"""Implementation module for the graphical version of the `mktap` command.
-"""
-
-# System imports
-import Tkinter, tkMessageBox, tkFileDialog, StringIO, os
-import traceback
-
-# Twisted imports
-from twisted.application import service
-from twisted.internet import tksupport, reactor
-from twisted.scripts import mktap
-from twisted.python import usage, reflect
-from twisted.copyright import version
-
-
-class TkMkAppFrame(Tkinter.Frame):
- """
- A frame with all the necessary widgets to configure a Twisted Application.
- """
-
- # Plugin currently selected
- coil = None
-
- # Options instance currently displayed
- options = None
-
- # Frame options are displayed in
- optFrame = None
-
- def __init__(self, master, coil):
- Tkinter.Frame.__init__(self, master)
-
- self.setupMkTap()
- self.reset(coil)
-
-
- def setupMkTap(self):
- # Create all of the "mktap" option widgets
- appFrame = Tkinter.Frame(self)
-
- f = Tkinter.Frame(appFrame)
- listLabel = Tkinter.Label(f, text='TAp Format')
- self.typeList = Tkinter.Listbox(f, background='white')
- self.typeList['height'] = 3
- for t in ('pickle', 'xml', 'source'):
- self.typeList.insert(Tkinter.END, t)
- self.typeList.selection_set(0)
-
- listLabel.pack(side=Tkinter.TOP)
- self.typeList.pack(side=Tkinter.TOP)
- f.pack(side=Tkinter.LEFT, anchor=Tkinter.N)
-
- f = Tkinter.Frame(appFrame)
- tapLabel = Tkinter.Label(f, text='TAp Filename')
- tapButton = Tkinter.Button(f, text="Choose", command=self.pickTapFile)
- self.tapfile = Tkinter.Entry(f, background='white')
-
- tapLabel.pack(side=Tkinter.LEFT)
- self.tapfile.pack(side=Tkinter.LEFT)
- tapButton.pack(side=Tkinter.LEFT)
- f.pack(side=Tkinter.TOP, anchor=Tkinter.E)
-
- f = Tkinter.Frame(appFrame)
- nameLabel = Tkinter.Label(f, text='Application Process Name')
- self.appname = Tkinter.Entry(f, background='white')
-
- nameLabel.pack(side=Tkinter.LEFT)
- self.appname.pack(side=Tkinter.LEFT)
- f.pack(side=Tkinter.TOP, anchor=Tkinter.E)
-
- f = Tkinter.Frame(appFrame)
- encLabel = Tkinter.Label(f, text='Passphrase')
- self.passphrase = Tkinter.Entry(f, background='white')
-
- encLabel.pack(side=Tkinter.LEFT)
- self.passphrase.pack(side=Tkinter.LEFT)
- f.pack(side=Tkinter.TOP, anchor=Tkinter.E)
-
- f = Tkinter.Frame(appFrame)
- self.append = Tkinter.BooleanVar()
- appLabel = Tkinter.Label(f, text='Append')
- appButton = Tkinter.Checkbutton(f, variable=self.append)
-
- appLabel.pack(side=Tkinter.LEFT)
- appButton.pack(side=Tkinter.LEFT)
- f.pack(side=Tkinter.LEFT, anchor=Tkinter.E)
-
- f = Tkinter.Frame(appFrame)
- s = Tkinter.StringVar()
- s.set(not hasattr(os, 'getuid') and '0' or str(os.getuid()))
- uidLabel = Tkinter.Label(f, text='UID')
- self.uid = Tkinter.Entry(f, text=s, background='white')
-
- uidLabel.pack(side=Tkinter.LEFT)
- self.uid.pack(side=Tkinter.LEFT)
- f.pack(side=Tkinter.BOTTOM)
-
- f = Tkinter.Frame(appFrame)
- s = Tkinter.StringVar()
- s.set(not hasattr(os, 'getgid') and '0' or str(os.getgid()))
- gidLabel = Tkinter.Label(f, text='GID')
- self.gid = Tkinter.Entry(f, text=s, background='white')
-
- gidLabel.pack(side=Tkinter.LEFT)
- self.gid.pack(side=Tkinter.LEFT)
- f.pack(side=Tkinter.BOTTOM)
-
- appFrame.grid(row=0, column=0, columnspan=3, sticky=Tkinter.N + Tkinter.S)
-
-
- def pickTapFile(self):
- r = tkFileDialog.askopenfilename()
- if r:
- self.tapfile.delete(0, Tkinter.END)
- self.tapfile.insert(Tkinter.END, r)
-
-
- def reset(self, coil):
- """
- Remove the existing coil-specific widgets and then create and add
- new ones based on the given plugin object.
- """
- if coil is self.coil:
- return
-
- try:
- opt = coil.load().Options()
- except:
- f = StringIO.StringIO()
- traceback.print_exc(file=f)
- # XXX - Why is this so narrow?
- tkMessageBox.showerror(title="Options Error", message=f.getvalue(), parent=self)
- return
-
- if self.optFrame:
- self.optFrame.forget()
- self.optFrame.destroy()
- self.optFrame = None
-
- self.coil = coil
- self.options = opt
- self.optFrame = TkConfigFrame(self, self.options)
- self.optFrame.grid(row=1, column=0)
-
-# self.tapfile.delete(0, Tkinter.END)
-# try:
-# self.tapfile.insert(Tkinter.END, self.coil.tapname)
-# except AttributeError:
-# self.tapfile.insert(Tkinter.END, self.coil.name)
-
-
- def copyOptions(self):
- # Snarf the data out of the widgets and place them into the Options
- # instance.
- extra = self.optFrame.updateConfig(self.options)
-
- self.options['filename'] = self.tapfile.get()
- self.options['appname'] = self.appname.get()
- self.options['passphrase'] = self.passphrase.get()
-
- self.options['append'] = self.append.get()
- self.options['encrypted'] = len(self.options['passphrase'])
-
- self.options['uid'] = int(self.uid.get())
- self.options['gid'] = int(self.gid.get())
-
- try:
- self.options['type'] = self.typeList.curselection()[0]
- except IndexError:
- raise usage.UsageError("Select a TAp Format")
- self.options['help'] = 0
-
- if extra:
- try:
- # XXX - this is wrong. It needs to respect quotes, etc.
- self.options.parseArgs(extra.split())
- except TypeError:
- raise usage.UsageError("Wrong number of extra arguments")
- self.options.postOptions()
-
-
- def createApplication(self):
- if not self.options:
- tkMessageBox.showerror(message="Select an Application first")
- return
-
- try:
- self.copyOptions()
- except usage.UsageError, e:
- tkMessageBox.showerror(message=str(e))
- return
-
- exists = os.path.exists(self.options['filename'])
- if self.options['append'] and exists:
- a = service.loadApplication(
- self.options['filename'],
- self.options['type'],
- self.options['passphrase']
- )
- else:
- if exists:
- overwrite = tkMessageBox.askyesno(title='File Exists', message='Overwrite?')
- if not overwrite:
- return
- a = service.Application(self.coil.name, self.options['uid'], self.options['gid'])
-
- try:
- s = mktap.makeService(
- self.coil.load(),
- self.options['appname'],
- self.options
- )
- except usage.UsageError:
- f = StringIO.StringIO()
- traceback.print_stack(file=f)
- tkMessageBox.showerror(title="Usage Error", message=f.getvalue(), parent=self)
- else:
- try:
- mktap.addToApplication(
- s, self.coil.name, self.options['append'],
- self.options['appname'], self.options['type'],
- self.options['encrypted'], self.options['uid'],
- self.options['gid'],
- )
- except:
- f = StringIO.StringIO()
- traceback.print_exc(file=f)
- print f.getvalue()
- tkMessageBox.showerror(title="Usage Error", message=f.getvalue(), parent=self)
- else:
- filename = self.options['filename']
- if not filename:
- filename = self.coil.name
- tkMessageBox.showinfo(message="Wrote " + filename)
-
-
- def destroy(self):
- reactor.crash()
- Tkinter.Frame.destroy(self)
-
-
-#
-# This class was written based on code from Drew "drewp" Pertulla
-# (<drewp (at) bigasterisk (dot) com>) - without his help, tkmktap
-# would be an ugly POS.
-#
-class ParameterLine(Tkinter.Frame):
- def __init__(self, master, lines, label, desc, default, cmd, **kw):
- Tkinter.Frame.__init__(self, master, relief='raised', bd=1, **kw)
-
- self.lines = lines
-
- l = Tkinter.Label(
- self, text=label, wraplen=200,
- width=30, anchor='w', justify='left'
- )
-
- s = Tkinter.StringVar()
- if default:
- s.set(default)
- self.entry = Tkinter.Entry(self, text=s, background='white')
- self.flag = label
-
- more = Tkinter.Button(
- self, text='+',
- command=lambda f = cmd, a = label, b = default, c = desc: f(a, b, c)
- )
-
- l.pack(side=Tkinter.LEFT, fill='y')
- self.entry.pack(side=Tkinter.LEFT)
- more.pack(side=Tkinter.LEFT)
-
- l.bind("<Enter>", self.highlight)
- l.bind("<Leave>", self.unhighlight)
-
- l.bind("<ButtonPress-1>", self.press)
- l.bind("<B1-ButtonRelease>", self.release)
- l.bind("<B1-Motion>", self.motion)
-
-
- def highlight(self, ev, hicolor = 'gray90'):
- # make the label light up when you mouseover
- ev.widget._oldcolor = self.cget('bg')
- ev.widget.config(bg=hicolor)
-
-
- def unhighlight(self, ev):
- # make the label return to its old setting
- try:
- ev.widget.config(bg=ev.widget._oldcolor)
- del ev.widget._oldcolor
- except:
- pass
-
-
- # make the frame change order when you drag it (by its label)
- def press(self, ev):
- # save old attrs
- self._oldrelief = self.cget('relief'), self.cget('bd')
- # thicken the border
- self.config(relief='raised', bd=3)
-
-
- def motion(self, ev):
- this = self.lines.index(self)
- framey = ev.y + self.winfo_y() # get mouse y coord in parent frame
- replace = this # replace will be the index of the row to swap with
- for i, l in zip(range(len(self.lines)), self.lines):
- y1 = l.winfo_y()
- y2 = y1 + l.winfo_height()
- if y1 < framey < y2:
- replace = i
- if replace != this:
- # we moved over another row-- swap them
- self.lines[replace], self.lines[this] = self.lines[this], self.lines[replace]
-
- # and re-assign all rows in the new order
- for i, l in zip(range(len(self.lines)), self.lines):
- l.grid(row=i, column=0)
-
-
- def release(self, ev):
- # restore the old border width
- try:
- rel, bd = self._oldrelief
- self.config(relief=rel, bd=bd)
- del self._oldrelief
- except:
- pass
-
-
-class TkConfigFrame(Tkinter.Frame):
- optFrame = None
- paramFrame = None
- commandFrame = None
-
- subCmdFrame = None
- previousCommand = None
-
- optFlags = None
- paramLines = None
-
- def __init__(self, master, options):
- Tkinter.Frame.__init__(self, master)
- self.options = options
-
- self.setupOptFlags()
- self.setupOptParameters()
- self.setupSubCommands()
- self.setupExtra()
-
-
- def getOptFlags(self):
- return self.optFlags
-
-
- def getOptParameters(self):
- r = []
- for p in self.paramLines:
- r.append((p.flag, p.entry.get()))
- return r
-
-
- def updateConfig(self, options):
- for (opt, var) in self.getOptFlags():
- var = var.get()
-
- if not var:
- continue # XXX - this is poor - add a '-' button to remove options
-
- f = getattr(options, 'opt_' + opt, None)
- if f:
- f()
- else:
- options[opt] = var
-
- for (opt, var) in self.getOptParameters():
-
- if not var:
- continue # XXX - this is poor - add a '-' button to remove options
-
- f = getattr(options, 'opt_' + opt, None)
- if f:
- f(var)
- else:
- options[opt] = var
- return self.extra.get()
-
-
- def setupOptFlags(self):
- self.optFlags = []
- flags = []
- if hasattr(self.options, 'optFlags'):
- flags.extend(self.options.optFlags)
-
- d = {}
- soFar = {}
- for meth in reflect.prefixedMethodNames(self.options.__class__, 'opt_'):
- full = 'opt_' + meth
- func = getattr(self.options, full)
-
- if not usage.flagFunction(func) or meth in ('help', 'version'):
- continue
-
- if soFar.has_key(func):
- continue
- soFar[func] = 1
-
- existing = d.setdefault(func, meth)
- if existing != meth:
- if len(existing) < len(meth):
- d[func] = meth
-
- for (func, name) in d.items():
- flags.append((name, None, func.__doc__))
-
- if len(flags):
- self.optFrame = f = Tkinter.Frame(self)
- for (flag, _, desc) in flags:
- b = Tkinter.BooleanVar()
- c = Tkinter.Checkbutton(f, text=desc, variable=b, wraplen=200)
- c.pack(anchor=Tkinter.W)
- self.optFlags.append((flag, b))
- f.grid(row=1, column=1)
-
-
- def setupOptParameters(self):
- params = []
- if hasattr(self.options, 'optParameters'):
- params.extend(self.options.optParameters)
-
- d = {}
- soFar = {}
- for meth in reflect.prefixedMethodNames(self.options.__class__, 'opt_'):
- full = 'opt_' + meth
- func = getattr(self.options, full)
-
- if usage.flagFunction(func) or soFar.has_key(func):
- continue
-
- soFar[func] = 1
-
- existing = d.setdefault(func, meth)
- if existing != meth:
- if len(existing) < len(meth):
- d[func] = meth
- for (func, name) in d.items():
- params.append((name, None, None, func.__doc__))
-
- if len(params):
- self.paramFrame = Tkinter.Frame(self)
- self.paramLines = []
- for (flag, _, default, desc) in params:
- try:
- default = self.options[flag]
- except KeyError:
- pass
- self.makeField(flag, default, desc)
- self.paramFrame.grid(row=1, column=2)
-
-
-
- def makeField(self, flag, default, desc):
- line = ParameterLine(
- self.paramFrame, self.paramLines, flag, desc, default,
- cmd=self.makeField
- )
- self.paramLines.append(line)
- line.grid(row=len(self.paramLines), column=0)
-
-
- def setupSubCommands(self):
- self.optMap = {}
- if hasattr(self.options, 'subCommands'):
- self.commandFrame = f = Tkinter.Frame(self)
- self.cmdList = Tkinter.Listbox(f)
- for (cmd, _, opt, desc) in self.options.subCommands:
- self.cmdList.insert(Tkinter.END, cmd)
- self.optMap[cmd] = opt()
- self.cmdList.pack()
- self.subCmdPoll = reactor.callLater(0.1, self.pollSubCommands)
- f.grid(row=1, column=3)
-
-
- def setupExtra(self):
- f = Tkinter.Frame(self)
- l = Tkinter.Label(f, text='Extra Options')
- self.extra = Tkinter.Entry(f, background='white')
- l.pack()
- self.extra.pack(fill='y')
- f.grid(row=2, column=1, columnspan=2)
-
-
- def pollSubCommands(self):
- s = self.cmdList.curselection()
- if len(s):
- s = s[0]
- if s != self.previousCommand:
- if self.subOptFrame:
- self.subOptFrame.forget()
- self.subOptFrame.destroy()
- self.subOptFrame = TkConfigFrame(self.commandFrame, self.optMap[s])
- self.subOptFrame.pack()
- self.subCmdPoll = reactor.callLater(0.1, self.pollSubCommands)
-
-
-class TkAppMenu(Tkinter.Menu):
- def __init__(self, master, create, callback, items):
- Tkinter.Menu.__init__(self, master)
-
- cmdMenu = Tkinter.Menu(self)
- self.add_cascade(label="Actions", menu=cmdMenu)
-
- cmdMenu.add_command(label='Create', command=create)
- cmdMenu.add_separator()
- cmdMenu.add_command(label='Quit', command=reactor.crash)
-
- tapMenu = Tkinter.Menu(self)
- self.add_cascade(label="Applications", menu=tapMenu)
-
- for item in items:
- tapMenu.add_command(
- label=item, command=lambda i=item, c = callback: c(i)
- )
-
-
-def run():
- taps = mktap.loadPlugins()
- r = Tkinter.Tk()
- r.withdraw()
-
- keyList = taps.keys()
- keyList.sort()
-
- config = TkMkAppFrame(r, None)
- menu = TkAppMenu(
- r,
- config.createApplication,
- lambda i, d = taps, c = config: c.reset(d[i]),
- keyList
- )
-
- config.pack()
- r['menu'] = menu
-
- r.title('Twisted Application Maker ' + version)
- r.deiconify()
- tksupport.install(r)
- reactor.run()
-
-if __name__ == '__main__':
- run()