feat: add broadcast field to interfaces
This commit is contained in:
21
backend/alembic/versions/0006_interface_add_broadcast.py
Normal file
21
backend/alembic/versions/0006_interface_add_broadcast.py
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
"""add broadcast column to interfaces
|
||||||
|
|
||||||
|
Revision ID: 0006
|
||||||
|
Revises: 0005
|
||||||
|
Create Date: 2026-03-01
|
||||||
|
"""
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
revision = "0006"
|
||||||
|
down_revision = "0005"
|
||||||
|
branch_labels = None
|
||||||
|
depends_on = None
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade() -> None:
|
||||||
|
op.add_column("interfaces", sa.Column("broadcast", sa.String(64), server_default="''", nullable=False))
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade() -> None:
|
||||||
|
op.drop_column("interfaces", "broadcast")
|
||||||
@@ -60,6 +60,7 @@ class Interface(Base):
|
|||||||
config_id: Mapped[int] = mapped_column(Integer, ForeignKey("configs.id"), nullable=False)
|
config_id: Mapped[int] = mapped_column(Integer, ForeignKey("configs.id"), nullable=False)
|
||||||
name: Mapped[str] = mapped_column(String(32), nullable=False)
|
name: Mapped[str] = mapped_column(String(32), nullable=False)
|
||||||
zone_id: Mapped[int | None] = mapped_column(Integer, ForeignKey("zones.id"), nullable=True)
|
zone_id: Mapped[int | None] = mapped_column(Integer, ForeignKey("zones.id"), nullable=True)
|
||||||
|
broadcast: Mapped[str] = mapped_column(String(64), default="")
|
||||||
options: Mapped[str] = mapped_column(Text, default="")
|
options: Mapped[str] = mapped_column(Text, default="")
|
||||||
|
|
||||||
config: Mapped["Config"] = relationship("Config", back_populates="interfaces")
|
config: Mapped["Config"] = relationship("Config", back_populates="interfaces")
|
||||||
|
|||||||
@@ -65,12 +65,14 @@ class ZoneOut(BaseModel):
|
|||||||
class InterfaceCreate(BaseModel):
|
class InterfaceCreate(BaseModel):
|
||||||
name: str
|
name: str
|
||||||
zone_id: Optional[int] = None
|
zone_id: Optional[int] = None
|
||||||
|
broadcast: str = ""
|
||||||
options: str = ""
|
options: str = ""
|
||||||
|
|
||||||
|
|
||||||
class InterfaceUpdate(BaseModel):
|
class InterfaceUpdate(BaseModel):
|
||||||
name: Optional[str] = None
|
name: Optional[str] = None
|
||||||
zone_id: Optional[int] = None
|
zone_id: Optional[int] = None
|
||||||
|
broadcast: Optional[str] = None
|
||||||
options: Optional[str] = None
|
options: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
@@ -79,6 +81,7 @@ class InterfaceOut(BaseModel):
|
|||||||
config_id: int
|
config_id: int
|
||||||
name: str
|
name: str
|
||||||
zone_id: Optional[int]
|
zone_id: Optional[int]
|
||||||
|
broadcast: str
|
||||||
options: str
|
options: str
|
||||||
|
|
||||||
model_config = {"from_attributes": True}
|
model_config = {"from_attributes": True}
|
||||||
|
|||||||
@@ -26,10 +26,10 @@ class ShorewallGenerator:
|
|||||||
return "".join(lines)
|
return "".join(lines)
|
||||||
|
|
||||||
def interfaces(self) -> str:
|
def interfaces(self) -> str:
|
||||||
lines = [self._header("interfaces"), "#ZONE".ljust(16) + "INTERFACE".ljust(16) + "OPTIONS\n"]
|
lines = [self._header("interfaces"), "#ZONE".ljust(16) + "INTERFACE".ljust(16) + "BROADCAST".ljust(16) + "OPTIONS\n"]
|
||||||
for iface in self._config.interfaces:
|
for iface in self._config.interfaces:
|
||||||
zone = iface.zone.name if iface.zone else "-"
|
zone = iface.zone.name if iface.zone else "-"
|
||||||
lines.append(self._col(zone, iface.name, iface.options or "-"))
|
lines.append(self._col(zone, iface.name, iface.broadcast or "-", iface.options or "-"))
|
||||||
return "".join(lines)
|
return "".join(lines)
|
||||||
|
|
||||||
def policy(self) -> str:
|
def policy(self) -> str:
|
||||||
|
|||||||
@@ -85,11 +85,13 @@ export default function ConfigDetail() {
|
|||||||
label: 'Zone',
|
label: 'Zone',
|
||||||
render: (r: AnyEntity) => r['zone_id'] == null ? '-' : (zones.find((z) => z.id === r['zone_id'])?.name ?? String(r['zone_id'])),
|
render: (r: AnyEntity) => r['zone_id'] == null ? '-' : (zones.find((z) => z.id === r['zone_id'])?.name ?? String(r['zone_id'])),
|
||||||
},
|
},
|
||||||
|
{ key: 'broadcast' as const, label: 'Broadcast' },
|
||||||
{ key: 'options' as const, label: 'Options' },
|
{ key: 'options' as const, label: 'Options' },
|
||||||
] as Column<AnyEntity>[],
|
] as Column<AnyEntity>[],
|
||||||
fields: [
|
fields: [
|
||||||
{ name: 'name', label: 'Interface Name', required: true },
|
{ name: 'name', label: 'Interface Name', required: true },
|
||||||
{ name: 'zone_id', label: 'Zone', type: 'select' as const, options: [{ value: '', label: '- (no zone)' }, ...zoneOptions] },
|
{ name: 'zone_id', label: 'Zone', type: 'select' as const, options: [{ value: '', label: '- (no zone)' }, ...zoneOptions] },
|
||||||
|
{ name: 'broadcast', label: 'Broadcast' },
|
||||||
{ name: 'options', label: 'Options' },
|
{ name: 'options', label: 'Options' },
|
||||||
] as FieldDef[],
|
] as FieldDef[],
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user