增加基于tap设备的桥接访问模式

This commit is contained in:
bjdgyc
2020-09-14 17:17:50 +08:00
parent 3b64de19b8
commit 31b1f12dbe
57 changed files with 2598 additions and 703 deletions

137
dbdata/db.go Normal file
View 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
View 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
View 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
View 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
View File

@@ -0,0 +1,9 @@
package dbdata
func Start() {
initDb()
}
func Stop() error {
return db.Close()
}

29
dbdata/user.go Normal file
View 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
}