From b965f9b75879065a3bc3cefa4ec7c2cb55a15f13 Mon Sep 17 00:00:00 2001 From: Tinashe Date: Fri, 20 Jan 2023 16:41:56 -0500 Subject: [PATCH] nodeconsole windowed and tiled functionality --- confluent_client/bin/nodeconsole | 102 ++++++++++++++++++++++++++++++- 1 file changed, 99 insertions(+), 3 deletions(-) diff --git a/confluent_client/bin/nodeconsole b/confluent_client/bin/nodeconsole index 3b5afa51..d2b09d88 100755 --- a/confluent_client/bin/nodeconsole +++ b/confluent_client/bin/nodeconsole @@ -72,13 +72,36 @@ if options.log: logreader.replay_to_console(logname) sys.exit(0) #added functionality for wcons - if options.windowed: + result=subprocess.Popen(['xwininfo', '-root'], stdout=subprocess.PIPE) + rootinfo=result.communicate()[0] + result.wait() + for line in rootinfo.decode('utf-8').split('\n'): + if 'Width' in line: + screenwidth = int(line.split(':')[1]) + if 'Height' in line: + screenheight = int(line.split(':')[1]) + envstring=os.environ.get('NODECONSOLE_WINDOWED_COMMAND') if not envstring: - envlist=["xterm", "-e"] + sizegeometry='75x30' + envlist=['xterm', '-bg', 'black', '-fg', 'white', '-geometry', '{sizegeometry}+0+0'.format(sizegeometry=sizegeometry), '-e'] else: envlist=os.environ.get('NODECONSOLE_WINDOWED_COMMAND').split(' ') + if envlist[0] == 'xterm': + if '-geometry' in envlist: + g_index = envlist.index('-geometry') + elif '-g' in envlist: + g_index = envlist.index('-g') + else: + g_index = 0 + if g_index: + envlist[g_index+1] = envlist[g_index+1] + '+0+0' + + else: + envlist.insert(1, '-geometry') + envlist.insert(2, '75x30+0+0') + g_index = 1 nodes = [] sess = client.Command() for res in sess.read('/noderange/{0}/nodes/'.format(args[0])): @@ -87,9 +110,82 @@ if options.windowed: sys.stderr.write(res.get('error', repr(res)) + '\n') sys.exit(1) nodes.append(node) + if options.tile and not envlist[0] == 'xterm': + sys.stderr.write('[ERROR] UNSUPPORTED OPTIONS. \nWindowed and tiled consoles are only supported when using xterm \n') + sys.exit(1) + firstnode=nodes[0] + nodes.pop(0) + with open(os.devnull, 'wb') as devnull: + xopen=subprocess.Popen(envlist + [confettypath, '-c', '/tmp/controlpath-{0}'.format(firstnode), '-m', '5', 'start', '/nodes/{0}/console/session'.format(firstnode) ] , stdin=devnull) + time.sleep(2) + s=socket.socket(socket.AF_UNIX) + winid='' + try: + s.connect('/tmp/controlpath-{firstnode}'.format(firstnode=firstnode)) + s.recv(64) + s.send(b'GETWINID') + winid=s.recv(64).decode('utf-8') + except: + time.sleep(2) + # try to get id of first panel/xterm window using name + win=subprocess.Popen(['xwininfo', '-tree', '-root'], stdout=subprocess.PIPE) + wintr=win.communicate()[0] + for line in wintr.decode('utf-8').split('\n'): + if 'console: {firstnode}'.format(firstnode=firstnode) in line or 'confetty' in line: + win_obj = [ele for ele in line.split(' ') if ele.strip()] + winid = win_obj[0] + if winid: + firstnode_window=subprocess.Popen(['xwininfo', '-id', '{winid}'.format(winid=winid)], stdout=subprocess.PIPE) + xinfo=firstnode_window.communicate()[0] + xinfl = xinfo.decode('utf-8').split('\n') + for line in xinfl: + if 'Absolute upper-left X:' in line: + side_pad = int(line.split(':')[1]) + elif 'Absolute upper-left Y:' in line: + top_pad = int(line.split(':')[1]) + elif 'Width:' in line: + window_width = int(line.split(':')[1]) + elif 'Height' in line: + window_height = int(line.split(':')[1]) + elif '-geometry' in line: + l = re.split(' |x|\+', line) + l_nosp = [ele for ele in l if ele.strip()] + wmxo = int(l_nosp[1]) + wmyo = int(l_nosp[2]) + sizegeometry = str(wmxo) + 'x' + str(wmyo) + else: + pass + window_width += side_pad*2 + window_height += side_pad+top_pad + screenwidth -= wmxo + screenheight -= wmyo + currx = window_width + curry = 0 + maxcol = int(screenwidth/window_width) for node in sortutil.natural_sort(nodes): + if options.tile and envlist[0] == 'xterm': + corrected_x = currx + corrected_y = curry + xgeometry = '{0}+{1}+{2}'.format(sizegeometry, corrected_x, corrected_y) + currx += window_width + if currx >= screenwidth: + currx=0 + curry += window_height + if curry > screenheight: + curry =top_pad + if not envstring: + envlist=['xterm','-bg', 'black', '-fg', 'white', '-geometry', '{0}'.format(xgeometry), '-e'] + else: + if g_index: + envlist[g_index+1] = xgeometry + elif envlist[0] == 'xterm': + envlist=['xterm','-bg', 'black', '-fg', 'white', '-geometry', '75x30+{0}+{1}'.format(side_pad, top_pad), '-e'] + side_pad+=side_pad + top_pad+=top_pad + else: + pass with open(os.devnull, 'wb') as devnull: - subprocess.Popen(envlist + [confettypath, '-m', '5', 'start', '/nodes/{0}/console/session'.format(node)], stdin=devnull) + xopen=subprocess.Popen(envlist + [confettypath, '-m', '5', 'start', '/nodes/{0}/console/session'.format(node)] , stdin=devnull) sys.exit(0) #end of wcons if options.tile: