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

@@ -191,12 +191,12 @@ func Config_List(
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
type Network struct { type Network struct {
NetworkID int64 NetworkID int64
Name string LocalDomain string
Network []byte Network []byte
} }
const Network_SelectQuery = "SELECT NetworkID,Name,Network FROM networks" const Network_SelectQuery = "SELECT NetworkID,LocalDomain,Network FROM networks"
func Network_Insert( func Network_Insert(
tx TX, tx TX,
@@ -207,7 +207,7 @@ func Network_Insert(
return err 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 return err
} }
@@ -220,7 +220,7 @@ func Network_UpdateFull(
return err 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 { if err != nil {
return err return err
} }
@@ -270,8 +270,8 @@ func Network_Get(
err error, err error,
) { ) {
row = &Network{} row = &Network{}
r := tx.QueryRow("SELECT NetworkID,Name,Network FROM networks WHERE NetworkID=?", NetworkID) r := tx.QueryRow("SELECT NetworkID,LocalDomain,Network FROM networks WHERE NetworkID=?", NetworkID)
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 row = nil
} }
return return
@@ -287,7 +287,7 @@ func Network_GetWhere(
) { ) {
row = &Network{} row = &Network{}
r := tx.QueryRow(query, args...) 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 row = nil
} }
return return
@@ -309,7 +309,7 @@ func Network_Iterate(
defer rows.Close() defer rows.Close()
for rows.Next() { for rows.Next() {
row := &Network{} row := &Network{}
err := rows.Scan(&row.NetworkID, &row.Name, &row.Network) err := rows.Scan(&row.NetworkID, &row.LocalDomain, &row.Network)
if !yield(row, err) { if !yield(row, err) {
return return
} }

View File

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

View File

@@ -4,9 +4,9 @@ TABLE config OF Config (
); );
TABLE networks OF Network ( TABLE networks OF Network (
NetworkID int64 PK, NetworkID int64 PK,
Name string NoUpdate, LocalDomain string NoUpdate,
Network []byte NoUpdate Network []byte NoUpdate
); );
TABLE peers OF Peer ( TABLE peers OF Peer (

View File

@@ -5,7 +5,7 @@ CREATE TABLE config (
CREATE TABLE networks ( CREATE TABLE networks (
NetworkID INTEGER NOT NULL PRIMARY KEY, 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 Network BLOB NOT NULL UNIQUE -- Network (/24), example 10.51.50.0
) WITHOUT ROWID; ) WITHOUT ROWID;

View File

@@ -72,7 +72,7 @@ func (a *App) _adminNetworkCreateSubmit(s *api.Session, w http.ResponseWriter, r
var netStr string var netStr string
err := webutil.NewFormScanner(r.Form). err := webutil.NewFormScanner(r.Form).
Scan("Name", &n.Name). Scan("LocalDomain", &n.LocalDomain).
Scan("Network", &netStr). Scan("Network", &netStr).
Error() Error()
if err != nil { 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 { 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) peers, err := a.peersArray(peer.NetworkID)
if err != nil { if err != nil {
return err 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) { func (a *App) peersArray(networkID int64) (peers [256]*m.Peer, err error) {

View File

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

View File

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

View File

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

View File

@@ -13,17 +13,18 @@ type PeerInitResp struct {
} }
type Peer struct { type Peer struct {
PeerIP byte PeerIP byte
Version int64 Version int64
Name string Name string
Addr4 []byte Addr4 []byte
Addr6 []byte Addr6 []byte
Port uint16 Port uint16
Relay bool Relay bool
WGPubKey []byte WGPubKey []byte
SignPubKey []byte SignPubKey []byte
} }
type NetworkState struct { type NetworkState struct {
Peers [256]*Peer LocalDomain string
Peers [256]*Peer
} }