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);
     }