2020-05-06 17:58:17 +02:00
< ? php
/**
* Python . php
*
* Check that various Python modules and functions exist .
*
* 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
2021-02-09 00:29:04 +01:00
* along with this program . If not , see < https :// www . gnu . org / licenses />.
2020-05-06 17:58:17 +02:00
*
2021-02-09 00:29:04 +01:00
* @ link https :// www . librenms . org
2021-09-10 20:09:53 +02:00
*
2020-05-06 17:58:17 +02:00
* @ copyright 2020 Thomas Berberich
* @ author Thomas Berberich < sourcehhdoctor @ gmail . com >
*/
namespace LibreNMS\Validations ;
use LibreNMS\Config ;
use LibreNMS\Util\Version ;
use LibreNMS\Validator ;
2020-05-08 09:54:30 -05:00
use Symfony\Component\Process\Process ;
2020-05-06 17:58:17 +02:00
class Python extends BaseValidation
{
const PYTHON_MIN_VERSION = '3.4.0' ;
/**
* Validate this module .
* To return ValidationResults , call ok , warn , fail , or result methods on the $validator
*
2021-09-08 23:35:56 +02:00
* @ param Validator $validator
2020-05-06 17:58:17 +02:00
*/
2022-06-10 16:25:33 -05:00
public function validate ( Validator $validator ) : void
2020-05-06 17:58:17 +02:00
{
2021-11-17 19:23:55 -06:00
$version = Version :: get () -> python ();
2020-05-06 17:58:17 +02:00
if ( empty ( $version )) {
2020-05-08 09:54:30 -05:00
$validator -> fail ( 'python3 not found' , 'Install Python 3 for your system.' );
2020-09-21 14:54:51 +02:00
2020-05-06 17:58:17 +02:00
return ; // no need to check anything else
}
$this -> checkVersion ( $validator , $version );
2020-05-30 11:09:54 -05:00
$this -> checkPipVersion ( $validator , $version );
2020-05-06 17:58:17 +02:00
$this -> checkExtensions ( $validator );
}
private function checkVersion ( Validator $validator , $version )
{
if ( version_compare ( $version , self :: PYTHON_MIN_VERSION , '<' )) {
2020-05-08 09:54:30 -05:00
$validator -> warn ( " Python version $version too old. " , 'Python version ' . self :: PYTHON_MIN_VERSION . ' is the minimum supported version. We recommend you update Python to a supported version.' );
2020-05-06 17:58:17 +02:00
}
}
2020-05-30 11:09:54 -05:00
private function checkPipVersion ( Validator $validator , $version )
{
2020-08-01 09:27:59 -05:00
preg_match ( '/\(python ([0-9.]+)\)/' , `pip3 --version 2>/dev/null` , $matches );
2020-05-30 11:09:54 -05:00
$pip = $matches [ 1 ];
$python = implode ( '.' , array_slice ( explode ( '.' , $version ), 0 , 2 ));
2020-06-08 08:11:53 -05:00
if ( $pip && version_compare ( $python , $pip , '!=' )) {
2020-05-30 11:09:54 -05:00
$validator -> fail ( " python3 ( $python ) and pip3 ( $pip ) versions do not match. This likely will cause dependencies to be installed for the wrong python version. " );
}
}
2020-05-06 17:58:17 +02:00
private function checkExtensions ( Validator $validator )
{
2021-11-10 17:38:50 +01:00
$pythonExtensions = '/scripts/dynamic_check_requirements.py' ;
2020-05-08 09:54:30 -05:00
$process = new Process ([ Config :: get ( 'install_dir' ) . $pythonExtensions , '-v' ]);
$process -> run ();
2020-05-06 17:58:17 +02:00
2020-05-08 09:54:30 -05:00
if ( $process -> getExitCode () !== 0 ) {
2020-06-27 22:24:54 -05:00
$user = \config ( 'librenms.user' );
2020-05-16 11:33:59 -05:00
$user_mismatch = function_exists ( 'posix_getpwuid' ) ? ( posix_getpwuid ( posix_geteuid ())[ 'name' ] ? ? null ) !== $user : false ;
if ( $user_mismatch ) {
2021-11-17 10:23:37 -06:00
$validator -> warn (
" Could not check Python dependencies because this script is not running as $user " ,
'The install docs show how this is done on a new install: https://docs.librenms.org/Installation/Install-LibreNMS/#configure-php-fpm'
);
2020-05-12 08:16:22 -05:00
} else {
$validator -> fail ( " Python3 module issue found: ' " . $process -> getOutput () . " ' " , 'pip3 install -r ' . Config :: get ( 'install_dir' ) . '/requirements.txt' );
}
2020-05-06 17:58:17 +02:00
}
}
}