9c323c662d469671a89bacee5c8dd24311560d5b hiram Tue Nov 30 12:51:28 2010 -0800 trying out phoneHome function diff --git src/hg/lib/web.c src/hg/lib/web.c index 6e614da..8c5b5fe 100644 --- src/hg/lib/web.c +++ src/hg/lib/web.c @@ -8,30 +8,35 @@ #include "web.h" #include "hPrint.h" #include "hdb.h" #include "hui.h" #include "hgConfig.h" #include "cheapcgi.h" #include "dbDb.h" #include "hgColors.h" #include "searchTracks.h" #ifndef GBROWSE #include "axtInfo.h" #include "wikiLink.h" #include "googleAnalytics.h" #endif /* GBROWSE */ #include "errabort.h" // FIXME tmp hack to try to find source of popWarnHandler underflows in browse +/* phoneHome business */ +#include <utime.h> +#include <htmlPage.h> +#include <signal.h> +/* phoneHome business */ static char const rcsid[] = "$Id: web.c,v 1.173 2010/05/20 03:14:17 kent Exp $"; /* flag that tell if the CGI header has already been outputed */ boolean webHeadAlreadyOutputed = FALSE; /* flag that tell if text CGI header hsa been outputed */ boolean webInTextMode = FALSE; static char *dbCgiName = "db"; static char *orgCgiName = "org"; static char *cladeCgiName = "clade"; static char *extraStyle = NULL; /* global: a cart for use in error handlers. */ static struct cart *errCart = NULL; @@ -925,86 +930,125 @@ if ((retDb == NULL) || !hDbExists(retDb)) { retDb = hDefaultDb(); } /* If genomes don't match, then get the default db for that genome */ if (differentWord(genome, hGenome(retDb))) { retDb = hDefaultDbForGenome(genome); } return retDb; } -#ifdef NOT +/* phoneHome business */ +static void alarmExit(int status) +/* signal handler for SIGALRM for phoneHome function */ +{ +exit(0); +} + static void phoneHome() { static boolean beenHere = FALSE; if (beenHere) /* one at a time please */ return; beenHere = TRUE; -char *scriptName = cgiScriptName(); -char *ip = getenv("SERVER_ADDR"); -if (scriptName && ip) + +char trashFile[PATH_LEN]; +safef(trashFile, sizeof(trashFile), "%s/registration.txt", trashDir()); +if(fileExists(trashFile)) /* update access time for trashFile */ { - struct sqlConnection *conn = hConnectCentral(); - if (conn) + struct utimbuf ut; + struct stat mystat; + ZeroVar(&mystat); + if (stat(trashFile,&mystat)==0) { -#define REGO_DB "UCSCRegistration" - if (sqlTableExists(conn, REGO_DB)) - return; - char query[256]; - safef(query, sizeof(query), "create table %s", REGO_DB); - struct sqlResult *sr = sqlGetResult(conn, query); - sqlFreeResult(&sr); - hDisconnectCentral(&conn); - fprintf(stderr, "phoneHome: scriptName: %s, ip: %s\n", scriptName, ip); + ut.actime = clock1(); + ut.modtime = mystat.st_mtime; } else - fprintf(stderr, "phoneHome: scriptName: %s, ip: %s can not connect\n", scriptName, ip); + { + ut.actime = ut.modtime = clock1(); } -else - fprintf(stderr, "phoneHome: scriptName: %s or ip %s are null\n", scriptName, ip); + (void) utime(trashFile, &ut); + return; } -#endif + +char *scriptName = cgiScriptName(); +char *ip = getenv("SERVER_ADDR"); +if (scriptName && ip) /* will not be true from command line execution */ + { + FILE *f = fopen(trashFile, "w"); + if (f) /* rigamarole only if we can get a trash file */ + { + time_t now = time(NULL); + char *localTime; + extern char *tzname[2]; + struct tm *tm = localtime(&now); + localTime = sqlUnixTimeToDate(&now,FALSE); /* FALSE == localtime */ + fprintf(f, "%s, %s, %s %s, %s\n", scriptName, ip, localTime, + tm->tm_isdst ? tzname[1] : tzname[0], trashFile); + fclose(f); + chmod(trashFile, 0666); + pid_t pid0 = fork(); + if (0 == pid0) /* in child */ + { + close(STDOUT_FILENO); /* do not hang up Apache finish for parent */ + (void) signal(SIGALRM, alarmExit); + (void) alarm(6); /* timeout here in 6 seconds */ +#include "versionInfo.h" + char url[1024]; + safef(url, sizeof(url), "%s%s", + "http://genomewiki.ucsc.edu/cgi-bin/useCount?version=browser.v", + CGI_VERSION); + + /* 6 second alarm will exit this page fetch if it does not work */ + (void) htmlPageGetWithCookies(url, NULL); /* ignore return */ + + exit(0); + } /* child of fork has done exit(0) normally or via alarm */ + } /* trash file open OK */ + } /* an actual CGI binary */ +} /* phoneHome() */ +/* phoneHome business */ void getDbGenomeClade(struct cart *cart, char **retDb, char **retGenome, char **retClade, struct hash *oldVars) /* Examine CGI and cart variables to determine which db, genome, or clade * has been selected, and then adjust as necessary so that all three are * consistent. Detect changes and reset db-specific cart variables. * Save db, genome and clade in the cart so it will be consistent hereafter. * The order of preference here is as follows: * If we got a request that explicitly names the db, that takes * highest priority, and we synch the organism to that db. * If we get a cgi request for a specific organism then we use that * organism to choose the DB. If just clade, go from there. * In the cart only, we use the same order of preference. * If someone requests an Genome we try to give them the same db as * was in their cart, unless the Genome doesn't match. */ { boolean gotClade = hGotClade(); *retDb = cgiOptionalString(dbCgiName); *retGenome = cgiOptionalString(orgCgiName); *retClade = cgiOptionalString(cladeCgiName); -#ifdef NOT +/* phoneHome business */ phoneHome(); -#endif /* Was the database passed in as a cgi param? * If so, it takes precedence and determines the genome. */ if (*retDb && hDbExists(*retDb)) { *retGenome = hGenome(*retDb); } /* If no db was passed in as a cgi param then was the organism (a.k.a. genome) * passed in as a cgi param? * If so, the we use the proper database for that genome. */ else if (*retGenome && !sameWord(*retGenome, "0")) { *retDb = getDbForGenome(*retGenome, cart); *retGenome = hGenome(*retDb); }