403Webshell
Server IP : 138.197.107.151  /  Your IP : 216.73.217.7
Web Server : Apache/2.4.58 (Ubuntu)
System : Linux BloxBy-Builder 6.8.0-71-generic #71-Ubuntu SMP PREEMPT_DYNAMIC Tue Jul 22 16:52:38 UTC 2025 x86_64
User : wpbetasites_mrakzqskir ( 1022)
PHP Version : 8.3.6
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : OFF
Directory :  /var/www/shark/app/Console/Commands/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/shark/app/Console/Commands/CreateWebsiteCommand.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\Models\Website;
use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;
use Mail;
use App\Helpers\EncryptionHelper;

class CreateWebsiteCommand extends Command
{
    /**
     * The name and signature of the console command.
     * 
     * @var string
     */
    protected $signature = 'app:create-website-command';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';


    function generateSecureUniqueId($length = 10) {
        $characters = '0123456789abcdefghijklmnopqrstuvwxyz';
        $charactersLength = strlen($characters);
        $uniqueId = '';

        for ($i = 0; $i < $length; $i++) {
            $uniqueId .= $characters[random_int(0, $charactersLength - 1)];
        }

        return $uniqueId;
    }
    function generateStrongPassword($length = 12, $username = '') {
        $lower = 'abcdefghijklmnopqrstuvwxyz';
        $upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $numbers = '0123456789';
        $special = '!@#$%^&*()-_=+[]{}|;:,.<>?';
        $all = $lower . $upper . $numbers . $special;

        do {
            $password = '';
            // Ensure each required character type is included
            $password .= $lower[random_int(0, strlen($lower) - 1)];
            $password .= $upper[random_int(0, strlen($upper) - 1)];
            $password .= $numbers[random_int(0, strlen($numbers) - 1)];
            $password .= $special[random_int(0, strlen($special) - 1)];

            for ($i = 4; $i < $length; $i++) {
                $password .= $all[random_int(0, strlen($all) - 1)];
            }

            // Shuffle to avoid predictable order
            $password = str_shuffle($password);

        } while (
            stripos($password, $username) !== false // must NOT contain username
        );

        return $password;
    }

    /**
     * Execute the console command.
     */
    public function handle()
    {
        $websites = Website::where('status', 'pending')->limit(1)->get();

        if ($websites->isEmpty()) {
            $this->info('No pending websites found.');
            return 0;
        }

        $this->info("Found {$websites->count()} pending website(s). Starting creation...");

        foreach ($websites as $website) {
            // try {
                $this->createWebsite($website);
            // } catch (Exception $e) {
            //     $website->status = "error";
            //     $website->error = $e->getMessage();
            //     $website->save();
            //     $this->error("❌ Error creating site #{$website->id}: {$e->getMessage()}");
            // }
        }

        $this->info("✅ Website creation batch completed.");

        return 0;
    }
    /**
     * Create an individual website.
     */
    protected function createWebsite($website)
    {
        $website->status = "inprogress";
        $website->save();

        $meta = json_decode($website->meta, true) ?? [];
        $meta["user_email"] = $website->user ? $website->user->email : "";
        $website->meta = json_encode($meta);
        $website->save();

        $json = base64_encode(serialize($meta));

        $server_meta = [];
        $server_meta["folder"] = env('WEBSITES_DIR');
        $site_chars = $this->generateSecureUniqueId(10);
        $server_meta["site"] = $site_chars;
        $server_meta["domain"] = $site_chars . env("DOMAIN_PREFIX");
        $server_meta["slug_environment"] = env('SLUG_ENV');
        $server_meta["sftp_user"] = $server_meta["slug_environment"] . "_" . $site_chars;
        $server_meta["sftp_pass"] = $this->generateSecureUniqueId(9);
        $server_meta["db_pass"] = $this->generateStrongPassword(12, "db_user_" . $server_meta["slug_environment"] . "_" . $server_meta["site"]);
        $server_meta["db_name"] = "db_" . $server_meta["slug_environment"] . "_" . $site_chars;
        $server_meta["db_user"] = "db_user_" . $server_meta["slug_environment"] . "_" . $site_chars;
        $server_meta["sftp_group"] = env('sftpgroup');

        $website->server_meta = json_encode($server_meta);
        $website->save();

        $thumbnail = "website" . time() . ".png";
        $thumbnail_path = public_path("websites/thumbs/" . $thumbnail);

        $role = $website->user ? $website->user->role : "user";
        // --- Build shell command (Option 3 style) ---
        $cmd = sprintf(
            'bash /var/www/bloxbycommands/create_wp_home_only.sh ' .
            '--folder %s --site %s --sftp-pass %s --db-pass %s --wpsite %s ' .
            '--sftp-group %s --site-id %d --json-data %s --domain %s --thumbnail %s ' .
            '--subscriber-user %s --subscriber-email %s --subscriber-pass %s --user-role %s',
            escapeshellarg($server_meta["folder"]),
            escapeshellarg($server_meta["site"]),
            escapeshellarg($server_meta["sftp_pass"]),
            escapeshellarg($server_meta["db_pass"]),
            escapeshellarg($server_meta["slug_environment"]),
            escapeshellarg($server_meta["sftp_group"]),
            $website->id,
            escapeshellarg($json),
            escapeshellarg($server_meta["domain"]),
            escapeshellarg($thumbnail_path),
            escapeshellarg('wp_sub_' . time()),
            escapeshellarg($website->user->email ?? 'noemail@local'),
            escapeshellarg($this->generateSecureUniqueId(10)),
            escapeshellarg($role)
        );

        // dd( $cmd );
        \Log::info("Executing site creation command: {$cmd}");

        $process = Process::fromShellCommandline($cmd);
        $process->setTimeout(3600);
        $process->run();

        if (!$process->isSuccessful()) {
            $website->status = "error";
            $website->error = $process->getErrorOutput();
            $website->save();
            throw new ProcessFailedException($process);
        }

        // Encrypt credentials after success
        $server_meta["sftp_pass"] = EncryptionHelper::secret_encrypt($server_meta["sftp_pass"], env("SODIUM_KEY"));
        $server_meta["db_pass"] = EncryptionHelper::secret_encrypt($server_meta["db_pass"], env("SODIUM_KEY"));
        $website->server_meta = json_encode($server_meta);

        $website->thumbnail = $thumbnail;
        $website->path = $server_meta["slug_environment"] . "_" . $server_meta["site"];
        $website->dbname = $server_meta["db_user"];
        $website->status = "completed";
        $website->save();

        if ($website->user) {
            Mail::send('emails.website_generated', [
                'user' => $website->user,
                'website' => $website,
                'domain' => $server_meta["domain"],
            ], function ($message) use ($website) {
                $message->to($website->user->email);
                $message->subject('Your Website is Ready - ' . env('APP_NAME'));
            });
        }

        $this->info("✅ Website #{$website->id} created successfully.");
    }
    
}

Youez - 2016 - github.com/yon3zu
LinuXploit