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