%PDF- %PDF-
Direktori : /backups/router/usr/local/sbin/ |
Current File : //backups/router/usr/local/sbin/carp_service_status |
#!/usr/local/bin/php <?php /* * Copyright (C) 2019 Deciso B.V. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ require_once 'config.inc'; require_once 'util.inc'; // Define a high value on service fail, so we can bitmask the current demotion easily. // This should prevent the need to maintain state elsewhere. define("SRV_FAIL_FACTOR", pow(2, 20)); // init carp service status openlog("carp", LOG_ODELAY, LOG_DAEMON); $fp = fopen('/var/run/carp_service_status.lock', 'a+e'); if (flock($fp, LOCK_EX)) { $current_demotion = get_single_sysctl("net.inet.carp.demotion"); $failed_services = array(); foreach (glob("/usr/local/etc/rc.carp_service_status.d/*") as $filename) { if (is_executable($filename)) { $status = mwexec($filename, true); if ($status != 0) { $failed_services[] = basename($filename); } } } $demotion_set = ($current_demotion & SRV_FAIL_FACTOR); if (!empty($failed_services) && !$demotion_set) { // demotion bitmask not set and service(s) fail(ed) syslog(LOG_WARNING, sprintf( "carp demoted by %d due to service disruption (services: %s)", SRV_FAIL_FACTOR, implode(",", $failed_services) )); set_single_sysctl("net.inet.carp.demotion", SRV_FAIL_FACTOR); } elseif (empty($failed_services) && $demotion_set) { // demotion bitmask set and service(s) operational syslog(LOG_WARNING, sprintf("carp promoted by %d due to service recovery", SRV_FAIL_FACTOR)); set_single_sysctl("net.inet.carp.demotion", -1 * SRV_FAIL_FACTOR); } flock($fp, LOCK_UN); fclose($fp); }