This commit is contained in:
jdl
2026-06-10 06:36:30 +02:00
parent a205f3acef
commit bb28b8f340
9 changed files with 46 additions and 32 deletions

View File

@@ -192,11 +192,11 @@ func Config_List(
type Network struct {
NetworkID int64
Name string
LocalDomain string
Network []byte
}
const Network_SelectQuery = "SELECT NetworkID,Name,Network FROM networks"
const Network_SelectQuery = "SELECT NetworkID,LocalDomain,Network FROM networks"
func Network_Insert(
tx TX,
@@ -207,7 +207,7 @@ func Network_Insert(
return err
}
_, err = tx.Exec("INSERT INTO networks(NetworkID,Name,Network) VALUES(?,?,?)", row.NetworkID, row.Name, row.Network)
_, err = tx.Exec("INSERT INTO networks(NetworkID,LocalDomain,Network) VALUES(?,?,?)", row.NetworkID, row.LocalDomain, row.Network)
return err
}
@@ -220,7 +220,7 @@ func Network_UpdateFull(
return err
}
result, err := tx.Exec("UPDATE networks SET Name=?,Network=? WHERE NetworkID=?", row.Name, row.Network, row.NetworkID)
result, err := tx.Exec("UPDATE networks SET LocalDomain=?,Network=? WHERE NetworkID=?", row.LocalDomain, row.Network, row.NetworkID)
if err != nil {
return err
}
@@ -270,8 +270,8 @@ func Network_Get(
err error,
) {
row = &Network{}
r := tx.QueryRow("SELECT NetworkID,Name,Network FROM networks WHERE NetworkID=?", NetworkID)
if err = r.Scan(&row.NetworkID, &row.Name, &row.Network); err != nil {
r := tx.QueryRow("SELECT NetworkID,LocalDomain,Network FROM networks WHERE NetworkID=?", NetworkID)
if err = r.Scan(&row.NetworkID, &row.LocalDomain, &row.Network); err != nil {
row = nil
}
return
@@ -287,7 +287,7 @@ func Network_GetWhere(
) {
row = &Network{}
r := tx.QueryRow(query, args...)
if err = r.Scan(&row.NetworkID, &row.Name, &row.Network); err != nil {
if err = r.Scan(&row.NetworkID, &row.LocalDomain, &row.Network); err != nil {
row = nil
}
return
@@ -309,7 +309,7 @@ func Network_Iterate(
defer rows.Close()
for rows.Next() {
row := &Network{}
err := rows.Scan(&row.NetworkID, &row.Name, &row.Network)
err := rows.Scan(&row.NetworkID, &row.LocalDomain, &row.Network)
if !yield(row, err) {
return
}

View File

@@ -11,6 +11,7 @@ var (
ErrNonPrivateIP = errors.New("non-private IP")
ErrInvalidPort = errors.New("invalid port")
ErrInvalidNetName = errors.New("invalid network name")
ErrNetNameNotLocal = errors.New("network name must end with .local")
ErrInvalidPeerName = errors.New("invalid peer name")
)
@@ -22,7 +23,7 @@ func Config_Validate(c *Config) error {
}
func Network_Sanitize(n *Network) {
n.Name = strings.TrimSpace(n.Name)
n.LocalDomain = strings.TrimSpace(n.LocalDomain)
if addr, ok := netip.AddrFromSlice(n.Network); ok {
n.Network = addr.AsSlice()
@@ -30,12 +31,17 @@ func Network_Sanitize(n *Network) {
}
func Network_Validate(c *Network) error {
// 16 bytes is linux limit for network interface names.
if len(c.Name) == 0 || len(c.Name) > 16 {
// 15 bytes is linux limit for network interface names. With ending .local,
// max length is 21.
if len(c.LocalDomain) == 0 || len(c.LocalDomain) > 21 {
return ErrInvalidNetName
}
for _, c := range c.Name {
if !strings.HasSuffix(c.LocalDomain, ".local") {
return ErrNetNameNotLocal
}
for _, c := range strings.TrimSuffix(c.LocalDomain, ".local") {
if c >= 'a' && c <= 'z' {
continue
}

View File

@@ -5,7 +5,7 @@ TABLE config OF Config (
TABLE networks OF Network (
NetworkID int64 PK,
Name string NoUpdate,
LocalDomain string NoUpdate,
Network []byte NoUpdate
);

View File

@@ -5,7 +5,7 @@ CREATE TABLE config (
CREATE TABLE networks (
NetworkID INTEGER NOT NULL PRIMARY KEY,
Name TEXT NOT NULL UNIQUE, -- Network/interface name.
LocalDomain TEXT NOT NULL UNIQUE, -- Network/interface name.
Network BLOB NOT NULL UNIQUE -- Network (/24), example 10.51.50.0
) WITHOUT ROWID;

View File

@@ -72,7 +72,7 @@ func (a *App) _adminNetworkCreateSubmit(s *api.Session, w http.ResponseWriter, r
var netStr string
err := webutil.NewFormScanner(r.Form).
Scan("Name", &n.Name).
Scan("LocalDomain", &n.LocalDomain).
Scan("Network", &netStr).
Error()
if err != nil {
@@ -345,12 +345,19 @@ func (a *App) _peerInit(peer *api.Peer, w http.ResponseWriter, r *http.Request)
}
func (a *App) _peerFetchState(peer *api.Peer, w http.ResponseWriter, r *http.Request) error {
net, err := a.api.Network_Get(peer.NetworkID)
if err != nil {
return err
}
peers, err := a.peersArray(peer.NetworkID)
if err != nil {
return err
}
return a.sendJSON(w, m.NetworkState{Peers: peers})
return a.sendJSON(w, m.NetworkState{
LocalDomain: net.LocalDomain,
Peers: peers,
})
}
func (a *App) peersArray(networkID int64) (peers [256]*m.Peer, err error) {

View File

@@ -3,8 +3,8 @@
<form method="POST">
<p>
<label>Name</label><br>
<input type="text" name="Name">
<label>Local Domain (ending with .local)</label><br>
<input type="text" name="LocalDomain">
</p>
<p>
<label>Network /24</label><br>

View File

@@ -9,7 +9,7 @@
<table>
<thead>
<tr>
<th>Name</th>
<th>Local Domain</th>
<th>Network</th>
</tr>
</thead>
@@ -18,7 +18,7 @@
<tr>
<td>
<a href="/admin/network/view/?NetworkID={{.NetworkID}}">
{{.Name}}
{{.LocalDomain}}
</a>
</td>
<td>{{ipToString .Network}}</td>

View File

@@ -17,7 +17,7 @@
</header>
<h2>
Network:
<a href="/admin/network/view/?NetworkID={{.Network.NetworkID}}">{{.Network.Name}}</a>
<a href="/admin/network/view/?NetworkID={{.Network.NetworkID}}">{{.Network.LocalDomain}}</a>
</h2>
{{block "body" .}}There's nothing here.{{end}}

View File

@@ -25,5 +25,6 @@ type Peer struct {
}
type NetworkState struct {
LocalDomain string
Peers [256]*Peer
}