mirror of
https://github.com/bjdgyc/anylink.git
synced 2025-08-10 23:53:29 +08:00
增加基于tap设备的桥接访问模式
This commit is contained in:
137
dbdata/db.go
Normal file
137
dbdata/db.go
Normal file
@@ -0,0 +1,137 @@
|
||||
package dbdata
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"log"
|
||||
|
||||
"github.com/bjdgyc/anylink/common"
|
||||
bolt "go.etcd.io/bbolt"
|
||||
)
|
||||
|
||||
const pageSize = 10
|
||||
|
||||
var (
|
||||
db *bolt.DB
|
||||
ErrNoKey = errors.New("db no this key")
|
||||
)
|
||||
|
||||
func initDb() {
|
||||
var err error
|
||||
db, err = bolt.Open(common.ServerCfg.DbFile, 0666, nil)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
// 创建bucket
|
||||
err = db.Update(func(tx *bolt.Tx) error {
|
||||
var err error
|
||||
_, err = tx.CreateBucketIfNotExists([]byte(BucketUser))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = tx.CreateBucketIfNotExists([]byte(BucketGroup))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = tx.CreateBucketIfNotExists([]byte(BucketMacIp))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func NextId(bucket string) int {
|
||||
var i int
|
||||
db.Update(func(tx *bolt.Tx) error {
|
||||
b := tx.Bucket([]byte(bucket))
|
||||
id, err := b.NextSequence()
|
||||
i = int(id)
|
||||
// discard error
|
||||
return err
|
||||
})
|
||||
return i
|
||||
}
|
||||
|
||||
func GetCount(bucket string) int {
|
||||
count := 0
|
||||
db.View(func(tx *bolt.Tx) error {
|
||||
bkt := tx.Bucket([]byte(bucket))
|
||||
s := bkt.Stats()
|
||||
// fmt.Printf("%+v \n", s)
|
||||
count = s.KeyN
|
||||
return nil
|
||||
})
|
||||
return count
|
||||
}
|
||||
|
||||
func Set(bucket, key string, v interface{}) error {
|
||||
return db.Update(func(tx *bolt.Tx) error {
|
||||
bkt := tx.Bucket([]byte(bucket))
|
||||
b, err := json.Marshal(v)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return bkt.Put([]byte(key), b)
|
||||
})
|
||||
}
|
||||
|
||||
func Del(bucket, key string) error {
|
||||
return db.Update(func(tx *bolt.Tx) error {
|
||||
bkt := tx.Bucket([]byte(bucket))
|
||||
return bkt.Delete([]byte(key))
|
||||
})
|
||||
}
|
||||
|
||||
func Get(bucket, key string, v interface{}) error {
|
||||
return db.View(func(tx *bolt.Tx) error {
|
||||
bkt := tx.Bucket([]byte(bucket))
|
||||
b := bkt.Get([]byte(key))
|
||||
if b == nil {
|
||||
return ErrNoKey
|
||||
}
|
||||
return json.Unmarshal(b, v)
|
||||
})
|
||||
}
|
||||
|
||||
// 分页获取
|
||||
func getList(bucket, lastKey string, prev bool) [][]byte {
|
||||
res := make([][]byte, 0)
|
||||
db.View(func(tx *bolt.Tx) error {
|
||||
c := tx.Bucket([]byte(bucket)).Cursor()
|
||||
size := pageSize
|
||||
k, b := c.Seek([]byte(lastKey))
|
||||
|
||||
if prev {
|
||||
for i := 0; i < size; i++ {
|
||||
k, b = c.Prev()
|
||||
if k == nil {
|
||||
break
|
||||
}
|
||||
res = append(res, b)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// next
|
||||
if string(k) != lastKey {
|
||||
// 不相同,说明找出其他的
|
||||
size -= 1
|
||||
res = append(res, b)
|
||||
}
|
||||
for i := 0; i < size; i++ {
|
||||
k, b = c.Next()
|
||||
if k == nil {
|
||||
break
|
||||
}
|
||||
res = append(res, b)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
return res
|
||||
}
|
63
dbdata/db_test.go
Normal file
63
dbdata/db_test.go
Normal file
@@ -0,0 +1,63 @@
|
||||
package dbdata
|
||||
|
||||
import (
|
||||
"net"
|
||||
"os"
|
||||
"path"
|
||||
"testing"
|
||||
|
||||
"github.com/bjdgyc/anylink/common"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func preIpData() {
|
||||
tmpDb := path.Join(os.TempDir(), "anylink_test.db")
|
||||
common.ServerCfg.DbFile = tmpDb
|
||||
initDb()
|
||||
}
|
||||
|
||||
func closeIpdata() {
|
||||
db.Close()
|
||||
tmpDb := path.Join(os.TempDir(), "anylink_test.db")
|
||||
os.Remove(tmpDb)
|
||||
}
|
||||
|
||||
func TestDb(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
preIpData()
|
||||
defer closeIpdata()
|
||||
|
||||
Set(BucketUser, "a", User{Username: "a"})
|
||||
Set(BucketUser, "b", User{Username: "b"})
|
||||
Set(BucketUser, "c", User{Username: "c"})
|
||||
Set(BucketUser, "d", User{Username: "d"})
|
||||
Set(BucketUser, "e", User{Username: "e"})
|
||||
Set(BucketUser, "f", User{Username: "f"})
|
||||
Set(BucketUser, "g", User{Username: "g"})
|
||||
|
||||
c := GetCount(BucketUser)
|
||||
assert.Equal(c, 7)
|
||||
Del(BucketUser, "g")
|
||||
c = GetCount(BucketUser)
|
||||
assert.Equal(c, 6)
|
||||
|
||||
// 分页查询
|
||||
us := GetUsers("d", false)
|
||||
assert.Equal(us[0].Username, "e")
|
||||
assert.Equal(us[1].Username, "f")
|
||||
us = GetUsers("d", true)
|
||||
assert.Equal(us[0].Username, "c")
|
||||
assert.Equal(us[1].Username, "b")
|
||||
assert.Equal(us[2].Username, "a")
|
||||
|
||||
mac1 := MacIp{Ip: net.ParseIP("192.168.3.11"), MacAddr: "mac1"}
|
||||
mac2 := MacIp{Ip: net.ParseIP("192.168.3.12"), MacAddr: "mac2"}
|
||||
Set(BucketMacIp, "mac1", mac1)
|
||||
Set(BucketMacIp, "mac2", mac2)
|
||||
|
||||
mp := GetAllMacIp()
|
||||
assert.Equal(mp[0].MacAddr, "mac1")
|
||||
assert.Equal(mp[1].MacAddr, "mac2")
|
||||
|
||||
os.Exit(0)
|
||||
}
|
36
dbdata/group.go
Normal file
36
dbdata/group.go
Normal file
@@ -0,0 +1,36 @@
|
||||
package dbdata
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"net"
|
||||
"time"
|
||||
)
|
||||
|
||||
const BucketGroup = "group"
|
||||
|
||||
type Group struct {
|
||||
Id int
|
||||
Name string
|
||||
RouteInclude []string
|
||||
RouteExclude []string
|
||||
AllowLan bool
|
||||
LinkAcl []struct {
|
||||
Action string // allow、deny
|
||||
IpNet string
|
||||
IPNet net.IPNet
|
||||
}
|
||||
Bandwidth int // 带宽限制
|
||||
CreatedAt time.Time
|
||||
UpdatedAt time.Time
|
||||
}
|
||||
|
||||
func GetGroups(lastKey string, prev bool) []Group {
|
||||
res := getList(BucketUser, lastKey, prev)
|
||||
datas := make([]Group, 0)
|
||||
for _, data := range res {
|
||||
d := Group{}
|
||||
json.Unmarshal(data, &d)
|
||||
datas = append(datas, d)
|
||||
}
|
||||
return datas
|
||||
}
|
34
dbdata/mac_ip.go
Normal file
34
dbdata/mac_ip.go
Normal file
@@ -0,0 +1,34 @@
|
||||
package dbdata
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"net"
|
||||
"time"
|
||||
|
||||
bolt "go.etcd.io/bbolt"
|
||||
)
|
||||
|
||||
const BucketMacIp = "macIp"
|
||||
|
||||
type MacIp struct {
|
||||
IsActive bool // db存储没有使用
|
||||
Ip net.IP
|
||||
MacAddr string
|
||||
LastLogin time.Time
|
||||
}
|
||||
|
||||
func GetAllMacIp() []MacIp {
|
||||
datas := make([]MacIp, 0)
|
||||
db.View(func(tx *bolt.Tx) error {
|
||||
bkt := tx.Bucket([]byte(BucketMacIp))
|
||||
bkt.ForEach(func(k, v []byte) error {
|
||||
d := MacIp{}
|
||||
json.Unmarshal(v, &d)
|
||||
datas = append(datas, d)
|
||||
return nil
|
||||
})
|
||||
return nil
|
||||
})
|
||||
|
||||
return datas
|
||||
}
|
9
dbdata/start.go
Normal file
9
dbdata/start.go
Normal file
@@ -0,0 +1,9 @@
|
||||
package dbdata
|
||||
|
||||
func Start() {
|
||||
initDb()
|
||||
}
|
||||
|
||||
func Stop() error {
|
||||
return db.Close()
|
||||
}
|
29
dbdata/user.go
Normal file
29
dbdata/user.go
Normal file
@@ -0,0 +1,29 @@
|
||||
package dbdata
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"time"
|
||||
)
|
||||
|
||||
const BucketUser = "user"
|
||||
|
||||
type User struct {
|
||||
Id int
|
||||
Username string
|
||||
Password string
|
||||
OtpSecret string
|
||||
Group []string
|
||||
// CreatedAt time.Time
|
||||
UpdatedAt time.Time
|
||||
}
|
||||
|
||||
func GetUsers(lastKey string, prev bool) []User {
|
||||
res := getList(BucketUser, lastKey, prev)
|
||||
datas := make([]User, 0)
|
||||
for _, data := range res {
|
||||
d := User{}
|
||||
json.Unmarshal(data, &d)
|
||||
datas = append(datas, d)
|
||||
}
|
||||
return datas
|
||||
}
|
Reference in New Issue
Block a user