(state,msg) = gemini_util.LAMP_sendmanifest(SLICEURN,my_manager["manifest"],my_manager["LAMPCERT"],SLICECRED_FOR_LAMP,LOGFILE,debug) if( not state): msg = msg +"\nFailed to send manifest to UNIS\n" gemini_util.write_to_log(LOGFILE,msg,gemini_util.printtoscreen,debug) sys.exit(1) else: gemini_util.write_to_log(LOGFILE,msg,gemini_util.printtoscreen,debug) # Repeat the loop for each CM # Create all required directories for the INSTOOLS Code if needed. # Do all instrumentation stuff here. # and intrument. dp_username = "******" dp_passwd = gemini_util.random_password() m = hashlib.sha1(PassPhraseCB(1)) password = m.hexdigest() crypt_passwd = gemini_util.generate_crypt_passwd(password,LOGFILE,debug) for my_manager in managers_to_monitor: # Check if GN Node startup scripts have completed # If its not yet started, it will do that too. (status,msg) = gemini_util.lock_unlock_MC(my_manager["GN_sliver_urn"],"lock",username,LOGFILE,keyfile,debug) if(not status): msg = msg + "Configuring next AM \n" gemini_util.write_to_log(LOGFILE,msg,gemini_util.printtoscreen,debug)
SLICECRED_FOR_LAMP, LOGFILE, debug) if (not state): msg = msg + "\nFailed to send manifest to UNIS\n" gemini_util.write_to_log(LOGFILE, msg, gemini_util.printtoscreen, debug) sys.exit(1) else: gemini_util.write_to_log(LOGFILE, msg, gemini_util.printtoscreen, debug) # Repeat the loop for each CM # Create all required directories for the INSTOOLS Code if needed. # Do all instrumentation stuff here. # and intrument. dp_username = "******" dp_passwd = gemini_util.random_password() m = hashlib.sha1(PassPhraseCB(1)) password = m.hexdigest() crypt_passwd = gemini_util.generate_crypt_passwd(password, LOGFILE, debug) for my_manager in managers_to_monitor: # Check if GN Node startup scripts have completed # If its not yet started, it will do that too. (status, msg) = gemini_util.lock_unlock_MC(my_manager["GN_sliver_urn"], "lock", username, LOGFILE, keyfile, debug) if (not status): msg = msg + "Configuring next AM \n" gemini_util.write_to_log(LOGFILE, msg, gemini_util.printtoscreen, debug)
def main(argv=None): ############################################# # MAIN PROCESS ############################################# other_details = "" managers = [] GN_Nodes = [] MP_Nodes = [] keyfile = "" force_refresh = False FILE = '' AMURNS = '' CERTIFICATE_string = None parser = argparse.ArgumentParser( description= 'Print Experiment state summary for GeniDesktop in JSON Format') parser.add_argument('-d', '--debug', action='store_true', help='Be Verbose') parser.add_argument( '--devel', action='store_true', help= 'Use Development version of GEMINI repository code [only for GEMINI developers]' ) parser.add_argument( '--force_refresh', action='store_true', help= 'Force fetch all user/slice/sliver info rather than using locally cached version' ) parser.add_argument('-n', '--sliceurn', help='Slice URN of the Slice', required=True) parser.add_argument( '-a', '--amurns', help= 'Comma seperated list of AM URNs where the user has slivers for this slice' ) parser.add_argument('-k', '--pkey', help='Your private SSH RSA Key file') parser.add_argument('-s', '--speaksforcred', help='Read Speaks for credential from file') args = parser.parse_args() LOGFILE = None if (args.debug): gemini_util.debug = True if (args.devel): gemini_util.version = gemini_util.devel_version gemini_util.INSTOOLS_repo_url = gemini_util.mc_repo_rooturl + "GEMINI/" + gemini_util.version + "/" if (args.force_refresh): force_refresh = True if (args.amurns): result = gemini_util.isValidAMURNs(args.amurns) if (result): AMURNS = args.amurns else: print "Invalid AM URNS Provided" parser.print_help() sys.exit(1) if (args.speaksforcred): print "Using Speaks for Credentials from the GeniDesktop" speaks_for_cred_file = args.speaksforcred #get Cert from this credential try: cf = open(speaks_for_cred_file, 'r') except: msg = "Error opening Speaks for Credential File" gemini_util.write_to_log(msg, gemini_util.printtoscreen) sys.exit(1) CERTIFICATE_string = gemini_util.getCertFromCredfile( speaks_for_cred_file) if (CERTIFICATE_string == ''): msg = "Missing Certificate in the Speaks for Credential" gemini_util.write_to_log(msg, gemini_util.printtoscreen) sys.exit(1) gemini_util.SLICEURN = args.sliceurn if (not gemini_util.isValidURN(gemini_util.SLICEURN, 'slice')): print "Not a valid SliceURN" parser.print_help() sys.exit(1) mylogbase = gemini_util.getLOGBASE(gemini_util.SLICEURN) LOCALTIME = time.strftime("%Y%m%dT%H:%M:%S", time.localtime(time.time())) LOGFILE = mylogbase + "/" + os.path.basename( __file__) + "-" + LOCALTIME + ".log" gemini_util.ensure_dir(LOGFILE) gemini_util.openLogPIPE(LOGFILE) if (args.pkey): if ((args.pkey).startswith('~')): keyfile = (args.pkey).replace('~', expanduser("~"), 1) else: keyfile = args.pkey if (not (keyfile != '' and os.path.isfile(keyfile))): print "Please provide a valid private key file" parser.print_help() sys.exit(1) else: SSH_pkey = gemini_util.getPkey(keyfile, "SSH key") if (LOGFILE is None): print "Please provide a slicename" parser.print_help() sys.exit(1) (CERT_ISSUER, username) = gemini_util.getCert_issuer_n_username(CERTIFICATE_string) pKey = SSH_pkey (UserInfo, Slices, Nodes) = gemini_util.getMyExpInfo(CERT_ISSUER, username, cf.read(), force_refresh, AMURNS) cf.close() username = UserInfo['uid'] email_id = UserInfo['email'] USERURN = UserInfo['userurn'] user_crypt = UserInfo['user_crypt'] framework = UserInfo['framework'] for SliceInfo in Slices: if (gemini_util.SLICEURN == SliceInfo['sliceurn']): found = True break if (not found): msg = "Slice : " + gemini_util.SLICEURN + ' does not exists' gemini_util.write_to_log(msg, gemini_util.printtoscreen) sys.exit(1) msg = "Found Slice Info for " + gemini_util.SLICEURN gemini_util.write_to_log(msg, gemini_util.printtoscreen) slice_crypt = SliceInfo['crypt'] if (isinstance(Nodes, basestring)): msg = Nodes + ": No Manifest Available for : " + SliceInfo['sliceurn'] gemini_util.write_to_log(msg, gemini_util.printtoscreen) sys.exit(1) for Node in Nodes: nodeid = Node['nodeid'] hostname = Node['hostname'] ismc = Node['ismc'] login_hostname = Node['login_hostname'] if (Node['login_username'] != username): msg = "Login Username obtained from manifest is " + Node[ 'login_username'] + " for node " + nodeid + ". Will change it to " + username + " for GEMINI Instrumentation setup" gemini_util.write_to_log(msg, gemini_util.printtoscreen) Node['login_username'] = username login_username = Node['login_username'] other_members = Node['additional_users'] login_port = Node['login_port'] mchostname = Node['mchostname'] cmurn = Node['cmurn'] gemini_node_type = Node['gemini_node_type'] sliver_id = Node['sliver_id'] if (gemini_node_type == 'global_node'): GN_Nodes.append(Node) elif (gemini_node_type == 'mp_node'): MP_Nodes.append(Node) if (Node['cmurn'] not in managers): managers.append(Node['cmurn']) msg = "*****************************\n"+\ "NodeID => "+nodeid+"\n"+ \ "Hostname =>" +hostname+"\n"+ \ "isMC => "+ismc+"\n"+ \ "Hostname to login => "+login_hostname+"\n"+ \ "Username to login with => "+login_username+"\n"+ \ "SSH port to use for Login => "+login_port+"\n"+ \ "Other members on this Node => "+' , '.join(other_members)+"\n"+ \ "Sliver_id => "+sliver_id+"\n"+ \ "Its CMURN => "+cmurn+"\n"+ \ "Gemini Node Type => "+gemini_node_type+"\n"+ \ "MC Hostname => "+mchostname+"\n"+"**********************" gemini_util.write_to_log(msg, gemini_util.dontprinttoscreen) msg = "***********************************\n"+\ "You have "+str(len(MP_Nodes))+" MP Nodes and "+str(len(GN_Nodes))+" GN Nodes\n"+\ "***********************************\n" gemini_util.write_to_log(msg, gemini_util.printtoscreen) if (len(GN_Nodes) == 0): msg = "No GN Nodes Present. Will not proceed" gemini_util.write_to_log(msg, gemini_util.printtoscreen) sys.exit(1) dpadmin_username = "******" dpadmin_passwd = gemini_util.random_password() m = hashlib.sha1(slice_crypt) user_password_for_drupal = m.hexdigest() proclist = [] for my_manager in managers: msg = "Starting initialization process for Nodes at [" + my_manager + "] " gemini_util.write_to_log(msg, gemini_util.printtoscreen) pruned_GN_Nodes = gemini_util.pruneNodes(GN_Nodes, my_manager, 'GN') if (len(pruned_GN_Nodes) == 0): msg = "No GN Nodes Present that monitor MP Nodes at AM = " + my_manager + " . Continuing with the next AM if available" gemini_util.write_to_log(msg, gemini_util.printtoscreen) continue if (len(pruned_GN_Nodes) > 1): msg = "Multiple GN Nodes Present that monitor this AM = " + my_manager + " . This is not supported yet" gemini_util.write_to_log(msg, gemini_util.printtoscreen) sys.exit(1) pruned_MP_Nodes = gemini_util.pruneNodes(MP_Nodes, my_manager, '') p = multiprocessing.Process(target=InitProcess, args=( my_manager, pruned_GN_Nodes, pruned_MP_Nodes, USERURN, email_id, user_password_for_drupal, gemini_util.SLICEURN, dpadmin_username, dpadmin_passwd, slice_crypt, pKey, )) proclist.append(p) p.start() while (True): pending_proclist = [] for i in proclist: if (i.exitcode is None): pending_proclist.append(i) continue elif (i.exitcode != 0): sys.exit(i.exitcode) else: continue if not pending_proclist: break else: proclist = pending_proclist time.sleep(5) pass gemini_util.closeLogPIPE(LOGFILE)
def main(argv=None): ############################################# # MAIN PROCESS ############################################# other_details = "" managers = [] GN_Nodes = [] MP_Nodes = [] keyfile = "" force_refresh = False FILE = '' AMURNS = '' parser = argparse.ArgumentParser(description='Print Experiment state summary for GeniDesktop in JSON Format') parser.add_argument('-d','--debug',action='store_true',help='Be Verbose') parser.add_argument('--devel',action='store_true',help='Use Development version of GEMINI repository code [only for GEMINI developers]') parser.add_argument('--force_refresh',action='store_true',help='Force fetch all user/slice/sliver info rather than using locally cached version') parser.add_argument('-n','--sliceurn',help='Slice URN of the Slice',required=True) parser.add_argument('-a','--amurns',help='Comma seperated list of AM URNs where the user has slivers for this slice') parser.add_argument('-k','--pkey',help='Your private SSH RSA Key file') parser.add_argument('-f','--certificate',help='Read SSL certificate from file',required=True) parser.add_argument('-p','--passphrase',help='Read passphrase for certificate from file') args = parser.parse_args() LOGFILE = None if (args.debug): gemini_util.debug = True if (args.devel): gemini_util.version = gemini_util.devel_version gemini_util.INSTOOLS_repo_url = gemini_util.mc_repo_rooturl+"GEMINI/"+gemini_util.version+"/" if (args.force_refresh): force_refresh = True if (args.amurns): result = gemini_util.isValidAMURNs(args.amurns) if(result): AMURNS = args.amurns else: print "Invalid AM URNS Provided" parser.print_help() sys.exit(1) if(args.certificate): if ((args.certificate).startswith('~')): gemini_util.CERTIFICATE = (args.certificate).replace('~',expanduser("~"),1) else: gemini_util.CERTIFICATE = args.certificate gemini_util.SLICEURN = args.sliceurn if (not gemini_util.isValidURN(gemini_util.SLICEURN,'slice')): print "Not a valid SliceURN" parser.print_help() sys.exit(1) mylogbase = gemini_util.getLOGBASE(gemini_util.SLICEURN) LOCALTIME = time.strftime("%Y%m%dT%H:%M:%S",time.localtime(time.time())) LOGFILE = mylogbase+"/"+os.path.basename(__file__)+"-"+LOCALTIME+".log" gemini_util.ensure_dir(LOGFILE) gemini_util.openLogPIPE(LOGFILE) if (args.passphrase): if((args.passphrase).startswith('~')): gemini_util.PASSPHRASEFILE = (args.passphrase).replace('~',expanduser("~"),1) else: gemini_util.PASSPHRASEFILE = args.passphrase if (args.pkey): if((args.pkey).startswith('~')): keyfile = (args.pkey).replace('~',expanduser("~"),1) else: keyfile = args.pkey if(not (keyfile != '' and os.path.isfile(keyfile))): print "Please provide a valid private key file" parser.print_help() sys.exit(1) else: SSH_pkey = gemini_util.getPkey(keyfile,"SSH key") if (LOGFILE is None): print "Please provide a slicename" parser.print_help() sys.exit(1) try: cf = open(gemini_util.CERTIFICATE,'r') except: msg = "Error opening Certificate" gemini_util.write_to_log(msg,gemini_util.printtoscreen) sys.exit(1) # Check if passphrase provided is valid # If passphrase is not provided prompt for it. CERT_pkey = gemini_util.getPkey(gemini_util.CERTIFICATE,"certificate") (CERT_ISSUER,username) = gemini_util.getCert_issuer_n_username() if(not (keyfile != '' and os.path.isfile(keyfile))): pKey = CERT_pkey else: pKey = SSH_pkey (UserInfo,Slices,Nodes) = gemini_util.getMyExpInfo(CERT_ISSUER,username,cf.read(),force_refresh,AMURNS) cf.close() username = UserInfo['uid'] email_id = UserInfo['email'] USERURN = UserInfo['userurn'] user_crypt = UserInfo['user_crypt'] framework = UserInfo['framework'] for SliceInfo in Slices: if (gemini_util.SLICEURN == SliceInfo['sliceurn']): found = True break if(not found): msg = "Slice : "+gemini_util.SLICEURN+' does not exists' gemini_util.write_to_log(msg,gemini_util.printtoscreen) sys.exit(1) msg = "Found Slice Info for "+gemini_util.SLICEURN gemini_util.write_to_log(msg,gemini_util.printtoscreen) slice_crypt = SliceInfo['crypt'] if(isinstance(Nodes, basestring)): msg = Nodes+": No Manifest Available for : "+ SliceInfo['sliceurn'] gemini_util.write_to_log(msg,gemini_util.printtoscreen) sys.exit(1) for Node in Nodes: nodeid = Node['nodeid'] hostname = Node['hostname'] ismc = Node['ismc'] login_hostname = Node['login_hostname'] if( Node['login_username'] != username): msg = "Login Username obtained from manifest is "+Node['login_username']+ " for node "+nodeid+". Will change it to "+username+" for GEMINI Instrumentation setup" gemini_util.write_to_log(msg,gemini_util.printtoscreen) Node['login_username'] = username login_username = Node['login_username'] other_members = Node['additional_users'] login_port = Node['login_port'] mchostname = Node['mchostname'] cmurn = Node['cmurn'] gemini_node_type = Node['gemini_node_type'] sliver_id = Node['sliver_id'] if(gemini_node_type == 'global_node'): GN_Nodes.append(Node) elif(gemini_node_type == 'mp_node'): MP_Nodes.append(Node) if(Node['cmurn'] not in managers): managers.append(Node['cmurn']) msg = "*****************************\n"+\ "NodeID => "+nodeid+"\n"+ \ "Hostname =>" +hostname+"\n"+ \ "isMC => "+ismc+"\n"+ \ "Hostname to login => "+login_hostname+"\n"+ \ "Username to login with => "+login_username+"\n"+ \ "SSH port to use for Login => "+login_port+"\n"+ \ "Other members on this Node => "+' , '.join(other_members)+"\n"+ \ "Sliver_id => "+sliver_id+"\n"+ \ "Its CMURN => "+cmurn+"\n"+ \ "Gemini Node Type => "+gemini_node_type+"\n"+ \ "MC Hostname => "+mchostname+"\n"+"**********************" gemini_util.write_to_log(msg,gemini_util.dontprinttoscreen) msg = "***********************************\n"+\ "You have "+str(len(MP_Nodes))+" MP Nodes and "+str(len(GN_Nodes))+" GN Nodes\n"+\ "***********************************\n" gemini_util.write_to_log(msg,gemini_util.printtoscreen) if (len(GN_Nodes) == 0): msg = "No GN Nodes Present. Will not proceed" gemini_util.write_to_log(msg,gemini_util.printtoscreen) sys.exit(1) dpadmin_username = "******" dpadmin_passwd = gemini_util.random_password() m = hashlib.sha1(slice_crypt) user_password_for_drupal = m.hexdigest() proclist = [] for my_manager in managers: msg = "Starting initialization process for Nodes at ["+my_manager+"] " gemini_util.write_to_log(msg,gemini_util.printtoscreen) pruned_GN_Nodes = gemini_util.pruneNodes(GN_Nodes,my_manager,'GN') if (len(pruned_GN_Nodes) == 0): msg = "No GN Nodes Present that monitor MP Nodes at AM = "+my_manager+" . Continuing with the next AM if available" gemini_util.write_to_log(msg,gemini_util.printtoscreen) continue if (len(pruned_GN_Nodes) > 1): msg = "Multiple GN Nodes Present that monitor this AM = "+my_manager+" . This is not supported yet" gemini_util.write_to_log(msg,gemini_util.printtoscreen) sys.exit(1) pruned_MP_Nodes = gemini_util.pruneNodes(MP_Nodes,my_manager,'') p = multiprocessing.Process(target=InitProcess,args=(my_manager,pruned_GN_Nodes,pruned_MP_Nodes,USERURN,email_id,user_password_for_drupal,gemini_util.SLICEURN,dpadmin_username,dpadmin_passwd,slice_crypt,pKey,)) proclist.append(p) p.start() while(True): pending_proclist = [] for i in proclist: if(i.exitcode is None): pending_proclist.append(i) continue elif(i.exitcode != 0): sys.exit(i.exitcode) else: continue if not pending_proclist: break else: proclist = pending_proclist time.sleep(5) pass gemini_util.closeLogPIPE(LOGFILE)