Merge pull request #167 from ComputerScienceHouse/willnilges/vnc-dev-bugfix

Launch websockify based on config variable, fix more VNC crashes, properly delete keys from Redis using API
This commit is contained in:
Willard Nilges 2022-08-31 23:35:35 -04:00 committed by GitHub
commit 6627457958
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 30 additions and 14 deletions

View file

@ -68,3 +68,10 @@ If you're trying to run this all on a VM without a graphical web browser, you ca
ssh example@dev-server.csh.rit.edu -L 8000:localhost:8000 -L 8001:localhost:8001
```
### Firing off Jobs
To fire off a targets cleanup job, run a curl request:
```
curl -X POST http://localhost:8000/console/cleanup -F 'token={VNC_CLEANUP_TOKEN}'
```

View file

@ -16,10 +16,11 @@ def start_websockify(websockify_path, target_file):
result = subprocess.run(['pgrep', 'websockify'], stdout=subprocess.PIPE)
if not result.stdout:
print("Websockify is stopped. Starting websockify.")
proxstar_port = app.config.get('VNC_PORT')
subprocess.call(
[
websockify_path,
'8081',
proxstar_port,
'--token-plugin',
'TokenFile',
'--token-source',

View file

@ -254,10 +254,13 @@ def vm_power(vmid, action):
vm = VM(vmid)
vnc_token_key = f'vnc_token|{vmid}'
# For deleting the token from redis later
vnc_token = None
try:
vnc_token = redis_conn.get(vnc_token_key).decode('utf-8')
except AttributeError as e:
print(f'Error: Could not get vnc_token:{e}')
print(
f'Warning: Could not get vnc_token during {action}:{e}. {action} is still being performed.'
)
if action == 'start':
vmconfig = vm.config
usage_check = user.check_usage(vmconfig['cores'], vmconfig['memory'], 0)
@ -266,18 +269,21 @@ def vm_power(vmid, action):
vm.start()
elif action == 'stop':
vm.stop()
delete_vnc_target(token=vnc_token)
redis_conn.delete(vnc_token_key)
if vnc_token is not None:
delete_vnc_target(token=vnc_token)
redis_conn.delete(vnc_token_key)
elif action == 'shutdown':
vm.shutdown()
delete_vnc_target(token=vnc_token)
redis_conn.delete(vnc_token_key)
if vnc_token is not None:
delete_vnc_target(token=vnc_token)
redis_conn.delete(vnc_token_key)
elif action == 'reset':
vm.reset()
elif action == 'suspend':
vm.suspend()
delete_vnc_target(token=vnc_token)
redis_conn.delete(vnc_token_key)
if vnc_token is not None:
delete_vnc_target(token=vnc_token)
redis_conn.delete(vnc_token_key)
elif action == 'resume':
vm.resume()
return '', 200
@ -592,7 +598,14 @@ def cleanup_vnc():
print('Cleaning up targets file...')
with open(app.config['WEBSOCKIFY_TARGET_FILE'], 'w') as targets:
targets.truncate()
return '', 200
print('Clearing vnc tokens from Redis...')
count = 0
ns_keys = 'vnc_token*'
for key in redis_conn.scan_iter(ns_keys):
redis_conn.delete(key)
count += 1
print(f'Deleted {count} key(s).')
return '', 200
print('Got bad cleanup request')
return '', 403

View file

@ -243,12 +243,7 @@ def cleanup_vnc_task():
ones every couple of minutes
https://github.com/ComputerScienceHouse/proxstar/issues/153
"""
print('Clearing vnc targets')
with open(app.config['WEBSOCKIFY_TARGET_FILE'], 'w') as targets:
targets.truncate()
# FIXME (willnilges): This... might be working...?
try:
requests.post(
'https://{}/console/cleanup'.format(app.config['SERVER_NAME']),