/** * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.seyren.core.util.config; import static org.apache.commons.lang.StringUtils.isNotEmpty; import static org.apache.commons.lang.StringUtils.stripEnd; import java.util.Arrays; import java.util.List; import javax.annotation.PostConstruct; import javax.inject.Named; import org.apache.velocity.app.Velocity; import org.apache.velocity.runtime.RuntimeConstants; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.seyren.core.util.velocity.Slf4jLogChute; @Named public class SeyrenConfig { private static final String DEFAULT_BASE_URL = "http://localhost:8080/seyren"; private final String baseUrl; private final String mongoUrl; private final String graphsEnable; private final String graphiteUrl; private final String graphiteUsername; private final String graphitePassword; private final String graphiteKeyStore; private final String graphiteKeyStorePassword; private final String graphiteTrustStore; private final String graphiteCarbonPickleEnable; private final String graphiteCarbonPicklePort; private final int graphiteConnectionRequestTimeout; private final int graphiteConnectTimeout; private final int graphiteSocketTimeout; private final String twilioUrl; private final String twilioAccountSid; private final String twilioAuthToken; private final String twilioPhoneNumber; private final List<String> opsGenieTeams; private final String hipChatBaseUrl; private final String hipChatAuthToken; private final String hipChatUsername; private final String hubotUrl; private final String smtpFrom; private final String smtpUsername; private final String smtpPassword; private final String smtpHost; private final String smtpProtocol; private final Integer smtpPort; private final String flowdockExternalUsername; private final String flowdockTags; // Icon mapped check sate (AlertType) see http://apps.timwhitlock.info/emoji/tables/unicode // question, sunny, cloud, voltage exclamation should be: \u2753,\u2600,\u2601,\u26A1,\u2757 private final String flowdockEmojis; private final String ircCatHost; private final String ircCatPort; private final String slackToken; private final String slackUsername; private final String slackIconUrl; private final String slackEmojis; private final String pushoverAppApiToken; private final String snmpHost; private final Integer snmpPort; private final String snmpCommunity; private final String snmpOID; private final String victorOpsRestAPIEndpoint; private final String emailTemplateFileName; private final String emailSubjectTemplateFileName; private final String bigPandaNotificationUrl; private final String bigPandaAuthBearer; private final int noOfThreads; private final String httpNotificationUrl; public SeyrenConfig() { // Base this.baseUrl = stripEnd(configOrDefault("SEYREN_URL", DEFAULT_BASE_URL), "/"); this.mongoUrl = configOrDefault("MONGO_URL", "mongodb://localhost:27017/seyren"); this.graphsEnable = configOrDefault("GRAPHS_ENABLE", "true"); this.noOfThreads = Integer.parseInt(configOrDefault("SEYREN_THREADS", "8")); // Graphite this.graphiteUrl = stripEnd(configOrDefault("GRAPHITE_URL", "http://localhost:80"), "/"); this.graphiteUsername = configOrDefault("GRAPHITE_USERNAME", ""); this.graphitePassword = configOrDefault("GRAPHITE_PASSWORD", ""); this.graphiteKeyStore = configOrDefault("GRAPHITE_KEYSTORE", ""); this.graphiteKeyStorePassword = configOrDefault("GRAPHITE_KEYSTORE_PASSWORD", ""); this.graphiteTrustStore = configOrDefault("GRAPHITE_TRUSTSTORE", ""); this.graphiteCarbonPickleEnable = configOrDefault("GRAPHITE_CARBON_PICKLE_ENABLE", "false"); this.graphiteCarbonPicklePort = configOrDefault("GRAPHITE_CARBON_PICKLE_PORT", "2004"); this.graphiteConnectionRequestTimeout = Integer.parseInt(configOrDefault("GRAPHITE_CONNECTION_REQUEST_TIMEOUT", "0")); this.graphiteConnectTimeout = Integer.parseInt(configOrDefault("GRAPHITE_CONNECT_TIMEOUT", "0")); this.graphiteSocketTimeout = Integer.parseInt(configOrDefault("GRAPHITE_SOCKET_TIMEOUT", "0")); // HTTP this.httpNotificationUrl = configOrDefault("HTTP_NOTIFICATION_URL", ""); // SMTP this.smtpFrom = configOrDefault(list("SMTP_FROM", "SEYREN_FROM_EMAIL"), "alert@seyren"); this.smtpUsername = configOrDefault("SMTP_USERNAME", ""); this.smtpPassword = configOrDefault("SMTP_PASSWORD", ""); this.smtpHost = configOrDefault("SMTP_HOST", "localhost"); this.smtpProtocol = configOrDefault("SMTP_PROTOCOL", "smtp"); this.smtpPort = Integer.parseInt(configOrDefault("SMTP_PORT", "25")); // HipChat this.hipChatBaseUrl = configOrDefault(list("HIPCHAT_BASEURL", "HIPCHAT_BASE_URL"), "https://api.hipchat.com"); this.hipChatAuthToken = configOrDefault(list("HIPCHAT_AUTHTOKEN", "HIPCHAT_AUTH_TOKEN"), ""); this.hipChatUsername = configOrDefault(list("HIPCHAT_USERNAME", "HIPCHAT_USER_NAME"), "Seyren Alert"); // PagerDuty // Twilio this.twilioUrl = configOrDefault("TWILIO_URL", "https://api.twilio.com/2010-04-01/Accounts"); this.twilioAccountSid = configOrDefault("TWILIO_ACCOUNT_SID", ""); this.twilioAuthToken = configOrDefault("TWILIO_AUTH_TOKEN", ""); this.twilioPhoneNumber = configOrDefault("TWILIO_PHONE_NUMBER", ""); // OpsGenie this.opsGenieTeams = Arrays.asList(configOrDefault("OPSGENIE_TEAMS", "ops").split(",")); // Hubot this.hubotUrl = configOrDefault(list("HUBOT_URL", "SEYREN_HUBOT_URL"), ""); // Flowdock this.flowdockExternalUsername = configOrDefault("FLOWDOCK_EXTERNAL_USERNAME", "Seyren"); this.flowdockTags = configOrDefault("FLOWDOCK_TAGS", ""); this.flowdockEmojis = configOrDefault("FLOWDOCK_EMOJIS", ""); // IrcCat this.ircCatHost = configOrDefault("IRCCAT_HOST", "localhost"); this.ircCatPort = configOrDefault("IRCCAT_PORT", "12345"); // Slack this.slackToken = configOrDefault("SLACK_TOKEN", ""); this.slackUsername = configOrDefault("SLACK_USERNAME", "Seyren"); this.slackIconUrl = configOrDefault("SLACK_ICON_URL", ""); this.slackEmojis = configOrDefault("SLACK_EMOJIS", ""); // PushOver this.pushoverAppApiToken = configOrDefault("PUSHOVER_APP_API_TOKEN", ""); // SNMP this.snmpHost = configOrDefault("SNMP_HOST", "localhost"); this.snmpPort = Integer.parseInt(configOrDefault("SNMP_PORT", "162")); this.snmpCommunity = configOrDefault("SNMP_COMMUNITY", "public"); this.snmpOID = configOrDefault("SNMP_OID", "1.3.6.1.4.1.32473.1"); //VictorOps this.victorOpsRestAPIEndpoint = configOrDefault("VICTOROPS_REST_ENDPOINT", ""); //BigPanda this.bigPandaNotificationUrl = configOrDefault("BIGPANDA_NOTIFICATION_URL", ""); this.bigPandaAuthBearer = configOrDefault("BIGPANDA_AUTH_BEARER", ""); // Template this.emailTemplateFileName = configOrDefault("TEMPLATE_EMAIL_FILE_PATH","com/seyren/core/service/notification/email-template.vm"); this.emailSubjectTemplateFileName = configOrDefault("TEMPLATE_EMAIL_SUBJECT_FILE_PATH","com/seyren/core/service/notification/email-subject-template.vm"); } @PostConstruct public void init() { Velocity.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM, new Slf4jLogChute()); Velocity.init(); } public String getBaseUrl() { return baseUrl; } @JsonIgnore public boolean isBaseUrlSetToDefault() { return getBaseUrl().equals(DEFAULT_BASE_URL); } @JsonIgnore public String getMongoUrl() { return mongoUrl; } public boolean isGraphsEnabled() { return Boolean.valueOf(graphsEnable); } @JsonIgnore public String getTwilioUrl() { return twilioUrl; } @JsonIgnore public String getTwilioAccountSid() { return twilioAccountSid; } @JsonIgnore public String getTwilioAuthToken() { return twilioAuthToken; } @JsonIgnore public List<String> getOpsGenieTeams() { return opsGenieTeams; } @JsonIgnore public String getTwilioPhoneNumber() { return twilioPhoneNumber; } @JsonIgnore public String getHipChatBaseUrl() { return hipChatBaseUrl; } @JsonIgnore public String getHipChatAuthToken() { return hipChatAuthToken; } @JsonIgnore public String getHipChatUsername() { return hipChatUsername; } @JsonIgnore public String getHubotUrl() { return hubotUrl; } @JsonIgnore public String getFlowdockExternalUsername() { return flowdockExternalUsername; } @JsonIgnore public String getFlowdockTags() { return flowdockTags; } @JsonIgnore public String getFlowdockEmojis() { return flowdockEmojis; } @JsonIgnore public String getIrcCatHost() { return this.ircCatHost; } @JsonIgnore public int getIrcCatPort() { return Integer.valueOf(this.ircCatPort); } @JsonIgnore public String getPushoverAppApiToken() { return this.pushoverAppApiToken; } @JsonIgnore public String getSmtpFrom() { return smtpFrom; } @JsonIgnore public String getSmtpUsername() { return smtpUsername; } @JsonIgnore public String getSmtpPassword() { return smtpPassword; } @JsonIgnore public String getSmtpHost() { return smtpHost; } @JsonIgnore public String getSmtpProtocol() { return smtpProtocol; } @JsonIgnore public Integer getSmtpPort() { return smtpPort; } @JsonIgnore public String getSnmpHost() { return snmpHost; } @JsonIgnore public Integer getSnmpPort() { return snmpPort; } @JsonIgnore public String getSnmpCommunity() { return snmpCommunity; } @JsonIgnore public String getSnmpOID() { return snmpOID; } @JsonIgnore public String getGraphiteUrl() { return graphiteUrl; } @JsonIgnore public String getGraphiteUsername() { return graphiteUsername; } @JsonIgnore public String getGraphitePassword() { return graphitePassword; } @JsonIgnore public String getGraphiteScheme() { return splitBaseUrl(graphiteUrl)[0]; } @JsonIgnore public int getGraphiteSSLPort() { return Integer.valueOf(splitBaseUrl(graphiteUrl)[1]); } @JsonIgnore public String getGraphiteHost() { return splitBaseUrl(graphiteUrl)[2]; } @JsonIgnore public String getGraphitePath() { return splitBaseUrl(graphiteUrl)[3]; } @JsonIgnore public String getGraphiteKeyStore() { return graphiteKeyStore; } @JsonIgnore public String getGraphiteKeyStorePassword() { return graphiteKeyStorePassword; } @JsonIgnore public String getGraphiteTrustStore() { return graphiteTrustStore; } @JsonIgnore public int getGraphiteCarbonPicklePort() { return Integer.valueOf(graphiteCarbonPicklePort); } @JsonProperty("graphiteCarbonPickleEnabled") public boolean getGraphiteCarbonPickleEnable() { return Boolean.valueOf(graphiteCarbonPickleEnable); } @JsonIgnore public int getGraphiteConnectionRequestTimeout() { return graphiteConnectionRequestTimeout; } @JsonIgnore public int getGraphiteConnectTimeout() { return graphiteConnectTimeout; } @JsonIgnore public int getGraphiteSocketTimeout() { return graphiteSocketTimeout; } @JsonIgnore public String getSlackToken() { return slackToken; } @JsonIgnore public String getSlackUsername() { return slackUsername; } @JsonIgnore public String getSlackIconUrl() { return slackIconUrl; } @JsonIgnore public String getSlackEmojis() { return slackEmojis; } @JsonIgnore public String getBigPandaNotificationUrl() { return bigPandaNotificationUrl; } @JsonIgnore public String getBigPandaAuthBearer() { return bigPandaAuthBearer; } @JsonIgnore public int getNoOfThreads() { return noOfThreads; } @JsonIgnore public String getHttpNotificationUrl() { return httpNotificationUrl; } @JsonIgnore public String getEmailTemplateFileName() { return emailTemplateFileName; } @JsonIgnore public String getEmailSubjectTemplateFileName() { return emailSubjectTemplateFileName; } @JsonIgnore public String getVictorOpsRestEndpoint() { return victorOpsRestAPIEndpoint; } private static String configOrDefault(String propertyName, String defaultValue) { return configOrDefault(list(propertyName), defaultValue); } private static String configOrDefault(List<String> propertyNames, String defaultValue) { for (String propertyName : propertyNames) { String value = System.getProperty(propertyName); if (isNotEmpty(value)) { return value; } value = System.getenv(propertyName); if (isNotEmpty(value)) { return value; } } return defaultValue; } private static List<String> list(String... propertyNames) { return Arrays.asList(propertyNames); } private static String[] splitBaseUrl(String baseUrl) { String[] baseParts = new String[4]; if (baseUrl.contains("://")) { baseParts[0] = baseUrl.split("://")[0]; baseUrl = baseUrl.split("://")[1]; } else { baseParts[0] = "http"; } if (baseUrl.contains(":")) { baseParts[1] = baseUrl.split(":")[1]; } else { baseParts[1] = "443"; } if (baseUrl.contains("/")) { baseParts[2] = baseUrl.split("/")[0]; baseParts[3] = "/" + baseUrl.split("/", 2)[1]; } else { baseParts[2] = baseUrl; baseParts[3] = ""; } return baseParts; } }