瀏覽代碼

Added healthChecks Plugin - WIP

CauseFX 6 年之前
父節點
當前提交
68694268d5

+ 4 - 0
.gitignore

@@ -127,6 +127,10 @@ api/plugins/*
 !api/plugins/api/chat.php
 !api/plugins/config/chat.php
 !api/plugins/js/chat.js
+!api/plugins/healthChecks.php
+!api/plugins/api/healthChecks.php
+!api/plugins/config/healthChecks.php
+!api/plugins/js/healthChecks.js
 !api/plugins/php-mailer.php
 !api/plugins/api/php-mailer.php
 !api/plugins/config/php-mailer.php

+ 59 - 0
api/plugins/api/healthChecks.php

@@ -0,0 +1,59 @@
+<?php
+if (isset($_POST['data']['plugin'])) {
+	switch ($_POST['data']['plugin']) {
+		case 'HealthChecks/settings/get':
+			if (qualifyRequest(1)) {
+				$result['status'] = 'success';
+				$result['statusText'] = 'success';
+				$result['data'] = healthCheckGetSettings();
+			} else {
+				$result['status'] = 'error';
+				$result['statusText'] = 'API/Token invalid or not set';
+				$result['data'] = null;
+			}
+			break;
+		case 'HealthChecks/run':
+			if (qualifyRequest($GLOBALS['HEALTHCHECKS-Auth-include'])) {
+				$result['status'] = 'success';
+				$result['statusText'] = 'success';
+				$result['data'] = healthCheckRun();
+			} else {
+				$result['status'] = 'error';
+				$result['statusText'] = 'API/Token invalid or not set';
+				$result['data'] = null;
+			}
+			break;
+		default:
+			//DO NOTHING!!
+			break;
+	}
+}
+if (isset($_GET['plugin']) && $_GET['plugin'] == 'HealthChecks' && isset($_GET['cmd'])) {
+	switch ($_GET['cmd']) {
+		case 'HealthChecks/settings/get':
+			if (qualifyRequest(1)) {
+				$result['status'] = 'success';
+				$result['statusText'] = 'success';
+				$result['data'] = healthCheckGetSettings();
+			} else {
+				$result['status'] = 'error';
+				$result['statusText'] = 'API/Token invalid or not set';
+				$result['data'] = null;
+			}
+			break;
+		case 'HealthChecks/run':
+			if (qualifyRequest($GLOBALS['HEALTHCHECKS-Auth-include'])) {
+				$result['status'] = 'success';
+				$result['statusText'] = 'success';
+				$result['data'] = healthCheckRun();
+			} else {
+				$result['status'] = 'error';
+				$result['statusText'] = 'API/Token invalid or not set';
+				$result['data'] = null;
+			}
+			break;
+		default:
+			//Do NOTHING!
+			break;
+	}
+}

+ 8 - 0
api/plugins/config/healthChecks.php

@@ -0,0 +1,8 @@
+<?php
+return array(
+	'HEALTHCHECKS-enabled' => false,
+	'HEALTHCHECKS-Auth-include' => '1',
+	'HEALTHCHECKS-option2-include' => '',
+	'HEALTHCHECKS-all-items' => '',
+	'HEALTHCHECKS-PingURL' => 'https://hc-ping.com/'
+);

+ 129 - 0
api/plugins/healthChecks.php

@@ -0,0 +1,129 @@
+<?php
+// PLUGIN INFORMATION
+$GLOBALS['plugins'][]['healthChecks'] = array( // Plugin Name
+	'name' => 'HealthChecks', // Plugin Name
+	'author' => 'CauseFX', // Who wrote the plugin
+	'category' => 'Utilities', // One to Two Word Description
+	'link' => '', // Link to plugin info
+	'license' => 'personal,business', // License Type use , for multiple
+	'idPrefix' => 'HEALTHCHECKS', // html element id prefix
+	'configPrefix' => 'HEALTHCHECKS', // config file prefix for array items without the hypen
+	'version' => '1.0.0', // SemVer of plugin
+	'image' => 'plugins/images/healthchecksio.png', // 1:1 non transparent image for plugin
+	'settings' => true, // does plugin need a settings page? true or false
+	'homepage' => false // Is plugin for use on homepage? true or false
+);
+// INCLUDE/REQUIRE FILES
+// PLUGIN FUNCTIONS
+function healthCheckTest($url)
+{
+	$success = false;
+	$options = array('verify' => false, 'verifyname' => false, 'follow_redirects' => true, 'redirects' => 1);
+	$headers = array('Token' => $GLOBALS['organizrAPI']);
+	$url = qualifyURL($url);
+	$response = Requests::get($url, $headers, $options);
+	if ($response->success) {
+		$success = true;
+	}
+	if ($response->status_code == 200) {
+		$success = true;
+	}
+	return $success;
+}
+
+function healthCheckUUID($uuid, $pass = false)
+{
+	if (!$uuid || !$pass || $GLOBALS['HEALTHCHECKS-PingURL'] == '') {
+		return false;
+	}
+	$url = qualifyURL($GLOBALS['HEALTHCHECKS-PingURL']);
+	$uuid = '/' . $uuid;
+	$path = !$pass ? '/fail' : '';
+	$response = Requests::get($url . $uuid . $path, [], []);
+	return $response;
+}
+
+function healthCheckRun()
+{
+	$continue = $GLOBALS['HEALTHCHECKS-all-items'] !== '' ? $GLOBALS['HEALTHCHECKS-all-items'] : false;
+	if ($continue && $GLOBALS['HEALTHCHECKS-enabled'] && !empty($GLOBALS['HEALTHCHECKS-PingURL']) && qualifyRequest($GLOBALS['HEALTHCHECKS-Auth-include'])) {
+		$allItems = [];
+		foreach ($GLOBALS['HEALTHCHECKS-all-items'] as $k => $v) {
+			
+			if ($k !== false) {
+				foreach ($v as $item) {
+					$allItems[$k][$item['label']] = $item['value'];
+				}
+			}
+		}
+		foreach ($allItems as $k => $v) {
+			if ($v['Enabled'] == 'false') {
+				unset($allItems[$k]);
+			}
+			if (!$v['UUID']) {
+				unset($allItems[$k]);
+			}
+		}
+		foreach ($allItems as $k => $v) {
+			$testLocal = $v['Internal URL'] !== '' ?? false;
+			$testExternal = $v['External URL'] !== '' ?? false;
+			$testBoth = ($testLocal && $testExternal) ?? false;
+			$pass = false;
+			if ($testLocal) {
+				$allItems[$k]['results']['internal'] = (healthCheckTest($v['Internal URL'])) ? 'Success' : 'Error';
+			}
+			if ($testExternal) {
+				$allItems[$k]['results']['external'] = (healthCheckTest($v['External URL'])) ? 'Success' : 'Error';
+			}
+			if ($testBoth) {
+				if ($allItems[$k]['results']['external'] == 'Success' && $allItems[$k]['results']['internal'] == 'Success') {
+					$pass = true;
+				}
+			} elseif ($testLocal) {
+				if ($allItems[$k]['results']['internal'] == 'Success') {
+					$pass = true;
+				}
+			} elseif ($testExternal) {
+				if ($allItems[$k]['results']['external'] == 'Success') {
+					$pass = true;
+				}
+			}
+			healthCheckUUID($v['UUID'], 'true');
+		}
+		return $allItems;
+	} else {
+		'No Access';
+	}
+}
+
+/* GET HEALTHCHECK SETTINGS */
+function healthCheckGetSettings()
+{
+	return array(
+		'Options' => array(
+			array(
+				'type' => 'select',
+				'name' => 'HEALTHCHECKS-Auth-include',
+				'label' => 'Minimum Authentication',
+				'value' => $GLOBALS['HEALTHCHECKS-Auth-include'],
+				'options' => groupSelect()
+			),
+			array(
+				'type' => 'input',
+				'name' => 'HEALTHCHECKS-PingURL',
+				'label' => 'URL',
+				'value' => $GLOBALS['HEALTHCHECKS-PingURL'],
+				'help' => 'URL for HealthChecks Ping',
+				'placeholder' => 'HealthChecks Ping URL'
+			),
+		),
+		'Services' => array(
+			array(
+				'type' => 'arrayMultiple',
+				'name' => 'HEALTHCHECKS-all-items',
+				'label' => 'Services',
+				'value' => $GLOBALS['HEALTHCHECKS-all-items']
+			)
+		)
+	);
+}

