Files
librenms-librenms/LibreNMS/Validations/User.php
Tony Murray 5f0388f0e3 Remove DB credentials from config.php
Better validation when config.php does not exist

Update docs and quote password

only populate legacy vars in config_to_json
drop .travis.yml config copy
remove credentials from config.php.default

Check for existance of .env instead of config.php in python scripts

legacy credential cleanup

tiny cleanups

consistent env for artisan server and artisan dusk
2020-06-27 07:47:08 -05:00

145 lines
5.6 KiB
PHP

<?php
/**
* User.php
*
* Check that user is set properly and we are running as the correct user. Check that user is the owner of install_dir.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @package LibreNMS
* @link http://librenms.org
* @copyright 2017 Tony Murray
* @author Tony Murray <murraytony@gmail.com>
*/
namespace LibreNMS\Validations;
use Illuminate\Support\Str;
use LibreNMS\Config;
use LibreNMS\Util\Env;
use LibreNMS\Util\Git;
use LibreNMS\ValidationResult;
use LibreNMS\Validator;
class User extends BaseValidation
{
/**
* Validate this module.
* To return ValidationResults, call ok, warn, fail, or result methods on the $validator
*
* @param Validator $validator
*/
public function validate(Validator $validator)
{
// Check we are running this as the root user
$username = $validator->getUsername();
$lnms_username = Config::get('user', 'librenms');
$lnms_groupname = Config::get('group', $lnms_username); // if group isn't set, fall back to user
if (!($username === 'root' || $username === $lnms_username)) {
if (isCli()) {
$validator->fail("You need to run this script as $lnms_username or root");
} elseif (function_exists('posix_getgrnam')) {
$lnms_group = posix_getgrnam($lnms_groupname);
if (!in_array($username, $lnms_group['members'])) {
$validator->fail(
"Your web server or php-fpm is not running as user '$lnms_username' or in the group '$lnms_groupname''",
"usermod -a -G $lnms_groupname $username"
);
}
}
}
// skip if docker image
if (Env::librenmsDocker()) {
return;
}
# if no git, then we probably have different permissions by design
if (!Git::repoPresent()) {
return;
}
// Let's test the user configured if we have it
if ($lnms_username) {
$dir = Config::get('install_dir');
$log_dir = Config::get('log_dir', "$dir/logs");
$rrd_dir = Config::get('rrd_dir', "$dir/rrd");
// generic fix
$fix = [
"sudo chown -R $lnms_username:$lnms_groupname $dir",
"sudo setfacl -d -m g::rwx $rrd_dir $log_dir $dir/bootstrap/cache/ $dir/storage/",
"sudo chmod -R ug=rwX $rrd_dir $log_dir $dir/bootstrap/cache/ $dir/storage/",
];
$find_result = rtrim(`find $dir \! -user $lnms_username -o \! -group $lnms_groupname 2> /dev/null`);
if (!empty($find_result)) {
// Ignore files created by the webserver
$ignore_files = array(
"$log_dir/error_log",
"$log_dir/access_log",
"$dir/bootstrap/cache/",
"$dir/storage/framework/cache/",
"$dir/storage/framework/sessions/",
"$dir/storage/framework/views/",
"$dir/storage/debugbar/",
"$dir/.pki/", // ignore files/folders created by setting the librenms home directory to the install directory
);
$files = array_filter(explode(PHP_EOL, $find_result), function ($file) use ($ignore_files) {
if (Str::startsWith($file, $ignore_files)) {
return false;
}
return true;
});
if (!empty($files)) {
$result = ValidationResult::fail(
"We have found some files that are owned by a different user than $lnms_username, this " .
'will stop you updating automatically and / or rrd files being updated causing graphs to fail.'
)
->setFix($fix)
->setList('Files', $files);
$validator->result($result);
return;
}
}
// check folder permissions
$folders = [
'rrd' => $rrd_dir,
'log' => $log_dir,
'bootstrap' => "$dir/bootstrap/cache/",
'storage' => "$dir/storage/",
'cache' => "$dir/storage/framework/cache/",
'sessions' => "$dir/storage/framework/sessions/",
'views' => "$dir/storage/framework/views/",
];
$folders_string = implode(' ', $folders);
$incorrect = exec("find $folders_string -group $lnms_groupname ! -perm -g=w");
if (!empty($incorrect)) {
$validator->result(ValidationResult::fail(
'Some folders have incorrect file permissions, this may cause issues.'
)->setFix($fix)->setList('Files', explode(PHP_EOL, $incorrect)));
}
} else {
$validator->warn("You don't have \$config['user'] set, this most likely needs to be set to librenms");
}
}
}