char *getHostname(char *givenHost) { if (givenHost == NULL) { char *res = strdup(get_local_fqdn().Value()); return res; } else { return givenHost; } }
void DBMSManager::InitPublicAd() { m_public_ad = ClassAd(); //TODO: this is the wrong ADTYPE. //Use the new generic ad type when it becomes available. //Until then, actual writes to the collector are disabled, //because it conflicts with the schedd on the same host.. SetMyTypeName( m_public_ad, DBMSD_ADTYPE ); SetTargetTypeName( m_public_ad, "" ); m_public_ad.Assign(ATTR_MACHINE,get_local_fqdn()); m_public_ad.Assign(ATTR_NAME,m_name.Value()); config_fill_ad( &m_public_ad ); }
int CollectorList::resortLocal( const char *preferred_collector ) { // Find the collector in the list that is best suited for // this host. This is determined either by // a) preferred_collector passed in // b) the collector that has the same hostname as this negotiator char * tmp_preferred_collector = NULL; if ( !preferred_collector ) { // figure out our hostname for plan b) above MyString _hostname_str = get_local_fqdn(); const char * _hostname = _hostname_str.Value(); if (!(*_hostname)) { // Can't get our hostname??? f**k off return -1; } tmp_preferred_collector = strdup(_hostname); preferred_collector = tmp_preferred_collector; // So we know to free later } // First, pick out collector(s) that is on this host Daemon *daemon; SimpleList<Daemon*> prefer_list; this->list.Rewind(); while ( this->list.Next(daemon) ) { if ( same_host (preferred_collector, daemon->fullHostname()) ) { this->list.DeleteCurrent(); prefer_list.Prepend( daemon ); } } // Walk through the list of preferred collectors, // stuff 'em in the main "list" this->list.Rewind(); prefer_list.Rewind(); while ( prefer_list.Next(daemon) ) { this->list.Prepend( daemon ); } free(tmp_preferred_collector); // Warning, preferred_collector (may have) just became invalid, so do this just before returning. return 0; }
void ReplicatorStateMachine::initializeClassAd() { if( m_classAd != NULL) { delete m_classAd; m_classAd = NULL; } m_classAd = new ClassAd(); SetMyTypeName(*m_classAd, "Replication"); SetTargetTypeName(*m_classAd, ""); m_name.formatstr( "replication@%s -p %d", get_local_fqdn().Value(), daemonCore->InfoCommandPort( ) ); m_classAd->Assign( ATTR_NAME, m_name.Value( ) ); m_classAd->Assign( ATTR_MY_ADDRESS, daemonCore->InfoCommandSinfulString( ) ); // publish list of replication nodes char* buffer = param( "REPLICATION_LIST" ); if ( NULL == buffer ) { EXCEPT( "ReplicatorStateMachine: No replication list!!" ); } char* replAddress = NULL; StringList replList; MyString attrReplList; MyString comma; replList.initializeFromString( buffer ); replList.rewind( ); while( ( replAddress = replList.next() ) ) { attrReplList += comma; attrReplList += replAddress; comma = ","; } m_classAd->Assign( ATTR_REPLICATION_LIST, attrReplList.Value( ) ); // publish DC attributes daemonCore->publish(m_classAd); free(buffer); }
// Return our full hostname (with domain) in a static data buffer. const char* my_full_hostname() { static MyString __my_full_hostname; __my_full_hostname = get_local_fqdn(); return __my_full_hostname.Value(); }
void XferSummary::time_out(time_t now, char *hostaddr) { ClassAd info; char line[128], *tmp; char *str = NULL; SetMyTypeName(info, "CkptServer"); SetTargetTypeName(info, "CkptFile"); sprintf(line, "%s = \"%s\"", ATTR_NAME, get_local_fqdn().Value()); 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); info.Assign("Disk", sysapi_disk_space(pwd.Value())); // Send to collector if ( Collectors ) { dprintf(D_NETWORK, "Sending CkptServer ClassAd:\n"); dPrintAd(D_NETWORK, info); Collectors->sendUpdates (UPDATE_CKPT_SRVR_AD, &info, NULL, true); } init(); }
FILE * email_open( const char *email_addr, const char *subject ) { char *Sendmail = NULL; char *Mailer = NULL; char *SmtpServer = NULL; char *FromAddress = NULL; char *FinalSubject; char *FinalAddr; char *temp; int token_boundary; int num_addresses; int arg_index; FILE *mailerstream; /* Take care of the subject. */ if ( subject ) { size_t prolog_length = strlen(EMAIL_SUBJECT_PROLOG); size_t subject_length = strlen(subject); FinalSubject = (char *)malloc(prolog_length + subject_length + 1); ASSERT( FinalSubject != NULL ); memcpy(FinalSubject, EMAIL_SUBJECT_PROLOG, prolog_length); memcpy(&FinalSubject[prolog_length], subject, subject_length); FinalSubject[prolog_length + subject_length] = '\0'; } else { FinalSubject = strdup(EMAIL_SUBJECT_PROLOG); } /** The following will not cause a fatal error, it just means that on Windows we may construct an invalid "from" address. */ FromAddress = param("MAIL_FROM"); #ifdef WIN32 /* On WinNT, we need to be given an SMTP server, and we must pass * this servername to the Mailer with a -relay option. */ if ( (SmtpServer=param("SMTP_SERVER")) == NULL ) { dprintf(D_FULLDEBUG, "Trying to email, but SMTP_SERVER not specified in config file\n"); free(FinalSubject); if (FromAddress) free(FromAddress); return NULL; } #endif /* Take care of destination email address. If it is NULL, grab * the email of the Condor admin from the config file. * We strdup this since we modify it (we split it into tokens so that * each address is a separate argument to the mailer). */ if ( email_addr ) { FinalAddr = strdup(email_addr); } else { if ( (FinalAddr = param("CONDOR_ADMIN")) == NULL ) { dprintf(D_FULLDEBUG, "Trying to email, but CONDOR_ADMIN not specified in config file\n"); free(FinalSubject); if (FromAddress) free(FromAddress); if (SmtpServer) free(SmtpServer); return NULL; } } /* Now tokenize the list of addresses on commas and/or spaces (by replacing * commas and spaces with nils). We also count the addresses here so we * know how large to make our argument vector */ token_boundary = TRUE; num_addresses = 0; for (temp = FinalAddr; *temp != '\0'; temp++) { if (*temp == ',' || *temp == ' ') { *temp = '\0'; token_boundary = TRUE; } else if (token_boundary) { num_addresses++; token_boundary = FALSE; } } if (num_addresses == 0) { dprintf(D_FULLDEBUG, "Trying to email, but address list is empty\n"); free(FinalSubject); if (FromAddress) free(FromAddress); if (SmtpServer) free(SmtpServer); free(FinalAddr); return NULL; } Sendmail = param_with_full_path("SENDMAIL"); Mailer = param("MAIL"); if ( Mailer == NULL && Sendmail == NULL ) { dprintf(D_FULLDEBUG, "Trying to email, but MAIL and SENDMAIL not specified in config file\n"); free(FinalSubject); free(FromAddress); free(SmtpServer); free(FinalAddr); return NULL; } /* construct the argument vector for the mailer */ //char const * const * final_args; const char * * final_args; final_args = (char const * *)malloc((8 + num_addresses) * sizeof(char*)); if (final_args == NULL) { EXCEPT("Out of memory"); } arg_index = 0; if (Sendmail != NULL) { final_args[arg_index++] = Sendmail; // Obtain addresses from the header. final_args[arg_index++] = "-t"; // No special treatment of dot-starting lines. final_args[arg_index++] = "-i"; } else { final_args[arg_index++] = Mailer; final_args[arg_index++] = "-s"; final_args[arg_index++] = FinalSubject; if (FromAddress) { #ifdef WIN32 // condor_mail.exe uses this flag final_args[arg_index++] = "-f"; #else // modern mailx uses this flag final_args[arg_index++] = "-r"; #endif final_args[arg_index++] = FromAddress; } if (SmtpServer) { // SmtpServer is only set on windows // condor_mail.exe uses this flag final_args[arg_index++] = "-relay"; final_args[arg_index++] = SmtpServer; } temp = FinalAddr; for (;;) { while (*temp == '\0') temp++; final_args[arg_index++] = temp; if (--num_addresses == 0) break; while (*temp != '\0') temp++; } } final_args[arg_index] = NULL; /* NEW CODE */ /* open a FILE* so that the mail we get will end up from condor, and not from root */ #ifdef WIN32 mailerstream = email_open_implementation(Mailer, final_args); #else mailerstream = email_open_implementation(final_args); #endif if ( !mailerstream ) { dprintf( D_ALWAYS, "Failed to launch mailer process: %s\n", final_args[0] ); } if ( mailerstream ) { if (Sendmail != NULL) { email_write_headers(mailerstream, FromAddress, FinalSubject, FinalAddr, num_addresses); } fprintf(mailerstream,"This is an automated email from the Condor " "system\non machine \"%s\". Do not reply.\n\n",get_local_fqdn().Value()); } /* free up everything we strdup-ed and param-ed, and return result */ free(Sendmail); free(Mailer); free(FinalSubject); if (FromAddress) free(FromAddress); if (SmtpServer) free(SmtpServer); free(FinalAddr); free(final_args); return mailerstream; }
main(int argc, char* argv) { config(); bool do_socks = false; if( argc > 1 ) { do_socks = true; } dprintf( dflag, "\nExternal interface (local daemon)\n\n" ); testAPI( NULL, do_socks ); dprintf( dflag, "\nExternal interface (bad hostname)\n\n" ); testAPI( "bazzle", do_socks ); dprintf( dflag, "\nLocal daemons\n\n" ); makeAndDisplayCM( NULL, NULL ); makeAndDisplayRegular( NULL, NULL ); dprintf( dflag, "\nRemote daemons we should find\n\n" ); makeAndDisplayCM( "condor", "condor" ); makeAndDisplayRegular( "puck.cs.wisc.edu", "condor" ); dprintf( dflag, "\nWe should find the startd, but not the others\n\n" ); makeAndDisplayRegular( "*****@*****.**", NULL ); dprintf( dflag, "\nUsing a bogus sinful string\n\n" ); Daemon d( DT_NEGOTIATOR, "<128.105.232.240:23232>" ); if( d.locate() ) { dprintf( dflag, "Found %s\n", d.idStr() ); d.display( dflag ); } else { dprintf( dflag, "%s\n", d.error() ); } dprintf( dflag, "\nMake a local STARTD w/ explicit name\n\n" ); Daemon d2( DT_STARTD, get_local_fqdn().Value() ); if( d2.locate() ) { d2.display( dflag ); } else { dprintf( dflag, "%s\n", d2.error() ); } dprintf( dflag, "\nMake a local COLLECTOR w/ explicit name\n\n" ); Daemon d3( DT_COLLECTOR, "turkey.cs.wisc.edu" ); if( d3.locate() ) { d3.display( dflag ); } else { dprintf( dflag, "%s\n", d3.error() ); } dprintf( dflag, "\nUse idStr for a remote STARTD\n\n" ); Daemon d4( DT_STARTD, "puck.cs.wisc.edu" ); if( d4.locate() ) { dprintf( dflag, "Found %s\n", d4.idStr() ); } else { dprintf( dflag, "%s\n", d4.error() ); } dprintf( dflag, "\nTest socks on a valid Daemon that isn't up\n\n" ); Daemon d5( DT_SCHEDD, "cabernet.cs.wisc.edu" ); testSocks( &d5 ); dprintf( dflag, "\nCM where you specify pool and not name\n\n" ); Daemon d6( DT_COLLECTOR, NULL, "condor" ); if( d6.locate() ) { d6.display( dflag ); } else { dprintf( dflag, "%s\n", d6.error() ); } dprintf( dflag, "\nUsing sinful string for the collector\n\n" ); Daemon d7( DT_COLLECTOR, "<128.105.143.16:9618>" ); if( d7.locate() ) { dprintf( dflag, "Found %s\n", d7.idStr() ); d7.display( dflag ); } else { dprintf( dflag, "%s\n", d7.error() ); } dprintf( dflag, "\nRemote daemons we should NOT find\n\n" ); makeAndDisplayRegular( "bazzle.cs.wisc.edu", "condor" ); makeAndDisplayCM( "bazzle", "bazzle" ); }
void store_pool_cred_handler(void *, int /*i*/, Stream *s) { int result; char *pw = NULL; char *domain = NULL; MyString username = POOL_PASSWORD_USERNAME "@"; if (s->type() != Stream::reli_sock) { dprintf(D_ALWAYS, "ERROR: pool password set attempt via UDP\n"); return; } // if we're the CREDD_HOST, make sure any password setting is done locally // (since knowing what the pool password is on the CREDD_HOST means being // able to fetch users' passwords) char *credd_host = param("CREDD_HOST"); if (credd_host) { MyString my_fqdn_str = get_local_fqdn(); MyString my_hostname_str = get_local_hostname(); MyString my_ip_str = get_local_ipaddr().to_ip_string(); // figure out if we're on the CREDD_HOST bool on_credd_host = (strcasecmp(my_fqdn_str.Value(), credd_host) == MATCH); on_credd_host = on_credd_host || (strcasecmp(my_hostname_str.Value(), credd_host) == MATCH); on_credd_host = on_credd_host || (strcmp(my_ip_str.Value(), credd_host) == MATCH); if (on_credd_host) { // we're the CREDD_HOST; make sure the source address matches ours const char *addr = ((ReliSock*)s)->peer_ip_str(); if (!addr || strcmp(my_ip_str.Value(), addr)) { dprintf(D_ALWAYS, "ERROR: attempt to set pool password remotely\n"); free(credd_host); return; } } free(credd_host); } s->decode(); if (!s->code(domain) || !s->code(pw) || !s->end_of_message()) { dprintf(D_ALWAYS, "store_pool_cred: failed to receive all parameters\n"); goto spch_cleanup; } if (domain == NULL) { dprintf(D_ALWAYS, "store_pool_cred_handler: domain is NULL\n"); goto spch_cleanup; } // construct the full pool username username += domain; // do the real work if (pw) { result = store_cred_service(username.Value(), pw, ADD_MODE); SecureZeroMemory(pw, strlen(pw)); } else { result = store_cred_service(username.Value(), NULL, DELETE_MODE); } s->encode(); if (!s->code(result)) { dprintf(D_ALWAYS, "store_pool_cred: Failed to send result.\n"); goto spch_cleanup; } if (!s->end_of_message()) { dprintf(D_ALWAYS, "store_pool_cred: Failed to send end of message.\n"); } spch_cleanup: if (pw) free(pw); if (domain) free(domain); }