#!/usr/bin/env python
# vsphere-vmrc --- connect to virtual machine remote console

# Author: Noah Friedman <friedman@splode.com>
# Created: 2018-04-03
# Public domain

# $Id: vsphere-vmrc,v 1.10 2019/03/23 02:39:45 friedman Exp $

# Commentary:
# Code:

from   __future__ import print_function

from   pyVmomi    import vim
import vspherelib     as vsl

import os
import sys
import time

def get_args():
    p = vsl.ArgumentParser( loadrc=True, rest='vmname', required=True )
    p.add_bool( '--uri', help='display URIs instead of launching' )
    p.add( '-d', '--delay', type=int, default=2, help='Keep original session open for DELAY minutes')
    return p.parse()


def spawn(*args):
    pid = os.fork()
    if pid == 0: # child
        os.chdir( os.getenv( 'HOME' ) )
        os.execlp( args[0], *args )
    else:
        return pid


def launch( mks, vmlist, delay ):
    for vm in vmlist:
        uri = mks.uri_vmrc( vm=vm )
        pid = spawn( os.getenv( 'VMRC_PROGRAM', default='vmplayer' ), uri )
    # Background ourselves for a while to keep session tickets active, then exit.
    pid = os.fork()
    if pid == 0:
        time.sleep( 60 * delay )
        sys.exit( 0 )
    else:
        os._exit( 0 )


def display( mks, vmlist, delay ):
    for vm in vmlist:
        print( mks.uri_vmrc( vm=vm ) )
        print( '' )
        print( mks.uri_html( vm=vm ) )
        print( '' )
        if len( vmlist ) > 1:
            print( '\n' )
    while delay > 0:
        # The tickets are only good until session is disconnected.
        print( 'You have {} minutes to connect before ticket expires.'.format( delay ))
        time.sleep( 60 )
        delay -= 1

def main():
    args = get_args()
    vsi  = vsl.vmomiConnect( args )
    mks  = vsi.mks( args )

    vmlist = vsi.find_vm( args.vmname )
    if args.uri:
        display( mks, vmlist, args.delay )
    else:
        launch( mks, vmlist, args.delay )

if __name__ == '__main__':
    main()

# vsphere-vmrc ends here
