WIP: DNS
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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}}
|
||||||
|
|||||||
15
m/models.go
15
m/models.go
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user