This script daemon will load a group from a google sheet.
You can adjust the authentication, but this simple example will just use an API key to a sheet which can be read from a link
Setup authentication
Allow google sheet access
Get an API key
Put the API key in a grouper config
Make the sheet
Make a GSH script daemon (adjust code)
Code
import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import org.apache.commons.lang.StringUtils; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import edu.internet2.middleware.grouper.Group; import edu.internet2.middleware.grouper.GroupFinder; import edu.internet2.middleware.grouper.GrouperSession; import edu.internet2.middleware.grouper.Member; import edu.internet2.middleware.grouper.MemberFinder; import edu.internet2.middleware.grouper.SubjectFinder; import edu.internet2.middleware.grouper.app.loader.OtherJobScript; import edu.internet2.middleware.grouper.cfg.GrouperConfig; import edu.internet2.middleware.grouper.misc.GrouperStartup; import edu.internet2.middleware.grouper.util.GrouperHttpClient; import edu.internet2.middleware.grouper.util.GrouperHttpMethod; import edu.internet2.middleware.grouper.util.GrouperUtil; import edu.internet2.middleware.grouperClient.jdbc.GcDbAccess; import edu.internet2.middleware.subject.Subject; //public class Test84googleSheets { // // public static void main(String[] args) { // // GrouperStartup.startup(); GrouperSession grouperSession = GrouperSession.startRootSession(); Map<String, Object> debugMap = new LinkedHashMap<>(); String apiKey = GrouperConfig.retrieveConfig().propertyValueStringRequired("someTempGoogleKey"); String jsonResponse = new GrouperHttpClient().assignGrouperHttpMethod(GrouperHttpMethod.get). assignUrl("https://sheets.googleapis.com/v4/spreadsheets/1c_abc123/values/Sheet1?key=" + apiKey). assignAssertResponseCode(200).executeRequest().getResponseBody(); // { // "range": "Sheet1!A1:Z1000", // "majorDimension": "ROWS", // "values": [ // [ // "Users" // ], // [ // "mchyzer" // ], // [ // "kwilso" // ] // ] // } JsonNode jsonNode = GrouperUtil.jsonJacksonNode(jsonResponse); ArrayNode arrayNode = GrouperUtil.jsonJacksonGetArrayNode(jsonNode, "values"); ArrayNode firstRowArray = (ArrayNode)arrayNode.get(0); String firstColHeader = GrouperUtil.jsonJacksonGetString(firstRowArray, 0); GrouperUtil.assertion(StringUtils.equals(firstColHeader, "Users"), "Header of first col should be 'Users', '" + firstColHeader + "'"); Set<String> subjectIdentifiersGoogleSheet = new HashSet<String>(); for (int i=1;i<arrayNode.size();i++) { ArrayNode rowArray = (ArrayNode)arrayNode.get(i); String subjectIdentifier = GrouperUtil.jsonJacksonGetString(rowArray, 0); if (!StringUtils.isBlank(subjectIdentifier)) { subjectIdentifiersGoogleSheet.add(subjectIdentifier); } } if (OtherJobScript.retrieveFromThreadLocal() != null) { OtherJobScript.retrieveFromThreadLocal().getOtherJobInput().getHib3GrouperLoaderLog().setTotalCount(subjectIdentifiersGoogleSheet.size()); } Map<String, Subject> subjectIdentifierToSubject = GrouperUtil.nonNull(subjectIdentifiersGoogleSheet.size() == 0 ? null : SubjectFinder.findByIdentifiers(subjectIdentifiersGoogleSheet, "pennperson")); if (subjectIdentifiersGoogleSheet.size() != subjectIdentifierToSubject.size()) { if (OtherJobScript.retrieveFromThreadLocal() != null) { OtherJobScript.retrieveFromThreadLocal().getOtherJobInput().getHib3GrouperLoaderLog().setUnresolvableSubjectCount( subjectIdentifiersGoogleSheet.size() - subjectIdentifierToSubject.size()); } Set<String> unresolvables = new HashSet<String>(subjectIdentifiersGoogleSheet); unresolvables.removeAll(subjectIdentifierToSubject.keySet()); debugMap.put("unresolvables", GrouperUtil.toStringForLog(unresolvables)); } Group group = GroupFinder.findByName("test:testGshLoader", true); int updates = group.replaceMembers(subjectIdentifierToSubject.values()); if (OtherJobScript.retrieveFromThreadLocal() != null) { OtherJobScript.retrieveFromThreadLocal().getOtherJobInput().getHib3GrouperLoaderLog().setUpdateCount(updates); OtherJobScript.retrieveFromThreadLocal().getOtherJobInput().getHib3GrouperLoaderLog().appendJobMessage(GrouperUtil.mapToString(debugMap)); } else { System.exit(0); } GrouperSession.stopQuietly(grouperSession); // } //}
See daemon run
See group memberships
(note make this group before running the daemon)