feat(plesk): parse subscription status from CLI

This commit is contained in:
2026-03-05 12:42:44 +00:00
parent d87808af23
commit 5adc9f0923

View File

@@ -16,6 +16,8 @@ export type PleskSubscription = {
external_id?: string;
name?: string;
status?: string;
status_raw?: string | null;
status_sync_error?: string | null;
owner_login?: string;
owner?: { login?: string };
plan_name?: string;
@@ -148,16 +150,27 @@ export async function listPleskSubscriptions(connection: PleskConnection) {
const subscriptions: PleskSubscription[] = [];
for (const subscriptionName of subscriptionNames.slice(0, 500)) {
let status: "active" | "suspended" | "unknown" = "unknown";
let status: "active" | "suspended" | "disabled" | "expired" | "unknown" =
"unknown";
let statusRaw: string | null = null;
let statusSyncError: string | null = null;
try {
const infoResult = await pleskCliCall(connection, "subscription", [
"--info",
subscriptionName,
]);
status = parseSubscriptionStatusFromInfo(infoResult.stdout ?? "");
} catch {
const parsed = parseSubscriptionStatusDetailsFromInfo(
infoResult.stdout ?? "",
);
status = parsed.status;
statusRaw = parsed.statusRaw;
} catch (error) {
status = "unknown";
statusSyncError =
error instanceof Error
? error.message.slice(0, 1000)
: "status_sync_failed";
}
subscriptions.push({
@@ -165,33 +178,57 @@ export async function listPleskSubscriptions(connection: PleskConnection) {
subscription_id: subscriptionName,
name: subscriptionName,
status,
status_raw: statusRaw,
status_sync_error: statusSyncError,
});
}
return subscriptions;
}
export function parseSubscriptionStatusFromInfo(
stdout: string,
): "active" | "suspended" | "unknown" {
export function parseSubscriptionStatusDetailsFromInfo(stdout: string): {
status: "active" | "suspended" | "disabled" | "expired" | "unknown";
statusRaw: string | null;
} {
const line = stdout
.split(/\r?\n/)
.map((entry) => entry.trim())
.find((entry) => /^domain\s+status\s*:/i.test(entry));
if (!line) return "unknown";
const value = line
.replace(/^domain\s+status\s*:/i, "")
.trim()
.toLowerCase();
if (value.includes("ok")) return "active";
if (value.includes("suspend") || value.includes("disabled")) {
return "suspended";
if (!line) {
return { status: "unknown", statusRaw: null };
}
return "unknown";
const value = line.replace(/^domain\s+status\s*:/i, "").trim();
const normalized = value.toLowerCase();
if (normalized.includes("expired")) {
return { status: "expired", statusRaw: value };
}
if (normalized.includes("disabled")) {
return { status: "disabled", statusRaw: value };
}
if (normalized.includes("suspend")) {
return { status: "suspended", statusRaw: value };
}
if (
normalized.includes("ok") ||
normalized.includes("active") ||
normalized.includes("enabled")
) {
return { status: "active", statusRaw: value };
}
return { status: "unknown", statusRaw: value };
}
export function parseSubscriptionStatusFromInfo(
stdout: string,
): "active" | "suspended" | "disabled" | "expired" | "unknown" {
return parseSubscriptionStatusDetailsFromInfo(stdout).status;
}
export async function pleskCliCall(