feat: complete rules with all shorewall columns (origdest, rate, user, mark, connlimit, time, headers, switch, helper)
This commit is contained in:
35
backend/alembic/versions/0009_rules_add_missing_columns.py
Normal file
35
backend/alembic/versions/0009_rules_add_missing_columns.py
Normal file
@@ -0,0 +1,35 @@
|
||||
"""add missing shorewall rule columns
|
||||
|
||||
Revision ID: 0009
|
||||
Revises: 0008
|
||||
Create Date: 2026-03-01
|
||||
"""
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
revision = "0009"
|
||||
down_revision = "0008"
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
_NEW_COLS = [
|
||||
("origdest", sa.String(128)),
|
||||
("rate_limit", sa.String(64)),
|
||||
("user_group", sa.String(64)),
|
||||
("mark", sa.String(32)),
|
||||
("connlimit", sa.String(32)),
|
||||
("time", sa.String(128)),
|
||||
("headers", sa.String(128)),
|
||||
("switch_name", sa.String(32)),
|
||||
("helper", sa.String(32)),
|
||||
]
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
for col_name, col_type in _NEW_COLS:
|
||||
op.add_column("rules", sa.Column(col_name, col_type, server_default="''", nullable=False))
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
for col_name, _ in reversed(_NEW_COLS):
|
||||
op.drop_column("rules", col_name)
|
||||
@@ -99,6 +99,15 @@ class Rule(Base):
|
||||
proto: Mapped[str] = mapped_column(String(16), default="")
|
||||
dport: Mapped[str] = mapped_column(String(64), default="")
|
||||
sport: Mapped[str] = mapped_column(String(64), default="")
|
||||
origdest: Mapped[str] = mapped_column(String(128), default="")
|
||||
rate_limit: Mapped[str] = mapped_column(String(64), default="")
|
||||
user_group: Mapped[str] = mapped_column(String(64), default="")
|
||||
mark: Mapped[str] = mapped_column(String(32), default="")
|
||||
connlimit: Mapped[str] = mapped_column(String(32), default="")
|
||||
time: Mapped[str] = mapped_column(String(128), default="")
|
||||
headers: Mapped[str] = mapped_column(String(128), default="")
|
||||
switch_name: Mapped[str] = mapped_column(String(32), default="")
|
||||
helper: Mapped[str] = mapped_column(String(32), default="")
|
||||
comment: Mapped[str] = mapped_column(Text, default="")
|
||||
position: Mapped[int] = mapped_column(Integer, default=0)
|
||||
|
||||
|
||||
@@ -135,6 +135,15 @@ class RuleCreate(BaseModel):
|
||||
proto: str = ""
|
||||
dport: str = ""
|
||||
sport: str = ""
|
||||
origdest: str = ""
|
||||
rate_limit: str = ""
|
||||
user_group: str = ""
|
||||
mark: str = ""
|
||||
connlimit: str = ""
|
||||
time: str = ""
|
||||
headers: str = ""
|
||||
switch_name: str = ""
|
||||
helper: str = ""
|
||||
comment: str = ""
|
||||
position: int = 0
|
||||
|
||||
@@ -148,6 +157,15 @@ class RuleUpdate(BaseModel):
|
||||
proto: Optional[str] = None
|
||||
dport: Optional[str] = None
|
||||
sport: Optional[str] = None
|
||||
origdest: Optional[str] = None
|
||||
rate_limit: Optional[str] = None
|
||||
user_group: Optional[str] = None
|
||||
mark: Optional[str] = None
|
||||
connlimit: Optional[str] = None
|
||||
time: Optional[str] = None
|
||||
headers: Optional[str] = None
|
||||
switch_name: Optional[str] = None
|
||||
helper: Optional[str] = None
|
||||
comment: Optional[str] = None
|
||||
position: Optional[int] = None
|
||||
|
||||
@@ -163,6 +181,15 @@ class RuleOut(BaseModel):
|
||||
proto: str
|
||||
dport: str
|
||||
sport: str
|
||||
origdest: str
|
||||
rate_limit: str
|
||||
user_group: str
|
||||
mark: str
|
||||
connlimit: str
|
||||
time: str
|
||||
headers: str
|
||||
switch_name: str
|
||||
helper: str
|
||||
comment: str
|
||||
position: int
|
||||
|
||||
|
||||
@@ -53,13 +53,24 @@ class ShorewallGenerator:
|
||||
def rules(self) -> str:
|
||||
lines = [
|
||||
self._header("rules"),
|
||||
"#ACTION".ljust(16) + "SOURCE".ljust(24) + "DEST".ljust(24) + "PROTO".ljust(10) + "DPORT".ljust(10) + "SPORT\n",
|
||||
"#ACTION".ljust(16) + "SOURCE".ljust(24) + "DEST".ljust(24)
|
||||
+ "PROTO".ljust(10) + "DPORT".ljust(16) + "SPORT".ljust(16)
|
||||
+ "ORIGDEST".ljust(20) + "RATE".ljust(16) + "USER".ljust(16)
|
||||
+ "MARK".ljust(12) + "CONNLIMIT".ljust(14) + "TIME".ljust(20)
|
||||
+ "HEADERS".ljust(16) + "SWITCH".ljust(16) + "HELPER\n",
|
||||
"SECTION NEW\n",
|
||||
]
|
||||
for r in sorted(self._config.rules, key=lambda x: x.position):
|
||||
src = (r.src_zone.name if r.src_zone else "all") + (f":{r.src_ip}" if r.src_ip else "")
|
||||
dst = (r.dst_zone.name if r.dst_zone else "all") + (f":{r.dst_ip}" if r.dst_ip else "")
|
||||
lines.append(self._col(r.action, src, dst, r.proto or "-", r.dport or "-", r.sport or "-", width=16))
|
||||
lines.append(self._col(
|
||||
r.action, src, dst,
|
||||
r.proto or "-", r.dport or "-", r.sport or "-",
|
||||
r.origdest or "-", r.rate_limit or "-", r.user_group or "-",
|
||||
r.mark or "-", r.connlimit or "-", r.time or "-",
|
||||
r.headers or "-", r.switch_name or "-", r.helper or "-",
|
||||
width=16,
|
||||
))
|
||||
return "".join(lines)
|
||||
|
||||
def hosts(self) -> str:
|
||||
|
||||
Reference in New Issue
Block a user