scaleway-sync-firewall
Version:
Synchronize Scaleway Security Groups
46 lines (39 loc) • 1.51 kB
text/typescript
import SecurityGroup from './SecurityGroup';
import { ScalewayZone } from './library/interfaces/Scaleway';
require('dotenv-defaults').config();
/**
* Validate that all required environment variables are set.
*/
function validateEnvironmentVariables() {
const requiredEnv = ['AUTH_TOKEN', 'MASTER_ID', 'MASTER_ZONE', 'TARGET_GROUPS_JSON'];
requiredEnv.forEach((variable) => {
if (!process.env[variable]) {
throw Error(`Missing environment variable! See .env.defaults [Missing: ${variable}]`)
}
});
}
function targets(): Promise<SecurityGroup>[] {
const targets = require(`../${process.env.TARGET_GROUPS_JSON}`);
return targets.map((target: { id: string, zone: ScalewayZone }) => {
return SecurityGroup.get(target.zone, target.id);
});
}
/**
* Current master group.
*/
async function syncGroups() {
const primaryGroup = await SecurityGroup.get(<ScalewayZone>process.env.MASTER_ZONE, process.env.MASTER_ID!);
const primaryRules = await primaryGroup.editableRules;
const targetGroups = await Promise.all(targets());
await Promise.all(targetGroups.map(async (group) => {
await group.clearRules();
await group.addRules(primaryRules);
}))
}
validateEnvironmentVariables();
syncGroups().then(() => {
console.info('Successfully synchronized groups!');
}).catch((error) => {
console.error('Encountered error syncing groups!');
console.error(error);
});