From f161129b9d00284428330b159cf4c38238ba3f23 Mon Sep 17 00:00:00 2001 From: completion Date: Wed, 9 Mar 2022 15:11:26 -0900 Subject: [PATCH 1/6] typo? G.cmd -> G.vvcmd --- vdiclient.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vdiclient.py b/vdiclient.py index 9672070..995d363 100644 --- a/vdiclient.py +++ b/vdiclient.py @@ -210,7 +210,7 @@ def vmaction(vmnode, vmid, vmtype): confignode.write(inifile) inifile.seek(0) inistring = inifile.read() - pcmd = [G.cmd] + pcmd = [G.vvcmd] if G.kiosk: pcmd.append('--kiosk') pcmd.append('--kiosk-quit') From f048505000e1f7440da43da2aed5adbea2bfd8c7 Mon Sep 17 00:00:00 2001 From: completion Date: Wed, 9 Mar 2022 15:14:16 -0900 Subject: [PATCH 2/6] add ability to use API tokens --- vdiclient.ini.example | 6 ++++++ vdiclient.py | 20 ++++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/vdiclient.ini.example b/vdiclient.ini.example index caf1151..bf9ac0d 100644 --- a/vdiclient.ini.example +++ b/vdiclient.ini.example @@ -17,6 +17,12 @@ auth_backend = pve auth_totp = false # If disabled, TLS certificate will not be checked tls_verify = false +# User name +#user = user +# API Token Name +#token_name = dvi +#API Token Value +#token_value = xxx-x-x-x-xxx [Hosts] # Hosts are entered as `IP/FQDN = Port` diff --git a/vdiclient.py b/vdiclient.py index 995d363..ddb672f 100644 --- a/vdiclient.py +++ b/vdiclient.py @@ -19,6 +19,9 @@ class G: ######### title = 'VDI Login' backend = 'pve' + user = None + token_name = None + token_value = None totp = False imagefile = None kiosk = False @@ -85,6 +88,12 @@ def loadconfig(config_location = None): G.totp = config['Authentication'].getboolean('auth_totp') if 'tls_verify' in config['Authentication']: G.verify_ssl = config['Authentication'].getboolean('tls_verify') + if 'user' in config['Authentication']: + G.user = config['Authentication']['user'] + if 'token_name' in config['Authentication']: + G.token_name = config['Authentication']['token_name'] + if 'token_value' in config['Authentication']: + G.token_value = config['Authentication']['token_value'] if not 'Hosts' in config: win_popup_button(f'Unable to read supplied configuration:\nNo `Hosts` section defined!', 'OK') return False @@ -148,9 +157,10 @@ def setvmlayout(vms): layout.append([sg.Text(G.title, size =(30, 1), justification='c', font=["Helvetica", 18])]) layout.append([sg.Text('Please select a desktop instance to connect to', size =(40, 1), justification='c', font=["Helvetica", 10])]) for vm in vms: - connkeyname = f'-CONN|{vm["vmid"]}-' - layout.append([sg.Text(vm['name'], font=["Helvetica", 14]), sg.Button('Connect', font=["Helvetica", 14], key=connkeyname)]) - layout.append([sg.HorizontalSeparator()]) + if not vm["status"] == "unknown": + connkeyname = f'-CONN|{vm["vmid"]}-' + layout.append([sg.Text(vm['name'], font=["Helvetica", 14]), sg.Button('Connect', font=["Helvetica", 14], key=connkeyname)]) + layout.append([sg.HorizontalSeparator()]) layout.append([sg.Button('Logout', font=["Helvetica", 14])]) return layout @@ -264,7 +274,9 @@ def pveauth(username, passwd, totp): authenticated = False if not connected and not authenticated: try: - if totp: + if G.token_name and G.token_value: + G.proxmox = proxmoxer.ProxmoxAPI(host, user=f'{username}@{G.backend}',token_name=G.token_name,token_value=G.token_value, verify_ssl=G.verify_ssl, port=port) + elif totp: G.proxmox = proxmoxer.ProxmoxAPI(host, user=f'{username}@{G.backend}', otp=totp, password=passwd, verify_ssl=G.verify_ssl, port=port) else: G.proxmox = proxmoxer.ProxmoxAPI(host, user=f'{username}@{G.backend}', password=passwd, verify_ssl=G.verify_ssl, port=port) From 8ff500257986c6b9eba4f2cb48ab06d72bbec7f9 Mon Sep 17 00:00:00 2001 From: completion Date: Wed, 9 Mar 2022 15:31:52 -0900 Subject: [PATCH 3/6] fill user from config --- vdiclient.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vdiclient.py b/vdiclient.py index ddb672f..ee0ffec 100644 --- a/vdiclient.py +++ b/vdiclient.py @@ -132,7 +132,7 @@ def setmainlayout(): layout.append([sg.Image(G.imagefile), sg.Text(G.title, size =(18, 1), justification='c', font=["Helvetica", 18])]) else: layout.append([sg.Text(G.title, size =(30, 1), justification='c', font=["Helvetica", 18])]) - layout.append([sg.Text("Username", size =(12, 1), font=["Helvetica", 12]), sg.InputText(key='-username-', font=["Helvetica", 12])]) + layout.append([sg.Text("Username", size =(12, 1), font=["Helvetica", 12]), sg.InputText(default_text=G.user,key='-username-', font=["Helvetica", 12])]) layout.append([sg.Text("Password", size =(12, 1),font=["Helvetica", 12]), sg.InputText(key='-password-', password_char='*', font=["Helvetica", 12])]) if G.totp: From cf3f8e2cc2b5dfb9262a8cfd54d70aeec8dd857c Mon Sep 17 00:00:00 2001 From: completion Date: Wed, 9 Mar 2022 16:14:47 -0900 Subject: [PATCH 4/6] only fill if user is defined --- vdiclient.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/vdiclient.py b/vdiclient.py index ee0ffec..09eaf1d 100644 --- a/vdiclient.py +++ b/vdiclient.py @@ -132,7 +132,10 @@ def setmainlayout(): layout.append([sg.Image(G.imagefile), sg.Text(G.title, size =(18, 1), justification='c', font=["Helvetica", 18])]) else: layout.append([sg.Text(G.title, size =(30, 1), justification='c', font=["Helvetica", 18])]) - layout.append([sg.Text("Username", size =(12, 1), font=["Helvetica", 12]), sg.InputText(default_text=G.user,key='-username-', font=["Helvetica", 12])]) + if G.user: + layout.append([sg.Text("Username", size =(12, 1), font=["Helvetica", 12]), sg.InputText(default_text=G.user,key='-username-', font=["Helvetica", 12])]) + else: + layout.append([sg.Text("Username", size =(12, 1), font=["Helvetica", 12]), sg.InputText(key='-username-', font=["Helvetica", 12])]) layout.append([sg.Text("Password", size =(12, 1),font=["Helvetica", 12]), sg.InputText(key='-password-', password_char='*', font=["Helvetica", 12])]) if G.totp: @@ -146,7 +149,8 @@ def setmainlayout(): def getvms(): vms = [] for vm in G.proxmox.cluster.resources.get(type='vm'): - vms.append(vm) + if vm['type'] == "qemu": + vms.append(vm) return vms def setvmlayout(vms): From ce137819ab2af5f909f6336466b5864e62f370ae Mon Sep 17 00:00:00 2001 From: completion Date: Wed, 9 Mar 2022 16:20:42 -0900 Subject: [PATCH 5/6] default fill blank user instead --- vdiclient.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/vdiclient.py b/vdiclient.py index 09eaf1d..a89c13c 100644 --- a/vdiclient.py +++ b/vdiclient.py @@ -19,7 +19,7 @@ class G: ######### title = 'VDI Login' backend = 'pve' - user = None + user = "" token_name = None token_value = None totp = False @@ -132,10 +132,7 @@ def setmainlayout(): layout.append([sg.Image(G.imagefile), sg.Text(G.title, size =(18, 1), justification='c', font=["Helvetica", 18])]) else: layout.append([sg.Text(G.title, size =(30, 1), justification='c', font=["Helvetica", 18])]) - if G.user: - layout.append([sg.Text("Username", size =(12, 1), font=["Helvetica", 12]), sg.InputText(default_text=G.user,key='-username-', font=["Helvetica", 12])]) - else: - layout.append([sg.Text("Username", size =(12, 1), font=["Helvetica", 12]), sg.InputText(key='-username-', font=["Helvetica", 12])]) + layout.append([sg.Text("Username", size =(12, 1), font=["Helvetica", 12]), sg.InputText(default_text=G.user,key='-username-', font=["Helvetica", 12])]) layout.append([sg.Text("Password", size =(12, 1),font=["Helvetica", 12]), sg.InputText(key='-password-', password_char='*', font=["Helvetica", 12])]) if G.totp: From c3a5233b8789a76789563f06d647dbd68e6e8f04 Mon Sep 17 00:00:00 2001 From: completion Date: Wed, 9 Mar 2022 16:29:00 -0900 Subject: [PATCH 6/6] remove list length hack --- vdiclient.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/vdiclient.py b/vdiclient.py index a89c13c..7bf623d 100644 --- a/vdiclient.py +++ b/vdiclient.py @@ -146,8 +146,7 @@ def setmainlayout(): def getvms(): vms = [] for vm in G.proxmox.cluster.resources.get(type='vm'): - if vm['type'] == "qemu": - vms.append(vm) + vms.append(vm) return vms def setvmlayout(vms):