def _getZoneDB(self, zone, zf=None): from time import strftime self._currentDB = zone zName = zone.getName() zFile = zone.getFile() if zf is None: self._zf = ZoneFile() if self._zf.openZoneFile( zFile ) is False: try: open(zFile, 'w').close() except: return UI.Label('O arquivo não pôde ser acessado!') if self._zf.openZoneFile( zFile ) is False: return UI.Label('O arquivo não pôde ser aberto!') else: self._zf = zf labelTop0 = UI.Label ( text = "Zona: "+zName.upper() , bold=True ) labelTop1 = UI.Label ( text = "Arquivo: "+zFile ) # Buttons butSave = UI.Button( id = 'saveDB', text="Salvar DB", icon="/dl/core/ui/stock/save.png", onclick="form", form="frmEditDB") butCancel = UI.Button( id = 'cancelDB', text="Cancelar", icon="/dl/core/ui/stock/dialog-cancel.png") butAddDir = UI.Button( id = 'addDirective', text="Adicionar Diretiva", icon="/dl/core/ui/stock/add.png") butAddRec = UI.Button( id = 'addRecord', text="Adicionar Registro", icon="/dl/core/ui/stock/add.png") buttons = UI.VContainer( UI.HContainer( butAddDir, butAddRec ), UI.HContainer( butCancel, butSave ) ) #END:Buttons # DIRETIVAS bloco = UI.DT( width="100%" ) bloco.append( UI.DTR( UI.DTD( UI.Label(text='Diretivas:', bold=True), colspan = 4 ) ) ) d = self._zf.getDirectives() for i in d.keys(): bloco.append( UI.DTR( UI.DTD(UI.Label( text=i ),colspan=2), UI.Label( text=d[i] ), UI.HContainer( UI.TipIcon( icon='/dl/core/ui/stock/edit.png', id='editDirectiveField/%s'%i), text='Editar Diretiva' ), )) del d #END: DIRETIVAS # SOA bloco.append( UI.DTR( UI.DTD( UI.Label ( text="Registro de Autoridade:", bold=True ), colspan=4 ))) s = self._zf.getSOA() for i in s.keys(): bloco.append( UI.DTR( UI.DTD(UI.Label ( text=i ),colspan=2), UI.Label ( text=s[i] ), UI.HContainer( UI.TipIcon( icon='/dl/core/ui/stock/edit.png', id='editSOAField/%s'%i, text='Editar campo SOA' ), ))) del s #END: SOA #REGISTROS bloco.append( UI.DTR( UI.DTD( UI.Label ( text="Demais registros:", bold=True ), colspan=4 ))) r = self._zf.getRecords() text4Label = [] for i in r.keys(): text4Label.append("%s[§SEP§]%s[§SEP§]%s%s%s[§SEP§]%s" %\ (r[i]['Tipo'],r[i]['Nome'],r[i]['IP'],r[i]['HostName'], r[i]['Texto'], str(i)) ) text4Label.sort() for i in text4Label: sp = i.split('[§SEP§]') bloco.append( UI.DTR( UI.Label ( text=sp[0] ), UI.Label ( text=sp[1] ), UI.Label ( text=sp[2] ), UI.HContainer( UI.TipIcon( icon='/dl/core/ui/stock/delete.png', id=('delRecordField/%s'%sp[3]), text='Delete', msg='Remover' ) ) )) del r #END:REGISTROS block = UI.VContainer( labelTop0, labelTop1, bloco, buttons ) return UI.DTR( block )
class BindPlugin(CategoryPlugin): text = 'DNS' icon = '/dl/bind/icon.png' folder = 'servers' def on_init(self): be = backend.Config(self.app) self.zones = be.read() def on_session_start(self): self._editing = None self._tab = 0 self._editZone = None self._restartBind = None # zona atual self._currentDB = None # conteudo da zona atual self._zf = None # adicionar registros self._addRecord = False self._addDirective = False # editar registros self._editSOA = None self._editDirective = None def _execute(self, command, daemon=False): ''' @return: [ (Boolean) Coomand executed with sucess , (tuple) (stdout,stderr) ] ''' cmd = command.split() print cmd[0], '::' , cmd[1:] if daemon: from time import sleep from os import access open( fileSync ,'w').write('1') exec_as_daemon(cmd[0], cmd[1:]) a = open( fileSync ).read() while access('/proc/%s'%a, 1): sleep(1) a = open( fileSync ).read() else: from os import system system(command) return [ True, 'Success' ] def _getZoneDB(self, zone, zf=None): from time import strftime self._currentDB = zone zName = zone.getName() zFile = zone.getFile() if zf is None: self._zf = ZoneFile() if self._zf.openZoneFile( zFile ) is False: try: open(zFile, 'w').close() except: return UI.Label('O arquivo não pôde ser acessado!') if self._zf.openZoneFile( zFile ) is False: return UI.Label('O arquivo não pôde ser aberto!') else: self._zf = zf labelTop0 = UI.Label ( text = "Zona: "+zName.upper() , bold=True ) labelTop1 = UI.Label ( text = "Arquivo: "+zFile ) # Buttons butSave = UI.Button( id = 'saveDB', text="Salvar DB", icon="/dl/core/ui/stock/save.png", onclick="form", form="frmEditDB") butCancel = UI.Button( id = 'cancelDB', text="Cancelar", icon="/dl/core/ui/stock/dialog-cancel.png") butAddDir = UI.Button( id = 'addDirective', text="Adicionar Diretiva", icon="/dl/core/ui/stock/add.png") butAddRec = UI.Button( id = 'addRecord', text="Adicionar Registro", icon="/dl/core/ui/stock/add.png") buttons = UI.VContainer( UI.HContainer( butAddDir, butAddRec ), UI.HContainer( butCancel, butSave ) ) #END:Buttons # DIRETIVAS bloco = UI.DT( width="100%" ) bloco.append( UI.DTR( UI.DTD( UI.Label(text='Diretivas:', bold=True), colspan = 4 ) ) ) d = self._zf.getDirectives() for i in d.keys(): bloco.append( UI.DTR( UI.DTD(UI.Label( text=i ),colspan=2), UI.Label( text=d[i] ), UI.HContainer( UI.TipIcon( icon='/dl/core/ui/stock/edit.png', id='editDirectiveField/%s'%i), text='Editar Diretiva' ), )) del d #END: DIRETIVAS # SOA bloco.append( UI.DTR( UI.DTD( UI.Label ( text="Registro de Autoridade:", bold=True ), colspan=4 ))) s = self._zf.getSOA() for i in s.keys(): bloco.append( UI.DTR( UI.DTD(UI.Label ( text=i ),colspan=2), UI.Label ( text=s[i] ), UI.HContainer( UI.TipIcon( icon='/dl/core/ui/stock/edit.png', id='editSOAField/%s'%i, text='Editar campo SOA' ), ))) del s #END: SOA #REGISTROS bloco.append( UI.DTR( UI.DTD( UI.Label ( text="Demais registros:", bold=True ), colspan=4 ))) r = self._zf.getRecords() text4Label = [] for i in r.keys(): text4Label.append("%s[§SEP§]%s[§SEP§]%s%s%s[§SEP§]%s" %\ (r[i]['Tipo'],r[i]['Nome'],r[i]['IP'],r[i]['HostName'], r[i]['Texto'], str(i)) ) text4Label.sort() for i in text4Label: sp = i.split('[§SEP§]') bloco.append( UI.DTR( UI.Label ( text=sp[0] ), UI.Label ( text=sp[1] ), UI.Label ( text=sp[2] ), UI.HContainer( UI.TipIcon( icon='/dl/core/ui/stock/delete.png', id=('delRecordField/%s'%sp[3]), text='Delete', msg='Remover' ) ) )) del r #END:REGISTROS block = UI.VContainer( labelTop0, labelTop1, bloco, buttons ) return UI.DTR( block ) # adiciona: # tab0: as zonas na lista com botão de editar e remover # tab1: as zonas no select def set_ui_zones(self, ui): l = ui.find('listzones') s = ui.find('selectZones') for pos in range( len(self.zones) ): z = self.zones[pos] s.append( UI.DTR( UI.SelectOption( value=pos, text=z.getName() ) )) zoneName = UI.Label( text = z.getName(), bold=True ) zoneType = UI.Label( text = z.getType() ) zoneFile = UI.Label( text = z.getFile() ) l.append(UI.DTR( zoneName, zoneType, zoneFile, UI.HContainer( UI.TipIcon( icon='/dl/core/ui/stock/edit.png', id='edit/' + str(self.zones.index(z)), text='Editar' ), UI.TipIcon( icon='/dl/core/ui/stock/delete.png', id='del/' + str(self.zones.index(z)), text='Delete', warning='Remover %s' % z.getName() ) ), )) # Trata a tab1, referente a acao de editar zona # Cuida do formulário da zona e também da lista e botões referentes def set_ui_editZone(self, ui): f = ui.find('frmEditZone') d = ui.find('divEditZone') if self._editZone <> None: ui.remove('selectZones') ui.remove('labelZonas') z = self.zones[self._editZone] d.append( self._getZoneDB(z, self._zf) ) else: f.append( UI.DTR( UI.Button(form="frmEditZone", onclick="form", text="Editar Zona", name="formEditButton", id="formEditButton", icon="/dl/core/ui/stock/service-run.png" ) )) def set_ui_AddRecord(self, ui): if (not self._addDirective) and (not self._addRecord): ui.remove('dlgAddRecord') return False d = ui.find('dlgAddRecord') tx = ui.find('textTypeRecord') ty = ui.find('typeRecord') #____________________ if self._addDirective: tx.set( 'text' , 'Diretiva:' ) v = [ 'ORIGIN', 'INCLUDE', 'TTL' ] ### Removendo as diretivas que já existem na zona, ### pois elas devem ser editadas e não inseridas tmp = self._zf.getDirectives() for i in tmp.keys(): try: v.remove(i) except: pass # Se não sobrou nenhuma, ele desabitilita a inserção if v == []: self._addDirective = False ui.remove('dlgAddRecord') return False ### for i in v: ty.append( UI.SelectOption( value='Directive:'+i, text=i ) ) d.append( UI.Formline( UI.TextInput(name='recordValue', value=''), text='Valor:' )) #___________________ elif self._addRecord: tx.set( 'text' , 'Registro:' ) v = { 'A':'IPv4', 'AAAA':'IPv6', 'CNAME':'Nome Canônico do Host', 'NS':'Nome do Servidor', 'TXT':'Texto do Host', 'MX': 'Servidor de E-mail', 'PTR':'Ponteiro' } keys = v.keys() keys.sort() for i in keys: ty.append( UI.SelectOption( value='Record:'+i, text=( "%s [%s]" % (v[i],i) ) ) ) d.append( UI.Formline( UI.TextInput(name='recordValueSource', value=''), text='1º Campo:' )) d.append( UI.Formline( UI.TextInput(name='recordValueTarget', value=''), text='2º Campo:' )) d.append( UI.Formline( UI.TextInput(name='recordValuePr', value=''), text='Prioridade (somente para servidor de e-mail):' )) d.append( UI.Formline( UI.Label(text='Em dúvidas, verifique a documentação.') )) def get_ui(self): ui = self.app.inflate('bind:main') ui.find('tabs').set('active', self._tab) l = ui.find('listzones') f = ui.find('frmEditZone') s = ui.find('selectZones') d = ui.find('divEditZone') # lista(tab0) e select(tab1) com as zonas existentes self.set_ui_zones(ui) # tab1: adiciona e remove UI's da tab de edição self.set_ui_editZone(ui) # formulario de adicionar Diretiva ou Registro self.set_ui_AddRecord(ui) ### tab0: formulário para editar uma zona if self._editing is not None: try: z = self.zones[self._editing] # definindo valores (do xml: 'id=') ui.find('name').set( 'value' , z.getName() ) ui.find('type').set( 'value' , z.getType() ) ui.find('file').set( 'value' , z.getFile() ) except: pass else: ui.remove('dlgEditZone') ### ### Para reiniciar o BIND if self._restartBind is not None: try: self._execute("/etc/init.d/bind9 restart",daemon=True) ui.find('bindCmd').append( UI.Label( text= 'Bind reiniciado' ) ) except: ui.find('bindCmd').append( UI.Label(text="Ocorreu um erro ao reiniciar o bind9")) pass else: ui.remove('dlgRestartBind') ### ### Para editar SOA if self._editSOA is None: ui.remove('dlgEditSOA') else: ui.find('dlgEditSOA').append(UI.FormLine(UI.Label(text=self._editSOA[0]))) ui.find('SOAValue').set( 'value', self._zf.getSOAField( self._editSOA[1] ) ) ### ### Para editar Diretivas if self._editDirective is None: ui.remove('dlgEditDirective') else: ui.find('dlgEditDirective').append(UI.FormLine(UI.Label(text=self._editDirective))) ui.find('DirectiveValue').set( 'value', self._zf.getDirectiveField( self._editDirective ) ) return ui @event('button/click') def on_click(self, event, params, vars = None): # se for botao id 'add' (xml) if params[0] == 'add': self._editing = len( self.zones ) self._tab = 0 # se for id 'edit/' elif params[0] == 'edit': self._editing = int( params[1] ) self._tab = 0 # se for id 'del/' elif params[0] == 'del': try: from os import rename f = self.zones[ int(params[1]) ].getFile() rename(f, f+'.bck') except: pass try: self.zones.pop( int(params[1]) ) except: pass backend.Config(self.app).save( self.zones ) self.on_init() self._tab = 0 #se o botao for reiniciar elif params[0] == 'restart': self._restartBind = True self._tab = 0 # se o botão for cancelar edicao elif params[0] == 'cancelDB': self._editZone = None self._currentDB = None self._getZoneDB = None self._zf = None self._tab = 1 elif params[0] == 'editDomainField': # modificar aqui print 'to-do' self._tab = 1 elif params[0] == 'delRecordField': self._zf.removeRecord(params[1]) self._tab = 1 elif params[0] == 'addDirective': self._addDirective = True self._tab = 1 elif params[0] == 'addRecord': self._addRecord = True self._tab = 1 elif params[0] == 'editDirectiveField': self._editDirective = params[1] elif params[0] == 'editSOAField': _tzf = "" if params[1] == 'Nome da Zona': _tzf = 'zoneName' elif params[1] == 'Dominio do Servidor': _tzf = 'serverDomain' elif params[1] == 'E-mail do Responsável': _tzf = 'emailResp' elif params[1] == 'Número Serial': _tzf = 'serial' elif params[1] == 'Tempo de Atualização': _tzf = 'refresh' elif params[1] == 'Retry' : _tzf = 'retry' elif params[1] == 'Expiração': _tzf = 'expire' elif params[1] == 'Tempo de cache negativa': _tzf = 'negative' self._editSOA = [ params[1] , _tzf ] @event('dialog/submit') def on_submit(self, event, params, vars = None): # se for o dialogo if params[0] == 'dlgEditZone': v = vars.getvalue('value', '') if vars.getvalue('action', '') == 'OK': # se a pessoa digitar um nome de arquivo inválido tmp = vars.getvalue('file', '').replace('/','') if tmp == "etcbindlocalzonesdb." or \ tmp == "" or (not tmp.startswith("etcbind")) or \ tmp == "etcbindlocalzones" or \ vars.getvalue('name','') == "": return None # cria a zona z = Zone() # obtendo valores (do xml: 'name=') z.setName( vars.getvalue('name', 'none') ) z.setType( vars.getvalue('type', 'none') ) z.setFile( vars.getvalue('file', 'none') ) # coloca no lugar da antiga: 'edit/' try: self.zones[self._editing] = z # ou adiciona uma nova: 'add' except: self.zones.append(z) # salva alteracoes backend.Config(self.app).save( self.zones ) self.on_init() elif params[0] == 'dlgAddRecord': if vars.getvalue('action', '') == 'OK': if vars.getvalue('typeRecord','').split(':')[0] == 'Directive': r = vars.getvalue('typeRecord','').split(':')[1] v = vars.getvalue('recordValue','') if v <> "": self._zf.setDirective("%s %s" % (r,v)) del r del v elif vars.getvalue('typeRecord','').split(':')[0] == 'Record': r = vars.getvalue('typeRecord','').split(':')[1] s = vars.getvalue('recordValueSource','') p = vars.getvalue('recordValuePr','') t = vars.getvalue('recordValueTarget','') if r <> 'MX': p = '' elif p == '': p = 10 self._zf.insertRecord( "%s IN %s %s %s"%(s,r,p,t) ) elif params[0] == 'dlgEditSOA': if vars.getvalue('action', '') == 'OK' and vars.getvalue('SOAValue','') != '': self._zf.setSOAbyFields( **{self._editSOA[1]:vars.getvalue('SOAValue','')} ) elif params[0] == 'dlgEditDirective': if vars.getvalue('action', '') == 'OK' and vars.getvalue('DirectiveValue','') != '': self._zf.setDirective( "%s %s" % (self._editDirective, vars.getvalue('DirectiveValue','')) ) # fecha janelas de formulario self._editing = None self._restartBind = None self._addDirective = False self._addRecord = False self._editSOA = None self._editDirective = None @event('form/submit') def on_submit_form(self, event, params, vars = None): # formulario EditZone if params[0] == 'frmEditZone': self._tab = 1 self._editZone = int( vars.getvalue('selectZones', '') ) # formulario frmEditDB elif params[0] == 'frmEditDB': backend.Config(self.app).saveZoneFile( self._currentDB, self._zf ) self._tab = 1 self._currentDB = None self._zf = None self._editZone = None
def saveZoneFile(self, zone, zoneFileObject): open(zone.getFile(), 'w').write( ZoneFile.getZoneFileByZone (zoneFileObject) )