74 lines
2.4 KiB
TypeScript
74 lines
2.4 KiB
TypeScript
// Hetzner Cloud Firewall Class
|
|
import type { HetznerAccount } from './classes.account.js';
|
|
import * as plugins from './hetznercloud.plugins.js';
|
|
import * as types from './types.js';
|
|
|
|
export class HetznerFirewall {
|
|
// STATIC
|
|
public static create = async (
|
|
hetznerAccountRefArg: HetznerAccount,
|
|
optionsArg: {
|
|
name: string;
|
|
labels?: {[key: string]: string},
|
|
rules: types.IFirewall['rules'],
|
|
}
|
|
) => {
|
|
const firewall = new HetznerFirewall(hetznerAccountRefArg);
|
|
|
|
const createFirewallUrl = '/firewalls';
|
|
const createFirewallPayload: types.TFirewallCreateRequestBody = {
|
|
name: optionsArg.name,
|
|
labels: optionsArg.labels || {} as any,
|
|
rules: optionsArg.rules
|
|
};
|
|
const response = await firewall.hetznerAccountRef.request(
|
|
'POST',
|
|
createFirewallUrl,
|
|
createFirewallPayload
|
|
);
|
|
firewall.data = (response.body as types.TFirewallCreateResponseBody).firewall;
|
|
return firewall;
|
|
}
|
|
|
|
public static getFirewalls = async (hetznerAccountRefArg: HetznerAccount) => {
|
|
const firewallsGetUrl = '/firewalls';
|
|
const response = await hetznerAccountRefArg.request('GET', firewallsGetUrl, {});
|
|
const firewallsDataArray = (response.body as types.TFirewallsGetResponseBody).firewalls;
|
|
const firewalls: HetznerFirewall[] = [];
|
|
for (const firewallData of firewallsDataArray) {
|
|
const firewall = new HetznerFirewall(hetznerAccountRefArg);
|
|
firewall.data = firewallData;
|
|
firewalls.push(firewall);
|
|
}
|
|
return firewalls;
|
|
}
|
|
|
|
public static getFirewallsByLabel = async (hetznerAccountRefArg: HetznerAccount, labelObject: {[key: string]: string}) => {
|
|
const firewalls = await HetznerFirewall.getFirewalls(hetznerAccountRefArg);
|
|
const results: HetznerFirewall[] = [];
|
|
for (const firewall of firewalls) {
|
|
let isMatch = true;
|
|
for (const key in labelObject) {
|
|
if (firewall.data.labels[key] !== labelObject[key]) {
|
|
isMatch = false;
|
|
}
|
|
}
|
|
if (isMatch) {
|
|
results.push(firewall);
|
|
}
|
|
}
|
|
return results;
|
|
}
|
|
|
|
// INSTANCE
|
|
public data: types.IFirewall;
|
|
public hetznerAccountRef: HetznerAccount;
|
|
|
|
constructor(hetznerAccountRefArg: HetznerAccount) {
|
|
this.hetznerAccountRef = hetznerAccountRefArg;
|
|
}
|
|
|
|
public async delete() {
|
|
await this.hetznerAccountRef.request('DELETE', `/firewalls/${this.data.id}`, {});
|
|
}
|
|
} |