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/edwRsyncEdwUser/edwRsyncEdwUser.c src/hg/encode3/encodeDataWarehouse/edwRsyncEdwUser/edwRsyncEdwUser.c index e66ab86..b5608b0 100644 --- src/hg/encode3/encodeDataWarehouse/edwRsyncEdwUser/edwRsyncEdwUser.c +++ src/hg/encode3/encodeDataWarehouse/edwRsyncEdwUser/edwRsyncEdwUser.c @@ -1,218 +1,218 @@ /* edwRsyncEdwUser - Update edwUser table using user information from encodedcc. */ /* 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 "dystring.h" #include "options.h" #include "jksql.h" #include "jsHelper.h" #include "htmlPage.h" #include "edwLib.h" #include "encodeDataWarehouse.h" boolean really; /* number of users in different stage */ int prevN = 0, postN = 0, procN = 0, addedN = 0, updateN = 0;; void usage() /* Explain usage and exit. */ { errAbort( "edwRsyncEdwUser - Update edwUser table using user information from encodedcc. \n" "usage:\n" "edwRsyncEdwUser url uid pwd update.sql\n" "where url will need to be in quotes if it contains a question mark.\n" "options:\n" " -really - Needs to be set for anything to happen, otherwise will just print update statement to update.sql file.\n" ); } /* Command line validation table. */ static struct optionSpec options[] = { {"really", OPTION_BOOLEAN}, {NULL, 0}, }; int countTable(struct sqlConnection *conn, char *tName) /* get number of rows of the table */ { char query[512]; sqlSafef(query, sizeof(query), "select count(*) from %s" , tName); return sqlQuickNum(conn, query); } void logUpdateResult(FILE *f) /* log the update result */ { /* mail message for cron task when new users are added */ if ( addedN > 0) verbose(1, "%d user records processed.\n%d new user added to edwUser table.\nedwUser started with %d and ended with %d rows.\n%d users information updated\n", procN, addedN, prevN, postN, updateN); /* write out the update statistics to the output file */ fprintf(f, "%d user records processed.\n%d new user added to edwUser table.\nedwUser table started with %d and ended with %d rows.\n%d users information updated\n", procN, addedN, prevN, postN, updateN); } char *getTextViaHttps(char *url, char *userId, char *password) /* getTextViaHttps - Fetch text from url that is https password protected. This * will return a NULL rather than aborting if URL not found. */ /* TODO: Move to edwLib.c */ { char fullUrl[1024]; safef(fullUrl, sizeof(fullUrl), "https://%s:%s@%s", userId, password, url); struct htmlPage *page = htmlPageGet(fullUrl); if (page == NULL) return NULL; char *text = NULL; struct htmlStatus *st = page->status; if (st->status == 200) text = cloneString(page->htmlText); htmlPageFree(&page); return text; } char *getUserJson(char *sUrl, char *uuid, char *userId, char *password) /* Get detail user information associated with this uuid */ { char url[512]; safef(url, sizeof(url), "%s/users/%s/?format=json&datastore=database", sUrl, uuid); return getTextViaHttps(url, userId, password); } char *getAllUsersJson(char *sUrl, char *userId, char *password) /* Get the userTable in JSON format from encodedcc using REST API * similar to the curl command -- curl --header "accept:application/json" -u "uid:pwd" https://www.encodedcc.org/users/?format=json&limit=all */ { char url[512]; safef(url, sizeof(url), "%s/users/?format=json&limit=all", sUrl); //verbose(1, "Fetching all users from\n %s\n", url); return getTextViaHttps(url, userId, password); } void maybeDoUpdate(struct sqlConnection *conn, char *query, boolean really, FILE *f) /* If really is true than do sqlUpdate with query, otherwise just print * it out. */ { if (really) sqlUpdate(conn, query); else fprintf(f, "%s\n", query); } void updateEdwUserInfo(struct sqlConnection *conn, char *email, char *uuid, int isAdmin, FILE *f) /* update edwUser table based on information from encodedcc's users json * text using uuid as search key to update email and isAdmine column */ { char query[512]; /* use uuid then email to search the user row */ if (!sqlRowExists(conn, "edwUser", "uuid", uuid)) { /* Was this user created by edwCreateUser without real encodedcc uuid? */ if (sqlRowExists(conn, "edwUser", "email", email)) { /* yes, update it with real uuid from encodedcc */ sqlSafef(query, sizeof(query), "update edwUser set uuid = '%s', isAdmin = '%d' where email = '%s' and uuid = '0'", uuid, isAdmin, email); maybeDoUpdate(conn, query, really, f); updateN += 1; } else { sqlSafef(query, sizeof(query), "insert into edwUser (email, uuid, isAdmin) values('%s', '%s', %d)", email, uuid, isAdmin); maybeDoUpdate(conn, query, really, f); addedN += 1; } } else { sqlSafef(query, sizeof(query), "update edwUser set email = '%s', isAdmin = '%d' where uuid = '%s'", email, isAdmin, uuid); maybeDoUpdate(conn, query, really, f); updateN += 1; } return; } struct slName *createUuidList(char *url, char *userId, char *password) { char *usersJsonText = getAllUsersJson(url, userId, password); struct jsonElement *jsonRoot = jsonParse(usersJsonText); char *userListName = "@graph"; struct jsonElement *jsonUserList = jsonMustFindNamedField(jsonRoot, "", userListName); //verbose(1, "Got @graph %p\n", jsonUserList); struct slName *list = NULL; struct slRef *ref, *refList = jsonListVal(jsonUserList, userListName); for (ref = refList; ref != NULL; ref = ref->next) { struct jsonElement *el = ref->val; char *uuid = jsonStringField(el, "uuid"); if (uuid !=NULL) slNameAddHead(&list, uuid); } //verbose(1, "Got %d uuid to process\n", slCount(list)); return list; } void edwRsyncEdwUser(char *url, char *userId, char *password, char *outTab) /* edwRsyncEdwUser - Update edwUser table using user information from * Stanford encodedcc. */ { FILE *f = mustOpen(outTab, "w"); //char *database = "chinhliTest"; //struct sqlConnection *conn = sqlConnect(database); struct sqlConnection *conn = edwConnectReadWrite(edwDatabase); prevN = countTable(conn, "edwUser"); struct slName *uuidList=createUuidList(url, userId, password); //verbose(1, "uuidList created %p\n", uuidList); struct slName *sln; int realUserCount = 0; for (sln = uuidList; sln != NULL; sln = sln->next) { char *userJson = getUserJson(url, sln->name, userId, password); struct jsonElement *el = jsonParse(userJson); char *email = jsonStringField(el, "email"); char *uuid = jsonStringField(el, "uuid"); struct jsonElement *groupsArray = jsonMustFindNamedField(el, NULL, "groups"); int isAdmin = 0; /* loop thru the groups array, set isAdmin to 1 for admin/wrangler group */ if (groupsArray != NULL) { struct slRef *grpRef; struct slRef *groupsList = jsonListVal(groupsArray, "groups"); for (grpRef = groupsList; grpRef != NULL; grpRef = grpRef->next) { struct jsonElement *grp = grpRef->val; char *grpName = jsonStringVal(grp,""); if ((grpName != NULL) && (sameString(grpName, "admin") || sameString(grpName, "wrangler"))) isAdmin = 1; } } updateEdwUserInfo(conn, email, uuid, isAdmin, f); //verbose(1, "%s\t%s\t%d\n", email, uuid, isAdmin); ++realUserCount; } procN = realUserCount; postN = countTable(conn, "edwUser"); logUpdateResult(f); //verbose(1, "Total of %d users processed\n", realUserCount); carefulClose(&f); } int main(int argc, char *argv[]) { optionInit(&argc, argv, options); really = optionExists("really"); //if (really) verbose(1, "Really going to do it! \n"); if (argc != 5) usage(); edwRsyncEdwUser(argv[1], argv[2], argv[3], argv[4]); return 0; }