Este ejemplo añade www.example.com como registro A con proxy, servido a través del borde de OpenWAF, con el protocolo completo de simular y después confirmar. El token necesita el rol Técnico.
import { OpenWAF, OpenWAFError, type Applied } from "./openwaf.ts";
const owf = new OpenWAF();
// 1. Busca el id de la zona.
const { items: zones = [] } = await owf.listZones();
const zone = zones.find((z) => z.name === "example.com");
if (!zone?.id) throw new Error("no se encuentra example.com");
const record = { type: "A", name: "www", content: "203.0.113.10", proxied: true } as const;
const reason = "Poner www detrás del WAF";
// 2. Simula: no se aplica nada.
const plan = (await owf.createRecord({ zone: zone.id, body: record }, { reason, dryRun: true })) as Applied;
for (const c of plan.diff?.changes ?? []) console.log(c.op, c.path);
console.log(`versión ${plan.from_version} → ${plan.to_version}`, plan.warnings);
// 3. Confirma con la versión contra la que se hizo el plan.
try {
const created = await owf.createRecord({ zone: zone.id, body: record }, { reason, ifMatch: plan.from_version! });
console.log("creado", created);
} catch (err) {
if (err instanceof OpenWAFError && err.code === "version_conflict") {
console.error("La zona ha cambiado mientras tanto: vuelve a ejecutarlo y revisa el plan nuevo.");
} else {
throw err;
}
}from openwaf import OpenWAF, OpenWAFError
owf = OpenWAF()
# 1. Busca el id de la zona.
zone = next(z for z in owf.list_zones()["items"] if z["name"] == "example.com")
record = {"type": "A", "name": "www", "content": "203.0.113.10", "proxied": True}
reason = "Poner www detrás del WAF"
# 2. Simula: no se aplica nada.
plan = owf.create_record(zone=zone["id"], body=record, reason=reason, dry_run=True)
for change in plan["diff"]["changes"]:
print(change["op"], change["path"])
print("versión %d -> %d" % (plan["from_version"], plan["to_version"]), plan["warnings"])
# 3. Confirma con la versión contra la que se hizo el plan.
try:
created = owf.create_record(zone=zone["id"], body=record, reason=reason, if_match=plan["from_version"])
print("creado", created)
except OpenWAFError as e:
if e.code != "version_conflict":
raise
print("La zona ha cambiado mientras tanto: vuelve a ejecutarlo y revisa el plan nuevo.")La simulación imprime un cambio, add records[id=…], y la versión que crearía el registro. La llamada confirmada devuelve el registro nuevo con su id.
Varios registros en un solo cambio
Para crear, cambiar y borrar varios registros como una sola versión, usa batchRecords / batch_records (hasta 500 operaciones, todo o nada), con un cuerpo de listas create, update y delete. Recibe las mismas opciones reason, dryRun e ifMatch.
Campos del registro
type y content son obligatorios; name, ttl, priority (solo MX y SRV), proxied (solo A, AAAA y CNAME), comment y tags son opcionales. La referencia de records de la CLI describe cada campo; la referencia de la API tiene el esquema completo.