Java tutorial
/* * MuninMX * Written by Enrico Kern, kern@clavain.com * www.clavain.com * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.clavain.alerts; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.clavain.muninmxcd; import com.clavain.alerts.msg.PushOverMessage; import com.clavain.alerts.msg.ShortTextMessage; import java.sql.ResultSet; import java.util.Calendar; import java.util.GregorianCalendar; import net.pushover.client.MessagePriority; import net.pushover.client.PushoverClient; import net.pushover.client.PushoverException; import net.pushover.client.PushoverMessage; import net.pushover.client.PushoverRestClient; import net.pushover.client.Status; import static com.clavain.utils.Generic.*; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; import com.clavain.alerts.msg.TTSMessage; import java.lang.reflect.Modifier; import org.apache.commons.mail.Email; import org.apache.commons.mail.SimpleEmail; import static com.clavain.muninmxcd.logger; import static com.clavain.muninmxcd.p; import static com.clavain.alerts.Helpers.*; import com.clavain.checks.ReturnServiceCheck; import static com.clavain.utils.Generic.sendPost; import java.sql.Connection; import static com.clavain.utils.Database.connectToDatabase; import java.util.*; import com.twilio.sdk.*; import com.twilio.sdk.resource.factory.*; import com.twilio.sdk.resource.instance.*; import com.twilio.sdk.resource.list.*; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import static com.clavain.muninmxcd.logger; /** * * @author enricokern */ public class Methods { public static void sendUPNotifications(ReturnServiceCheck sc) { Integer cid = sc.getCid(); try { Connection conn = connectToDatabase(com.clavain.muninmxcd.p); java.sql.Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery( "SELECT notifications.id as nid, contacts.* FROM `notifications` LEFT JOIN contacts ON notifications.contact_id = contacts.id WHERE check_id = " + cid); while (rs.next()) { Integer contact_id = rs.getInt("id"); String dayField = getScheduleFieldToCheck(); logger.info("[Check Notifications " + cid + "] Found " + rs.getString("contact_name")); if (rs.getString(dayField).equals("disabled")) { logger.info("[Check Notifications " + cid + "] " + rs.getString("contact_name") + " disabled notifications for today - skipping contact"); } else { String splitField = rs.getString(dayField); // figure out if this user got notifications enabled or disabled for the current hour and time String[] hours = splitField.split(";"); long a = getStampFromTimeAndZone(hours[0], rs.getString("timezone")); long b = getStampFromTimeAndZone(hours[1], rs.getString("timezone")); long cur = (System.currentTimeMillis() / 1000L); // if in range send notifications if (a < cur && b > cur) { String title = "Service OK: " + sc.getCheckname() + " (" + sc.getChecktype() + ")"; String message = "The Service is now up again."; String json = ""; if (rs.getInt("email_active") == 1) { logger.info("[Check Notifications " + cid + "] " + rs.getString("contact_name") + " Sending E-Mail"); sendMail(title, message, rs.getString("contact_email")); updateCheckNotificationLog(cid, contact_id, "UPTIME E-Mail send to " + rs.getString("contact_email"), "email"); } if (rs.getInt("sms_active") == 1) { logger.info("[Check Notifications " + cid + "] " + rs.getString("contact_name") + " Sending SMS"); sendSMS(title, message, rs.getString("contact_mobile_nr"), rs.getInt("user_id")); updateCheckNotificationLog(cid, contact_id, "UPTIME SMS send to " + rs.getString("contact_mobile_nr"), "sms"); } if (rs.getInt("pushover_active") == 1) { logger.info("[Check Notifications " + cid + "] " + rs.getString("contact_name") + " Sending Pushover Notification"); sendPushover(title, message, rs.getString("pushover_key")); updateCheckNotificationLog(cid, contact_id, "UPTIME PushOver Message send to " + rs.getString("pushover_key"), "pushover"); } } else { logger.info("[Check Notifications " + cid + "] " + rs.getString("contact_name") + " disabled notifications for this timerange - skipping contact"); } } } } catch (Exception ex) { logger.error("Error in sendUPNotifications for CID " + cid + " : " + ex.getLocalizedMessage()); } } public static void sendNotifications(ReturnServiceCheck sc) { Integer cid = sc.getCid(); try { Connection conn = connectToDatabase(com.clavain.muninmxcd.p); java.sql.Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery( "SELECT notifications.id as nid, contacts.* FROM `notifications` LEFT JOIN contacts ON notifications.contact_id = contacts.id WHERE check_id = " + cid); while (rs.next()) { Integer contact_id = rs.getInt("id"); String dayField = getScheduleFieldToCheck(); logger.info("[Check Notifications " + cid + "] Found " + rs.getString("contact_name")); if (rs.getString(dayField).equals("disabled")) { logger.info("[Check Notifications " + cid + "] " + rs.getString("contact_name") + " disabled notifications for today - skipping contact"); } else { String splitField = rs.getString(dayField); // figure out if this user got notifications enabled or disabled for the current hour and time String[] hours = splitField.split(";"); long a = getStampFromTimeAndZone(hours[0], rs.getString("timezone")); long b = getStampFromTimeAndZone(hours[1], rs.getString("timezone")); long cur = (System.currentTimeMillis() / 1000L); // if in range send notifications if (a < cur && b > cur) { String failTime = getHumanReadableDateFromTimeStampWithTimezone(sc.getDownTimeConfirmedAt(), rs.getString("timezone")); String title = "ALERT: " + sc.getCheckname() + " (" + sc.getChecktype() + ")"; String message = "Service Downtime verified @ " + failTime + ". Details: " + sc.getOutput().get(0); String json = ""; if (rs.getInt("callback_active") == 1) { logger.info("[Check Notifications " + cid + "] " + rs.getString("contact_name") + " Sending Callback"); sendCallback(sc, rs.getString("contact_callback")); updateCheckNotificationLog(cid, contact_id, "Callback executed to " + rs.getString("contact_callback"), "callback"); } if (rs.getInt("tts_active") == 1) { title = "This is a PingReports Alert: The Servicecheck: " + sc.getCheckname() + " with type: " + sc.getChecktype() + " is in alert state."; logger.info("[Notifications " + cid + "] " + rs.getString("contact_name") + " Initiating TTS Call"); sendTTS(title, message, rs.getString("contact_mobile_nr"), rs.getInt("user_id")); updateCheckNotificationLog(cid, contact_id, "Text2Speech Call initiated to " + rs.getString("contact_mobile_nr"), "tts"); } if (rs.getInt("email_active") == 1) { logger.info("[Check Notifications " + cid + "] " + rs.getString("contact_name") + " Sending E-Mail"); String ENDL = System.getProperty("line.separator"); message = "Service Downtime verified @ " + failTime + "." + ENDL + ENDL + "Details:" + ENDL + ENDL + sc.getOutput().get(0); sendMail(title, message, rs.getString("contact_email")); updateCheckNotificationLog(cid, contact_id, "E-Mail send to " + rs.getString("contact_email"), "email"); } if (rs.getInt("sms_active") == 1) { title = sc.getCheckname() + "(" + sc.getChecktype() + ")"; message = sc.getOutput().get(0); logger.info("[Check Notifications " + cid + "] " + rs.getString("contact_name") + " Sending SMS"); sendSMS(title, message, rs.getString("contact_mobile_nr"), rs.getInt("user_id")); updateCheckNotificationLog(cid, contact_id, "SMS send to " + rs.getString("contact_mobile_nr"), "sms"); } if (rs.getInt("pushover_active") == 1) { logger.info("[Check Notifications " + cid + "] " + rs.getString("contact_name") + " Sending Pushover Notification"); sendPushover(title, message, rs.getString("pushover_key")); updateCheckNotificationLog(cid, contact_id, "PushOver Message send to " + rs.getString("pushover_key"), "pushover"); } } else { logger.info("[Check Notifications " + cid + "] " + rs.getString("contact_name") + " disabled notifications for this timerange - skipping contact"); } } } } catch (Exception ex) { logger.error("Error in sendNotifications for CID " + cid + " : " + ex.getLocalizedMessage()); ex.printStackTrace(); } } public static void sendNotifications(Alert alert) { Integer aid = alert.getAlert_id(); try { Connection conn = connectToDatabase(com.clavain.muninmxcd.p); java.sql.Statement stmt = conn.createStatement(); // SELECT alert_contacts.id as nid, contacts.* FROM `alert_contacts` LEFT JOIN contacts ON alert_contacts.contact_id = contacts.id WHERE alert_id = 1 ResultSet rs = stmt.executeQuery( "SELECT alert_contacts.id as nid, contacts.*,contacts.id AS contactId FROM `alert_contacts` LEFT JOIN contacts ON alert_contacts.contact_id = contacts.id WHERE alert_id = " + aid); while (rs.next()) { Integer contact_id = rs.getInt("contactId"); String dayField = getScheduleFieldToCheck(); logger.info("[Notifications " + aid + "] Found " + rs.getString("contact_name")); if (rs.getString(dayField).equals("disabled")) { logger.info("[Notifications " + aid + "] " + rs.getString("contact_name") + " disabled notifications for today - skipping contact"); } else { String splitField = rs.getString(dayField); // figure out if this user got notifications enabled or disabled for the current hour and time String[] hours = splitField.split(";"); long a = getStampFromTimeAndZone(hours[0], rs.getString("timezone")); long b = getStampFromTimeAndZone(hours[1], rs.getString("timezone")); long cur = (System.currentTimeMillis() / 1000L); // if in range send notifications if (a < cur && b > cur) { String failTime = getHumanReadableDateFromTimeStampWithTimezone(alert.getLast_alert(), rs.getString("timezone")); String title = "ALERT: " + alert.getHostname() + " (" + alert.getPluginName() + ")"; String message = "Alert Time: " + failTime + ". Details: " + alert.getAlertMsg(); String json = ""; if (rs.getInt("callback_active") == 1) { logger.info("[Notifications " + aid + "] " + rs.getString("contact_name") + " Sending Callback"); sendCallback(alert, rs.getString("contact_callback")); updateNotificationLog(aid, contact_id, "Callback executed to " + rs.getString("contact_callback"), "callback"); } if (rs.getInt("tts_active") == 1) { title = "This is a MuninMX Alert: Plugin: " + alert.getPluginName() + " on host " + alert.getHostname() + " is in alert state."; logger.info("[Notifications " + aid + "] " + rs.getString("contact_name") + " Initiating TTS Call"); sendTTS(title, message, rs.getString("contact_mobile_nr"), rs.getInt("user_id")); updateNotificationLog(aid, contact_id, "Text2Speech Call initiated to " + rs.getString("contact_mobile_nr"), "tts"); } if (rs.getInt("email_active") == 1) { logger.info("[Notifications " + aid + "] " + rs.getString("contact_name") + " Sending E-Mail"); String ENDL = System.getProperty("line.separator"); message = "Alert Time: " + failTime + "." + ENDL + ENDL + "Details:" + ENDL + ENDL + alert.getAlertMsg(); sendMail(title, message, rs.getString("contact_email")); updateNotificationLog(aid, contact_id, "E-Mail send to " + rs.getString("contact_email"), "email"); } if (rs.getInt("sms_active") == 1) { title = alert.getHostname() + " reports "; message = alert.getAlertMsg(); logger.info( "[Notifications " + aid + "] " + rs.getString("contact_name") + " Sending SMS"); sendSMS(title, message, rs.getString("contact_mobile_nr"), rs.getInt("user_id")); updateNotificationLog(aid, contact_id, "SMS send to " + rs.getString("contact_mobile_nr"), "sms"); } if (rs.getInt("pushover_active") == 1) { logger.info("[Notifications " + aid + "] " + rs.getString("contact_name") + " Sending Pushover Notification"); sendPushover(title, message, rs.getString("pushover_key")); updateNotificationLog(aid, contact_id, "PushOver Message send to " + rs.getString("pushover_key"), "pushover"); } } else { logger.info("[Notifications " + aid + "] " + rs.getString("contact_name") + " disabled notifications for this timerange - skipping contact"); } } } conn.close(); } catch (Exception ex) { logger.error("Error in sendNotifications for CID " + aid + " : " + ex.getLocalizedMessage()); ex.printStackTrace(); } } private static void sendPushover(String title, String message, String userKey) { PushOverMessage pom = new PushOverMessage(userKey, title, message); com.clavain.muninmxcd.notification_pushover_queue.add(pom); //sendPushOverMessage(userKey, title, message); } private static void sendMail(String title, String message, String emailaddy) { try { Email email = new SimpleEmail(); email.setHostName(p.getProperty("mailserver.host")); email.setSmtpPort(Integer.parseInt(p.getProperty("mailserver.port"))); if (p.getProperty("mailserver.useauth").equals("true")) { email.setAuthentication(p.getProperty("mailserver.user"), p.getProperty("mailserver.pass")); } if (p.getProperty("mailserver.usessl").equals("true")) { email.setSSLOnConnect(true); } else { email.setSSLOnConnect(false); } email.setFrom(p.getProperty("mailserver.from")); email.setSubject("[MuninMX] " + title); email.setMsg(message); email.addTo(emailaddy); email.send(); } catch (Exception ex) { logger.warn("Unable to send Mail: " + ex.getLocalizedMessage()); } } // send a SMS and withdraw one token private static void sendSMS(String title, String message, String mobile, Integer user_id) { if (getSMSTicketCount(user_id) > 0) { message = title + " - " + message; ShortTextMessage sms = new ShortTextMessage(message, mobile); com.clavain.muninmxcd.notification_sms_queue.add(sms); withdrawSMSTicket(user_id); } else { String email = getCustomerEMail(user_id); if (email != null) { sendMail("MuninMX cant send SMS to you", "Hello. You receive this Mail because we tried to send you a SMS alert, but you do not have any sms tickets left. Please add more sms tickets or disable sms notifications", email); } } } // initiate TTS call and withdraw one token private static void sendTTS(String title, String message, String mobile, Integer user_id) { if (getTTSTicketCount(user_id) > 0) { message = title + " - " + message; TTSMessage tts = new TTSMessage(message, mobile); com.clavain.muninmxcd.notification_tts_queue.add(tts); withdrawTTSTicket(user_id); } else { String email = getCustomerEMail(user_id); if (email != null) { sendMail("MuninMX cant initiate text to speech calls to you", "Hello. You receive this Mail because we tried to send you a TTS alert, but you do not have any tts tickets left. Please add more tts tickets or disable tts notifications", email); } } } // send a http json callback to a url private static void sendCallback(Alert alert, String url) { Gson gson = new GsonBuilder().excludeFieldsWithModifiers(Modifier.TRANSIENT).create(); String json = gson.toJson(alert); sendPost(url, json); } // send a http json callback to a url private static void sendCallback(ReturnServiceCheck alert, String url) { Gson gson = new GsonBuilder().excludeFieldsWithModifiers(Modifier.TRANSIENT).create(); String json = gson.toJson(alert); sendPost(url, json); } private static String getScheduleFieldToCheck() { GregorianCalendar gc = new GregorianCalendar(); String retval = ""; switch (gc.get(Calendar.DAY_OF_WEEK)) { case 1: retval = "s_mon"; break; case 2: retval = "s_tue"; break; case 3: retval = "s_wed"; break; case 4: retval = "s_thu"; break; case 5: retval = "s_fri"; break; case 6: retval = "s_sat"; break; case 7: retval = "s_sun"; break; } return retval; } public static boolean sendSMSMessage(String message, String mobile_nr) { boolean retval = false; // http://smsflatrate.net/schnittstelle.php?key=ff&to=00491734631526&type=4&text=ALERT:%20Notification%20Test%20(HTTPS)%20-%20HTTP%20Critical-%20OK%20String%20not%20found try { if (p.getProperty("sms.provider").equals("smsflatrate")) { String key = p.getProperty("smsflatrate.key"); String gw = p.getProperty("smsflatrate.gw"); if (mobile_nr.startsWith("0049")) { gw = p.getProperty("smsflatrate.gwde"); } String msg = URLEncoder.encode(message); URL url = new URL("http://smsflatrate.net/schnittstelle.php?key=" + key + "&to=" + mobile_nr + "&type=" + gw + "&text=" + msg); URLConnection conn = url.openConnection(); // open the stream and put it into BufferedReader BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); String inputLine; String resp = ""; while ((inputLine = br.readLine()) != null) { resp = inputLine; } //conn.getContent(); if (resp.trim().equals("100")) { retval = true; } } else if (p.getProperty("sms.provider").equals("bulksms")) { // http://bulksms.de:5567/eapi/submission/send_sms/2/2.0?username=ff&password=yt89hjfff98&message=Hey%20Fucker&msisdn=491734631526 String msg = URLEncoder.encode(message); URL url = new URL("http://bulksms.de:5567/eapi/submission/send_sms/2/2.0?username=" + p.getProperty("bulksms.username") + "&password=" + p.getProperty("bulksms.password") + "&message=" + msg + "&msisdn=" + mobile_nr); URLConnection conn = url.openConnection(); // open the stream and put it into BufferedReader BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); String inputLine; String resp = ""; while ((inputLine = br.readLine()) != null) { resp = inputLine; } //conn.getContent(); if (resp.trim().startsWith("0")) { retval = true; } } else if (p.getProperty("sms.provider").equals("twilio")) { // reformat number? if (mobile_nr.startsWith("00")) { mobile_nr = "+" + mobile_nr.substring(2, mobile_nr.length()); } else if (mobile_nr.startsWith("0")) { mobile_nr = "+" + mobile_nr.substring(1, mobile_nr.length()); } TwilioRestClient client = new TwilioRestClient(p.getProperty("twilio.accountsid"), p.getProperty("twilio.authtoken")); //String msg = URLEncoder.encode(message); // Build the parameters List<NameValuePair> params = new ArrayList<>(); params.add(new BasicNameValuePair("To", mobile_nr)); params.add(new BasicNameValuePair("From", p.getProperty("twilio.fromnr"))); params.add(new BasicNameValuePair("Body", message)); MessageFactory messageFactory = client.getAccount().getMessageFactory(); Message tmessage = messageFactory.create(params); logger.info("twilio: msg send to " + mobile_nr + " sid: " + tmessage.getSid() + " status: " + tmessage.getStatus() + " twilio emsg: " + tmessage.getErrorMessage()); } else if (p.getProperty("sms.provider").equals("script")) { List<String> commands = new ArrayList<String>(); // add global timeout script commands.add(p.getProperty("sms.script")); commands.add(mobile_nr); commands.add(message); ProcessBuilder pb = new ProcessBuilder(commands).redirectErrorStream(true); logger.info("sms.script - Running: " + commands); Process p = pb.start(); Integer rv = p.waitFor(); } } catch (Exception ex) { retval = false; logger.error("sendSMSMessage Error: " + ex.getLocalizedMessage()); } return retval; } public static boolean sendTTSMessage(String message, String mobile_nr) { boolean retval = false; try { if (p.getProperty("tts.provider").equals("smsflatrate")) { String key = p.getProperty("smsflatrate.key"); String gw = p.getProperty("smsflatrate.ttsgw"); String msg = URLEncoder.encode(message); URL url = new URL("http://smsflatrate.net/schnittstelle.php?key=" + key + "&to=" + mobile_nr + "&voice=Dave&repeat=2&rate=1&type=" + gw + "&text=" + msg); URLConnection conn = url.openConnection(); // open the stream and put it into BufferedReader BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); String inputLine; String resp = ""; while ((inputLine = br.readLine()) != null) { resp = inputLine; } //conn.getContent(); if (resp.trim().equals("100")) { retval = true; } } else if (p.getProperty("tts.provider").equals("script")) { List<String> commands = new ArrayList<String>(); // add global timeout script commands.add(p.getProperty("tts.script")); commands.add(mobile_nr); commands.add(message); ProcessBuilder pb = new ProcessBuilder(commands).redirectErrorStream(true); logger.info("tts.script - Running: " + commands); Process p = pb.start(); Integer rv = p.waitFor(); } } catch (Exception ex) { retval = false; logger.error("sendTTSMessage Error: " + ex.getLocalizedMessage()); } return retval; } public static Status sendPushOverMessage(String userKey, String title, String Message) { PushoverClient client = new PushoverRestClient(); try { Status result = client.pushMessage(PushoverMessage.builderWithApiToken(p.getProperty("pushover.key")) .setUserId(userKey).setMessage(Message).setPriority(MessagePriority.HIGH) // HIGH|NORMAL|QUIET .setTitle(title).build()); return result; } catch (PushoverException ex) { logger.error("PushOver Error: " + ex.getLocalizedMessage()); return null; } } }