Subversion Repositories sysadmin_scripts

Rev

Rev 146 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

<?php
/*
 * quick_fix.php
 * by Randell Miller of Creatvie Technology Services
 * Version 1.0.0
 * Aug 9 2019
 */

//Start time
$start = microtime(true);

//Our color class
$color = new Colors();

//Opening banner
echo "\n";
banner("Quick Fix for WordPress by CTS.  Version 1.0.0");

//Any extra args we need to use based on the environment or supplied arguments
$extraargs = "";

//Get info on what user we currently are.
$whoami = strip_newline(shell_exec("whoami"));
$isroot = false;

if(isset($whoami)) {
    if(strtolower($whoami) == strtolower(trim("root"))) {
        //We're root.
        $extraargs .= " --allow-root";
        banner("Root user detected!  Make sure to check permissions and ownership after script completion!","warning");
        $isroot = true;
    } else {
        echo "Running as non-root user ($whoami).\n";
    }
} else {
    //Command did not return anything useable.
    //Assume we need to have root priv
    banner("Unable to check user.  Assuming root.","error");
    echo "\n";
    banner("Root user detected!  Make sure to check permissions and ownership after script completion!","warning");
    $extraargs += " --allow-root";
    $isroot = true;
}

//Check current version of WordPress
$version = strip_newline(shell_exec("wp core version $extraargs"));

echo "WordPress version $version found.\n";

//Check to see if there is a new version available.
$checkUpdate = strip_newline(shell_exec("wp core check-update $extraargs"));
if($checkUpdate == "Success: WordPress is at the latest version.") {
    echo $color->getColoredString("WordPress is up to date.\n","green");
} else {
    echo $color->getColoredString("A newer version of WordPress is available.\n","red");
}

echo "\n";

echo "Doing verify-checksums.\n";

$coreCheckSums = shell_exec("wp core verify-checksums $extraargs 2>&1");
$coreCheckSums = explode("\n", $coreCheckSums);

$failedChecksum = array();
$shouldNotExist = array();
foreach($coreCheckSums as $line) {
    if(empty($line)) {        
        continue; 
    }
    
    $line_arr = explode(":",$line);
    switch(strtolower($line_arr[0])) {
        case "success":
            echo "\n";
            banner("All WordPress Core files pass checksum validation.","success");
            break;
        case "warning":
            if(trim($line_arr[1])=="File doesn't verify against checksum") {
                echo $color->getColoredString("File failed checksum validation: {$line_arr[2]}\n","red");
                $failedChecksum[] = trim($line_arr[2]);
            } elseif (trim($line_arr[1])=="File should not exist") {
                echo $color->getColoredString("File should not exist: {$line_arr[2]}\n","red");
                $shouldNotExist[] = trim($line_arr[2]);
            }
            break;
        case "error":
            echo "\n";
            banner("WordPress Core files did not pass validation.","error");
            break;
        default:
            echo $color->getColoredString("Unknown return string:\n$line\n","red","light_gray");
            break;
    }
}

echo "\n";

//Deal with checksum validation
echo "Number of files that failed checksum validation: ";
if(count($failedChecksum) > 0) {
    echo $color->getColoredString(count($failedChecksum)."\n","red");
    $response = readline("Do you wish to replace the core files with fress versions from WordPress.org (y/N)? ");
    if(strtolower($response) == "y") {
        //Replace 'em!
        $replace = shell_exec("wp core download --version=$version --force $extraargs");
        echo "\n";
        print_r($replace);
        echo "\n";
        
        if($isroot) {
            echo "\n";
            banner("WordPress Core files have been updated.  Please check ownership and permission after script is finished!","warning");
        }
    }
} else {
    echo $color->getColoredString("0\n","green");
}
echo "\n";

//deal with files that should not exist.
echo "Number of files that should not exist: ";
if(count($shouldNotExist) > 0) {
    echo $color->getColoredString(count($shouldNotExist)."\n","red");
    $response = readline("Do you wish to delete these files (y/N)? ");
    if(strtolower($response) == "y") {
        //Delete 'em
        foreach($shouldNotExist as $target) {
            if(unlink($target)) {
                echo $color->getColoredString("File $target deleted.","green");
            } else {
                echo $color->getColoredString("Unable to delete $target.","red");
            }
        }
        echo "\n";
    }
} else {
    echo $color->getColoredString("0\n","green");
}
echo "\n";

//Plugins
$checkPluginVersions = shell_exec("wp plugin list $extraargs");
$arr_checkPluginVersions = explode("\n",$checkPluginVersions);
$plugins = array();
foreach($arr_checkPluginVersions as $p) {
    $arr_p = explode("\t",$p);
    if(!isset($arr_p[0]) ||  empty($arr_p[0]) || trim($arr_p[0]) == "name") {
        continue; //Ignore this line
    }
    $plugins[$arr_p[0]] = array("name"=>$arr_p[0],"active"=>$arr_p[1],"update"=>$arr_p[2],"version"=>$arr_p[3]);   
}

//filter the plugins
$active_plugins = array_filter($plugins,function($plugin) {
    return ($plugin['active']=="active");
});

$inactive_plugins = array_filter($plugins,function($plugin) {
    return ($plugin['active']=="inactive");
});

//Active plugins
echo "Total number of active plugins: ".count($active_plugins)."\n";
if(count($active_plugins) > 0) {
    //Active plugins
    $result = readline("Do you wish to check active plugins (y/N)? ");
    if(strtolower($result) == "y") {
        //Parse 'em
        foreach($active_plugins as $p) {
            check_plugin($p);
        }
    }
} 