+ 131 - 0
api/plugins/js/healthChecks.js

@@ -0,0 +1,131 @@
+/* PHP MAILER JS FILE */
+/*
+$(document).on('click', '#PHPMAILER-settings-button', function() {
+	var post = {
+        plugin:'PHPMailer/settings/get', // used for switch case in your API call
+        api:'api/?v1/plugin', // API Endpoint will always be this for custom plugin API calls
+        name:$(this).attr('data-plugin-name'),
+        configName:$(this).attr('data-config-name'),
+        messageTitle:'', // Send succees message title (top line)
+        messageBody:'Disabled '+$(this).attr('data-plugin-name'), // Send succees message body (bottom line)
+        error:'Organizr Function: API Connection Failed' // conole error message
+    };
+	var callbacks = $.Callbacks(); // init callbacks var
+    //callbacks.add(  ); // add function to callback to be fired after API call
+    //settingsAPI(post,callbacks); // exec API call
+    //ajaxloader(".content-wrap","in");
+    //setTimeout(function(){ buildPlugins();ajaxloader(); }, 3000);
+});
+*/
+
+// FUNCTIONS
+
+// EVENTS and LISTENERS
+
+// CHANGE CUSTOMIZE Options
+//
+$(document).on('click', '#HEALTHCHECKS-settings-button', function() {
+    var post = {
+        plugin:'HealthChecks/settings/get', // used for switch case in your API call
+    };
+    ajaxloader(".content-wrap","in");
+    organizrAPI('POST','api/?v1/plugin',post).success(function(data) {
+        var response = JSON.parse(data);
+        $('#HEALTHCHECKS-settings-items').html(buildFormGroup(response.data));
+        var elAddButtonStart = $('#HEALTHCHECKS-settings-page [id*="Services"] .row.start');
+        var testone = $('#HEALTHCHECKS-settings-page [id*="Services"] .row.m-b-40').first('span')
+        var testtwo = $('#HEALTHCHECKS-settings-page [id*="Services"] .row.m-b-40 span')
+        $(elAddButtonStart).after('<div class="row"><button type="button" class="btn btn-info pull-right m-r-20 addNewHCService" ><i class="fa fa-plus"></i> Add New Service</button></div>');
+        $.each(testtwo, function(key,val) {
+            var el = $(val);
+            var text = el.text();
+            if(text === 'Service Name'){
+                $(this).after('&nbsp;<code lang="en" class="m-l-20 removeHCService mouse">Remove Service</code>');
+            }
+        })
+
+    }).fail(function(xhr) {
+        console.error("Organizr Function: API Connection Failed");
+    });
+    ajaxloader();
+});
+$(document).on('click', '.addNewHCService', function() {
+    var lastEl = $('#HEALTHCHECKS-settings-page [name*="HEALTHCHECKS-all-items"]').last().attr('name');
+    var newNum = 0;
+    if(typeof lastEl !== 'undefined'){
+        lastEl = Number($('#HEALTHCHECKS-settings-page [name*="HEALTHCHECKS-all-items"]').last().attr('name').replace(/\D/g, ''));
+        newNum = lastEl + 1;
+    }
+    var copyEl = '' +
+        '<div class="row m-b-40">\n' +
+        '\t<!-- INPUT BOX  Yes Multiple -->\n' +
+        '\t<div class="col-md-6 p-b-10">\n' +
+        '\t\t<div class="form-group">\n' +
+        '\t\t\t<label class="control-label col-md-12"><span lang="en">Service Name</span>&nbsp;<code lang="en" class="m-l-20 removeHCService mouse">Remove Service</code></label>\n' +
+        '\t\t\t<div class="col-md-12"> <input data-changed="false" lang="en" type="text" class="form-control" value="" name="HEALTHCHECKS-all-items[999999].name" data-type="input" data-label="Service Name" autocomplete="new-password"> </div> <!-- end div -->\n' +
+        '\t\t</div>\n' +
+        '\t</div>\n' +
+        '\t<!--/ INPUT BOX -->\n' +
+        '\n' +
+        '\t<!-- INPUT BOX  Yes Multiple -->\n' +
+        '\t<div class="col-md-6 p-b-10">\n' +
+        '\t\t<div class="form-group">\n' +
+        '\t\t\t<label class="control-label col-md-12"><span lang="en">UUID</span></label>\n' +
+        '\t\t\t<div class="col-md-12"> <input data-changed="false" lang="en" type="text" class="form-control" value="" name="HEALTHCHECKS-all-items[999999].uuid" data-type="input" data-label="UUID" autocomplete="new-password"> </div> <!-- end div -->\n' +
+        '\t\t</div>\n' +
+        '\t</div>\n' +
+        '\t<!--/ INPUT BOX -->\n' +
+        '\n' +
+        '\t<!-- INPUT BOX  Yes Multiple -->\n' +
+        '\t<div class="col-md-6 p-b-10">\n' +
+        '\t\t<div class="form-group">\n' +
+        '\t\t\t<label class="control-label col-md-12"><span lang="en">External URL</span></label>\n' +
+        '\t\t\t<div class="col-md-12"> <input data-changed="false" lang="en" type="text" class="form-control" value="" name="HEALTHCHECKS-all-items[999999].external" data-type="input" data-label="External URL" autocomplete="new-password"> </div> <!-- end div -->\n' +
+        '\t\t</div>\n' +
+        '\t</div>\n' +
+        '\t<!--/ INPUT BOX -->\n' +
+        '\n' +
+        '\t<!-- INPUT BOX  Yes Multiple -->\n' +
+        '\t<div class="col-md-6 p-b-10">\n' +
+        '\t\t<div class="form-group">\n' +
+        '\t\t\t<label class="control-label col-md-12"><span lang="en">Internal URL</span></label>\n' +
+        '\t\t\t<div class="col-md-12"> <input data-changed="false" lang="en" type="text" class="form-control" value="" name="HEALTHCHECKS-all-items[999999].internal" data-type="input" data-label="Internal URL" autocomplete="new-password"> </div> <!-- end div -->\n' +
+        '\t\t</div>\n' +
+        '\t</div>\n' +
+        '\t<!--/ INPUT BOX -->\n' +
+        '\n' +
+        '\t<!-- INPUT BOX  Yes Multiple -->\n' +
+        '\t<div class="col-md-6 p-b-10">\n' +
+        '\t\t<div class="form-group">\n' +
+        '\t\t\t<label class="control-label col-md-12"><span lang="en">Enabled</span></label>\n' +
+        '\t\t\t<div class="col-md-12"> <input data-changed="false" type="checkbox" class="js-switch" data-size="small" data-color="#99d683" data-secondary-color="#f96262" name="HEALTHCHECKS-all-items[999999].enabled" value="" checked="" data-type="switch" data-label="Enabled"><input data-changed="false" type="hidden" name="HEALTHCHECKS-all-items[999999].enabled" value=""> </div> <!-- end div -->\n' +
+        '\t\t</div>\n' +
+        '\t</div>\n' +
+        '\t<!--/ INPUT BOX -->\n' +
+        '</div>'
+//smallLabel+'<input data-changed="false" type="checkbox" class="js-switch'+extraClass+'" data-size="small" data-color="#99d683" data-secondary-color="#f96262"'+name+value+tof(item.value,'c')+id+disabled+type+label+attr+' /><input data-changed="false" type="hidden"'+name+'value="false">';
+    var elAddButtonStart = $('#HEALTHCHECKS-settings-page [id*="Services"] .row.start');
+    var copiedEl = $(copyEl).clone();
+    copiedEl.find("input").each(function() {
+        var currentName = $(this).attr("name");
+        var newName = currentName.replace('999999', newNum);
+        $(this).attr("name", newName);
+        $(this).attr("value", "");
+    });
+    $(copiedEl).appendTo(elAddButtonStart);
+    $(function () {
+        // Switchery
+        var elems = Array.prototype.slice.call(document.querySelectorAll('.js-switch'));
+        $('.js-switch').each(function() {
+            if ($(this).attr('data-switchery') !== 'true'){
+                new Switchery($(this)[0], $(this).data());
+            }
+        });
+    });
+
+});
+
+$(document).on('click', '.removeHCService', function() {
+    $(this).closest('.row').remove();
+    $('#HEALTHCHECKS-settings-page-save').removeClass('hidden');
+});

二進制
plugins/images/healthchecksio.png