def getCtxId(id, server): ctxdir = None if id is not None: ctxdir = glob.glob('{0}/.kcluster/{1}*'.format(utils.getHome(), id)) elif id is None and server is None: ctxdir = glob.glob('{0}/.kcluster/*'.format(utils.getHome())) if ctxdir is not None: ctxdir = [c for c in ctxdir if os.path.isdir(c)] # filter only dirs if len(ctxdir) != 1: print("ID not unique or not found {0}".format(ctxdir)) exit() else: return os.path.basename(ctxdir[0]) else: return None # id stays None
def apiOperWithLogin(user, servers, id, verb, noun, queryParams, data): resp = doAPIOper(servers, id, verb, noun, queryParams, data) if resp is not None and resp.status_code == 401 and 'NeedLogin' in resp.json( ) and resp.json()['NeedLogin']: #print(json.dumps(resp.json())) cfg = utils.loadYaml("{0}/.{1}/{1}.users.yaml".format( utils.getHome(), "kcluster")) oidclogin.login(cfg[user]['provider'].lower(), "kcluster") # update token & try again cfg = utils.loadYaml("{0}/.{1}/{1}.users.yaml".format( utils.getHome(), "kcluster")) queryParams['id_token'] = cfg[user]['tokens']['id_token'] return doAPIOper(servers, id, verb, noun, queryParams, data) else: return resp
def dumpServers(resp, configLoc): cfgdir = utils.getHome()+"/.{0}".format(configLoc) print("Writing {0} to {1}".format(resp.json(), cfgdir)) utils.mkdir(cfgdir) with open('{0}/servers.yaml'.format(cfgdir), 'w') as fp: yaml.dump(resp.json(), fp) return resp.json()["ClusterID"]
def main(argv): parser = argparse.ArgumentParser( "kubectl.py", description= "Run kubectl commands on cluster, any arguments not parsed here will be passed directly to kubectl" ) parser.add_argument("--id", default=None, help="Context ID of cluster to operate on") parser.add_argument("-u", "--user", default=None) parser.add_argument("-n", "--namespace", default=None) args, remargs = parser.parse_known_args(argv) (args.id, args.user) = getCtx(args.id, args.user, None) # move default config as it may conflict, register to remove moveExistConfig() cfgdir = "{0}/.kcluster/{1}".format(utils.getHome(), args.id) serverInfo = utils.loadYaml("{0}/servers.yaml".format(cfgdir)) servers = serverInfo["Servers"] servers = [ re.sub('(.*):(.*)', '\g<1>:{0}'.format(serverInfo["k8sport"]), s) for s in servers ] (queryParams, _) = argsToQuery(user=args.user) webutils.tryServers( servers, partial(doOper, args.user, args.id, remargs, args.namespace), partial(getServers, queryParams))
def setCtx(id, user): if user is not None and id is not None: with open('{0}/.kcluster/context.yaml'.format(utils.getHome()), 'w') as fp: yaml.dump({'ClusterID': id, 'User': user}, fp) else: print("Unable to determine id or user")
def argsToQuery(user=None, workspec=None, status=None, workcfg=None, workfile=None, origspec=None, workuser=None, dataPut=None): queryParams = {} data = dataPut if user is not None: home = utils.getHome() cfgfile = "{0}/.{1}/{1}.users.yaml".format(home, "kcluster") cfg = utils.loadYaml(cfgfile) queryParams['provider'] = cfg[user]['provider'] queryParams['id_token'] = cfg[user]['tokens']['id_token'] else: # worktoken queryParams['work_token'] = os.environ["KC_WORKTOKEN"] if status is not None: queryParams['status'] = status if workuser is not None: queryParams['workuser'] = workuser if workspec is not None: if data is None: data = {} data.update({ 'spec': workspec, # this work's spec - a map 'origspec': origspec, # original spec without mods - a map 'workfile': workfile # the raw file as string }) if workcfg is not None: data['workcfg'] = workcfg # a map return queryParams, data
def moveExistConfig(): home = utils.getHome() if os.path.exists("{0}/.kube/config".format(home)): tempname = "{0}/.kube/config_temp_{1}".format(home, utils.random_string(16)) os.rename("{0}/.kube/config".format(home), tempname) atexit.register(os.rename, tempname, "{0}/.kube/config".format(home))
def getUser(id, user): if user is None: cfgfile = "{0}/.{1}/{1}.users.yaml".format(utils.getHome(), "kcluster") if not os.path.exists(cfgfile) and id is not None: cfgfile = "{0}/.{1}/{2}/users.yaml".format(utils.getHome(), "kcluster", id) # if id is None: # cfgfile = "{0}/.{1}/{1}.users.yaml".format(utils.getHome(), "kcluster") # else: # cfgfile = "{0}/.{1}/{2}/users.yaml".format(utils.getHome(), "kcluster", id) cfg = utils.loadYaml(cfgfile) if len(list(cfg)) > 1: print("User must be specified - one of {0}".format(list(cfg))) exit() user = list(cfg)[0] return user
def __init__(self, db, sql): Home = getHome() if os.path.exists(sql): cmd_template = Home + """/sqlite3.exe {0} < {1}""" self.cmd = cmd_template.format(db, sql) else: cmd_template = Home + """/sqlite3.exe {0} {1}""" self.cmd = cmd_template.format(db, sql)
def __init__(self,parent=None): super(TimeSheetDialog,self).__init__(parent) self.setupUi(self) self.dateEdit.setDate(datetime.now()) self.dateEdit_2.setDate(datetime.now()) self.connect(self.importSOHOWH_Button,SIGNAL("clicked()"),self.importSOHOWorkHour) self.connect(self.importSHFAWH_Button,SIGNAL("clicked()"),self.importSHFAWorkHour) self.connect(self.importHoliday_Button,SIGNAL("clicked()"),self.importHoliday) self.connect(self.importOuting_Button,SIGNAL("clicked()"),self.importOuting) self.connect(self.importOuting2_Button,SIGNAL("clicked()"),self.importOuting2) self.connect(self.importOT_Button,SIGNAL("clicked()"),self.importOverTime) self.connect(self.calc_Button,SIGNAL("clicked()"),self.calc) if not os.path.isdir(getHome() + "/db/"): os.mkdir(getHome() + "/db/") self.dbname = getHome() + "/db/" + str(time.time()) + ".db"
def __init__(self, parent, title, fName=None, html=None): wx.Frame.__init__(self, parent, -1, title, size=(600, 400)) assert (fName is None or html is None) self.win = wx.html.HtmlWindow(self, -1) if fName is not None: fn = os.path.join(getHome(), fName) self.win.LoadFile(fn) if html is not None: self.win.SetPage(html)
def apiOperWork(verb, noun, queryParams=None, data=None): home = utils.getHome() if queryParams is None: (queryParams, _) = argsToQuery() id = os.environ["KC_CLUSTERID"] if os.path.exists('{0}/.{1}/{2}/servers.yaml'.format(home, "kcluster", id)): servers = None # read from file else: servers = os.environ["KC_APISERVERS"].split( ",") # initial list of servers return doAPIOper(servers, id, verb, noun, queryParams, data)
def getKubeStr(user, id, kubeargstr, namespace, server): cfgdir = "{0}/.kcluster/{1}".format(utils.getHome(), id) base = "{0}/{1}".format(cfgdir, user) if namespace is None: namespace = utils.loadYaml( "{0}/users.yaml".format(cfgdir))[user]['namespace'] cmd = ("kubectl --server={0} --namespace={1} " "--certificate-authority={2}/ca-kube.pem " "--client-certificate={3}-kube.pem " "--client-key={3}-kube-key.pem {4}".format(server, namespace, cfgdir, base, kubeargstr)) #print(cmd) return cmd
def serversWithPort(id, port, http=None): cfgdir = "{0}/.kcluster/{1}".format(utils.getHome(), id) serverInfo = utils.loadYaml("{0}/servers.yaml".format(cfgdir)) servers = serverInfo["Servers"] if http is None: return [ re.sub('(.*):(.*)', '\g<1>:{0}'.format(port), s) for s in servers ] else: return [ re.sub('(.*)://(.*):(.*)', '{0}://\g<2>:{1}'.format(http, port), s) for s in servers ] return servers
def dumpKubeCreds(user, resp, id): cfgdir = utils.getHome() + "/.kcluster/{0}".format(id) print("Writing {0} to {1}".format(resp, cfgdir)) with open('{0}/ca-kube.pem'.format(cfgdir), 'w') as fp: fp.write(resp['CA']) with open('{0}/{1}-kube.pem'.format(cfgdir, user), 'w') as fp: fp.write(resp['Cert']) with open('{0}/{1}-kube-key.pem'.format(cfgdir, user), 'w') as fp: fp.write(resp['Key']) with open('{0}/{1}-kube.config'.format(cfgdir, user), 'w') as fp: # create config file yaml.safe_dump(createKubeConfig(cfgdir, resp), fp) # also merge into kubeconfig if ctxName is None: cname = getKubeServers(cfgdir)[0].split('//')[1].split('.')[0].split( '-infra')[0] else: cname = ctxName uname = cname + '-' + user kcfg = createKubeConfig(cfgdir, resp, clustername=cname, username=uname, contextname=uname) basecfg = utils.getHome() + '/.kube/config' if os.path.exists(basecfg): baseYaml = utils.loadYaml(basecfg) baseYaml['clusters'] = removeDups(baseYaml['clusters'], cname) baseYaml['users'] = removeDups(baseYaml['users'], uname) baseYaml['contexts'] = removeDups(baseYaml['contexts'], uname) newYaml = utils.deepmerge(kcfg, baseYaml) fd, name = tempfile.mkstemp() utils.dumpYaml(newYaml, name) print("merging configuration into {0}".format(basecfg)) shutil.copy(name, basecfg) os.close(fd) os.remove(name)
def doKubeOper(user, id, kubeargs, namespace=None, servers=None): moveExistConfig() if servers is None: cfgdir = "{0}/.kcluster/{1}".format(utils.getHome(), id) serverInfo = utils.loadYaml("{0}/servers.yaml".format(cfgdir)) servers = serverInfo["Servers"] servers = [ re.sub('(.*):(.*)', '\g<1>:{0}'.format(serverInfo["k8sport"]), s) for s in servers ] #print("SERVERS: {0}".format(servers)) doOperFn = lambda server: doOper(user, id, kubeargs, namespace, server, True) out = webutils.tryServers(servers, doOperFn, None) return out.stdout.decode(), out
def getCtx(id, user, server, setcontext=False): ctxFile = '{0}/.kcluster/context.yaml'.format(utils.getHome()) if os.path.exists(ctxFile) and not setcontext: ctx = utils.loadYaml(ctxFile) if id is None: id = ctx['ClusterID'] else: id = getCtxId(id, server) if user is None: user = ctx['User'] else: user = getUser(id, user) else: id = getCtxId(id, server) user = getUser(id, user) return id, user
def OnInit(self): wx.InitAllImageHandlers() # Show a splash screen png = os.path.join(getHome(), "Icons", "splash.png") bmp = wx.Image(png).ConvertToBitmap() wx.adv.SplashScreen( bmp, wx.adv.SPLASH_CENTRE_ON_SCREEN | wx.adv.SPLASH_TIMEOUT, 5000, None, -1) self.frame = Frame(None) self.frame.Show(True) self.frame.Center() self.frame.Raise() self.SetTopWindow(self.frame) return True
def getPlugins(package, baseClass, format, exclude0): """Find plugins of a specified type. Each plugin has a status value that may be 0, 1, or 2. For status=0, the plugin is excluded by default, but will be included if exclude0 is set to False. For Method plugins, status=1 or 2 indicates whether the method appears in the fist tier list or second tier list. For Loader and Report plugins there is only one tier. """ assert (format in ["byName", "classes"]) # Import all modules in package ppath = package.__path__ pname = package.__name__ + "." for importer, modname, ispkg in pkgutil.iter_modules(ppath, pname): module = __import__(modname, fromlist="dummy") # Look for user-installed plugins externalPluginDir = os.path.join(getHome(), "Plugins") if os.path.exists(externalPluginDir): if externalPluginDir not in sys.path: sys.path.append(externalPluginDir) externalPlugins = [ x[:-3] for x in os.listdir(externalPluginDir) if x.endswith(".py") ] for plugin in externalPlugins: __import__(plugin) # Get plugin list from subclasses of baseClass pluginClasses = [] for m in baseClass.__subclasses__(): if exclude0 and m.status == 0: del m else: pluginClasses.append(m) if format == "classes": return pluginClasses elif format == "byName": pluginClass = {} for p in pluginClasses: pluginClass[p.__name__] = p return pluginClass else: assert (0)
def __init__(self, parent): wx.Dialog.__init__(self, parent, -1, "About OpenSTV") sizer = wx.BoxSizer(wx.VERTICAL) fn = os.path.join(getHome(), "Icons", "splash.png") bmp = wx.Image(fn, wx.BITMAP_TYPE_PNG).ConvertToBitmap() bm = wx.StaticBitmap(self, -1, bmp) sizer.Add(bm) button = wx.Button(self, wx.ID_OK, "Close") button.SetDefault() sizer.Add(button, 0, wx.ALIGN_CENTER | wx.ALL, 5) sizer.Fit(self) self.SetAutoLayout(True) self.SetSizer(sizer)
def calc(self): if self.check(): try: self.appendLog("step 1: 创建基础数据") initialDates(self.dbname, self.dateEdit.date().toPyDate(), self.dateEdit_2.date().toPyDate()) self.appendLog("OK") # self.appendLog("step 2: 合并指纹考勤") # executeSQL(self.dbname, getHome() + "/sql/2-合并soho-tongpu.sql") # self.appendLog("OK") # # self.appendLog("step 3: groupby上下班时间") # executeSQL(self.dbname, getHome() + "/sql/3-groupby上下班时间.sql") # self.appendLog("OK") # # self.appendLog("step 4: 制作考勤表") # executeSQL(self.dbname, getHome() + "/sql/4-制作考勤表.sql") # self.appendLog("OK") # # self.appendLog("step 5: 杂项处理") # executeSQL(self.dbname, getHome() + "/sql/5-杂项处理.sql") # self.appendLog("OK") root = getHome() + "/sql/" files = os.listdir(root) files.sort() for i in files: if os.path.isfile(os.path.join(root,i)): self.appendLog("Execute SQL: " + i) executeSQL(self.dbname, os.path.join(root,i)) self.appendLog("OK") self.appendLog("step 6: 导出考勤表(考勤结果.xlsx)") #导出考勤excel表 exportSQLite32Excel(self.dbname, "t_checking_in_all", "考勤结果.xlsx") self.appendLog("OK") except Exception as e: self.appendLog("发生异常,异常消息:" + str(e)) else: self.appendLog("异常退出!")
def doAPIOper(servers, id, verb, noun, queryParams, data): home = utils.getHome() if servers is None: with open('{0}/.{1}/{2}/servers.yaml'.format(home, "kcluster", id)) as fp: servers = yaml.safe_load(fp)["Servers"] elif noun != "servers": resp = doAPIOper(servers, id, "get", "servers", queryParams, data) if resp.status_code != 200: return resp id = resp.json()["ClusterID"] def getWithDebug(req): print("REQ: {0}".format(req)) print("QUERYPARAMS: {0}".format(queryParams)) resp = requests.get(req, params=queryParams, verify=sslVerify) print("RESP: {0}".format(resp)) return resp #print("Verify={0}".format(sslVerify)) if verb == "get": reqFn = lambda req: requests.get( req, params=queryParams, verify=sslVerify) #reqFn=getWithDebug elif verb == "create": reqFn = lambda req: requests.post( req, params=queryParams, json=data, verify=sslVerify) elif verb == "delete": reqFn = lambda req: requests.delete( req, params=queryParams, verify=sslVerify) elif verb == "put": reqFn = lambda req: requests.put( req, params=queryParams, json=data, verify=sslVerify) else: print("Unknown verb {0} - noun {1}".format(verb, noun)) exit() #print("Verb: {0} Noun: {1} Servers: {2} QueryParams: {3} Data: {4}".format(verb, noun, servers, queryParams, data)) resp = webutils.tryHttpServers("{0}".format(noun), servers, reqFn, partial(getServers, queryParams), verify=sslVerify) #if resp is not None: # print(json.dumps(resp.json())) if resp is not None and resp.status_code == 200 and verb == "get": if noun == "user": try: user = resp.json()['User'] info = resp.json()['UserInfo'] utils.merge2Yaml( "{0}/.kcluster/{1}/users.yaml".format(home, id), {user: info}) except Exception: print("Unable to get userinfo from {0}".format(resp.json())) elif noun == "servers": id = resp.json()["ClusterID"] utils.mkdir("{0}/.{1}/{2}".format(home, "kcluster", id)) webutils.dumpServers(resp, "kcluster/{0}".format(id)) elif noun == "kubecred": dumpKubeCreds(resp.json()['user'], resp.json(), id) return resp
def __init__(self, parent, mode): wx.Frame.__init__(self, parent, -1, "Ballot File Editor") warnings.showwarning = self.catchWarnings self.MakeMenu() self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) self.logfName = "" fn = os.path.join(getHome(), "Icons", "blt.ico") icon = wx.Icon(fn, wx.BITMAP_TYPE_ICO) self.SetIcon(icon) # Edit a new ballot file if mode == "new": # Create an empty ballots class instance self.b = Ballots() # Get the candidate names from the user dlg = CandidatesDialog(parent, self.b) dlg.Center() if dlg.ShowModal() != wx.ID_OK: dlg.Destroy() self.Destroy() return dlg.Destroy() # Edit an existing ballot file elif mode == "old": dlg = wx.FileDialog(self, "Edit Ballot File", style=wx.FD_OPEN|wx.FD_CHANGE_DIR) # WM: added FD_ prefixes if dlg.ShowModal() != wx.ID_OK: dlg.Destroy() self.Destroy() return fName = dlg.GetPath() dlg.Destroy() # Open the file try: self.b = Ballots() self.b.loadUnknown(fName) except RuntimeError as msg: wx.MessageBox(str(msg), "Error", wx.OK|wx.ICON_ERROR) self.Destroy() return else: assert(0) # Set the window title to include the filename fn = self.b.getFileName() if fn is not None: title = "%s - Ballot File Editor" % os.path.basename(fn) else: title = "%s - Ballot File Editor" % "New File" self.SetTitle(title) # Create a notebook with an editing page and a log page nb = wx.Notebook(self, -1) self.panel = BallotsPanel(nb, self.b) nb.AddPage(self.panel, "Ballots") self.logN = 1 # counter for display purposes self.log = wx.TextCtrl(nb, -1, style=wx.TE_MULTILINE|wx.TE_READONLY|\ wx.TE_WORDWRAP) # WM: no attribute 'FIXED' so removed self.log.SetMaxLength(0) nb.AddPage(self.log, "Log") # Initialize if mode == "new": self.panel.NeedToSaveBallots = True self.Log("Created a new ballot file.") elif mode == "old": self.panel.NeedToSaveBallots = False self.Log("Loaded %d ballots from file %s." %\ (self.b.numBallots, os.path.basename(self.b.getFileName()))) else: assert(0) # Set up the sizer sizer = wx.BoxSizer() sizer.Add(nb, 1, wx.EXPAND, 0) self.SetSizer(sizer) sizer.Fit(self) sizer.SetSizeHints(self)
check_exsit if __name__ == '__main__': logging.basicConfig(level=logging.DEBUG, format='%(asctime)s [%(levelname)s] %(filename)s[line:%(lineno)d] %(message)s', datefmt='%a, %d %b %Y %H:%M:%S') if check_exsit("fanUpdater.exe") > 1: logging.debug("another fanUpdater.exe exists") os._exit(2) config = getConfig("updater.ini") check_version_service = config.get("default", "check_version_service") fixpack_service = config.get("default", "fixpack_service") APP_HOME = getHome() + "/../" absolute_version_file = APP_HOME + "properties/app.version" absolute_fixpack_file = APP_HOME + urllib.parse.unquote(fixpack_service).split('/')[-1].split("?")[0] TEMP = getHome() + "/TEMP/" while True: version, md5 = checkUpdate(check_version_service, absolute_version_file) if version: root = Tk() root.withdraw() result = askokcancel("fanUpdater", "发现新版本,是否更新?", default=CANCEL) print(result) root.destroy() if result: logging.debug("downloading...")
def decodeOIDCToken(cfgfile, user=None): cfg = utils.loadYaml("{0}/.{1}/{1}.users.yaml".format(utils.getHome(), cfgfile)) if user is None: user = list(cfg)[0] return validateJWTFn[cfg[user]['provider']](cfg[user]['tokens']['id_token'])
def login(provider, cfgfile, useReqs=False): (sessionState, user) = get_code(provider, webutils.oidc[provider], useReqs) configdir = "{0}/.{1}".format(utils.getHome(), cfgfile) pathlib.Path(configdir).mkdir(parents=True, exist_ok=True) utils.updateYaml("{0}/{1}.users.yaml".format(configdir, cfgfile), sessionState) return sessionState, user
def __init__(self, parent): wx.Frame.__init__(self, parent, -1, "OpenSTV", size=(900, 600)) warnings.showwarning = self.catchWarnings # Get method plugins and create dict for easy access plugins = getMethodPlugins("classes") self.methodClasses1 = {} # Methods enabled by default self.methodClasses2 = {} # All methods self.lastMethod = "Scottish STV" for p in plugins: if p.status == 1: self.methodClasses1[p.longMethodName] = p self.methodClasses2[p.longMethodName] = p self.methodClasses = self.methodClasses1 # Methods currently viewable to user self.breakTiesRandomly = False fn = os.path.join(getHome(), "Icons", "pie.ico") self.icon = wx.Icon(fn, wx.BITMAP_TYPE_ICO) self.SetIcon(self.icon) self.lastBallotFile = "" self.electionList = [] self.menuBar = wx.MenuBar() self.MakeMenu() self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) # create a notebook self.notebook = wx.Notebook(self, -1) # create a console window # WM: Removed wx.FIXED from style self.console = wx.TextCtrl(self.notebook, -1, style=wx.TE_MULTILINE|wx.TE_READONLY|\ wx.TE_WORDWRAP|wx.TE_RICH2) self.console.SetMaxLength(0) ps = self.console.GetFont().GetPointSize() font = wx.Font(ps, wx.MODERN, wx.NORMAL, wx.NORMAL) self.console.SetFont(font) # add the console as the first page self.notebook.AddPage(self.console, "Console") self.output = Output(self.notebook) sys.stdout = self.output sys.stderr = self.output self.introText = """\ OpenSTV Copyright 2003-2010 Jeffrey O'Neill GNU General Public License See Help->License for more details. To run an election with an existing ballot file, select "New Election" from the File menu. To create a new ballot file, select "Create New Ballot File" from the File menu. To edit an existing ballot file, select "Edit Ballot File" from the File menu. For more information about the operation of OpenSTV, see the Help menu, go to www.OpenSTV.org, or send an email to [email protected]. """ self.console.AppendText(self.introText)
csvfile = os.path.dirname(file) + "/temp/" + os.path.basename(file).split(".")[0] + ".csv" utils.Excel2CSV(file, csvfile) sql = "\".mode csv\" \".import {0} {1}\"" return createCommand(dbname, sql.format(csvfile, tablename), type="SQLite3_Win32").execute() def executeSQL(dbname, file): return createCommand(dbname, file, type="SQLite3_Win32").execute() def exportSQLite32Excel(dbname, tblname, file): try: db = SqliteDatabase(dbname) sql = "select * from {0}".format(tblname,) result = db.execute_sql(sql) utils.writeExcel(result, file, 6, 2) utils.writeCreateTime(file, 2, 4) except Exception as e: logging.debug(e) finally: db.close() if __name__ == "__main__": logfile = getHome() + "/timesheet.log" logging.basicConfig(level=logging.DEBUG, format='%(asctime)s [%(levelname)s] %(filename)s[line:%(lineno)d] %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename=logfile) app=QApplication(sys.argv) dialog=TimeSheetDialog() dialog.show() app.exec_()
def openFile(self, title): s=QFileDialog.getOpenFileName(self,title,getHome(),"Excel工作簿(*.xlsx)") return s
def getServers(queryParams, server): resp = doAPIOper([server], None, "get", "servers", queryParams, None) id = resp.json()["ClusterID"] utils.mkdir("{0}/.{1}/{2}".format(utils.getHome(), "kcluster", id)) return resp, "kcluster/{0}".format(id)