echo "";

//Inactive plugins
echo "Total number of inactive plugins: ".count($inactive_plugins)."\n";
if(count($inactive_plugins) > 0) {
    //Active plugins
    $result = readline("Do you wish to check inactive plugins (y/N)? ");
    if(strtolower($result) == "y") {
        //Parse 'em
        foreach($inactive_plugins as $p) {
            check_plugin($p);
        }
    }
} 

echo "";
$time_elapsed_secs = microtime(true) - $start;
banner("Script Complete.  Total run time: $time_elapsed_secs sec");

function check_plugin($p) {
    global $color;
    global $extraargs;
    echo "\nPlugin: {$p['name']}\n";
    if($p['update'] == "available") {
        echo $color->getColoredString("This plugin is out of date!","red")."\n";
        $response = readline("Do you want to update this plugin (y/N)? ");
        if(strtolower($response) == "y") {
            echo "Updating {$p['name']}...\n";
            $result = shell_exec("wp plugin update {$p['name']} $extraargs 2>&1");
            print_r($result);
            echo "\n";
        }
    }
    $cmd = "wp plugin verify-checksums {$p['name']} $extraargs 2>&1";
    $result = explode("\n",shell_exec($cmd));
    $state = null;
    foreach($result as $r) {
        if(!empty($r)) {
            if (strpos($r, 'Warning: Could not retrieve the checksums') !== false) {
                $state = "nocheck";
            }
            if (strpos($r, 'Success:') !== false && $state != "nocheck") {
                $state = "success";
            }
            if (strpos($r, 'Error:') !== false && $state != "nocheck") {
                $state = "fail";
            }
        }
    }
    switch($state) {
        case "success":
            echo $color->getColoredString("Plugin passed checksum validation.","green")."\n";
            break;
        case "nocheck":
            echo $color->getColoredString("Unable to retrieve checksum info for plugin.","yellow")."\n";
            break;
        case "fail":
            echo $color->getColoredString("Plugin failed checksum validation!","red")."\n";
            break;
        default:
            echo $color->getColoredString("Unknown result of checksum validation!","red")."\m".print_r($result,true)."\m";
            break;
    }
    if($state == "fail") {
        $response = readline("Do you want to install a fresh copy of this plugin (y/N)? ");
        if(strtolower($response) == "y") {
            $result = shell_exec("wp plugin install {$p['name']} --force --version={$p['version']} $extraargs 2>&1");
            print_r($result);
            echo "\n";
        }
    }
    
    
}

function banner($msg,$type = "message") {
    global $color;
    switch($type) {
        case "error":
            $forecolor = "red";
            break;
        case "warning":
            $forecolor = "yellow";
            break;
        case "success":
            $forecolor = "green";
            break;
        default:
            $forecolor = null; //Default color
            break;
    }
    
    echo $color->getColoredString(str_repeat("*", strlen($msg))."\n",$forecolor);
    echo $color->getColoredString($msg."\n",$forecolor);
    echo $color->getColoredString(str_repeat("*", strlen($msg))."\n",$forecolor);
    echo "\n"; //Extra spacing
}



class Colors {
        private $foreground_colors = array();
        private $background_colors = array();

        public function __construct() {
                // Set up shell colors
                $this->foreground_colors['black'] = '0;30';
                $this->foreground_colors['dark_gray'] = '1;30';
                $this->foreground_colors['blue'] = '0;34';
                $this->foreground_colors['light_blue'] = '1;34';
                $this->foreground_colors['green'] = '0;32';
                $this->foreground_colors['light_green'] = '1;32';
                $this->foreground_colors['cyan'] = '0;36';
                $this->foreground_colors['light_cyan'] = '1;36';
                $this->foreground_colors['red'] = '0;31';
                $this->foreground_colors['light_red'] = '1;31';
                $this->foreground_colors['purple'] = '0;35';
                $this->foreground_colors['light_purple'] = '1;35';
                $this->foreground_colors['brown'] = '0;33';
                $this->foreground_colors['yellow'] = '1;33';
                $this->foreground_colors['light_gray'] = '0;37';
                $this->foreground_colors['white'] = '1;37';

                $this->background_colors['black'] = '40';
                $this->background_colors['red'] = '41';
                $this->background_colors['green'] = '42';
                $this->background_colors['yellow'] = '43';
                $this->background_colors['blue'] = '44';
                $this->background_colors['magenta'] = '45';
                $this->background_colors['cyan'] = '46';
                $this->background_colors['light_gray'] = '47';
        }

        // Returns colored string
        public function getColoredString($string, $foreground_color = null, $background_color = null) {
                $colored_string = "";

                // Check if given foreground color found
                if (isset($this->foreground_colors[$foreground_color])) {
                        $colored_string .= "\033[" . $this->foreground_colors[$foreground_color] . "m";
                }
                // Check if given background color found
                if (isset($this->background_colors[$background_color])) {
                        $colored_string .= "\033[" . $this->background_colors[$background_color] . "m";
                }

                // Add string and end coloring
                $colored_string .=  $string . "\033[0m";

                return $colored_string;
        }

        // Returns all foreground color names
        public function getForegroundColors() {
                return array_keys($this->foreground_colors);
        }

        // Returns all background color names
        public function getBackgroundColors() {
                return array_keys($this->background_colors);
        }
}

function strip_newline($input) {
    $output = str_replace(array("\n", "\r"), '', $input);
    return $output;
}