int condor__getPlatformString(struct soap *soap,void *,char* &result) { const char *platform = CondorPlatform(); result = (char *) soap_malloc(soap, strlen(platform) + 1); ASSERT(result); strcpy(result, platform); return SOAP_OK; }
void version() { printf( "%s\n%s\n", CondorVersion(), CondorPlatform() ); exit( 0 ); }
void XferSummary::time_out(time_t now, char *hostaddr) { ClassAd info; char line[128], *tmp; char *str = NULL; info.SetMyTypeName("CkptServer"); info.SetTargetTypeName("CkptFile"); sprintf(line, "%s = \"%s\"", ATTR_NAME, my_full_hostname() ); info.Insert(line); sprintf(line, "%s = \"%s\"", ATTR_MACHINE, hostaddr ); info.Insert(line); sprintf(line, "%s = \"%s\"", ATTR_VERSION, CondorVersion() ); info.Insert(line); sprintf(line, "%s = \"%s\"", ATTR_PLATFORM, CondorPlatform() ); info.Insert(line); sprintf(line, "NumSends = %d", num_sends); info.Insert(line); sprintf(line, "BytesSent = %d", (int) bytes_sent); info.Insert(line); sprintf(line, "TimeSending = %d", time_sending); info.Insert(line); sprintf(line, "AvgSendBandwidth = %f", num_sends ? tot_send_bandwidth / num_sends : 0.0); info.Insert(line); sprintf(line, "NumRecvs = %d", num_recvs); info.Insert(line); sprintf(line, "BytesReceived = %d", (int) bytes_recv); info.Insert(line); sprintf(line, "TimeReceiving = %d", time_recving); info.Insert(line); sprintf(line, "AvgReceiveBandwidth = %f", num_recvs ? tot_recv_bandwidth / num_recvs : 0.0); info.Insert(line); /* ctime adds a newline at the end of the ascii conversion.... */ str = ctime(&start_time); sprintf(line, "CkptServerIntervalStart = \"%s\"", str ? str : "Unknown\n"); tmp = strchr( line, '\n' ); if (tmp != NULL) { /* delete the newline */ *tmp = '\"'; tmp++; *tmp = '\0'; } info.Insert(line); /* ctime adds a newline at the end of the ascii conversion.... */ str = ctime(&now); sprintf(line, "CkptServerIntervalEnd = \"%s\"", str ? str : "Unknown\n"); tmp = strchr( line, '\n' ); if (tmp != NULL) { /* delete the newline */ *tmp = '\"'; tmp++; *tmp = '\0'; } info.Insert(line); sprintf(line, "Disk = %d", sysapi_disk_space(pwd.Value()) ); info.Insert(line); // Send to collector if ( Collectors ) { dprintf(D_NETWORK, "Sending CkptServer ClassAd:\n"); info.dPrint(D_NETWORK); Collectors->sendUpdates (UPDATE_CKPT_SRVR_AD, &info, NULL, true); } init(); }
/*ARGSUSED*/ int main(int argc, char *argv[] ) { char *tmp = NULL; int reserved_swap, free_swap; char *host = NULL, *cluster = NULL, *proc = NULL; char *bogus_capability; int i; set_mySubSystem( "SHADOW", SUBSYSTEM_TYPE_SHADOW ); myDistro->Init( argc, argv ); if( argc == 2 && strncasecmp(argv[1], "-cl", 3) == MATCH ) { printClassAd(); exit( 0 ); } #if defined(SYSCALL_DEBUG) SyscallLabel = argv[0] + 7; #endif #if !defined(WIN32) install_sig_handler(SIGPIPE, (SIG_HANDLER)SIG_IGN ); #endif if( argc > 1 ) { if( strcmp("-t",argv[1]) == MATCH ) { Termlog = 1; argv++; argc--; } } ShadowBDate = LastRestartTime = time(0); _EXCEPT_Cleanup = ExceptCleanup; MyPid = getpid(); config(); /* Start up with condor.condor privileges. */ /* we need to do this AFTER we call config() so that if CONDOR_IDS is being defined in the config file, we'll get the right value */ set_condor_priv(); if(Termlog) dprintf_set_tool_debug(get_mySubSystem()->getName(), 0); else dprintf_config( get_mySubSystem()->getName() ); DebugId = whoami; // create a database connection object dprintf( D_ALWAYS, "******* Standard Shadow starting up *******\n" ); dprintf( D_ALWAYS, "** %s\n", CondorVersion() ); dprintf( D_ALWAYS, "** %s\n", CondorPlatform() ); dprintf( D_ALWAYS, "*******************************************\n" ); reserved_swap = param_integer("RESERVED_SWAP", 0); reserved_swap *= 1024; /* megabytes -> kb */ bool use_sql_log = param_boolean("QUILL_USE_SQL_LOG", false); FILEObj = FILESQL::createInstance(use_sql_log); free_swap = sysapi_swap_space(); dprintf( D_FULLDEBUG, "*** Reserved Swap = %d\n", reserved_swap ); dprintf( D_FULLDEBUG, "*** Free Swap = %d\n", free_swap ); if( reserved_swap && free_swap < reserved_swap ) { dprintf( D_ALWAYS, "Not enough reserved swap space\n" ); if(FILEObj) { delete FILEObj; } exit( JOB_NO_MEM ); } dprintf(D_ALWAYS, "uid=%d, euid=%d, gid=%d, egid=%d\n", getuid(), geteuid(), getgid(), getegid()); dprintf(D_FULLDEBUG, "argc = %d\n", argc); for(i = 0; i < argc; i++) { dprintf(D_FULLDEBUG, "argv[%d] = %s\n", i, argv[i]); } if( argc < 6 ) { usage(); } if (param_boolean("SHADOW_DEBUG_WAIT", false, false)) { int debug_wait = 1; dprintf(D_ALWAYS, "SHADOW_DEBUG_WAIT is TRUE, waiting for debugger to attach to pid %d.\n", (int)::getpid()); while (debug_wait) { sleep(1); } } CheckSpoolVersion(SPOOL_MIN_VERSION_SHADOW_SUPPORTS,SPOOL_CUR_VERSION_SHADOW_SUPPORTS); if( strcmp("-pipe",argv[1]) == 0 ) { bogus_capability = argv[2]; cluster = argv[3]; proc = argv[4]; // read the big comment in the function for why this is here. RemoveNewShadowDroppings(cluster, proc); pipe_setup( cluster, proc, bogus_capability ); } else { schedd = argv[1]; host = argv[2]; bogus_capability = argv[3]; cluster = argv[4]; proc = argv[5]; if ( argc > 6 ) { IpcFile = argv[6]; dprintf(D_FULLDEBUG,"Setting IpcFile to %s\n",IpcFile); } else { IpcFile = NULL; } // read the big comment in the function for why this is here. RemoveNewShadowDroppings(cluster, proc); regular_setup( host, cluster, proc ); } scheddName = getenv( EnvGetName( ENV_SCHEDD_NAME ) ); #if 0 /* Don't want to share log file lock between child and pnarent */ (void)close( LockFd ); LockFd = -1; #endif // initialize the user log initializeUserLog(); My_Filesystem_Domain = param( "FILESYSTEM_DOMAIN" ); dprintf( D_ALWAYS, "My_Filesystem_Domain = \"%s\"\n", My_Filesystem_Domain ); My_UID_Domain = param( "UID_DOMAIN" ); dprintf( D_ALWAYS, "My_UID_Domain = \"%s\"\n", My_UID_Domain ); UseAFS = param_boolean_crufty( "USE_AFS", false ) ? TRUE : FALSE; UseNFS = param_boolean_crufty( "USE_NFS", false ) ? TRUE : FALSE; // if job specifies a checkpoint server host, this overrides // the config file parameters tmp = NULL; if (JobAd->LookupString(ATTR_CKPT_SERVER, &tmp) == 1) { if (CkptServerHost) free(CkptServerHost); UseCkptServer = TRUE; CkptServerHost = strdup(tmp); StarterChoosesCkptServer = FALSE; free(tmp); } else { free(tmp); if (CkptServerHost) { free(CkptServerHost); } CkptServerHost = param( "CKPT_SERVER_HOST" ); UseCkptServer = FALSE; if( CkptServerHost && param_boolean_crufty( "USE_CKPT_SERVER", true ) ) { UseCkptServer = TRUE; } StarterChoosesCkptServer = param_boolean_crufty("STARTER_CHOOSES_CKPT_SERVER", true) ? TRUE : FALSE; } // Initialize location of our checkpoint file. If we stored it // on a checkpoint server then set LastCkptServer. Otherwise, // LastCkptServer should be NULL to indicate that we should // look on the local disk for our checkpoint file. LastCkptServer = NULL; if (JobAd->LookupString(ATTR_LAST_CKPT_SERVER, &LastCkptServer) == 0) { free(LastCkptServer); LastCkptServer = NULL; } // LIGO if (param_boolean("ALWAYS_USE_LOCAL_CKPT_SERVER", false)) { if (LastCkptServer) { char *remoteHost = NULL; JobAd->LookupString(ATTR_REMOTE_HOST, &remoteHost); char *machineName = strrchr(remoteHost, '@'); if (machineName == NULL) { machineName = remoteHost; } else { machineName++; } LastCkptServer = strdup(machineName); CkptServerHost = strdup(machineName); dprintf(D_ALWAYS, "ALWAYS_USE_LOCAL_CKPT_SERVER is true, forcing LastCkptServer to %s\n", LastCkptServer); } else { dprintf(D_ALWAYS, "ALWAYS_USE_LOCAL_CKPT_SERVER is true, but checkpoint is not on server, restoring file local file\n"); } } MaxDiscardedRunTime = param_integer( "MAX_DISCARDED_RUN_TIME", 3600 ); CompressPeriodicCkpt = param_boolean( "COMPRESS_PERIODIC_CKPT", false ); PeriodicSync = param_boolean( "PERIODIC_MEMORY_SYNC", false ); CompressVacateCkpt = param_boolean( "COMPRESS_VACATE_CKPT", false ); SlowCkptSpeed = param_integer( "SLOW_CKPT_SPEED", 0 ); // Install signal handlers such that all signals are blocked when inside // the handler. sigset_t fullset; sigfillset(&fullset); install_sig_handler_with_mask( SIGCHLD,&fullset, reaper ); // SIGUSR1 is sent by the schedd when a job is removed with // condor_rm. install_sig_handler_with_mask( SIGUSR1, &fullset, handle_sigusr1 ); // SIGQUIT is sent for a fast shutdow. install_sig_handler_with_mask( SIGQUIT, &fullset, handle_sigquit ); // SIGTERM is sent for a graceful shutdow. install_sig_handler_with_mask( SIGTERM, &fullset, handle_sigterm ); /* Here we block the async signals. We do this mainly because on HPUX, * XDR wigs out if it is interrupted by a signal. We do it on all * platforms because it seems like a safe idea. We unblock the signals * during before select(), which is where we spend most of our time. */ block_signal(SIGCHLD); block_signal(SIGUSR1); /* If the completed job had been committed to the job queue, but for some reason the shadow exited wierdly and the schedd is trying to run it again, then simply write the job termination events and send the email as if the job had just ended. */ if (terminate_is_pending() == TRUE) { /* This function will exit()! */ handle_terminate_pending(); } HandleSyscalls(); Wrapup(); /* HACK! WHOOO!!!!! Throw the old shadow away already! */ /* This will figure out whether or not the job should go on hold AFTER the job has exited for whatever reason, or if the job should be allowed to exit. It modifies ExitReason approriately for job holding, or, get this, just EXCEPTs if the jobs is supposed to go into idle state and not leave. :) */ /* Small change by Todd : only check the static policy if the job really exited of its own accord -- we don't want to even evaluate the static policy if the job exited because it was preempted, for instance */ if (check_static_policy && (ExitReason == JOB_EXITED || ExitReason == JOB_KILLED || ExitReason == JOB_COREDUMPED)) { static_policy(); } if( My_UID_Domain ) { free( My_UID_Domain ); } if( My_Filesystem_Domain ) { free( My_Filesystem_Domain ); } if(FILEObj) { delete FILEObj; } dprintf( D_ALWAYS, "********** Shadow Exiting(%d) **********\n", ExitReason ); exit( ExitReason ); }
static void version() { printf( "%s\n%s\n", CondorVersion(), CondorPlatform() ); }
//--------------------------------------------------------------------------- void parseCommandLine(SubmitDagDeepOptions &deepOpts, SubmitDagShallowOptions &shallowOpts, int argc, const char * const argv[]) { for (int iArg = 1; iArg < argc; iArg++) { MyString strArg = argv[iArg]; if (strArg[0] != '-') { // We assume an argument without a leading hyphen is // a DAG file name. shallowOpts.dagFiles.append(strArg.Value()); if ( shallowOpts.primaryDagFile == "" ) { shallowOpts.primaryDagFile = strArg; } } else if (shallowOpts.primaryDagFile != "") { // Disallow hyphen args after DAG file name(s). printf("ERROR: no arguments allowed after DAG file name(s)\n"); printUsage(); } else { strArg.lower_case(); // Note: in checking the argument names here, we only check for // as much of the full name as we need to unambiguously define // the argument. if (strArg.find("-no_s") != -1) // -no_submit { shallowOpts.bSubmit = false; } else if (strArg.find("-vers") != -1) // -version { printf( "%s\n%s\n", CondorVersion(), CondorPlatform() ); exit( 0 ); } else if (strArg.find("-help") != -1 || strArg.find("-h") != -1) // -help { printUsage(0); } // submit and stick to a specific schedd else if (strArg.find("-schedd-daemon-ad-file") != -1) { if (iArg + 1 >= argc) { fprintf(stderr, "-schedd-daemon-ad-file argument needs a value\n"); printUsage(); } shallowOpts.strScheddDaemonAdFile = argv[++iArg]; } // submit and stick to a specific schedd else if (strArg.find("-schedd-address-file") != -1) { if (iArg + 1 >= argc) { fprintf(stderr, "-schedd-address-file argument needs a value\n"); printUsage(); } shallowOpts.strScheddAddressFile = argv[++iArg]; } else if (strArg.find("-f") != -1) // -force { deepOpts.bForce = true; } else if (strArg.find("-not") != -1) // -notification { if (iArg + 1 >= argc) { fprintf(stderr, "-notification argument needs a value\n"); printUsage(); } deepOpts.strNotification = argv[++iArg]; } else if (strArg.find("-r") != -1) // submit to remote schedd { if (iArg + 1 >= argc) { fprintf(stderr, "-r argument needs a value\n"); printUsage(); } shallowOpts.strRemoteSchedd = argv[++iArg]; } else if (strArg.find("-dagman") != -1) { if (iArg + 1 >= argc) { fprintf(stderr, "-dagman argument needs a value\n"); printUsage(); } deepOpts.strDagmanPath = argv[++iArg]; } else if (strArg.find("-de") != -1) // -debug { if (iArg + 1 >= argc) { fprintf(stderr, "-debug argument needs a value\n"); printUsage(); } shallowOpts.iDebugLevel = atoi(argv[++iArg]); } else if (strArg.find("-noev") != -1) // -noeventchecks { shallowOpts.bNoEventChecks = true; } else if (strArg.find("-allowlog") != -1) // -allowlogerror { deepOpts.bAllowLogError = true; } else if (strArg.find("-use") != -1) // -usedagdir { deepOpts.useDagDir = true; } else if (strArg.find("-out") != -1) // -outfile_dir { if (iArg + 1 >= argc) { fprintf(stderr, "-outfile_dir argument needs a value\n"); printUsage(); } deepOpts.strOutfileDir = argv[++iArg]; } else if (strArg.find("-con") != -1) // -config { if (iArg + 1 >= argc) { fprintf(stderr, "-config argument needs a value\n"); printUsage(); } shallowOpts.strConfigFile = argv[++iArg]; // Internally we deal with all configuration file paths // as full paths, to make it easier to determine whether // several paths point to the same file. MyString errMsg; if (!MakePathAbsolute(shallowOpts.strConfigFile, errMsg)) { fprintf( stderr, "%s\n", errMsg.Value() ); exit( 1 ); } } else if (strArg.find("-app") != -1) // -append { if (iArg + 1 >= argc) { fprintf(stderr, "-append argument needs a value\n"); printUsage(); } shallowOpts.appendLines.append(argv[++iArg]); } else if (strArg.find("-insert") != -1) // -insert_sub_file { if (iArg + 1 >= argc) { fprintf(stderr, "-insert_sub_file argument needs a value\n"); printUsage(); } ++iArg; if (shallowOpts.appendFile != "") { printf("Note: -insert_sub_file value (%s) overriding " "DAGMAN_INSERT_SUB_FILE setting (%s)\n", argv[iArg], shallowOpts.appendFile.Value()); } shallowOpts.appendFile = argv[iArg]; } else if (strArg.find("-autor") != -1) // -autorescue { if (iArg + 1 >= argc) { fprintf(stderr, "-autorescue argument needs a value\n"); printUsage(); } deepOpts.autoRescue = (atoi(argv[++iArg]) != 0); } else if (strArg.find("-dores") != -1) // -dorescuefrom { if (iArg + 1 >= argc) { fprintf(stderr, "-dorescuefrom argument needs a value\n"); printUsage(); } deepOpts.doRescueFrom = atoi(argv[++iArg]); } else if (strArg.find("-allowver") != -1) // -AllowVersionMismatch { deepOpts.allowVerMismatch = true; } else if (strArg.find("-no_rec") != -1) // -no_recurse { deepOpts.recurse = false; } else if (strArg.find("-do_rec") != -1) // -do_recurse { deepOpts.recurse = true; } else if (strArg.find("-updat") != -1) // -update_submit { deepOpts.updateSubmit = true; } else if (strArg.find("-import_env") != -1) // -import_env { deepOpts.importEnv = true; } else if (strArg.find("-dumpr") != -1) // -DumpRescue { shallowOpts.dumpRescueDag = true; } else if (strArg.find("-valgrind") != -1) // -valgrind { shallowOpts.runValgrind = true; } // This must come last, so we can have other arguments // that start with -v. else if ( (strArg.find("-v") != -1) ) // -verbose { deepOpts.bVerbose = true; } else if ( (strArg.find("-dontalwaysrun") != -1) ) // DontAlwaysRunPost { shallowOpts.bPostRun = false; } else if ( (strArg.find("-dont_use_default_node_log") != -1) ) { fprintf( stderr, "Error: -dont_use_default_node_log is no longer allowed\n" ); printUsage(); } else if ( (strArg.find("-suppress_notification") != -1) ) { deepOpts.suppress_notification = true; } else if ( (strArg.find("-dont_suppress_notification") != -1) ) { deepOpts.suppress_notification = false; } else if( (strArg.find("-prio") != -1) ) // -priority { if(iArg + 1 >= argc) { fprintf(stderr, "-priority argument needs a value\n"); printUsage(); } deepOpts.priority = atoi(argv[++iArg]); } else if ( (strArg.find("-dorecov") != -1) ) { shallowOpts.doRecovery = true; } else if ( parsePreservedArgs( strArg, iArg, argc, argv, shallowOpts) ) { // No-op here } else { fprintf( stderr, "ERROR: unknown option %s\n", strArg.Value() ); printUsage(); } } } if (shallowOpts.primaryDagFile == "") { fprintf( stderr, "ERROR: no dag file specified; aborting.\n" ); printUsage(); } if (deepOpts.doRescueFrom < 0) { fprintf( stderr, "-dorescuefrom value must be non-negative; aborting.\n"); printUsage(); } }
/* Utility function to create a generic job ad. The caller can then fill * in the relevant details. */ ClassAd *CreateJobAd( const char *owner, int universe, const char *cmd ) { ClassAd *job_ad = new ClassAd(); SetMyTypeName(*job_ad, JOB_ADTYPE); SetTargetTypeName(*job_ad, STARTD_ADTYPE); if ( owner ) { job_ad->Assign( ATTR_OWNER, owner ); } else { job_ad->AssignExpr( ATTR_OWNER, "Undefined" ); } job_ad->Assign( ATTR_JOB_UNIVERSE, universe ); job_ad->Assign( ATTR_JOB_CMD, cmd ); job_ad->Assign( ATTR_Q_DATE, (int)time(NULL) ); job_ad->Assign( ATTR_COMPLETION_DATE, 0 ); job_ad->Assign( ATTR_JOB_REMOTE_WALL_CLOCK, 0.0 ); job_ad->Assign( ATTR_JOB_LOCAL_USER_CPU, 0.0 ); job_ad->Assign( ATTR_JOB_LOCAL_SYS_CPU, 0.0 ); job_ad->Assign( ATTR_JOB_REMOTE_USER_CPU, 0.0 ); job_ad->Assign( ATTR_JOB_REMOTE_SYS_CPU, 0.0 ); // This is a magic cookie, see how condor_submit sets it job_ad->Assign( ATTR_CORE_SIZE, -1 ); // Are these ones really necessary? job_ad->Assign( ATTR_JOB_EXIT_STATUS, 0 ); job_ad->Assign( ATTR_ON_EXIT_BY_SIGNAL, false ); job_ad->Assign( ATTR_NUM_CKPTS, 0 ); job_ad->Assign( ATTR_NUM_JOB_STARTS, 0 ); job_ad->Assign( ATTR_NUM_RESTARTS, 0 ); job_ad->Assign( ATTR_NUM_SYSTEM_HOLDS, 0 ); job_ad->Assign( ATTR_JOB_COMMITTED_TIME, 0 ); job_ad->Assign( ATTR_CUMULATIVE_SLOT_TIME, 0 ); job_ad->Assign( ATTR_COMMITTED_SLOT_TIME, 0 ); job_ad->Assign( ATTR_TOTAL_SUSPENSIONS, 0 ); job_ad->Assign( ATTR_LAST_SUSPENSION_TIME, 0 ); job_ad->Assign( ATTR_CUMULATIVE_SUSPENSION_TIME, 0 ); job_ad->Assign( ATTR_COMMITTED_SUSPENSION_TIME, 0 ); job_ad->Assign( ATTR_JOB_ROOT_DIR, "/" ); job_ad->Assign( ATTR_MIN_HOSTS, 1 ); job_ad->Assign( ATTR_MAX_HOSTS, 1 ); job_ad->Assign( ATTR_CURRENT_HOSTS, 0 ); job_ad->Assign( ATTR_WANT_REMOTE_SYSCALLS, false ); job_ad->Assign( ATTR_WANT_CHECKPOINT, false ); job_ad->Assign( ATTR_WANT_REMOTE_IO, true ); job_ad->Assign( ATTR_JOB_STATUS, IDLE ); job_ad->Assign( ATTR_ENTERED_CURRENT_STATUS, (int)time(NULL) ); job_ad->Assign( ATTR_JOB_PRIO, 0 ); job_ad->Assign( ATTR_NICE_USER, false ); job_ad->Assign( ATTR_JOB_NOTIFICATION, NOTIFY_NEVER ); job_ad->Assign( ATTR_IMAGE_SIZE, 100 ); job_ad->Assign( ATTR_JOB_IWD, "/tmp" ); job_ad->Assign( ATTR_JOB_INPUT, NULL_FILE ); job_ad->Assign( ATTR_JOB_OUTPUT, NULL_FILE ); job_ad->Assign( ATTR_JOB_ERROR, NULL_FILE ); // Not sure what to do with these. If stdin/out/err is unset in the // submit file, condor_submit sets In/Out/Err to the NULL_FILE and // these transfer attributes to false. Otherwise, it leaves the // transfer attributes unset (which is treated as true). If we // explicitly set these to false here, our caller needs to reset // them to true if it changes In/Out/Err and wants the default // behavior of transfering them. This will probably be a common // oversite. Leaving them unset should be safe if our caller doesn't // change In/Out/Err. //job_ad->Assign( ATTR_TRANSFER_INPUT, false ); //job_ad->Assign( ATTR_TRANSFER_OUTPUT, false ); //job_ad->Assign( ATTR_TRANSFER_ERROR, false ); //job_ad->Assign( ATTR_TRANSFER_EXECUTABLE, false ); job_ad->Assign( ATTR_BUFFER_SIZE, 512*1024 ); job_ad->Assign( ATTR_BUFFER_BLOCK_SIZE, 32*1024 ); job_ad->Assign( ATTR_SHOULD_TRANSFER_FILES, getShouldTransferFilesString( STF_YES ) ); job_ad->Assign( ATTR_WHEN_TO_TRANSFER_OUTPUT, getFileTransferOutputString( FTO_ON_EXIT ) ); job_ad->Assign( ATTR_REQUIREMENTS, true ); job_ad->Assign( ATTR_PERIODIC_HOLD_CHECK, false ); job_ad->Assign( ATTR_PERIODIC_REMOVE_CHECK, false ); job_ad->Assign( ATTR_PERIODIC_RELEASE_CHECK, false ); job_ad->Assign( ATTR_ON_EXIT_HOLD_CHECK, false ); job_ad->Assign( ATTR_ON_EXIT_REMOVE_CHECK, true ); job_ad->Assign( ATTR_JOB_ARGUMENTS1, "" ); job_ad->Assign( ATTR_JOB_LEAVE_IN_QUEUE, false ); job_ad->AssignExpr( ATTR_REQUEST_MEMORY, "ifthenelse(MemoryUsage isnt undefined,MemoryUsage,( ImageSize + 1023 ) / 1024)" ); job_ad->AssignExpr( ATTR_REQUEST_DISK, "DiskUsage" ); job_ad->Assign( ATTR_DISK_USAGE, 1 ); job_ad->Assign( ATTR_REQUEST_CPUS, 1 ); // Without these, the starter will not automatically remap the stdout/err (look at sha 422735d9) // and possibly won't put them in the correct directory. job_ad->Assign( ATTR_STREAM_OUTPUT, false ); job_ad->Assign( ATTR_STREAM_ERROR, false ); job_ad->Assign( ATTR_VERSION, CondorVersion() ); job_ad->Assign( ATTR_PLATFORM, CondorPlatform() ); job_ad->Assign( ATTR_Q_DATE, time(NULL) ); return job_ad; }
int main(int argc, char *argv[]) { myDistro->Init( argc, argv ); CondorVersionInfo *version; bool use_syscall_lib = false; bool print_arch = false; bool print_opsys = false; bool opsys_first = false; // stupid flag for maintaining the // order we saw the args in... for(int i = 1; i < argc; i++ ) { if( argv[i][0] != '-' ) { fprintf( stderr, "ERROR: invalid argument: '%s'\n", argv[i] ); usage( argv[0], 1 ); } switch( argv[i][1] ) { case 's': use_syscall_lib = true; break; case 'a': print_arch = true; break; case 'o': print_opsys = true; if( ! print_arch ) { opsys_first = true; } break; case 'h': usage( argv[0], 0 ); break; default: fprintf( stderr, "ERROR: unrecognized argument: '%s'\n", argv[i] ); usage( argv[0], 1 ); } } char *path=NULL, *fullpath=NULL, *vername=NULL, *platform=NULL; if( use_syscall_lib ) { config(); path = param( "LIB" ); if( path == NULL ) { fprintf( stderr, "ERROR: -syscall_lib specified but 'LIB' not " "defined in configuration!\n" ); usage( argv[0], 1 ); } fullpath = (char *)malloc(strlen(path) + 24); ASSERT( fullpath != NULL ); strcpy(fullpath, path); strcat(fullpath, "/libcondorsyscall.a"); vername = NULL; vername = CondorVersionInfo::get_version_from_file(fullpath, vername); platform = NULL; platform = CondorVersionInfo::get_platform_from_file(fullpath, platform); version = new CondorVersionInfo(vername, NULL, platform); free(path); free(fullpath); } else { version = new CondorVersionInfo; } if( opsys_first ) { assert( print_opsys ); printf("%s\n", version->getOpSysVer() ); } if( print_arch ) { printf("%s\n", version->getArchVer() ); } if( ! opsys_first && print_opsys ) { printf("%s\n", version->getOpSysVer() ); } if( print_arch || print_opsys ) { return 0; } if( use_syscall_lib ) { printf( "%s\n%s\n", vername, platform ); } else { printf( "%s\n%s\n", CondorVersion(), CondorPlatform() ); } delete( version ); return 0; }