Added filers

This commit is contained in:
Antonio de la Rosa 2025-12-11 21:37:45 +01:00
commit 33899c38a4
5 changed files with 385 additions and 0 deletions

5
.gitignore vendored Normal file
View file

@ -0,0 +1,5 @@
*~
composer.lock
vendor/*
!vendor/phangoapp
settings/

12
composer.json Normal file
View file

@ -0,0 +1,12 @@
{
"repositories": [
{
"type": "path",
"url": "./vendor/phangoapp/cuchuluphputils"
}
],
"require": {
"phangoapp/cuchuluphputils": "dev-master"
}
}

View file

@ -0,0 +1,20 @@
{
"name": "phangoapp/cuchuluphputils",
"description": "A set of classes and methods for make shell operations in linux",
"require-dev": {
"phpunit/phpunit": "^12"
},
"license": "GPL3",
"authors": [
{
"name": "Antonio de la Rosa",
"email": "antonio.delarosa@cuchulu.com"
}
],
"minimum-stability": "stable",
"autoload": {
"psr-4": {
"PhangoApp\\CuchuluPHPUtils\\": "src"
}
}
}

View file

@ -0,0 +1,327 @@
<?php
namespace PhangoApp\CuchuluPHPUtils;
class Linux {
static public function shell_command($arr_command, $exit_if_error=1) {
$error=0;
for($x=1;$x<count($arr_command);$x++) {
$arr_command[$x]=escapeshellcmd($arr_command[$x]);
}
$final_command=implode(' ', $arr_command);
$descriptorspec = array(
0 => array("pipe", "r"), // stdin
1 => array("pipe", "w"), // stdout
2 => array("pipe", "w") // stderr
);
$pipes=[];
$process=proc_open($final_command, $descriptorspec, $pipes);
if(is_resource($process)) {
while($s=fgets($pipes[1])) {
echo $s;
flush();
}
while($e=fgets($pipes[2])) {
echo $e;
flush();
}
}
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
$result=proc_close($process);
if($result>0) {
echo 'Error executing command '.$final_command."\n";
if($exit_if_error) {
exit($result);
}
else {
return $result;
}
}
}
static public function get_linux_distro() {
$file_distro=__DIR__.'/../../../../settings/distro.php';
$dir_distro=__DIR__.'/../../../../settings/';
if(!is_file($file_distro)) {
ob_start();
Linux::shell_command(['python3 -c "import distro;print(distro.id())"']);
$distro=trim(ob_get_contents());
ob_end_clean();
$distro_data="<?php\n\ndefine('DISTRO_LINUX', '".$distro."');";
if(!is_dir($dir_distro)) {
if(!mkdir($dir_distro)) {
throw new \Exception('Sorry, cannot create settings directory');
}
}
if(!file_put_contents($file_distro, $distro_data)) {
throw new \Exception('Sorry, cannot create settings config file');
}
}
else {
if(!defined('DISTRO_LINUX')) {
include_once($file_distro);
}
$distro=DISTRO_LINUX;
}
return $distro;
}
static public function add_new_user($username, $password='', $user_directory='', $shell='/usr/sbin/nologin') {
$str_user="sudo useradd -m -s ${shell}";
if($password!='') {
$salt_str='\$6\$'.\str_replace('$', '\$', Linux::generate_random_password(10)).'\$';
$hash=crypt($password, $salt_str);
$str_user.=" -p \"${hash}\"";
echo $str_user;
}
if($user_directory!='') {
$str_user.=" -d \"${user_directory}\"";
}
$str_user.=" ${username}";
return Linux::shell_command([$str_user]);
}
static public function user_delete($username) {
}
static public function install_package($package) {
$distro=Linux::get_linux_distro();
if(!isset($package[$distro])) {
echo "Sorry, you don't have a package install for this distro\n";
exit(1);
}
if($distro=='debian' || $distro=='ubuntu') {
return Linux::shell_command(['sudo DEBIAN_FRONTEND="noninteractive" apt-get install -y '.$package[$distro]]);
}
else if($distro=='fedora' || $distro=='almalinux' || $distro=='rocky') {
//if call("sudo dnf install -y {}".format(package[linux_distro]), shell=True) > 0:
return Linux::shell_command(['sudo dnf install -y '.$package[$distro]]);
}
else if($distro=='arch') {
//sudo pacman -S --noconfirm
return Linux::shell_command(['sudo pacman -S --noconfirm '.$package[$distro]]);
}
}
static public function patch_file($original_file, $patch_file) {
$distro=Linux::get_linux_distro();
//if call("sudo patch {} < {}".format(original_file[linux_distro], patch_file[linux_distro]), shell=True) > 0:
if(!isset($original_file[$distro])) {
echo "Sorry, you don't have a patch for this distro\n\n";
exit(1);
}
Linux::shell_command(["sudo patch ${original_file[$distro]} < ${patch_file[$distro]}"]);
}
static public function systemd_service($action, $service) {
$distro=Linux::get_linux_distro();
if(!isset($service[$distro])) {
echo "Sorry, you don't have a service reload for this distro\n\n";
exit(1);
}
return Linux::shell_command(["sudo systemctl ${action} ".$service[$distro]]);
}
static public function exec($executable) {
$distro=Linux::get_linux_distro();
if(!isset($executable[$distro])) {
echo "Sorry, you don't have a exec for this distro\n\n";
exit(1);
}
return Linux::shell_command($executable[$distro]);
}
static public function sed($arr_sed) {
$distro=Linux::get_linux_distro();
if(!isset($arr_sed[$distro])) {
echo "Sorry, you don't have a sed str for this distro\n\n";
exit(1);
}
return Linux::shell_command(["sudo sed -i", "\"s/".$arr_sed[$distro][0]."/".$arr_sed[$distro][1]."/g\" ".$arr_sed[$distro][2]]);
}
static public function json_log($message, $error=0, $status=0, $progress=0, $no_progress=0) {
$log=["error" => $error, "status" => $status, "progress" => $progress, "no_progress" => $no_progress, "message" => $message];
echo json_encode($log)."\n";
}
static public function check_domain_name($domain_name) {
return preg_match("/^(a-z\d*)(\.(a-z\d*))*$/i", $domain_name);
}
/**
* Function used for generate a simple random password. Used RamdomLib from Ircmaxell
*
* @param string $length_pass A variable used for set the character's length the password. More length, password more secure
*
*/
static public function generate_random_password($length_pass=32)
{
$x=0;
$z=0;
$abc=array( 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '*', '+', '!', '-', '_', '@', '#', '$');
$disorder_abc=[];
//Simple disorder using random_int
while(count($abc)>0) {
$c_abc=count($abc);
$num_element_move=random_int(0, $c_abc-1);
$disorder_abc[]=$abc[$num_element_move];
unset($abc[$num_element_move]);
$abc=array_values($abc);
}
//Get randomly elements from the randomly generated array.
$c=count($disorder_abc);
$password_final='';
for($x=0;$x<$length_pass;$x++) {
$num_element_pass=random_int(0, $c-1);
$password_final.=$disorder_abc[$num_element_pass];
}
//Add strange characters
return $password_final;
}
}

View file

@ -0,0 +1,21 @@
<?php
use PHPUnit\Framework\TestCase;
include("vendor/autoload.php");
final class LinuxTest extends TestCase {
public function testDistro() {
$distro=PhangoApp\CuchuluPHPUtils\Linux::get_linux_distro();
$this->assertEquals($distro, 'manjaro');
unlink('./settings/distro.php');
rmdir('./settings');
}
}