Files
onix/onix-gui/onix/app/api/install-registry/route.js
Mishalabdullah d5ea660d7e added the GUI
2024-05-02 21:44:17 +05:30

143 lines
4.0 KiB
JavaScript

import { exec } from "child_process";
import { NextResponse } from "next/server";
import { promises as fs } from "fs";
import { tmpdir } from "os";
import { join } from "path";
import os from "os";
async function directoryExists(path) {
try {
await fs.access(path);
return true;
} catch (error) {
return false;
}
}
export async function POST(req, res) {
const pathDir = join(os.homedir(), "beckn-onix");
const becknOnixDirExists = await directoryExists(pathDir);
console.log("Installing Beckn Onix...", becknOnixDirExists);
if (!becknOnixDirExists) {
console.log(`Directory beckn-onix does not exist. Cloning repository...`);
try {
const response = await fetch(`${req.nextUrl.origin}/api/clonning-repo`);
if (!response.ok) {
console.error(
`Failed to clone repository: ${response.status} ${response.statusText}`
);
return NextResponse.json(
{
error: `Failed to clone repository: ${response.status} ${response.statusText}`,
},
{ status: 500 }
);
}
console.log("Repository cloned successfully.");
} catch (error) {
console.error("An error occurred while cloning the repository:", error);
return NextResponse.json(
{ error: "An error occurred while cloning the repository" },
{ status: 500 }
);
}
}
const data = await req.json();
const executeCommand = (command) => {
return new Promise((resolve, reject) => {
exec(command, (error, stdout, stderr) => {
if (error) {
console.error("Error:", error);
reject(error);
return;
}
const output = stdout + stderr;
console.log("Output:", output);
resolve(output);
});
});
};
const updateRegistryDetails = async (url) => {
let registryUrl = "";
let registryPort = "";
let protocol = "";
if (url) {
if (url.startsWith("https://")) {
registryUrl = url.replace("https://", "");
registryPort = "443";
protocol = "https";
} else if (url.startsWith("http://")) {
registryUrl = url.replace("http://", "");
registryPort = "80";
protocol = "http";
}
} else {
registryUrl = "registry";
registryPort = "3030";
protocol = "http";
}
console.log("Registry URL:", registryUrl);
const configFile = join(
pathDir,
"install",
"registry_data",
"config",
"swf.properties"
);
const sampleFile = join(
pathDir,
"install",
"registry_data",
"config",
"swf.properties-sample"
);
try {
await fs.copyFile(sampleFile, configFile);
const tempDir = join(os.homedir(), "beckn-onix", "tmp");
await fs.mkdir(tempDir, { recursive: true }); // Create the temporary directory if it doesn't exist
const tempFile = join(tempDir, "tempfile.XXXXXXXXXX");
const configData = await fs.readFile(configFile, "utf8");
const updatedConfigData = configData
.replace(/REGISTRY_URL/g, registryUrl)
.replace(/REGISTRY_PORT/g, registryPort)
.replace(/PROTOCOL/g, protocol);
await fs.writeFile(tempFile, updatedConfigData);
await fs.rename(tempFile, configFile);
await executeCommand(
`docker-compose -f ${join(
pathDir,
"install",
"docker-compose-v2.yml"
)} up -d registry`
);
// Wait for 10 seconds
await new Promise((resolve) => setTimeout(resolve, 10000));
console.log("Registry installation successful");
} catch (error) {
console.error("Error updating registry details:", error);
throw error;
}
};
try {
const url = data.registryUrl;
await updateRegistryDetails(url);
return NextResponse.json({
message: "Registry details updated successfully",
});
} catch (error) {
console.error("An error occurred:", error);
return NextResponse.json({ error: "An error occurred" }, { status: 500 });
}
}