どっかのデモに使えるかなぁ。。。ということで。
ソースはこちら。RHEL6.1で作りました。エラーチェックとかサニタイズは真剣にはやっていないので、本気で利用される方はそのあたりは手を加えてください。tkinterパッケージが必要です。
# yum install tkinter
#!/usr/bin/python from Tix import * import sys, os, re, commands, stat class ConfWindow( Frame ): def __init__( self, param, gpath ): self.param = param self.gpath = gpath self.win = Toplevel() self.win.title( "New Parameter" ) Frame.__init__( self, self.win ) cmd = "cgget -nv -r " + param + " " + gpath current = commands.getoutput( cmd ) self.entry = Entry( self ) self.entry.insert( 0, current ) gfont = ( "Sans", 12 ) pfont = ( "Courier", 12, "bold" ) Label( self, text="Group: " + gpath, font=gfont ).pack( side=TOP ) Label( self, text=param, font=pfont ).pack( side=TOP ) self.entry.pack( side=TOP ) Button( self, text="OK", command=self.onOK ).pack( side=LEFT ) Button( self, text="Cancel", command=self.onCancel ).pack( side=LEFT ) self.pack( fill=BOTH, expand=YES ) self.win.focus_set() self.entry.focus_set() while True: try: self.win.grab_set() except TclError: pass else: break self.win.wait_window() def onOK( self ): cmd = "cgset -r " + self.param + "=\'" + self.entry.get() + "\' " + self.gpath commands.getoutput( cmd ) self.win.destroy() def onCancel( self ): self.win.destroy() class ParamView( Frame ): def __init__( self, parent, **params ): Frame.__init__( self, parent, **params ) self.parent = parent listfont = ( "Courier", 12 ) labelfont = ( "Sans", 12 ) self.paramview = ScrolledListBox( self ) self.paramview.listbox.config( font=listfont ) self.paramview.listbox.bind( "<Double-Button-1>", self.modparam ) self.subsys, self.gpath = "", "" self.glabel = Label( self, text="Subsystem:Group", font=labelfont, bd=2, relief=RIDGE ) self.glabel.pack( side=TOP, fill=X, expand=NO ) self.paramview.pack( side=TOP, fill=BOTH, expand=YES ) def refresh( self, subsys, gpath, params ): self.subsys, self.gpath = subsys, gpath self.glabel.config( text = subsys + ":" + gpath ) self.paramview.listbox.delete( 0, END ) self.paramview.listbox.insert( END, *params ) def modparam( self, event ): match = re.match( "^([^:]+):", self.paramview.listbox.get( ACTIVE ) ) if match: param = match.group( 1 ) parampath = "/cgroup/" + self.subsys + self.gpath + "/" + param if stat.S_IWUSR & os.stat( parampath )[stat.ST_MODE]: cw = ConfWindow( param, self.gpath ) self.cgtree.selection( None ) class CgTree( Frame ): def __init__( self, parent, grouplist, **params ): Frame.__init__( self, parent, **params ) self.parent = parent self.glist = grouplist treefont = ( "Sans", 12 ) self.cgtree = Tree( self, options="hlist.separator /", browsecmd=self.selection ) self.cgtree.hlist.config( font = treefont, selectmod=SINGLE, selectbackground = "black" ) subsyses = self.glist.keys() subsyses.sort() for subsys in subsyses: self.cgtree.hlist.add( subsys ,text=subsys ) group = self.glist[ subsys ] items = group.keys() items.sort() for item in items: self.cgtree.hlist.add( subsys + item, text=group[ item ] ) self.cgtree.hlist.hide_entry( subsys + item ) self.cgtree.autosetmode() self.cgtree.pack( side=LEFT, fill=BOTH, expand=YES ) def selection( self, event ): entry, = self.cgtree.hlist.info_selection() match = re.match( r"^([^/]+)(/.+)?", entry ) subsys, gpath = match.group( 1 ), match.group( 2 ) if not gpath: gpath = "/" cmd = "cgget -g " + subsys + " " + gpath params = [] entries = commands.getoutput( cmd ).split("\n") entries.pop( 0 ) for line in entries: params.append( line ) self.paramview.refresh( subsys, gpath, params ) def get_grouplist(): grouplist = {} for line in commands.getoutput( "lscgroup" ).split("\n"): match = re.match( r"^([^:]+):(/.+)", line ) if match: subsys, gpath = match.group( 1 ), match.group( 2 ) if not grouplist.has_key( subsys ): grouplist[ subsys ] = {} match = re.match( r"^.*/([^/]+)", gpath ) grouplist[ subsys ][ gpath ] = match.group( 1 ) return grouplist class MainPanel(): def __init__( self, parent, **params ): grouplist = get_grouplist() self.parent = parent self.params = params self.paramview = ParamView( self.parent ) self.cgtree = CgTree( self.parent, grouplist ) self.paramview.cgtree = self.cgtree self.cgtree.paramview = self.paramview self.cgtree.pack( side=LEFT, fill=Y, expand=NO ) self.paramview.pack( side=LEFT, fill=BOTH, expand=YES ) if __name__ == "__main__": root = Tk() root.title ( "Controll Groups Viewer" ) root.geometry( "600x400" ) mainPanel = MainPanel( root ) root.mainloop() # vi:ts=4