* Copyright (C) 2022 Red Hat, Inc.
* SPDX-License-Identifier: LGPL-2.1-or-later
*/
import cockpit from "cockpit";
import { setPayloadTypeAction } from "../actions/payload.js";
import { error } from "../helpers/log.js";
import { _callClient, _getProperty } from "./helpers.js";
import { PayloadDNFClient } from "./payload_dnf.js";
const OBJECT_PATH = "/org/fedoraproject/Anaconda/Modules/Payloads";
const INTERFACE_NAME = "org.fedoraproject.Anaconda.Modules.Payloads";
const PAYLOAD_BASE_INTERFACE = INTERFACE_NAME + ".Payload";
const callClient = (...args) => {
return _callClient(PayloadsClient, OBJECT_PATH, INTERFACE_NAME, ...args);
};
const getProperty = (...args) => {
return _getProperty(PayloadsClient, OBJECT_PATH, INTERFACE_NAME, ...args);
};
export class PayloadsClient {
constructor (address, dispatch) {
if (PayloadsClient.instance && (!address || PayloadsClient.instance.address === address)) {
return PayloadsClient.instance;
}
PayloadsClient.instance?.client.close();
PayloadsClient.instance = this;
this.client = cockpit.dbus(
INTERFACE_NAME,
{ address, bus: "none", superuser: "try" }
);
this.address = address;
this.dispatch = dispatch;
}
init (args = {}) {
this.client.addEventListener(
"close", () => error("Payloads client closed")
);
this.initData(args);
}
stopEventMonitor () {
PayloadDNFClient.instance?.stopEventMonitor();
}
async initData (args = {}) {
const activePayload = await getActivePayload();
const payloadType = await getPayloadType(activePayload);
this.dispatch(setPayloadTypeAction(payloadType));
await this.initPayloadClient(activePayload, args);
}
async initPayloadClient (payload, args = {}) {
const payloadType = await getPayloadType(payload);
if (payloadType === "DNF") {
const dnfClient = new PayloadDNFClient(this.client, this.dispatch, payload);
await dnfClient.init(args);
}
}
}
export const getPayloadType = async (payload) => {
return _getProperty(
PayloadsClient,
payload,
PAYLOAD_BASE_INTERFACE,
"Type"
);
};
*
* @returns {Promise} Resolves the total space required by the payload
*/
export const getRequiredSpace = () => {
return callClient("CalculateRequiredSpace", []);
};
export const getActivePayload = () => {
return getProperty("ActivePayload");
};