| 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 : |
<?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.");
}
}