nhance/app/Controllers/DeployController.php
2025-12-11 14:58:41 +05:30

293 lines
12 KiB
PHP

<?php
namespace App\Controllers;
use CodeIgniter\Controller;
use CodeIgniter\API\ResponseTrait;
class DeployController extends AdminController
{
use ResponseTrait;
protected $myLogger;
public function __construct()
{
$this->myLogger = \Config\Services::mylogger();
}
// public function fedeploy()
// {
// $request = $this->request;
// // Multiple zip files: <input type="file" name="zip_files[]" multiple>
// // $zipFiles = $this->request->getFileMultiple('zip_files');
// $zipFiles = $this->request->getFile('zip_files');//('zip_files');
// // print_r($zipFiles);die();
// // Matching dropdown/text values (arrays, indexed same as zip_files[])
// $zipFolders = (array) $request->getPost('zip_folder'); // e.g. ["web/", "dist/"]
// $s3Buckets = (array) $request->getPost('s3_bucket'); // e.g. ["benefits-app-bucket", ...]
// $s3Prefixes = (array) $request->getPost('s3_prefix'); // e.g. ["hr/", "payroll/"]
// $cfDistributions = (array) $request->getPost('cf_distribution_id'); // e.g. ["DIST1", "DIST1", "DIST2"]
// $cfPathsList = (array) $request->getPost('cf_paths'); // e.g. ["/hr/*", "/hr/special/*", "/payroll/*"]
// // Path to Python interpreter and deploy_assets.py script
// $pythonBin = getenv('PY_PATH'); // adjust if needed
// $scriptPath = getenv('PY_SCRIPT_PATH'); // full path to your script
// $results = [];
// if (empty($zipFiles)) {
// return $this->response->setJSON([
// 'status' => 'error',
// 'message' => 'No zip files uploaded',
// ]);
// }
// // --------------------------------------------------------
// // 1) Pre-process distribution IDs → group by distribution
// // - So we can run ONE invalidation per distribution
// // - And merge all paths into a single JSON array
// // --------------------------------------------------------
// $distGroups = []; // [distId => ['indexes' => [...], 'paths' => [...], 'firstIndex' => int]]
// foreach ($cfDistributions as $i => $distId) {
// $distId = trim((string) $distId);
// $path = trim((string) ($cfPathsList[$i] ?? ''));
// // Only consider entries where both distribution ID and path are set
// if ($distId === '' || $path === '') {
// continue;
// }
// if (!isset($distGroups[$distId])) {
// $distGroups[$distId] = [
// 'indexes' => [],
// 'paths' => [],
// ];
// }
// $distGroups[$distId]['indexes'][] = $i;
// $distGroups[$distId]['paths'][] = $path;
// }
// // Set firstIndex and unique paths per distribution
// foreach ($distGroups as $distId => $info) {
// $distGroups[$distId]['firstIndex'] = $info['indexes'][0]; // first file index for this dist
// $distGroups[$distId]['paths'] = array_values(array_unique($info['paths'])); // unique paths
// }
// // --------------------------------------------------------
// // 2) Process each uploaded file
// // --------------------------------------------------------
// foreach ($zipFiles as $index => $file) {
// if (!$file->isValid() || $file->hasMoved()) {
// $results[] = [
// 'file' => $file->getName(),
// 'status' => 'error',
// 'message' => 'Invalid file or already moved.',
// ];
// continue;
// }
// // Read matching form values (or fallback)
// $zipFolder = $zipFolders[$index] ?? 'web/'; // default example
// $s3Bucket = $s3Buckets[$index] ?? '';
// $s3Prefix = $s3Prefixes[$index] ?? '';
// $cfDistribution = $cfDistributions[$index] ?? '';
// $cfDistribution = trim((string) $cfDistribution);
// // Move file into a known directory (keep original name)
// // $uploadDir = WRITEPATH . 'uploads/deploy';
// $uploadDir = '/home/ubuntu/py';
// if (!is_dir($uploadDir)) {
// mkdir($uploadDir, 0775, true);
// }
// $originalName = $file->getName();
// $file->move($uploadDir, $originalName);
// $zipPath = $uploadDir . DIRECTORY_SEPARATOR . $originalName;
// // --------------------------------------------------------
// // Decide whether THIS file should trigger invalidation
// // - Only firstIndex of each distribution will do it
// // - cf-paths-json = JSON array of all unique paths for that dist
// // --------------------------------------------------------
// $doInvalidation = false;
// $cfPathsJson = '';
// if ($cfDistribution !== '' && isset($distGroups[$cfDistribution])) {
// $group = $distGroups[$cfDistribution];
// if ($group['firstIndex'] === $index) {
// // This is the first file for this distribution ID → do invalidation ONCE
// $doInvalidation = true;
// // Build CloudFront paths JSON array (AWS syntax: ["path1", "path2", ...])
// $cfPathsJson = json_encode($group['paths']); // e.g. ["\/hr\/*","\/hr\/special\/*"]
// }
// // Else: same distribution ID but NOT first index → no invalidation
// }
// // --------------------------------------------------------
// // Build the python command safely using escapeshellarg
// // --------------------------------------------------------
// $cmdParts = [
// escapeshellarg($pythonBin),
// escapeshellarg($scriptPath),
// '--zip-path', escapeshellarg($zipPath),
// '--zip-folder', escapeshellarg($zipFolder),
// '--s3-bucket', escapeshellarg($s3Bucket),
// '--s3-prefix', escapeshellarg($s3Prefix),
// '--do-webhook', // always send webhook after success
// ];
// if ($doInvalidation) {
// $cmdParts[] = '--do-invalidation';
// $cmdParts[] = '--cf-distribution-id';
// $cmdParts[] = escapeshellarg($cfDistribution);
// $cmdParts[] = '--cf-paths-json';
// $cmdParts[] = escapeshellarg($cfPathsJson); // e.g. '["/hr/*","/hr/special/*"]'
// }
// // Final command string (2>&1 to capture stderr too)
// $cmd = implode(' ', $cmdParts) . ' 2>&1';
// print_r($cmd);die();
// $output = [];
// $returnVar = 0;
// exec($cmd, $output, $returnVar);
// $results[] = [
// 'file' => $originalName,
// 'zip_path' => $zipPath,
// 'command' => $cmd,
// 'output' => $output,
// 'exit_code' => $returnVar,
// 'status' => $returnVar === 0 ? 'success' : 'error',
// ];
// }
// return $this->response->setJSON([
// 'status' => 'completed',
// 'results' => $results,
// ]);
// }
public function fedeploy()
{
$request = $this->request;
echo 'HI';die();
// Single zip file: <input type="file" name="zip_file">
$file = $request->getFile('zip_file');
if (!$file || !$file->isValid()) {
return $this->response->setJSON([
'status' => 'error',
'message' => 'No valid zip file uploaded',
]);
}
echo 'cool';die();
// Read scalar form values
$zipFolder = (string) $request->getPost('zip_folder') ?: 'web/';
$s3Bucket = (string) $request->getPost('s3_bucket') ?: '';
$s3Prefix = (string) $request->getPost('s3_prefix') ?: '';
$cfDistribution = trim((string) $request->getPost('cf_distribution_id'));
$cfPathsRaw = (string) $request->getPost('cf_paths');
// Python interpreter and script path from env
$pythonBin = getenv('PY_PATH'); // e.g. /usr/bin/python3
$scriptPath = getenv('PY_SCRIPT_PATH'); // e.g. /home/ubuntu/deploy_assets.py
if (empty($pythonBin) || empty($scriptPath)) {
return $this->response->setJSON([
'status' => 'error',
'message' => 'Python path or script path not configured in environment.',
]);
}
// Move file into known directory (keep original name)
$uploadDir = '~/py';
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0775, true);
}
$originalName = $file->getName();
$file->move($uploadDir, $originalName);
$zipPath = $uploadDir . DIRECTORY_SEPARATOR . $originalName;
// -----------------------------
// CloudFront invalidation data
// -----------------------------
$doInvalidation = false;
$cfPathsJson = '';
// Allow comma or newline separated paths: "/hr/*,/hr/special/*" or
// "/hr/*\n/hr/special/*"
$paths = array_filter(
array_map('trim', preg_split('/[\r\n,]+/', $cfPathsRaw)),
'strlen'
);
if ($cfDistribution !== '' && !empty($paths)) {
$doInvalidation = true;
$cfPathsJson = json_encode($paths); // e.g. ["\/hr\/*","\/hr\/special\/*"]
}
// -----------------------------
// Build python command
// -----------------------------
$cmdParts = [
escapeshellarg($pythonBin),
escapeshellarg($scriptPath),
'--zip-path', escapeshellarg($zipPath),
'--zip-folder', escapeshellarg($zipFolder),
'--s3-bucket', escapeshellarg($s3Bucket),
'--s3-prefix', escapeshellarg($s3Prefix),
'--do-webhook', // always send webhook after success
];
if ($doInvalidation) {
$cmdParts[] = '--do-invalidation';
$cmdParts[] = '--cf-distribution-id';
$cmdParts[] = escapeshellarg($cfDistribution);
$cmdParts[] = '--cf-paths-json';
$cmdParts[] = escapeshellarg($cfPathsJson);
}
// Final command string (2>&1 to capture stderr too)
$cmd = implode(' ', $cmdParts) . ' 2>&1';
$output = [];
$returnVar = 0;
print_r($cmd);die();
exec($cmd, $output, $returnVar);
$result = [
'file' => $originalName,
'zip_path' => $zipPath,
'command' => $cmd,
'output' => $output,
'exit_code' => $returnVar,
'status' => $returnVar === 0 ? 'success' : 'error',
];
return $this->response->setJSON([
'status' => 'completed',
'result' => $result,
]);
}
public function fedeploy_view()
{
// $this->load->view('fedeploy');
$this->loadLayout('fedeploy');
}
public function fetest()
{
echo 'Hello from DeployController fetest!';
}
}