This is a GSH template which is re-used for a few GSH script daemons to send out a CSV report attachment to emails
Configuration
grouperGshTemplate.emailCsvReport.defaultRunButtonFolderUuidOrName = penn\u003Aetc\u003Atemplates\u003AemailCsvReport grouperGshTemplate.emailCsvReport.folderShowOnDescendants = certainFoldersAndDescendants grouperGshTemplate.emailCsvReport.folderShowType = certainFolders grouperGshTemplate.emailCsvReport.folderUuidToShow = penn\u003Aetc\u003Atemplates\u003AemailCsvReport grouperGshTemplate.emailCsvReport.gshTemplate = // grouperGshTemplate.emailCsvReport.input.0.description = Comma separated list of email address grouperGshTemplate.emailCsvReport.input.0.formElementType = textarea grouperGshTemplate.emailCsvReport.input.0.label = Emails grouperGshTemplate.emailCsvReport.input.0.maxLength = 2000 grouperGshTemplate.emailCsvReport.input.0.name = gsh_input_emails grouperGshTemplate.emailCsvReport.input.0.required = true grouperGshTemplate.emailCsvReport.input.0.validationType = none grouperGshTemplate.emailCsvReport.input.1.description = Enter the subject of the email grouperGshTemplate.emailCsvReport.input.1.label = Email subject grouperGshTemplate.emailCsvReport.input.1.name = gsh_input_subject grouperGshTemplate.emailCsvReport.input.1.required = true grouperGshTemplate.emailCsvReport.input.1.validationType = none grouperGshTemplate.emailCsvReport.input.2.description = Enter the email body describing the attachment and where to go for support grouperGshTemplate.emailCsvReport.input.2.formElementType = textarea grouperGshTemplate.emailCsvReport.input.2.label = Email body grouperGshTemplate.emailCsvReport.input.2.maxLength = 2000 grouperGshTemplate.emailCsvReport.input.2.name = gsh_input_body grouperGshTemplate.emailCsvReport.input.2.required = true grouperGshTemplate.emailCsvReport.input.2.validationType = none grouperGshTemplate.emailCsvReport.input.3.description = Enter the SQL external system config ID grouperGshTemplate.emailCsvReport.input.3.label = Database config ID grouperGshTemplate.emailCsvReport.input.3.name = gsh_input_databaseConfigId grouperGshTemplate.emailCsvReport.input.3.required = true grouperGshTemplate.emailCsvReport.input.3.validationType = none grouperGshTemplate.emailCsvReport.input.4.description = Enter the full database query. Should also include all column names grouperGshTemplate.emailCsvReport.input.4.formElementType = textarea grouperGshTemplate.emailCsvReport.input.4.label = SQL query grouperGshTemplate.emailCsvReport.input.4.maxLength = 4000 grouperGshTemplate.emailCsvReport.input.4.name = gsh_input_query grouperGshTemplate.emailCsvReport.input.4.required = true grouperGshTemplate.emailCsvReport.input.4.validationType = none grouperGshTemplate.emailCsvReport.input.5.description = Enter the CSV file name, should probably end in .csv. Can use \u0024date_time\u0024 and will substitute in a timestamp grouperGshTemplate.emailCsvReport.input.5.label = File name grouperGshTemplate.emailCsvReport.input.5.name = gsh_input_fileName grouperGshTemplate.emailCsvReport.input.5.validationType = none grouperGshTemplate.emailCsvReport.input.6.description = BCC email addresses grouperGshTemplate.emailCsvReport.input.6.label = BCC's grouperGshTemplate.emailCsvReport.input.6.name = gsh_input_bccs grouperGshTemplate.emailCsvReport.input.6.validationType = none grouperGshTemplate.emailCsvReport.moreActionsLabel = Email CSV report grouperGshTemplate.emailCsvReport.numberOfInputs = 7 grouperGshTemplate.emailCsvReport.runAsType = GrouperSystem grouperGshTemplate.emailCsvReport.runButtonGroupOrFolder = folder grouperGshTemplate.emailCsvReport.securityRunType = wheel grouperGshTemplate.emailCsvReport.showInMoreActions = true grouperGshTemplate.emailCsvReport.showOnFolders = true grouperGshTemplate.emailCsvReport.templateDescription = Email a CSV as an attachment to some email addresses grouperGshTemplate.emailCsvReport.templateName = Email CSV report grouperGshTemplate.emailCsvReport.templateVersion = V2
GSH code
import java.io.File; import java.util.Date; import java.util.List; import org.apache.commons.lang.StringUtils; import edu.internet2.middleware.grouper.SubjectFinder; import edu.internet2.middleware.grouper.app.gsh.template.GshTemplateExec; import edu.internet2.middleware.grouper.app.gsh.template.GshTemplateExecOutput; import edu.internet2.middleware.grouper.app.gsh.template.GshTemplateInput; import edu.internet2.middleware.grouper.app.gsh.template.GshTemplateOwnerType; import edu.internet2.middleware.grouper.app.gsh.template.GshTemplateV2; import edu.internet2.middleware.grouper.app.gsh.template.GshTemplateV2input; import edu.internet2.middleware.grouper.app.gsh.template.GshTemplateV2output; import edu.internet2.middleware.grouper.app.gsh.template.GshValidationLine; import edu.internet2.middleware.grouper.app.reports.GrouperCsvReportJob; import edu.internet2.middleware.grouper.util.GrouperEmail; import edu.internet2.middleware.grouper.util.GrouperUtil; public class Test69emailCsvReport extends GshTemplateV2 { @Override public void gshRunLogic(GshTemplateV2input gshTemplateV2input, GshTemplateV2output gshTemplateV2output) { String gsh_input_query = gshTemplateV2input.getGsh_builtin_inputString("gsh_input_query"); String gsh_input_databaseConfigId = gshTemplateV2input.getGsh_builtin_inputString("gsh_input_databaseConfigId"); String gsh_input_fileName = gshTemplateV2input.getGsh_builtin_inputString("gsh_input_fileName"); String gsh_input_subject = gshTemplateV2input.getGsh_builtin_inputString("gsh_input_subject"); String gsh_input_body = gshTemplateV2input.getGsh_builtin_inputString("gsh_input_body"); String gsh_input_emails = gshTemplateV2input.getGsh_builtin_inputString("gsh_input_emails"); String gsh_input_bccs = gshTemplateV2input.getGsh_builtin_inputString("gsh_input_bccs"); List<String> headers = GrouperCsvReportJob.retrieveHeaders(gsh_input_query, true); List<String[]> data = GrouperCsvReportJob.retrieveData(gsh_input_databaseConfigId, gsh_input_query); String fileName = GrouperUtil.tmpDir(true) + StringUtils.replace(gsh_input_fileName, "#date_time#", GrouperUtil.timestampToFileString(new Date())); File file = GrouperCsvReportJob.createCsv(fileName, headers, data); GrouperEmail grouperEmail = new GrouperEmail().addAttachment(file).setSubject(gsh_input_subject).setBody(gsh_input_body).setTo(gsh_input_emails); if (!StringUtils.isBlank(gsh_input_bccs)) { grouperEmail.setBcc(gsh_input_bccs); } grouperEmail.send(); } }
Script daemon
Config
GSH script daemon source
String emails = "support@whatever.school.edu"; String bccs = "someone@school.edu"; String subject = "Penn O365 report for Annenberg"; String body = "Attached is the Penn O365 report for Annenberg. Email help@school.edu for support."; String databaseConfigId = "pennCommunity"; String fileName = "o365_Annenberg_report_#date_time#.csv"; String query = "select PENN_ID, PENNKEY, NAME, INSTITUTIONAL_PREFERRED_EMAIL, PHONE, ACTIVE_CODE, O365_PRIMARY_AFFILIATION, CENTER, CENTER_NAME, HOME_ORG, SRS_DIVISION, SRS_SCHOOL, ALL_ACTIVE_AFFILIATIONS, O365_READY, EXPIRES_IN_DAYS, HAS_MAILBOX, O365_CENTER, JOB_ORG_CODE, JOB_ORG_DISPLAY_NAME, JOB_ORG_CENTER_CODE, FIRST_NAME, LAST_NAME, SCHEDULED_DELETION_DATE, JOB_CLASS_TITLE, PERSON_DESCRIPTION, DN, DECEASED_FLAG from pcdadmin.project_o365_Annenberg_v"; GshTemplateExec gshTemplateExec = new GshTemplateExec(); gshTemplateExec.assignConfigId("emailCsvReport"); gshTemplateExec.addGshTemplateInput(new GshTemplateInput().assignName("gsh_input_emails").assignValueString(emails)); gshTemplateExec.addGshTemplateInput(new GshTemplateInput().assignName("gsh_input_subject").assignValueString(subject)); gshTemplateExec.addGshTemplateInput(new GshTemplateInput().assignName("gsh_input_body").assignValueString(body)); gshTemplateExec.addGshTemplateInput(new GshTemplateInput().assignName("gsh_input_databaseConfigId").assignValueString(databaseConfigId)); gshTemplateExec.addGshTemplateInput(new GshTemplateInput().assignName("gsh_input_fileName").assignValueString(fileName)); gshTemplateExec.addGshTemplateInput(new GshTemplateInput().assignName("gsh_input_query").assignValueString(query)); gshTemplateExec.addGshTemplateInput(new GshTemplateInput().assignName("gsh_input_bccs").assignValueString(bccs)); gshTemplateExec.assignOwnerStemName("penn:etc:templates:emailCsvReport"); gshTemplateExec.assignGshTemplateOwnerType(GshTemplateOwnerType.stem); gshTemplateExec.assignCurrentUser(SubjectFinder.findRootSubject()); GshTemplateExecOutput gshTemplateExecOutput = gshTemplateExec.execute(); List<GshValidationLine> validationLines = gshTemplateExecOutput.getGshTemplateOutput().getValidationLines(); if (GrouperUtil.length(validationLines) > 0) { throw new RuntimeException(GrouperUtil.toStringForLog(validationLines)); } if (gshTemplateExecOutput.getException() != null) { throw gshTemplateExecOutput.getException(); }