mirror of
				https://github.com/librenms/librenms.git
				synced 2024-10-07 16:52:45 +00:00 
			
		
		
		
	refactor: DB Updates will now file level lock to stop duplicate updates (#6469)
* refactor: DB Updates will now file level lock to stop duplicate updates * scrut fixes * renamed function from clear_lock() to release_lock()
This commit is contained in:
		
							
								
								
									
										18
									
								
								alerts.php
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								alerts.php
									
									
									
									
									
								
							@@ -30,21 +30,7 @@ require __DIR__ . '/includes/init.php';
 | 
			
		||||
 | 
			
		||||
$options = getopt('d::');
 | 
			
		||||
 | 
			
		||||
$lock = false;
 | 
			
		||||
if (file_exists($config['install_dir'].'/.alerts.lock')) {
 | 
			
		||||
    $pids = explode("\n", trim(`ps -e | grep php | awk '{print $1}'`));
 | 
			
		||||
    $lpid = trim(file_get_contents($config['install_dir'].'/.alerts.lock'));
 | 
			
		||||
    if (in_array($lpid, $pids)) {
 | 
			
		||||
        $lock = true;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if ($lock === true) {
 | 
			
		||||
    exit(1);
 | 
			
		||||
} else {
 | 
			
		||||
    file_put_contents($config['install_dir'].'/.alerts.lock', getmypid());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
set_lock('alerts');
 | 
			
		||||
 | 
			
		||||
if (isset($options['d'])) {
 | 
			
		||||
    echo "DEBUG!\n";
 | 
			
		||||
@@ -74,7 +60,7 @@ if (!defined('TEST') && $config['alert']['disable'] != 'true') {
 | 
			
		||||
    echo 'End  : '.date('r')."\r\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unlink($config['install_dir'].'/.alerts.lock');
 | 
			
		||||
release_lock('alerts');
 | 
			
		||||
 | 
			
		||||
function ClearStaleAlerts()
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -113,7 +113,9 @@ if (!$where) {
 | 
			
		||||
    exit;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
require 'includes/sql-schema/update.php';
 | 
			
		||||
if (get_lock('schema') === false) {
 | 
			
		||||
    require 'includes/sql-schema/update.php';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$discovered_devices = 0;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -9,16 +9,32 @@ then you can do this by running the following command as the **librenms** user:
 | 
			
		||||
This will update both the core LibreNMS files but also update the database
 | 
			
		||||
structure if updates are available.
 | 
			
		||||
 | 
			
		||||
#### Advanced users
 | 
			
		||||
If you absolutely must update manually then you can do so by running the following commands:
 | 
			
		||||
```bash
 | 
			
		||||
cd /opt/librenms
 | 
			
		||||
git pull
 | 
			
		||||
php includes/sql-schema/update.php
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Configuring the update channel ##
 | 
			
		||||
LibreNMS follows the master branch on github for daily updates.
 | 
			
		||||
You can change to the monthly releases by setting:
 | 
			
		||||
 | 
			
		||||
#### Stable branch
 | 
			
		||||
You can change to the stable monthly branch by setting:
 | 
			
		||||
 | 
			
		||||
`$config['update_channel'] = 'release';`
 | 
			
		||||
 | 
			
		||||
> Choose this branch if you want to have a stable release 
 | 
			
		||||
 | 
			
		||||
#### Development branch
 | 
			
		||||
You can change to the development branch by setting:
 | 
			
		||||
 | 
			
		||||
`$config['update_channel'] = 'master';`
 | 
			
		||||
 | 
			
		||||
> Choose this branch if you want the latest features at the cost that sometimes bugs are inadvertently introduced. 
 | 
			
		||||
 | 
			
		||||
## Disabling automatic updates ##
 | 
			
		||||
LibreNMS by default performs updates on a daily basis. This can be disabled
 | 
			
		||||
by ensuring:
 | 
			
		||||
LibreNMS by default performs updates on a daily basis. This can be disabled by setting:
 | 
			
		||||
 | 
			
		||||
`$config['update'] = 0;`
 | 
			
		||||
 | 
			
		||||
is no longer commented out. 
 | 
			
		||||
 
 | 
			
		||||
@@ -57,7 +57,7 @@ $msg_box = array();
 | 
			
		||||
// Check for install.inc.php
 | 
			
		||||
if (!file_exists('../config.php') && $_SERVER['PATH_INFO'] != '/install.php') {
 | 
			
		||||
    // no config.php does so let's redirect to the install
 | 
			
		||||
    header('Location: install.php');
 | 
			
		||||
    header("Location: {$config['base_url']}/install.php");
 | 
			
		||||
    exit;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ if ($stage > 3) {
 | 
			
		||||
require realpath(__DIR__ . '/..') . '/includes/init.php';
 | 
			
		||||
 | 
			
		||||
// List of php modules we expect to see
 | 
			
		||||
$modules = array('gd','mysqli','snmp','mcrypt');
 | 
			
		||||
$modules = array('gd','mysqli','mcrypt');
 | 
			
		||||
 | 
			
		||||
$dbhost = @$_POST['dbhost'] ?: 'localhost';
 | 
			
		||||
$dbuser = @$_POST['dbuser'] ?: 'librenms';
 | 
			
		||||
 
 | 
			
		||||
@@ -2327,6 +2327,53 @@ function db_schema_is_current()
 | 
			
		||||
    return $current >= $latest;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Get the lock status for a given name
 | 
			
		||||
 * @param $name
 | 
			
		||||
 * @return bool
 | 
			
		||||
 */
 | 
			
		||||
function get_lock($name)
 | 
			
		||||
{
 | 
			
		||||
    global $config;
 | 
			
		||||
    $lock_file = $config['install_dir']."/.$name.lock";
 | 
			
		||||
    if (file_exists($lock_file)) {
 | 
			
		||||
        $pids = explode("\n", trim(`ps -e | grep php | awk '{print $1}'`));
 | 
			
		||||
        $lpid = trim(file_get_contents($lock_file));
 | 
			
		||||
        if (in_array($lpid, $pids)) {
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Set the lock status for a given name
 | 
			
		||||
 * @param $name
 | 
			
		||||
 */
 | 
			
		||||
function set_lock($name)
 | 
			
		||||
{
 | 
			
		||||
    global $config;
 | 
			
		||||
    $lock_file = $config['install_dir']."/.$name.lock";
 | 
			
		||||
    $lock = get_lock($name);
 | 
			
		||||
 | 
			
		||||
    if ($lock === true) {
 | 
			
		||||
        echo "$lock_file exists, exiting\n";
 | 
			
		||||
        exit(1);
 | 
			
		||||
    } else {
 | 
			
		||||
        file_put_contents($lock_file, getmypid());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Release lock file for a given name
 | 
			
		||||
 * @param $name
 | 
			
		||||
 */
 | 
			
		||||
function release_lock($name)
 | 
			
		||||
{
 | 
			
		||||
    global $config;
 | 
			
		||||
    unlink($config['install_dir']."/.$name.lock");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @param $device
 | 
			
		||||
 * @return int|null
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,8 @@
 | 
			
		||||
 * See COPYING for more details.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
set_lock('schema');
 | 
			
		||||
 | 
			
		||||
if (!isset($debug)  && php_sapi_name() == 'cli') {
 | 
			
		||||
    // Not called from within discovery, let's load up the necessary stuff.
 | 
			
		||||
    $init_modules = array();
 | 
			
		||||
@@ -24,8 +26,11 @@ if (!isset($debug)  && php_sapi_name() == 'cli') {
 | 
			
		||||
    $debug = isset($options['d']);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
d_echo("DB Schema update started....\n");
 | 
			
		||||
 | 
			
		||||
if (db_schema_is_current()) {
 | 
			
		||||
    d_echo("DB Schema already up to date.\n");
 | 
			
		||||
    release_lock('schema');
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -91,3 +96,5 @@ if ($updating) {
 | 
			
		||||
        $_SESSION['build-ok'] = true;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
release_lock('schema');
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,3 @@
 | 
			
		||||
UPDATE dbSchema SET version = 107;
 | 
			
		||||
CREATE TABLE bill_port_counters_tmp(port_id int NOT NULL PRIMARY KEY, `timestamp` timestamp NOT NULL DEFAULT current_timestamp, in_counter bigint, in_delta bigint NOT NULL DEFAULT 0, out_counter bigint, out_delta bigint NOT NULL DEFAULT 0);
 | 
			
		||||
INSERT INTO bill_port_counters_tmp(port_id, timestamp, in_counter, out_counter) SELECT q.port_id, q.max_timestamp, max(i.counter), max(o.counter) FROM (SELECT port_id, MAX(`timestamp`) AS max_timestamp FROM port_in_measurements GROUP BY port_id) q INNER JOIN port_in_measurements i ON q.port_id = i.port_id AND q.max_timestamp = i.timestamp INNER JOIN port_out_measurements o ON q.port_id = o.port_id AND q.max_timestamp = o.timestamp GROUP BY q.port_id, q.max_timestamp;
 | 
			
		||||
RENAME TABLE bill_port_counters_tmp TO bill_port_counters;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,3 @@
 | 
			
		||||
UPDATE dbSchema SET version = 118;
 | 
			
		||||
ALTER TABLE `eventlog` ADD `device_id` INT NOT NULL AFTER `host` ;
 | 
			
		||||
ALTER TABLE `eventlog` ADD INDEX ( `device_id` ) ;
 | 
			
		||||
UPDATE eventlog SET device_id=host WHERE device_id=0;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,3 @@
 | 
			
		||||
UPDATE `dbSchema` SET `version` = 171;
 | 
			
		||||
ALTER TABLE `access_points` DEFAULT CHARSET=utf8 COLLATE utf8_unicode_ci;
 | 
			
		||||
ALTER TABLE `alert_map` DEFAULT CHARSET=utf8 COLLATE utf8_unicode_ci;
 | 
			
		||||
ALTER TABLE `alert_rules` DEFAULT CHARSET=utf8 COLLATE utf8_unicode_ci;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user