diff --git a/asterboard/asterboard/README b/asterboard/asterboard/README new file mode 100644 index 0000000..dbdf569 --- /dev/null +++ b/asterboard/asterboard/README @@ -0,0 +1,73 @@ +There are some minor steps needed to install Asterboard and there are +some assumptions as to how your data is logged. + +*** ASSUMPTIONS + +* Your data is sent from one or more Asterisk servers running v 1.8 or higher. + +* Your data is tagged from Asterisk as being the "asterisk" program (this is + the "-t" parameter from the setup-linux.sh script). + +* Asterisk uses "from-trunk" context for all incoming calls and "from-internal" + for all outgoing calls (or at least, the final context before sending + calls out goes through from-internal). + + +*** INSTALLING + +Note: Older (pre 1.4.0) versions of NLS used a different directory for logstash +patterns. If the directory in step 1a does not exist, use step 1b. You do not +need to perform both steps. + +1a) Copy "asterisk" to logstash's patterns directory: +cp asterisk /usr/local/nagioslogserver/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-0.1.10/patterns + +1b) Copy "asterisk" to older logstash patterns directory: +cp asterisk /usr/local/nagioslogserver/logstash/patterns + + +2) Log in to Nagios Log Server and go to "Administration" + Go to "Global Configuration" + Add a filter called "Asterisk" with the following content: + + if [program] == 'asterisk' { + grok { + match => ['message', '%{ASTLOG}'] + } + } + + Save and Apply your new global configuration + +3) Install the dashboard itself by going to the "Dashboard" screen + Click the "Load" icon near the top right + Select "Advanced" from the bottom of the pop-up + Choose "Browse" and browse to where you saved the asterboard.json file + +You can now save your new dashboard as whatever you want, but as it is primarily +showing "Concurrent Calls" we use "Concurrent Calls." + +New Asterisk log data will now be parsed into the following fields: + + asterisk_app Set, Macro, Dial, etc + asterisk_app_params Parameters to above + asterisk_channel SIP/1234@context (for instance) + asterisk_context 1234@from-intenal:1 or 1234@from-trunk:1 + asterisk_ext 1234 + asterisk_extension Internal extension used in transfers, etc + asterisk_sip_channel SIP/1234 + asterisk_src_file pbx.c for outbound calls + +These terms are also available for general Asterisk log file searching/analysis +though some are not used or useful for this particular dashboard. + +Note that if you added Asterisk data prior to loading the global filter, that +data will not have the appropriate terms parsed and will not show up in the +call details, but they will show up in the overall counts. Only new data added +after applying the global filter will show phone numbers and trunk information. + + +Feel free to contact me with questions: + +Author: Eric Loyd +Copyleft 2014 by Eric Loyd +Last updated 23-Mar-2016 diff --git a/asterboard/asterboard/asterisk b/asterboard/asterboard/asterisk new file mode 100644 index 0000000..39eb438 --- /dev/null +++ b/asterboard/asterboard/asterisk @@ -0,0 +1,51 @@ +SIP_HEADER [A-Z_]+ +ASTLEVEL (?:VERBOSE|ERROR|NOTICE|INFO|DEBUG|DTMF|WARNING) +ASTLANGUAGE [a-z]{1,3} +# Special pattern for "Ext." Logs +ASTEXTNO [A-Za-z0-9_]+ +# Valid DTMF keys +ASTDTMF [0-9#*] +# Log source file (Normally a c file) +ASTSRC [-a-z._0-9/]+ +# Registration info +ASTREGISTRATION %{USERNAME}@%{IPORHOST} +# Context +ASTCONTEXTEXTENSION [A-Za-z0-9*#~_]+ +ASTCONTEXTNAME [-a-z0-9]+ +ASTCONTEXTPOSITION \d+ +ASTCONTEXT %{ASTCONTEXTEXTENSION:asterisk_ext}@%{ASTCONTEXTNAME}:%{ASTCONTEXTPOSITION} +# Application +ASTAPP [A-Z][A-Za-z0-9]+ +ASTAPP_AUDIOFILE [-a-zA-Z0-9_./]+ +# Interfaces +AST_SIP_INTERFACE SIP/[-_A-Za-z0-9]+ +ASTINTERFACE %{AST_SIP_INTERFACE} +# Channels +ASTCHANNEL_SIP %{AST_SIP_INTERFACE:asterisk_sip_channel}-[a-f0-9]+ +ASTCHANNEL_LOCAL Local/[-a-z0-9@;]+ +ASTCHANNEL (:?%{ASTCHANNEL_SIP}|%{ASTCHANNEL_LOCAL}) +# Different log content types +ASTCONTENT_CHANNELEVENT1 (:?CDR updated on|Timeout on|Stopped music on hold on|Started music on hold, class '%{ASTAPP_AUDIOFILE}', on|(:?Begin|End) MixMonitor Recording) %{ASTCHANNEL:asterisk_channel} +ASTCONTENT_CHANNELEVENT2 (Locally bridging )?%{ASTCHANNEL:asterisk_channel}.*%{ASTCHANNEL:asterisk_channel} +ASTCONTENT_CHANNELEVENT3 %{ASTCHANNEL:asterisk_channel} is ringing +ASTCONTENT_EXECUTE Executing \[%{ASTCONTEXT:asterisk_context}\] %{ASTAPP:asterisk_app}\("%{ASTCHANNEL:asterisk_channel}", "%{GREEDYDATA:asterisk_app_params}"\) in new stack +ASTCONTENT_CHANNELJUMP Channel '%{ASTCHANNEL:asterisk_channel}' jumping out of macro '%{ASTCONTEXTNAME:asterisk_context}' +ASTCONTENT_GOTO Goto \(%{ASTCONTEXTNAME:asterisk_context},%{ASTCONTEXTEXTENSION:asterisk_extension},%{ASTCONTEXTPOSITION:asterisk_context_position}\) +ASTCONTENT_SIPCOSMARK Using SIP RTP CoS mark %{NUMBER} +ASTCONTENT_ASTMANAGER Manager '%{USERNAME:asterisk_manager_name}' logged (:?off|on) from %{IPORHOST:asterisk_manager_host} +ASTCONTENT_CDRUPDATE on %{ASTCHANNEL:asterisk_channel} +ASTCONTENT_PLAYAUDIO <%{ASTCHANNEL:asterisk_channel}> Playing '%{ASTAPP_AUDIOFILE:audiofile}' \(language '%{ASTLANGUAGE}'\) +ASTCONTENT_REGISTRATION_TIMEOUT Registration for '%{ASTREGISTRATION}' timed out, trying again \(Attempt #%{NUMBER:asterisk_registration_attempt}\) +ASTCONTENT_INVALID_EXTENSION Invalid extension '%{ASTCONTEXTEXTENSION:asterisk_extension}' in context '%{ASTCONTEXTNAME:asterisk_context}' on %{ASTCHANNEL} +ASTCONTENT_CONNECTION_REFUSED Connect attempt from '%{IPORHOST:asterisk_connection_refused_host}' unable to authenticate +ASTCONTENT_QUEUE_EVENT Added interface '%{ASTINTERFACE}' to queue '%{NOTSPACE:asterisk_queue}' +ASTCONTENT_UNKNOWN_SIPMESSAGE Unable to parse %{SIP_HEADER:sip_header} message from %{ASTREGISTRATION:asterisk_external} +ASTCONTENT_SPAWN Spawn extension \(%{ASTCONTEXTNAME:asterisk_context}, %{ASTCONTEXTEXTENSION:asterisk_extension}, %{ASTCONTEXTPOSITION:asterisk_context_position}\) exited .* on '%{ASTCHANNEL:asterisk_channel}' +ASTCONTENT_USERINPUT User entered '%{DATA:asterisk_userinput}' +ASTCONTENT_DTMF DTMF (:?begin|end)(:? passthrough| ignored)? '%{ASTDTMF:asterisk_dtmf_number}'(:? received)? on %{ASTCHANNEL}(:?, duration %{NUMBER:asterisk_dtmf_duration} ms)? +ASTCONTENT [-=\s]*(:?%{ASTCONTENT_EXECUTE}|%{ASTCONTENT_CHANNELJUMP}|%{ASTCONTENT_GOTO}|%{ASTCONTENT_PLAYAUDIO}|%{ASTCONTENT_SPAWN}|%{ASTCONTENT_ASTMANAGER}|%{ASTCONTENT_DTMF}|%{ASTCONTENT_REGISTRATION_TIMEOUT}|%{ASTCONTENT_CHANNELEVENT1}|%{ASTCONTENT_CHANNELEVENT2}|%{ASTCONTENT_CHANNELEVENT3}|%{ASTCONTENT_INVALID_EXTENSION}|%{ASTCONTENT_CONNECTION_REFUSED}|%{ASTCONTENT_QUEUE_EVENT}|%{ASTCONTENT_USERINPUT}|%{ASTCONTENT_UNKNOWN_SIPMESSAGE}|%{ASTCONTENT_SIPCOSMARK}|%{GREEDYDATA}) +# different log types +ASTLOG1 \[%{TIMESTAMP_ISO8601:timestamp}\] %{ASTLEVEL:severity}\[\d+\]\[.*\] %{ASTSRC:asterisk_src_file}:%{ASTCONTENT} +ASTLOG2 \[%{TIMESTAMP_ISO8601:timestamp}\] %{ASTLEVEL:severity}\[\d+\] Ext. %{ASTEXTNO}: %{GREEDYDATA} +ASTTIMEOUT Packet timed out after %{NUMBER}ms with no response +ASTLOG ^(:?%{ASTLOG1}|%{ASTLOG2}|%{ASTTIMEOUT}) diff --git a/check_web_site_size b/check_web_site_size new file mode 100755 index 0000000..29d86c0 --- /dev/null +++ b/check_web_site_size @@ -0,0 +1,45 @@ +#!/bin/sh + +# curl -s https://www.homedepot.com/p/HDX-Black-5-Tier-Plastic-Garage-Storage-Shelving-Unit-36-in-W-x-74-in-H-x-18-in-D-241592/306331734 | grep -v href | md5sum | awk '{print $1}' + +verbose="" +size=0 + +while [ -n "$1" ]; do + case "$1" in + -v) verbose="true"; shift 1;; + -u) url="$2"; shift 2;; + -s) size="$2"; shift 2;; + *) shift 1;; + esac +done + +# curl -skL "https://www.wyze.com/products/wyze-cam-v3" -w '%{size_download}' -o /dev/null +agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:97.0) Gecko/20100101 Firefox/97.0" +[ -n "$verbose" ] && echo "DEBUG: curl --connect-timeout 10 -A \"$agent\" -skL \"$url\" -w \"%{size_download}\" -o /dev/null" +checkSize=$(curl --connect-timeout 10 -A "$agent" -skL "$url" -w "%{size_download}" -o /dev/null) +status=$? +if [ "$status" != "0" ]; then + sleep 2 + checkSize=$(curl --connect-timeout 10 -A "$agent" -skL "$url" -w "%{size_download}" -o /dev/null) + status=$? +fi + +case $status in + 0) ;; + 3) echo "UNKNOWN: malformed URL $url" && exit 3;; + 6) echo "WARNING: could not resolve host for $url" && exit 3;; + 7) echo "WARNING: could not connect to host $url" && exit 1;; + 28) echo "WARNING: curl timeout" && exit 1;; + 35) echo "WARNING: TLS/SSL handshake failure - $output" && exit 1;; + 47) echo "WARNING: too many redirects" && exit 1;; + 52) echo "WARNING: $url returned no data" && exit 1;; +esac + +if [ "$size" = "$checkSize" ]; then + echo "OK; received $size bytes|bytes=${checkSize}B" + exit 0 +else + echo "CRITICAL; $checkSize is not expected value of $size bytes|bytes=${checkSize}B" + exit 2 +fi