def __init__(self, motionScheduler=None, specification=None, scheduler=None): """ Initializes the SRPCServer object Args passed to this object allow the SRPC server to share these objects All requests are subject to username and password authentication and connection are made over HTTPS. @param motionScheduler @param specification @param scheduler """ if (motionScheduler == None): self.motionScheduler = MotionScheduler.GetInstance() else: self.motionScheduler = motionScheduler if (specification == None): self.specification = Specification.GetInstance() else: self.specification = specification if (scheduler == None): self.scheduler = Scheduler.GetInstance() else: self.scheduler = scheduler self.notifier = Notifier() self.sslmanager = SSLManager() self.server_address = (Setting.get('rpc_server_hostname', '0.0.0.0'), Setting.get('rpc_server_port', 9000)) try: self.server = SecureXMLRPCServer( self.server_address, SecureXMLRpcRequestHandler, Setting.get('rpc_server_log', False), self.sslmanager.key, self.sslmanager.certificate) except (socket.error): old = self.server_address[0] Setting.set('rpc_server_hostname', '0.0.0.0') self.server_address = (Setting.get('rpc_server_hostname', '0.0.0.0'), Setting.get('rpc_server_port', 9000)) self.server = SecureXMLRPCServer( self.server_address, SecureXMLRpcRequestHandler, Setting.get('rpc_server_log', False), self.sslmanager.key, self.sslmanager.certificate) self.notifier.addNotice( 'Unable to bind to RPC Hostname: {}. Reset to 0.0.0.0.'.format( old), 'warning') self.exposed = Exposed(self.specification, self.motionScheduler) self.server.register_instance(self.exposed) self.scheduler.addTask( 'srpc_server', self.serve, 0.2, stopped=(not Setting.get('rpc_autostart', False)))
def __init__(self, parent, gui, **options): """ Initializes TkRPCManager object @param parent @param gui @param options """ super(TkRPCManager,self).__init__(parent, gui, **options) self.scheduler = self.gui.scheduler self.now = lambda: int(round(time.time() * 1000)) self.urlshown = None dependencies = [ {'package':'OpenSSL', 'installer': 'apt-get'}, {'package':'python-openssl', 'installer': 'apt-get'} ] self.dm = TkDependencyManager(self.widget, dependencies, 'RPC Manager', self.gui) if(not self.dm.installRequired()): self.ssl = SSLManager() self.scheduler.addTask('rpc_url_watcher', self.__hideUrl, 10) try: self.rpcserver = TkRPCManager.rpcserver except: TkRPCManager.rpcserver = self.rpcserver = self.gui.getClass('SRPC.SRPCServer')(motionScheduler = self.gui.motionScheduler, specification = self.gui.specification, scheduler = self.gui.scheduler)
def __init__(self, parent, gui, **options): super(TkRPCManager,self).__init__(parent, gui, **options) self.scheduler = self.gui.scheduler self.now = lambda: int(round(time.time() * 1000)) self.urlshown = None dependencies = [ {'package':'OpenSSL', 'installer': 'apt-get'}, {'package':'python-openssl', 'installer': 'apt-get'} ] self.dm = TkDependencyManager(self.widget, dependencies, 'RPC Manager', self.gui) if(not self.dm.installRequired()): self.ssl = SSLManager() self.scheduler.addTask('rpc_url_watcher', self.__hideUrl, 10) try: self.rpcserver = TkRPCManager.rpcserver except: TkRPCManager.rpcserver = self.rpcserver = self.gui.getClass('SRPC.SRPCServer')(motionScheduler = self.gui.motionScheduler, specification = self.gui.specification, scheduler = self.gui.scheduler)
class TkRPCManager(TkPage): def __init__(self, parent, gui, **options): """ Initializes TkRPCManager object @param parent @param gui @param options """ super(TkRPCManager,self).__init__(parent, gui, **options) self.scheduler = self.gui.scheduler self.now = lambda: int(round(time.time() * 1000)) self.urlshown = None dependencies = [ {'package':'OpenSSL', 'installer': 'apt-get'}, {'package':'python-openssl', 'installer': 'apt-get'} ] self.dm = TkDependencyManager(self.widget, dependencies, 'RPC Manager', self.gui) if(not self.dm.installRequired()): self.ssl = SSLManager() self.scheduler.addTask('rpc_url_watcher', self.__hideUrl, 10) try: self.rpcserver = TkRPCManager.rpcserver except: TkRPCManager.rpcserver = self.rpcserver = self.gui.getClass('SRPC.SRPCServer')(motionScheduler = self.gui.motionScheduler, specification = self.gui.specification, scheduler = self.gui.scheduler) def setup(self): """ setup gui menu """ self.gui.menus['rpc'] = Tkinter.Menu(self.gui.menubar, tearoff=0, bg=self.colours['menubg'], fg=self.colours['menufg'], activeforeground=self.colours['menuactivefg'], activebackground=self.colours['menuactivebg']) self.gui.menus['rpc'].add_command(label="Manage Server", command=self.OnManageRPCClick) self.addMenu(label="RPC", menu=self.gui.menus['rpc']) #=== VIEWS ===# def serverManager(self): """ view - RPC service manager """ self.open() self.widgets['frameLabel'] = Tkinter.Label(self.widgets['tframe'],text='RPC Server', bg=self.colours['bg'], fg=self.colours['headingfg'], font=self.fonts['heading']) self.widgets['frameLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.gridrow += 1 self.widgets['serviceLabel'] = Tkinter.Label(self.widgets['tframe'],text='Service', anchor='nw', bg=self.colours['bg'], fg=self.colours['headingfg'], font=self.fonts['heading2']) self.widgets['serviceLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.gridrow += 1 self.variables['status'] = Tkinter.StringVar() self.widgets['statusdata'] = Tkinter.Label(self.widgets['tframe'],textvariable=self.variables['status'], bg=self.colours['bg'], fg=self.colours['fg'], font=self.fonts['heading2']) self.widgets['statusdata'].grid(column=0,row=self.gridrow,sticky='EW') self.widgets['controlframe'] = Tkinter.Frame(self.widgets['tframe'], borderwidth=0, bg = self.colours['bg']) self.widgets['controlframe'].grid(column = 1, row = self.gridrow, padx=20, columnspan=2, sticky = "WENS") self.widgets['startbutton'] = Tkinter.Button(self.widgets['controlframe'],text=u"Start RPC Server", image=self.images['play'], command=self.OnStartClick, bg=self.colours['buttonbg'], activebackground=self.colours['buttonhighlightbg'], highlightbackground=self.colours['buttonborder']) self.widgets['startbutton'].grid(column=1,row=0, padx=10) self.widgets['stopbutton'] = Tkinter.Button(self.widgets['controlframe'],text=u"Stop RPC Server", image=self.images['stop'], command=self.OnStopClick, bg=self.colours['buttonbg'], activebackground=self.colours['buttonhighlightbg'], highlightbackground=self.colours['buttonborder']) self.widgets['stopbutton'].grid(column=2,row=0, padx=10) self.variables['autostart'] = Tkinter.BooleanVar() self.variables['autostart'].set(Setting.get('rpc_autostart', False)) self.widgets['autostartentry'] = Tkinter.Checkbutton(self.widgets['controlframe'], text="Autostart", variable=self.variables['autostart'], command=self.OnToggleAutostartClick, bg=self.colours['inputbg'], fg=self.colours['inputfg'], activebackground=self.colours['activebg'], selectcolor=self.colours['inputbg']) self.widgets['autostartentry'].grid(column=3,row=0, padx=10) if(self.rpcserver.isRunning() == False): self.variables['status'].set('Stopped') self.widgets['startbutton'].configure(state='normal') self.widgets['stopbutton'].configure(state='disabled') else: self.variables['status'].set('Running') self.widgets['startbutton'].configure(state='disabled') self.widgets['stopbutton'].configure(state='normal') self.gridrow += 1 self.widgets['sslLabel'] = Tkinter.Label(self.widgets['tframe'],text='SSL Certificate', anchor='nw', bg=self.colours['bg'], fg=self.colours['headingfg'], font=self.fonts['heading2']) self.widgets['sslLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.gridrow += 1 self.widgets['startdateLabel'] = Tkinter.Label(self.widgets['tframe'],text='Start Date', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['startdateLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.widgets['startdateData'] = Tkinter.Label(self.widgets['tframe'],text=str(self.ssl.start), bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['startdateData'].grid(column=1,row=self.gridrow,sticky='EW') self.widgets['ccframe'] = Tkinter.Frame(self.widgets['tframe'], borderwidth=0, bg = self.colours['bg']) self.widgets['ccframe'].grid(column = 3, row = self.gridrow, padx=20, columnspan=4, rowspan=5, sticky = "WENS") self.widgets['ccLabel'] = Tkinter.Label(self.widgets['ccframe'],text='Valid Country Codes', anchor='nw', bg=self.colours['bg'], fg=self.colours['headingfg']) self.widgets['ccLabel'].grid(column=0,row=0, sticky='EW') self.widgets['ccSubframe'] = Tkinter.Frame(self.widgets['ccframe'], borderwidth=0, bg = self.colours['bg']) self.widgets['ccSubframe'].grid(column = 0, row = 1, sticky = "WENS") r,c = 0,0 cols = 20 for s in self.ssl.countryCodes(): self.widgets['ccLabel'+s] = Tkinter.Label(self.widgets['ccSubframe'],text=s, anchor='nw', bg=self.colours['bg'], fg=self.colours['fg']) self.widgets['ccLabel'+s].grid(column=c,row=r,sticky='EW') #if (c == cols-1): # r += 1 if (c < cols): c = c+1 else: c = 0 r+=1 self.gridrow += 1 self.widgets['enddateLabel'] = Tkinter.Label(self.widgets['tframe'],text='End Date', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['enddateLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.widgets['enddateData'] = Tkinter.Label(self.widgets['tframe'],text=str(self.ssl.end), bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['enddateData'].grid(column=1,row=self.gridrow,sticky='EW') self.gridrow += 1 self.widgets['domainLabel'] = Tkinter.Label(self.widgets['tframe'],text='Domain', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['domainLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.variables['domain'] = Tkinter.StringVar() self.widgets['domainentry'] = Tkinter.Entry(self.widgets['tframe'], textvariable=self.variables['domain'], bg=self.colours['inputbg'], fg=self.colours['inputfg']) self.widgets['domainentry'].grid(column=1,row=self.gridrow,sticky='EW') self.variables['domain'].set(Setting.get('rpc_server_ssl_domain', 'localhost')) self.gridrow += 1 self.widgets['companyLabel'] = Tkinter.Label(self.widgets['tframe'],text='Company', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['companyLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.variables['company'] = Tkinter.StringVar() self.widgets['companyentry'] = Tkinter.Entry(self.widgets['tframe'], textvariable=self.variables['company'], bg=self.colours['inputbg'], fg=self.colours['inputfg']) self.widgets['companyentry'].grid(column=1,row=self.gridrow,sticky='EW') self.variables['company'].set(Setting.get('rpc_server_ssl_company', 'TestCo')) self.gridrow += 1 self.widgets['countryLabel'] = Tkinter.Label(self.widgets['tframe'],text='Country', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['countryLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.variables['country'] = Tkinter.StringVar() self.widgets['countryentry'] = Tkinter.Entry(self.widgets['tframe'], textvariable=self.variables['country'], bg=self.colours['inputbg'], fg=self.colours['inputfg']) self.widgets['countryentry'].grid(column=1,row=self.gridrow,sticky='EW') self.variables['country'].set(Setting.get('rpc_server_ssl_country', 'GB')) self.gridrow += 1 self.widgets['settingsLabel'] = Tkinter.Label(self.widgets['tframe'],text='Settings', anchor='nw', bg=self.colours['bg'], fg=self.colours['headingfg'], font=self.fonts['heading2']) self.widgets['settingsLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.gridrow += 1 self.widgets['hostnameLabel'] = Tkinter.Label(self.widgets['tframe'],text='Hostname', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['hostnameLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.variables['hostname'] = Tkinter.StringVar() self.widgets['hostnameentry'] = Tkinter.Entry(self.widgets['tframe'], textvariable=self.variables['hostname'], bg=self.colours['inputbg'], fg=self.colours['inputfg']) self.widgets['hostnameentry'].grid(column=1,row=self.gridrow,sticky='EW') self.variables['hostname'].set(Setting.get('rpc_server_hostname', 'localhost')) self.widgets['efframe'] = Tkinter.Frame(self.widgets['tframe'], borderwidth=0, bg = self.colours['bg']) self.widgets['efframe'].grid(column = 3, row = self.gridrow, padx=20, columnspan=6, rowspan=4, sticky = "WENS") self.widgets['efLabel'] = Tkinter.Label(self.widgets['efframe'],text='Exposed Functions', anchor='nw', bg=self.colours['bg'], fg=self.colours['headingfg']) self.widgets['efLabel'].grid(column=0,row=0, sticky='EW') self.widgets['efSubframe'] = Tkinter.Frame(self.widgets['efframe'], borderwidth=0, bg = self.colours['bg']) self.widgets['efSubframe'].grid(column = 0, row = 1, sticky = "WENS") r,c = 0,0 cols = 4 for t in self.rpcserver.listMethods(): self.widgets[t+'Label'] = Tkinter.Label(self.widgets['efSubframe'],text=t, bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets[t+'Label'].grid(column=c,row=r, padx=10,sticky='EW') if (c < cols): c = c+1 else: c = 0 r+=1 self.gridrow += 1 self.widgets['portLabel'] = Tkinter.Label(self.widgets['tframe'],text='Port', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['portLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.variables['port'] = Tkinter.IntVar() self.widgets['portentry'] = Tkinter.Entry(self.widgets['tframe'], textvariable=self.variables['port'], bg=self.colours['inputbg'], fg=self.colours['inputfg']) self.widgets['portentry'].grid(column=1,row=self.gridrow,sticky='EW') self.variables['port'].set(Setting.get('rpc_server_port', 9000)) self.gridrow += 1 self.widgets['usernameLabel'] = Tkinter.Label(self.widgets['tframe'],text='Username', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['usernameLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.variables['username'] = Tkinter.StringVar() self.widgets['usernameentry'] = Tkinter.Entry(self.widgets['tframe'], textvariable=self.variables['username'], bg=self.colours['inputbg'], fg=self.colours['inputfg']) self.widgets['usernameentry'].grid(column=1,row=self.gridrow,sticky='EW') self.variables['username'].set(Setting.get('rpc_server_username', 'remoteuser')) self.gridrow += 1 self.widgets['passwordLabel'] = Tkinter.Label(self.widgets['tframe'],text='Password', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['passwordLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.variables['password'] = Tkinter.StringVar() self.widgets['passwordentry'] = Tkinter.Entry(self.widgets['tframe'], textvariable=self.variables['password'], bg=self.colours['inputbg'], fg=self.colours['inputfg']) self.widgets['passwordentry'].grid(column=1,row=self.gridrow,sticky='EW') self.variables['password'].set(Setting.get('rpc_server_password', str(uuid.uuid4()))) self.widgets['genbutton'] = Tkinter.Button(self.widgets['tframe'],text=u"Generate Key", image=self.images['process'], bg=self.colours['buttonbg'], activebackground=self.colours['buttonhighlightbg'], highlightbackground=self.colours['buttonborder'], command=self.OnGeneratePasswordClick) self.widgets['genbutton'].grid(column=2,row=self.gridrow,sticky='EW') self.gridrow += 1 self.widgets['urlLabel'] = Tkinter.Label(self.widgets['tframe'],text='URL', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['urlLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.widgets['url'] = Tkinter.Label(self.widgets['tframe'],text='Click show or copy', anchor=NW, bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['url'].grid(column=1,row=self.gridrow, columnspan=6, sticky='EW') self.gridrow += 1 self.widgets['optionsFrame'] = Tkinter.Frame(self.widgets['tframe'], bg=self.colours['bg']) self.widgets['optionsFrame'].grid(column=0,row=self.gridrow,columnspan=2, sticky='EW') self.gridrow = 0 self.widgets['saveLabel'] = Tkinter.Label(self.widgets['optionsFrame'],text='Save', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['saveLabel'].grid(column=0,row=self.gridrow, padx=5, sticky='EW') self.widgets['regenLabel'] = Tkinter.Label(self.widgets['optionsFrame'],text='Regenerate SSL', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['regenLabel'].grid(column=1,row=self.gridrow,padx=5, sticky='EW') self.widgets['showUrlLabel'] = Tkinter.Label(self.widgets['optionsFrame'],text='Show URL', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['showUrlLabel'].grid(column=2,row=self.gridrow,padx=5, sticky='EW') self.widgets['copyUrlLabel'] = Tkinter.Label(self.widgets['optionsFrame'],text='Copy URL', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['copyUrlLabel'].grid(column=3,row=self.gridrow,padx=5, sticky='EW') self.gridrow += 1 self.widgets['saveserver'] = Tkinter.Button(self.widgets['optionsFrame'],text=u"Save", image=self.images['save'], command=self.OnSaveServerClick, bg=self.colours['buttonbg'], activebackground=self.colours['buttonhighlightbg'], highlightbackground=self.colours['buttonborder']) self.widgets['saveserver'].grid(column=0,row=self.gridrow) self.widgets['regen'] = Tkinter.Button(self.widgets['optionsFrame'],text=u"Regen", image=self.images['process'], command=self.OnRegenSSLClick, bg=self.colours['buttonbg'], activebackground=self.colours['buttonhighlightbg'], highlightbackground=self.colours['buttonborder']) self.widgets['regen'].grid(column=1,row=self.gridrow) self.widgets['show'] = Tkinter.Button(self.widgets['optionsFrame'],text=u"Show", image=self.images['find'], command=self.OnShowUrlClick, bg=self.colours['buttonbg'], activebackground=self.colours['buttonhighlightbg'], highlightbackground=self.colours['buttonborder']) self.widgets['show'].grid(column=2,row=self.gridrow) self.widgets['copy'] = Tkinter.Button(self.widgets['optionsFrame'],text=u"Copy", image=self.images['ram'], command=self.OnCopyUrlClick, bg=self.colours['buttonbg'], activebackground=self.colours['buttonhighlightbg'], highlightbackground=self.colours['buttonborder']) self.widgets['copy'].grid(column=3,row=self.gridrow) #=== ACTIONS ===# def OnStartClick(self): """ action - start the RPC service """ self.variables['status'].set('Running') self.rpcserver.start() self.widgets['startbutton'].configure(state='disabled') self.widgets['stopbutton'].configure(state='normal') def OnStopClick(self): """ action - stop the RPC service """ self.variables['status'].set('Stopped') self.rpcserver.stop() self.widgets['startbutton'].configure(state='normal') self.widgets['stopbutton'].configure(state='disabled') def OnToggleAutostartClick(self): """ action - toggle RPC service autostart """ self.autostart = Setting.set('rpc_autostart', self.variables['autostart'].get()) def OnManageRPCClick(self): """ action - display RPC service management page """ if(not self.dm.installRequired()): self.serverManager() else: self.open() self.dm.addManager() def OnSaveServerClick(self): """ action - save server config """ if(self.variables['hostname'].get() != '' and self.variables['port'].get() > 1000 and len(self.variables['username'].get()) > 4 and len(self.variables['password'].get()) > 4): hostname = Setting.set('rpc_server_hostname', self.variables['hostname'].get()) port = Setting.set('rpc_server_port', self.variables['port'].get()) username = Setting.set('rpc_server_username', self.variables['username'].get()) password = Setting.set('rpc_server_password', self.variables['password'].get()) self.notifier.addNotice('RPC server settings saved') else: self.notifier.addNotice('Invalid RPC server settings.', 'warning') def OnGeneratePasswordClick(self): """ action - generates a new password """ self.variables['password'].set(str(uuid.uuid4())) self.notifier.addNotice('New password generated. Click Save to apply it', 'warning') def OnRegenSSLClick(self): """ action - regenerates SSL certificate """ if(self.__validSSLDomain(self.variables['domain'].get())): if(self.__validSSLCompany(self.variables['company'].get())): if(self.__validSSLCountry(self.variables['country'].get())): domain = Setting.set('rpc_server_ssl_domain', self.variables['domain'].get()) company = Setting.set('rpc_server_ssl_company', self.variables['company'].get()) country = Setting.set('rpc_server_ssl_country', self.variables['country'].get()) self.ssl.generateCertificate() self.notifier.addNotice('SSL Certifice regenerated successfully') else: self.notifier.addNotice('Invalid country code','error') else: self.notifier.addNotice('Invalid company name','error') else: self.notifier.addNotice('Invalid domain','error') self.serverManager() def OnShowUrlClick(self): """ action - shows the url based on current configuration """ url = 'https://{0}:{1}@{2}:{3}'.format(Setting.get('rpc_server_username', 'remoteuser'), Setting.get('rpc_server_password', str(uuid.uuid4())), Setting.get('rpc_server_hostname', 'localhost'), Setting.get('rpc_server_port', 9000)) self.widgets['url'].configure(text=url) self.urlshown = self.now() def OnCopyUrlClick(self): """ action - copies the url to clipboard """ url = 'https://{0}:{1}@{2}:{3}'.format(Setting.get('rpc_server_username', 'remoteuser'), Setting.get('rpc_server_password', str(uuid.uuid4())), Setting.get('rpc_server_hostname', 'localhost'), Setting.get('rpc_server_port', 9000)) self.gui.clipboard_clear() self.gui.clipboard_append(url) self.notifier.addNotice('The RPC URL has been copied to clipboard') #=== UTILS ===# def __hideUrl(self): """ util - auto hides the url after 10 seconds """ if(self.urlshown != None): if(self.urlshown <= self.now()-10000): self.widgets['url'].configure(text='Click show or copy') self.urlshown = None self.notifier.addNotice('URL hidden for security purposes') def __validSSLDomain(self, domain): """ util - validate SSL domain @param domain str """ try: assert len(domain) > 4 assert not r"/" in domain return True except: pass return False def __validSSLCompany(self, company): """ util - validate SSL company @param company str """ try: assert len(company) > 4 assert not r"/" in company return True except: pass return False def __validSSLCountry(self, country): """ util - validate SSL company @param country str """ try: assert country != '' assert any(country in s for s in self.ssl.countryCodes()) return True except: pass return False
class TkRPCManager(TkPage): def __init__(self, parent, gui, **options): super(TkRPCManager,self).__init__(parent, gui, **options) self.scheduler = self.gui.scheduler self.now = lambda: int(round(time.time() * 1000)) self.urlshown = None dependencies = [ {'package':'OpenSSL', 'installer': 'apt-get'}, {'package':'python-openssl', 'installer': 'apt-get'} ] self.dm = TkDependencyManager(self.widget, dependencies, 'RPC Manager', self.gui) if(not self.dm.installRequired()): self.ssl = SSLManager() self.scheduler.addTask('rpc_url_watcher', self.__hideUrl, 10) try: self.rpcserver = TkRPCManager.rpcserver except: TkRPCManager.rpcserver = self.rpcserver = self.gui.getClass('SRPC.SRPCServer')(motionScheduler = self.gui.motionScheduler, specification = self.gui.specification, scheduler = self.gui.scheduler) def setup(self): self.gui.menus['rpc'] = Tkinter.Menu(self.gui.menubar, tearoff=0, bg=self.colours['menubg'], fg=self.colours['menufg'], activeforeground=self.colours['menuactivefg'], activebackground=self.colours['menuactivebg']) self.gui.menus['rpc'].add_command(label="Manage Server", command=self.OnManageRPCClick) self.addMenu(label="RPC", menu=self.gui.menus['rpc']) #=== VIEWS ===# def serverManager(self): self.open() self.widgets['frameLabel'] = Tkinter.Label(self.widgets['tframe'],text='RPC Server', bg=self.colours['bg'], fg=self.colours['headingfg'], font=self.fonts['heading']) self.widgets['frameLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.gridrow += 1 self.widgets['serviceLabel'] = Tkinter.Label(self.widgets['tframe'],text='Service', anchor='nw', bg=self.colours['bg'], fg=self.colours['headingfg'], font=self.fonts['heading2']) self.widgets['serviceLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.gridrow += 1 self.variables['status'] = Tkinter.StringVar() self.widgets['statusdata'] = Tkinter.Label(self.widgets['tframe'],textvariable=self.variables['status'], bg=self.colours['bg'], fg=self.colours['fg'], font=self.fonts['heading2']) self.widgets['statusdata'].grid(column=0,row=self.gridrow,sticky='EW') self.widgets['controlframe'] = Tkinter.Frame(self.widgets['tframe'], borderwidth=0, bg = self.colours['bg']) self.widgets['controlframe'].grid(column = 1, row = self.gridrow, padx=20, columnspan=2, sticky = "WENS") self.widgets['startbutton'] = Tkinter.Button(self.widgets['controlframe'],text=u"Start RPC Server", image=self.images['play'], command=self.OnStartClick, bg=self.colours['buttonbg'], activebackground=self.colours['buttonhighlightbg'], highlightbackground=self.colours['buttonborder']) self.widgets['startbutton'].grid(column=1,row=0, padx=10) self.widgets['stopbutton'] = Tkinter.Button(self.widgets['controlframe'],text=u"Stop RPC Server", image=self.images['stop'], command=self.OnStopClick, bg=self.colours['buttonbg'], activebackground=self.colours['buttonhighlightbg'], highlightbackground=self.colours['buttonborder']) self.widgets['stopbutton'].grid(column=2,row=0, padx=10) self.variables['autostart'] = Tkinter.BooleanVar() self.variables['autostart'].set(Setting.get('rpc_autostart', False)) self.widgets['autostartentry'] = Tkinter.Checkbutton(self.widgets['controlframe'], text="Autostart", variable=self.variables['autostart'], command=self.OnToggleAutostartClick, bg=self.colours['inputbg'], fg=self.colours['inputfg'], activebackground=self.colours['activebg'], selectcolor=self.colours['inputbg']) self.widgets['autostartentry'].grid(column=3,row=0, padx=10) if(self.rpcserver.isRunning() == False): self.variables['status'].set('Stopped') self.widgets['startbutton'].configure(state='normal') self.widgets['stopbutton'].configure(state='disabled') else: self.variables['status'].set('Running') self.widgets['startbutton'].configure(state='disabled') self.widgets['stopbutton'].configure(state='normal') self.gridrow += 1 self.widgets['sslLabel'] = Tkinter.Label(self.widgets['tframe'],text='SSL Certificate', anchor='nw', bg=self.colours['bg'], fg=self.colours['headingfg'], font=self.fonts['heading2']) self.widgets['sslLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.gridrow += 1 self.widgets['startdateLabel'] = Tkinter.Label(self.widgets['tframe'],text='Start Date', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['startdateLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.widgets['startdateData'] = Tkinter.Label(self.widgets['tframe'],text=str(self.ssl.start), bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['startdateData'].grid(column=1,row=self.gridrow,sticky='EW') self.widgets['ccframe'] = Tkinter.Frame(self.widgets['tframe'], borderwidth=0, bg = self.colours['bg']) self.widgets['ccframe'].grid(column = 3, row = self.gridrow, padx=20, columnspan=4, rowspan=5, sticky = "WENS") self.widgets['ccLabel'] = Tkinter.Label(self.widgets['ccframe'],text='Valid Country Codes', anchor='nw', bg=self.colours['bg'], fg=self.colours['headingfg']) self.widgets['ccLabel'].grid(column=0,row=0, sticky='EW') self.widgets['ccSubframe'] = Tkinter.Frame(self.widgets['ccframe'], borderwidth=0, bg = self.colours['bg']) self.widgets['ccSubframe'].grid(column = 0, row = 1, sticky = "WENS") r,c = 0,0 cols = 20 for s in self.ssl.countryCodes(): self.widgets['ccLabel'+s] = Tkinter.Label(self.widgets['ccSubframe'],text=s, anchor='nw', bg=self.colours['bg'], fg=self.colours['fg']) self.widgets['ccLabel'+s].grid(column=c,row=r,sticky='EW') #if (c == cols-1): # r += 1 if (c < cols): c = c+1 else: c = 0 r+=1 self.gridrow += 1 self.widgets['enddateLabel'] = Tkinter.Label(self.widgets['tframe'],text='End Date', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['enddateLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.widgets['enddateData'] = Tkinter.Label(self.widgets['tframe'],text=str(self.ssl.end), bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['enddateData'].grid(column=1,row=self.gridrow,sticky='EW') self.gridrow += 1 self.widgets['domainLabel'] = Tkinter.Label(self.widgets['tframe'],text='Domain', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['domainLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.variables['domain'] = Tkinter.StringVar() self.widgets['domainentry'] = Tkinter.Entry(self.widgets['tframe'], textvariable=self.variables['domain'], bg=self.colours['inputbg'], fg=self.colours['inputfg']) self.widgets['domainentry'].grid(column=1,row=self.gridrow,sticky='EW') self.variables['domain'].set(Setting.get('rpc_server_ssl_domain', 'localhost')) self.gridrow += 1 self.widgets['companyLabel'] = Tkinter.Label(self.widgets['tframe'],text='Company', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['companyLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.variables['company'] = Tkinter.StringVar() self.widgets['companyentry'] = Tkinter.Entry(self.widgets['tframe'], textvariable=self.variables['company'], bg=self.colours['inputbg'], fg=self.colours['inputfg']) self.widgets['companyentry'].grid(column=1,row=self.gridrow,sticky='EW') self.variables['company'].set(Setting.get('rpc_server_ssl_company', 'TestCo')) self.gridrow += 1 self.widgets['countryLabel'] = Tkinter.Label(self.widgets['tframe'],text='Country', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['countryLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.variables['country'] = Tkinter.StringVar() self.widgets['countryentry'] = Tkinter.Entry(self.widgets['tframe'], textvariable=self.variables['country'], bg=self.colours['inputbg'], fg=self.colours['inputfg']) self.widgets['countryentry'].grid(column=1,row=self.gridrow,sticky='EW') self.variables['country'].set(Setting.get('rpc_server_ssl_country', 'GB')) self.gridrow += 1 self.widgets['settingsLabel'] = Tkinter.Label(self.widgets['tframe'],text='Settings', anchor='nw', bg=self.colours['bg'], fg=self.colours['headingfg'], font=self.fonts['heading2']) self.widgets['settingsLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.gridrow += 1 self.widgets['hostnameLabel'] = Tkinter.Label(self.widgets['tframe'],text='Hostname', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['hostnameLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.variables['hostname'] = Tkinter.StringVar() self.widgets['hostnameentry'] = Tkinter.Entry(self.widgets['tframe'], textvariable=self.variables['hostname'], bg=self.colours['inputbg'], fg=self.colours['inputfg']) self.widgets['hostnameentry'].grid(column=1,row=self.gridrow,sticky='EW') self.variables['hostname'].set(Setting.get('rpc_server_hostname', 'localhost')) self.widgets['efframe'] = Tkinter.Frame(self.widgets['tframe'], borderwidth=0, bg = self.colours['bg']) self.widgets['efframe'].grid(column = 3, row = self.gridrow, padx=20, columnspan=6, rowspan=4, sticky = "WENS") self.widgets['efLabel'] = Tkinter.Label(self.widgets['efframe'],text='Exposed Functions', anchor='nw', bg=self.colours['bg'], fg=self.colours['headingfg']) self.widgets['efLabel'].grid(column=0,row=0, sticky='EW') self.widgets['efSubframe'] = Tkinter.Frame(self.widgets['efframe'], borderwidth=0, bg = self.colours['bg']) self.widgets['efSubframe'].grid(column = 0, row = 1, sticky = "WENS") r,c = 0,0 cols = 4 for t in self.rpcserver.listMethods(): self.widgets[t+'Label'] = Tkinter.Label(self.widgets['efSubframe'],text=t, bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets[t+'Label'].grid(column=c,row=r, padx=10,sticky='EW') if (c < cols): c = c+1 else: c = 0 r+=1 self.gridrow += 1 self.widgets['portLabel'] = Tkinter.Label(self.widgets['tframe'],text='Port', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['portLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.variables['port'] = Tkinter.IntVar() self.widgets['portentry'] = Tkinter.Entry(self.widgets['tframe'], textvariable=self.variables['port'], bg=self.colours['inputbg'], fg=self.colours['inputfg']) self.widgets['portentry'].grid(column=1,row=self.gridrow,sticky='EW') self.variables['port'].set(Setting.get('rpc_server_port', 9000)) self.gridrow += 1 self.widgets['usernameLabel'] = Tkinter.Label(self.widgets['tframe'],text='Username', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['usernameLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.variables['username'] = Tkinter.StringVar() self.widgets['usernameentry'] = Tkinter.Entry(self.widgets['tframe'], textvariable=self.variables['username'], bg=self.colours['inputbg'], fg=self.colours['inputfg']) self.widgets['usernameentry'].grid(column=1,row=self.gridrow,sticky='EW') self.variables['username'].set(Setting.get('rpc_server_username', 'remoteuser')) self.gridrow += 1 self.widgets['passwordLabel'] = Tkinter.Label(self.widgets['tframe'],text='Password', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['passwordLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.variables['password'] = Tkinter.StringVar() self.widgets['passwordentry'] = Tkinter.Entry(self.widgets['tframe'], textvariable=self.variables['password'], bg=self.colours['inputbg'], fg=self.colours['inputfg']) self.widgets['passwordentry'].grid(column=1,row=self.gridrow,sticky='EW') self.variables['password'].set(Setting.get('rpc_server_password', str(uuid.uuid4()))) self.widgets['genbutton'] = Tkinter.Button(self.widgets['tframe'],text=u"Generate Key", image=self.images['process'], bg=self.colours['buttonbg'], activebackground=self.colours['buttonhighlightbg'], highlightbackground=self.colours['buttonborder'], command=self.OnGeneratePasswordClick) self.widgets['genbutton'].grid(column=2,row=self.gridrow,sticky='EW') self.gridrow += 1 self.widgets['urlLabel'] = Tkinter.Label(self.widgets['tframe'],text='URL', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['urlLabel'].grid(column=0,row=self.gridrow,sticky='EW') self.widgets['url'] = Tkinter.Label(self.widgets['tframe'],text='Click show or copy', anchor=NW, bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['url'].grid(column=1,row=self.gridrow, columnspan=6, sticky='EW') self.gridrow += 1 self.widgets['optionsFrame'] = Tkinter.Frame(self.widgets['tframe'], bg=self.colours['bg']) self.widgets['optionsFrame'].grid(column=0,row=self.gridrow,columnspan=2, sticky='EW') self.gridrow = 0 self.widgets['saveLabel'] = Tkinter.Label(self.widgets['optionsFrame'],text='Save', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['saveLabel'].grid(column=0,row=self.gridrow, padx=5, sticky='EW') self.widgets['regenLabel'] = Tkinter.Label(self.widgets['optionsFrame'],text='Regenerate SSL', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['regenLabel'].grid(column=1,row=self.gridrow,padx=5, sticky='EW') self.widgets['showUrlLabel'] = Tkinter.Label(self.widgets['optionsFrame'],text='Show URL', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['showUrlLabel'].grid(column=2,row=self.gridrow,padx=5, sticky='EW') self.widgets['copyUrlLabel'] = Tkinter.Label(self.widgets['optionsFrame'],text='Copy URL', bg=self.colours['bg'], fg=self.colours['fg'], height=2) self.widgets['copyUrlLabel'].grid(column=3,row=self.gridrow,padx=5, sticky='EW') self.gridrow += 1 self.widgets['saveserver'] = Tkinter.Button(self.widgets['optionsFrame'],text=u"Save", image=self.images['save'], command=self.OnSaveServerClick, bg=self.colours['buttonbg'], activebackground=self.colours['buttonhighlightbg'], highlightbackground=self.colours['buttonborder']) self.widgets['saveserver'].grid(column=0,row=self.gridrow) self.widgets['regen'] = Tkinter.Button(self.widgets['optionsFrame'],text=u"Regen", image=self.images['process'], command=self.OnRegenSSLClick, bg=self.colours['buttonbg'], activebackground=self.colours['buttonhighlightbg'], highlightbackground=self.colours['buttonborder']) self.widgets['regen'].grid(column=1,row=self.gridrow) self.widgets['show'] = Tkinter.Button(self.widgets['optionsFrame'],text=u"Show", image=self.images['find'], command=self.OnShowUrlClick, bg=self.colours['buttonbg'], activebackground=self.colours['buttonhighlightbg'], highlightbackground=self.colours['buttonborder']) self.widgets['show'].grid(column=2,row=self.gridrow) self.widgets['copy'] = Tkinter.Button(self.widgets['optionsFrame'],text=u"Copy", image=self.images['ram'], command=self.OnCopyUrlClick, bg=self.colours['buttonbg'], activebackground=self.colours['buttonhighlightbg'], highlightbackground=self.colours['buttonborder']) self.widgets['copy'].grid(column=3,row=self.gridrow) #=== ACTIONS ===# ##== Service ==## def OnStartClick(self): self.variables['status'].set('Running') self.rpcserver.start() self.widgets['startbutton'].configure(state='disabled') self.widgets['stopbutton'].configure(state='normal') def OnStopClick(self): self.variables['status'].set('Stopped') self.rpcserver.stop() self.widgets['startbutton'].configure(state='normal') self.widgets['stopbutton'].configure(state='disabled') def OnToggleAutostartClick(self): self.autostart = Setting.set('rpc_autostart', self.variables['autostart'].get()) ##== Management ==## def OnManageRPCClick(self): if(not self.dm.installRequired()): self.serverManager() else: self.open() self.dm.addManager() def OnSaveServerClick(self): if(self.variables['hostname'].get() != '' and self.variables['port'].get() > 1000 and len(self.variables['username'].get()) > 4 and len(self.variables['password'].get()) > 4): hostname = Setting.set('rpc_server_hostname', self.variables['hostname'].get()) port = Setting.set('rpc_server_port', self.variables['port'].get()) username = Setting.set('rpc_server_username', self.variables['username'].get()) password = Setting.set('rpc_server_password', self.variables['password'].get()) self.notifier.addNotice('RPC server settings saved') else: self.notifier.addNotice('Invalid RPC server settings.', 'warning') def OnGeneratePasswordClick(self): self.variables['password'].set(str(uuid.uuid4())) self.notifier.addNotice('New password generated. Click Save to apply it', 'warning') def OnRegenSSLClick(self): if(self.__validSSLDomain(self.variables['domain'].get())): if(self.__validSSLCompany(self.variables['company'].get())): if(self.__validSSLCountry(self.variables['country'].get())): domain = Setting.set('rpc_server_ssl_domain', self.variables['domain'].get()) company = Setting.set('rpc_server_ssl_company', self.variables['company'].get()) country = Setting.set('rpc_server_ssl_country', self.variables['country'].get()) self.ssl.generateCertificate() self.notifier.addNotice('SSL Certifice regenerated successfully') else: self.notifier.addNotice('Invalid country code','error') else: self.notifier.addNotice('Invalid company name','error') else: self.notifier.addNotice('Invalid domain','error') self.serverManager() def OnShowUrlClick(self): url = 'https://{0}:{1}@{2}:{3}'.format(Setting.get('rpc_server_username', 'remoteuser'), Setting.get('rpc_server_password', str(uuid.uuid4())), Setting.get('rpc_server_hostname', 'localhost'), Setting.get('rpc_server_port', 9000)) self.widgets['url'].configure(text=url) self.urlshown = self.now() def OnCopyUrlClick(self): url = 'https://{0}:{1}@{2}:{3}'.format(Setting.get('rpc_server_username', 'remoteuser'), Setting.get('rpc_server_password', str(uuid.uuid4())), Setting.get('rpc_server_hostname', 'localhost'), Setting.get('rpc_server_port', 9000)) self.gui.clipboard_clear() self.gui.clipboard_append(url) self.notifier.addNotice('The RPC URL has been copied to clipboard') #=== UTILS ===# def __hideUrl(self): if(self.urlshown != None): if(self.urlshown <= self.now()-10000): self.widgets['url'].configure(text='Click show or copy') self.urlshown = None self.notifier.addNotice('URL hidden for security purposes') def __validSSLDomain(self, domain): try: assert len(domain) > 4 assert not r"/" in domain return True except: pass return False def __validSSLCompany(self, company): try: assert len(company) > 4 assert not r"/" in company return True except: pass return False def __validSSLCountry(self, country): try: assert country != '' assert any(country in s for s in self.ssl.countryCodes()) return True except: pass return False