4898794edd81be5285ea6e544acbedeaeb31bf78 max Tue Nov 23 08:10:57 2021 -0800 Fixing pointers to README file for license in all source code files. refs #27614 diff --git src/hg/encode3/encodeDataWarehouse/edwWebSubmit/edwWebSubmit.c src/hg/encode3/encodeDataWarehouse/edwWebSubmit/edwWebSubmit.c index a515c50..4eaa5a2 100644 --- src/hg/encode3/encodeDataWarehouse/edwWebSubmit/edwWebSubmit.c +++ src/hg/encode3/encodeDataWarehouse/edwWebSubmit/edwWebSubmit.c @@ -1,352 +1,352 @@ /* edwWebSubmit - A small self-contained CGI for submitting data to the ENCODE Data Warehouse.. */ /* Copyright (C) 2014 The Regents of the University of California - * See README in this or parent directory for licensing information. */ + * See kent/LICENSE or http://genome.ucsc.edu/license/ for licensing information. */ #include "common.h" #include "linefile.h" #include "hash.h" #include "options.h" #include "dystring.h" #include "errAbort.h" #include "cheapcgi.h" #include "htmshell.h" #include "obscure.h" #include "jksql.h" #include "encodeDataWarehouse.h" #include "edwLib.h" #include "portable.h" #include "net.h" #include "paraFetch.h" char *userEmail; /* Filled in by authentication system. */ void usage() /* Explain usage and exit. */ { errAbort( "edwWebSubmit - A small self-contained CGI for submitting data to the ENCODE Data Warehouse.\n" "usage:\n" " edwWebSubmit cgiVar=value cgiVar2=value2\n" ); } void logIn() /* Put up name. No password for now. */ { printf("<DIV>"); printf("<H3>Welcome to the ENCODE data submission site</H3>"); printf("Please sign in using Persona "); printf("<INPUT TYPE=BUTTON NAME=\"signIn\" CLASS=\"btn\" VALUE=\"Sign in\" id=\"signin\"</H5>"); printf("</DIV>"); } void getUrl(struct sqlConnection *conn) /* Put up URL. */ { printf("<H3>Submit data</H3>"); printf("<P CLASS='title'>Enter the URL of a validated manifest file:<P>"); puts("<DIV CLASS=\"input-append\">"); cgiMakeTextVar("url", emptyForNull(cgiOptionalString("url")), 80); cgiMakeButton("submitUrl", "Submit"); puts("</DIV>"); puts("<DIV>"); cgiMakeCheckBox("update", FALSE); printf(" Update information for files previously submitted"); puts("</DIV>"); } static char *stopButtonName = "stopUpload"; long long paraFetchedSoFar(char *path) /* Return amount fetched so far. */ { struct parallelConn *pcList = NULL; char *url = NULL; off_t fileSize = 0; char *dateString = NULL; off_t totalDownloaded = 0; paraFetchReadStatus(path, &pcList, &url, &fileSize, &dateString, &totalDownloaded); return totalDownloaded; } void monitorSubmission(struct sqlConnection *conn, boolean autoRefresh) /* Write out information about submission. */ { char *url = trimSpaces(cgiString("url")); cgiMakeHiddenVar("url", url); struct edwSubmit *sub = edwMostRecentSubmission(conn, url); time_t startTime = 0, endTime = 0, endUploadTime = 0; if (sub == NULL) { int posInQueue = edwSubmitPositionInQueue(conn, url, NULL); if (posInQueue == 0) printf("%s is first in the submission queue, but upload has not started<BR>\n", url); else if (posInQueue > 0) printf("%s is in submission queue with %d submissions ahead of it<BR>\n", url, posInQueue); else { printf("%s status unknown.", url); } } else { startTime = sub->startUploadTime; endUploadTime = sub->endUploadTime; endTime = (endUploadTime ? endUploadTime : edwNow()); int timeSpan = endTime - startTime; long long thisUploadSize = sub->byteCount - sub->oldBytes; long long curSize = 0; // Amount of current file we know we've transferred. /* Print title letting them know if upload is done or in progress. */ struct edwUser *user = edwUserFromId(conn, sub->userId); printf("<B>Submission by %s is ", user->email); if (!isEmpty(sub->errorMessage)) { if (endUploadTime == 0) printf("having problems..."); else printf("stopped by uploader request."); } else if (endUploadTime != 0) { printf("uploaded."); } else printf("in progress..."); printf("</B><BR>\n"); /* Print URL and how far along we are at the file level. */ if (!isEmpty(sub->errorMessage)) { printf("<B>error:</B> %s<BR>\n", sub->errorMessage); cgiMakeButton("getUrl", "try submission again"); printf("<BR>"); } printf("<B>url:</B> %s<BR>\n", sub->url); printf("<B>files count:</B> %d<BR>\n", sub->fileCount); if (sub->oldFiles > 0) printf("<B>files already in warehouse:</B> %u<BR>\n", sub->oldFiles); if (sub->metaChangeCount > 0) printf("<B>old files with new tags in this submission</B> %d<BR>", sub->metaChangeCount); if (sub->oldFiles != sub->fileCount) { printf("<B>files transferred:</B> %u<BR>\n", sub->newFiles); printf("<B>files remaining:</B> %u<BR>\n", sub->fileCount - sub->oldFiles - sub->newFiles); } /* Report validation status */ printf("<B>new files validated:</B> %u of %u<BR>\n", edwSubmitCountNewValid(sub, conn), sub->newFiles); /* Print error message, and in case of error skip file-in-transfer info. */ if (isEmpty(sub->errorMessage)) { /* If possible print information about file en route */ if (endUploadTime == 0) { struct edwFile *ef = edwFileInProgress(conn, sub->id); if (ef != NULL) { char path[PATH_LEN]; safef(path, sizeof(path), "%s%s", edwRootDir, ef->edwFileName); if (ef->endUploadTime > 0) curSize = ef->size; else curSize = paraFetchedSoFar(path); printf("<B>file in route:</B> %s", ef->submitFileName); printf(" (%d%% transferred)<BR>\n", (int)(100.0 * curSize / ef->size)); } } } /* Report bytes transferred */ long long transferredThisTime = curSize + sub->newBytes; printf("<B>total bytes transferred:</B> "); long long totalTransferred = transferredThisTime + sub->oldBytes; printLongWithCommas(stdout, totalTransferred); printf(" of "); printLongWithCommas(stdout, sub->byteCount); if (sub->byteCount != 0) printf(" (%d%%)<BR>\n", (int)(100.0 * totalTransferred / sub->byteCount)); else printf("<BR>\n"); /* Report transfer speed if possible */ if (isEmpty(sub->errorMessage)) { if (timeSpan > 0) { printf("<B>transfer speed:</B> "); printLongWithCommas(stdout, (curSize + sub->newBytes)/timeSpan); printf(" bytes/sec<BR>\n"); } /* Report start time and duration */ printf("<B>submission started:</B> %s<BR>\n", ctime(&startTime)); struct dyString *duration = edwFormatDuration(timeSpan); /* Try and give them an ETA if we aren't finished */ if (endUploadTime == 0 && timeSpan > 0) { printf("<B>time so far:</B> %s<BR>\n", duration->string); double bytesPerSecond = (double)transferredThisTime/timeSpan; long long bytesRemaining = thisUploadSize - curSize - sub->newBytes; if (bytesPerSecond > 0) { long long estimatedFinish = bytesRemaining/bytesPerSecond; struct dyString *eta = edwFormatDuration(estimatedFinish); printf("<B>estimated finish in:</B> %s<BR>\n", eta->string); } } else { printf("<B>submission time:</B> %s<BR>\n", duration->string); } } } if (endUploadTime == 0 && isEmpty(sub->errorMessage)) cgiMakeButton(stopButtonName, "stop upload"); if (autoRefresh && isEmpty(sub->errorMessage)) { cgiMakeHiddenVar("monitor", "monitor"); edwWebAutoRefresh(EDW_WEB_REFRESH_5_SEC); } } boolean okToResubmitThisUrl(struct sqlConnection *conn, char *url) /* Return true if the user is an administrator or the original submitter */ { if (edwUserIsAdmin(conn,userEmail)) return TRUE; if (!sqlRowExists(conn, "edwSubmit", "url", url)) return TRUE; /* url exists, find out who is the original submitter */ int uId = edwFindUserIdFromEmail(conn, userEmail); char query[256]; sqlSafef(query, sizeof(query), "select distinct userId from edwSubmit where url='%s'", url); struct slInt *idList = sqlQuickNumList(conn, query); struct slInt *id; for (id = idList; id != NULL; id = id->next) { if (id->val == uId) return TRUE; } return FALSE; } void submitUrl(struct sqlConnection *conn) /* Submit validated manifest if it is not already in process. */ { /* Parse email and URL out of CGI vars. Do a tiny bit of error checking. */ char *url = trimSpaces(cgiString("url")); if (!stringIn("://", url)) errAbort("%s doesn't seem to be a valid URL, no '://'", url); /* Do some reality checks that email and URL actually exist. */ edwMustGetUserFromEmail(conn, userEmail); int sd = netUrlMustOpenPastHeader(url); close(sd); /* Check is it OK for the user to resubmit the url or update its information */ if (!okToResubmitThisUrl(conn, url)) errAbort("The url was previously submitted by another user, you cannot submit it again nor update its information."); edwAddSubmitJob(conn, userEmail, url, cgiBoolean("update")); } void stopUpload(struct sqlConnection *conn) /* Try and stop current upload. */ { char *url = trimSpaces(cgiString("url")); cgiMakeHiddenVar("url", url); struct edwSubmit *sub = edwMostRecentSubmission(conn, url); if (sub == NULL) { /* Submission hasn't happened yet - remove it from job queue. */ unsigned edwSubmitJobId = 0; int posInQueue = edwSubmitPositionInQueue(conn, url, &edwSubmitJobId); if (posInQueue >= 0) { char query[256]; sqlSafef(query, sizeof(query), "delete from edwSubmitJob where id=%u", edwSubmitJobId); sqlUpdate(conn, query); printf("Removed submission from %s from job queue\n", url); } } else { char query[256]; sqlSafef(query, sizeof(query), "update edwSubmit set errorMessage='Stopped by user.' where id=%u", sub->id); sqlUpdate(conn, query); } } static void localWarn(char *format, va_list args) /* A little warning handler to override the one with the button that goes nowhere. */ { printf("<B>Error:</B> "); vfprintf(stdout, format, args); printf("<BR>Please use the back button on your web browser, correct the error, and resubmit."); } void doMiddle() /* doMiddle - put up middle part of web page, not including http and html headers/footers */ { pushWarnHandler(localWarn); edwWebSubmitMenuItem(TRUE); printf("<FORM ACTION=\"../cgi-bin/edwWebSubmit\" METHOD=GET>\n"); struct sqlConnection *conn = edwConnectReadWrite(edwDatabase); userEmail = edwGetEmailAndVerify(); if (userEmail == NULL) { edwWebSubmitMenuItem(FALSE); edwWebBrowseMenuItem(FALSE); logIn(); } else if (cgiVarExists(stopButtonName)) { stopUpload(conn); monitorSubmission(conn, FALSE); } else if (cgiVarExists("submitUrl")) { submitUrl(conn); sleep1000(1000); monitorSubmission(conn, TRUE); } else if (cgiVarExists("monitor")) { monitorSubmission(conn, TRUE); } else { getUrl(conn); edwWebSubmitMenuItem(FALSE); } printf("</FORM>"); } int main(int argc, char *argv[]) /* Process command line. */ { boolean isFromWeb = cgiIsOnWeb(); if (!isFromWeb && !cgiSpoof(&argc, argv)) usage(); /* Put out HTTP header and HTML HEADER all the way through <BODY> */ edwWebHeaderWithPersona(""); /* Call error handling wrapper that catches us so we write /BODY and /HTML to close up page * even through an errAbort. */ htmEmptyShell(doMiddle, NULL); edwWebFooterWithPersona(); return 0; }