Skip to content

Commit 72391f0

Browse files
authored
Merge pull request #598 from go-admin-team/dev
fix🐛: fix monitor macos env error (#605)
2 parents e2c5075 + 39e26d7 commit 72391f0

File tree

14 files changed

+525
-87
lines changed

14 files changed

+525
-87
lines changed

Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ PROJECT:=go-admin
33
.PHONY: build
44
build:
55
CGO_ENABLED=0 go build -o go-admin main.go
6+
build-linux:
7+
env GOOS=linux GOARCH=amd64 go build
68
build-sqlite:
79
go build -tags sqlite3 -o go-admin main.go
810
#.PHONY: test

app/admin/service/sys_role.go

Lines changed: 58 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package service
22

33
import (
44
"errors"
5+
"github.com/go-admin-team/go-admin-core/sdk/config"
56
"gorm.io/gorm/clause"
67

78
"github.com/casbin/casbin/v2"
@@ -71,14 +72,17 @@ func (e *SysRole) Insert(c *dto.SysRoleInsertReq, cb *casbin.SyncedEnforcer) err
7172
}
7273
c.SysMenu = dataMenu
7374
c.Generate(&data)
74-
tx := e.Orm.Begin()
75-
defer func() {
76-
if err != nil {
77-
tx.Rollback()
78-
} else {
79-
tx.Commit()
80-
}
81-
}()
75+
tx := e.Orm
76+
if config.DatabaseConfig.Driver != "sqlite3" {
77+
tx := e.Orm.Begin()
78+
defer func() {
79+
if err != nil {
80+
tx.Rollback()
81+
} else {
82+
tx.Commit()
83+
}
84+
}()
85+
}
8286

8387
err = tx.Create(&data).Error
8488
if err != nil {
@@ -108,14 +112,17 @@ func (e *SysRole) Insert(c *dto.SysRoleInsertReq, cb *casbin.SyncedEnforcer) err
108112
// Update 修改SysRole对象
109113
func (e *SysRole) Update(c *dto.SysRoleUpdateReq, cb *casbin.SyncedEnforcer) error {
110114
var err error
111-
tx := e.Orm.Debug().Begin()
112-
defer func() {
113-
if err != nil {
114-
tx.Rollback()
115-
} else {
116-
tx.Commit()
117-
}
118-
}()
115+
tx := e.Orm
116+
if config.DatabaseConfig.Driver != "sqlite3" {
117+
tx := e.Orm.Begin()
118+
defer func() {
119+
if err != nil {
120+
tx.Rollback()
121+
} else {
122+
tx.Commit()
123+
}
124+
}()
125+
}
119126
var model = models.SysRole{}
120127
var mlist = make([]models.SysMenu, 0)
121128
tx.Preload("SysMenu").First(&model, c.GetId())
@@ -142,7 +149,7 @@ func (e *SysRole) Update(c *dto.SysRoleUpdateReq, cb *casbin.SyncedEnforcer) err
142149
e.Log.Errorf("delete policy error:%s", err)
143150
return err
144151
}
145-
mp:=make(map [string] interface{} ,0)
152+
mp := make(map[string]interface{}, 0)
146153
polices := make([][]string, 0)
147154
for _, menu := range mlist {
148155
for _, api := range menu.SysApi {
@@ -164,14 +171,17 @@ func (e *SysRole) Update(c *dto.SysRoleUpdateReq, cb *casbin.SyncedEnforcer) err
164171
// Remove 删除SysRole
165172
func (e *SysRole) Remove(c *dto.SysRoleDeleteReq) error {
166173
var err error
167-
tx := e.Orm.Begin()
168-
defer func() {
169-
if err != nil {
170-
tx.Rollback()
171-
} else {
172-
tx.Commit()
173-
}
174-
}()
174+
tx := e.Orm
175+
if config.DatabaseConfig.Driver != "sqlite3" {
176+
tx := e.Orm.Begin()
177+
defer func() {
178+
if err != nil {
179+
tx.Rollback()
180+
} else {
181+
tx.Commit()
182+
}
183+
}()
184+
}
175185
var model = models.SysRole{}
176186
tx.Preload("SysMenu").Preload("SysDept").First(&model, c.GetId())
177187
db := tx.Select(clause.Associations).Delete(&model)
@@ -203,14 +213,17 @@ func (e *SysRole) GetRoleMenuId(roleId int) ([]int, error) {
203213

204214
func (e *SysRole) UpdateDataScope(c *dto.RoleDataScopeReq) *SysRole {
205215
var err error
206-
tx := e.Orm.Begin()
207-
defer func() {
208-
if err != nil {
209-
tx.Rollback()
210-
} else {
211-
tx.Commit()
212-
}
213-
}()
216+
tx := e.Orm
217+
if config.DatabaseConfig.Driver != "sqlite3" {
218+
tx := e.Orm.Begin()
219+
defer func() {
220+
if err != nil {
221+
tx.Rollback()
222+
} else {
223+
tx.Commit()
224+
}
225+
}()
226+
}
214227
var dlist = make([]models.SysDept, 0)
215228
var model = models.SysRole{}
216229
tx.Preload("SysDept").First(&model, c.RoleId)
@@ -239,14 +252,17 @@ func (e *SysRole) UpdateDataScope(c *dto.RoleDataScopeReq) *SysRole {
239252
// UpdateStatus 修改SysRole对象status
240253
func (e *SysRole) UpdateStatus(c *dto.UpdateStatusReq) error {
241254
var err error
242-
tx := e.Orm.Debug().Begin()
243-
defer func() {
244-
if err != nil {
245-
tx.Rollback()
246-
} else {
247-
tx.Commit()
248-
}
249-
}()
255+
tx := e.Orm
256+
if config.DatabaseConfig.Driver != "sqlite3" {
257+
tx := e.Orm.Begin()
258+
defer func() {
259+
if err != nil {
260+
tx.Rollback()
261+
} else {
262+
tx.Commit()
263+
}
264+
}()
265+
}
250266
var model = models.SysRole{}
251267
tx.First(&model, c.GetId())
252268
c.Generate(&model)
@@ -299,4 +315,4 @@ func (e *SysRole) GetById(roleId int) ([]string, error) {
299315
permissions = append(permissions, l[i].Permission)
300316
}
301317
return permissions, nil
302-
}
318+
}

app/other/apis/sys_server_monitor.go

Lines changed: 98 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,21 @@ package apis
22

33
import (
44
"fmt"
5-
"github.com/shirou/gopsutil/host"
5+
"github.com/shirou/gopsutil/v3/net"
6+
"regexp"
67
"runtime"
78
"strconv"
9+
"strings"
810
"time"
911

1012
"github.com/gin-gonic/gin"
1113
"github.com/go-admin-team/go-admin-core/sdk/api"
1214
"github.com/go-admin-team/go-admin-core/sdk/pkg"
1315
_ "github.com/go-admin-team/go-admin-core/sdk/pkg/response"
14-
"github.com/shirou/gopsutil/cpu"
15-
"github.com/shirou/gopsutil/disk"
16-
"github.com/shirou/gopsutil/mem"
16+
"github.com/shirou/gopsutil/v3/cpu"
17+
"github.com/shirou/gopsutil/v3/disk"
18+
"github.com/shirou/gopsutil/v3/host"
19+
"github.com/shirou/gopsutil/v3/mem"
1720
)
1821

1922
const (
@@ -23,11 +26,28 @@ const (
2326
GB = 1024 * MB
2427
)
2528

29+
var (
30+
Version string
31+
expectDiskFsTypes = []string{
32+
"apfs", "ext4", "ext3", "ext2", "f2fs", "reiserfs", "jfs", "btrfs",
33+
"fuseblk", "zfs", "simfs", "ntfs", "fat32", "exfat", "xfs", "fuse.rclone",
34+
}
35+
excludeNetInterfaces = []string{
36+
"lo", "tun", "docker", "veth", "br-", "vmbr", "vnet", "kube",
37+
}
38+
getMacDiskNo = regexp.MustCompile(`\/dev\/disk(\d)s.*`)
39+
)
40+
41+
var (
42+
netInSpeed, netOutSpeed, netInTransfer, netOutTransfer, lastUpdateNetStats uint64
43+
cachedBootTime time.Time
44+
)
45+
2646
type ServerMonitor struct {
2747
api.Api
2848
}
2949

30-
//获取相差时间
50+
// GetHourDiffer 获取相差时间
3151
func GetHourDiffer(startTime, endTime string) int64 {
3252
var hour int64
3353
t1, err := time.ParseInLocation("2006-01-02 15:04:05", startTime, time.Local)
@@ -64,33 +84,28 @@ func (e ServerMonitor) ServerInfo(c *gin.Context) {
6484
osDic["hostName"] = sysInfo.Hostname
6585
osDic["time"] = time.Now().Format("2006-01-02 15:04:05")
6686

67-
dis, _ := disk.Usage("/")
68-
diskTotalGB := int(dis.Total) / GB
69-
diskFreeGB := int(dis.Free) / GB
70-
diskDic := make(map[string]interface{}, 0)
71-
diskDic["total"] = diskTotalGB
72-
diskDic["free"] = diskFreeGB
73-
7487
mem, _ := mem.VirtualMemory()
75-
memUsedMB := int(mem.Used) / GB
76-
memTotalMB := int(mem.Total) / GB
77-
memFreeMB := int(mem.Free) / GB
78-
memUsedPercent := int(mem.UsedPercent)
7988
memDic := make(map[string]interface{}, 0)
80-
memDic["total"] = memTotalMB
81-
memDic["used"] = memUsedMB
82-
memDic["free"] = memFreeMB
83-
memDic["usage"] = memUsedPercent
89+
memDic["used"] = mem.Used / MB
90+
memDic["total"] = mem.Total / MB
91+
92+
fmt.Println("mem", int(mem.Total/mem.Used*100))
93+
memDic["percent"] = pkg.Round(mem.UsedPercent, 2)
94+
95+
swapDic := make(map[string]interface{}, 0)
96+
swapDic["used"] = mem.SwapTotal - mem.SwapFree
97+
swapDic["total"] = mem.SwapTotal
8498

8599
cpuDic := make(map[string]interface{}, 0)
86100
cpuDic["cpuInfo"], _ = cpu.Info()
87101
percent, _ := cpu.Percent(0, false)
88-
cpuDic["Percent"] = pkg.Round(percent[0], 2)
102+
cpuDic["percent"] = pkg.Round(percent[0], 2)
89103
cpuDic["cpuNum"], _ = cpu.Counts(false)
90104

91105
//服务器磁盘信息
92106
disklist := make([]disk.UsageStat, 0)
93107
//所有分区
108+
var diskTotal, diskUsed, diskUsedPercent float64
94109
diskInfo, err := disk.Partitions(true)
95110
if err == nil {
96111
for _, p := range diskInfo {
@@ -101,16 +116,72 @@ func (e ServerMonitor) ServerInfo(c *gin.Context) {
101116
diskDetail.Used = diskDetail.Used / 1024 / 1024
102117
diskDetail.Free = diskDetail.Free / 1024 / 1024
103118
disklist = append(disklist, *diskDetail)
119+
104120
}
105121
}
106122
}
107123

124+
d, _ := disk.Usage("/")
125+
126+
diskTotal = float64(d.Total / GB)
127+
diskUsed = float64(d.Used / GB)
128+
diskUsedPercent, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", d.UsedPercent), 64)
129+
130+
diskDic := make(map[string]interface{}, 0)
131+
diskDic["total"] = diskTotal
132+
diskDic["used"] = diskUsed
133+
diskDic["percent"] = diskUsedPercent
134+
135+
bootTime, _ := host.BootTime()
136+
cachedBootTime = time.Unix(int64(bootTime), 0)
137+
138+
TrackNetworkSpeed()
139+
netDic := make(map[string]interface{}, 0)
140+
netDic["in"] = pkg.Round(float64(netInSpeed/KB), 2)
141+
netDic["out"] = pkg.Round(float64(netOutSpeed/KB), 2)
108142
e.Custom(gin.H{
109-
"code": 200,
110-
"os": osDic,
111-
"mem": memDic,
112-
"cpu": cpuDic,
113-
"disk": diskDic,
114-
"diskList": disklist,
143+
"code": 200,
144+
"os": osDic,
145+
"mem": memDic,
146+
"cpu": cpuDic,
147+
"disk": diskDic,
148+
"net": netDic,
149+
"swap": swapDic,
150+
"location": "Aliyun",
151+
"bootTime": GetHourDiffer(cachedBootTime.Format("2006-01-02 15:04:05"), time.Now().Format("2006-01-02 15:04:05")),
115152
})
116153
}
154+
155+
func TrackNetworkSpeed() {
156+
var innerNetInTransfer, innerNetOutTransfer uint64
157+
nc, err := net.IOCounters(true)
158+
if err == nil {
159+
for _, v := range nc {
160+
if isListContainsStr(excludeNetInterfaces, v.Name) {
161+
continue
162+
}
163+
innerNetInTransfer += v.BytesRecv
164+
innerNetOutTransfer += v.BytesSent
165+
}
166+
now := uint64(time.Now().Unix())
167+
diff := now - lastUpdateNetStats
168+
if diff > 0 {
169+
netInSpeed = (innerNetInTransfer - netInTransfer) / diff
170+
fmt.Println("netInSpeed", netInSpeed)
171+
netOutSpeed = (innerNetOutTransfer - netOutTransfer) / diff
172+
fmt.Println("netOutSpeed", netOutSpeed)
173+
}
174+
netInTransfer = innerNetInTransfer
175+
netOutTransfer = innerNetOutTransfer
176+
lastUpdateNetStats = now
177+
}
178+
}
179+
180+
func isListContainsStr(list []string, str string) bool {
181+
for i := 0; i < len(list); i++ {
182+
if strings.Contains(str, list[i]) {
183+
return true
184+
}
185+
}
186+
return false
187+
}

cmd/migrate/migration/init.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func (e *Migration) Migrate() {
4646
var err error
4747
var count int64
4848
for _, v := range versions {
49-
err = e.db.Debug().Table("sys_migration").Where("version = ?", v).Count(&count).Error
49+
err = e.db.Table("sys_migration").Where("version = ?", v).Count(&count).Error
5050
if err != nil {
5151
log.Fatalln(err)
5252
}
@@ -55,7 +55,7 @@ func (e *Migration) Migrate() {
5555
count = 0
5656
continue
5757
}
58-
err = (e.version[v])(e.db.Debug(), strconv.Itoa(v))
58+
err = (e.version[v])(e.db, strconv.Itoa(v))
5959
if err != nil {
6060
log.Fatalln(err)
6161
}

cmd/migrate/migration/models/initdb.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func ExecSql(db *gorm.DB, filePath string) error {
3939
fmt.Println(sqlList[i])
4040
continue
4141
}
42-
sql := strings.Replace(sqlList[i]+";", "\n", "", 0)
42+
sql := strings.Replace(sqlList[i]+";", "\n", "", -1)
4343
sql = strings.TrimSpace(sql)
4444
if err = db.Exec(sql).Error; err != nil {
4545
log.Printf("error sql: %s", sql)
@@ -60,4 +60,4 @@ func Ioutil(filePath string) (string, error) {
6060
} else {
6161
return "", err
6262
}
63-
}
63+
}

0 commit comments

Comments
 (0)