diff --git a/controllers/system_info.go b/controllers/system_info.go index de349f54..ba01d20e 100644 --- a/controllers/system_info.go +++ b/controllers/system_info.go @@ -15,22 +15,9 @@ package controllers import ( - "github.com/casdoor/casdoor/object" "github.com/casdoor/casdoor/util" ) -type SystemInfo struct { - MemoryUsed uint64 `json:"memory_used"` - MemoryTotal uint64 `json:"memory_total"` - CpuUsage []float64 `json:"cpu_usage"` -} - -type GitRepoInfo struct { - AheadCnt int `json:"ahead_cnt"` - Commit string `json:"commit"` - Version string `json:"version"` -} - // GetSystemInfo // @Title GetSystemInfo // @Tag System API @@ -39,54 +26,32 @@ type GitRepoInfo struct { // @Success 200 {object} object.SystemInfo The Response object // @router /get-system-info [get] func (c *ApiController) GetSystemInfo() { - id := c.GetString("id") - if id == "" { - id = c.GetSessionUsername() - } - - user := object.GetUser(id) - if user == nil || !user.IsGlobalAdmin { - c.ResponseError(c.T("auth:Unauthorized operation")) + _, ok := c.RequireAdmin() + if !ok { return } - cpuUsage, err := util.GetCpuUsage() + systemInfo, err := util.GetSystemInfo() if err != nil { c.ResponseError(err.Error()) return } - memoryUsed, memoryTotal, err := util.GetMemoryUsage() - if err != nil { - c.ResponseError(err.Error()) - return - } - - c.Data["json"] = SystemInfo{ - CpuUsage: cpuUsage, - MemoryUsed: memoryUsed, - MemoryTotal: memoryTotal, - } - c.ServeJSON() + c.ResponseOk(systemInfo) } -// GitRepoVersion -// @Title GitRepoVersion +// GetVersionInfo +// @Title GetVersionInfo // @Tag System API -// @Description get local github repo's latest release version info -// @Success 200 {string} local latest version hash of casdoor -// @router /get-release [get] -func (c *ApiController) GitRepoVersion() { - aheadCnt, commit, version, err := util.GetGitRepoVersion() +// @Description get local git repo's latest release version info +// @Success 200 {string} local latest version hash of Casdoor +// @router /get-version-info [get] +func (c *ApiController) GetVersionInfo() { + versionInfo, err := util.GetVersionInfo() if err != nil { c.ResponseError(err.Error()) return } - c.Data["json"] = GitRepoInfo{ - AheadCnt: aheadCnt, - Commit: commit, - Version: version, - } - c.ServeJSON() + c.ResponseOk(versionInfo) } diff --git a/routers/router.go b/routers/router.go index d1447194..d4532f09 100644 --- a/routers/router.go +++ b/routers/router.go @@ -225,5 +225,5 @@ func initAPI() { beego.Router("/api/webauthn/signin/finish", &controllers.ApiController{}, "Post:WebAuthnSigninFinish") beego.Router("/api/get-system-info", &controllers.ApiController{}, "GET:GetSystemInfo") - beego.Router("/api/get-release", &controllers.ApiController{}, "GET:GitRepoVersion") + beego.Router("/api/get-version-info", &controllers.ApiController{}, "GET:GetVersionInfo") } diff --git a/util/system.go b/util/system.go index 9abc301b..ef3c2c3f 100644 --- a/util/system.go +++ b/util/system.go @@ -26,16 +26,26 @@ import ( "github.com/shirou/gopsutil/mem" ) -// get cpu usage -func GetCpuUsage() ([]float64, error) { +type SystemInfo struct { + CpuUsage []float64 `json:"cpuUsage"` + MemoryUsed uint64 `json:"memoryUsed"` + MemoryTotal uint64 `json:"memoryTotal"` +} + +type VersionInfo struct { + Version string `json:"version"` + CommitId string `json:"commitId"` + CommitOffset int `json:"commitOffset"` +} + +// getCpuUsage get cpu usage +func getCpuUsage() ([]float64, error) { usage, err := cpu.Percent(time.Second, true) return usage, err } -var fileDate, version string - -// get memory usage -func GetMemoryUsage() (uint64, uint64, error) { +// getMemoryUsage get memory usage +func getMemoryUsage() (uint64, uint64, error) { virtualMem, err := mem.VirtualMemory() if err != nil { return 0, 0, err @@ -47,21 +57,46 @@ func GetMemoryUsage() (uint64, uint64, error) { return m.TotalAlloc, virtualMem.Total, nil } -// get github current commit and repo release version -func GetGitRepoVersion() (int, string, string, error) { +func GetSystemInfo() (*SystemInfo, error) { + cpuUsage, err := getCpuUsage() + if err != nil { + return nil, err + } + + memoryUsed, memoryTotal, err := getMemoryUsage() + if err != nil { + return nil, err + } + + res := &SystemInfo{ + CpuUsage: cpuUsage, + MemoryUsed: memoryUsed, + MemoryTotal: memoryTotal, + } + return res, nil +} + +// GetVersionInfo get git current commit and repo release version +func GetVersionInfo() (*VersionInfo, error) { + res := &VersionInfo{ + Version: "", + CommitId: "", + CommitOffset: -1, + } + _, filename, _, _ := runtime.Caller(0) rootPath := path.Dir(path.Dir(filename)) r, err := git.PlainOpen(rootPath) if err != nil { - return -1, "", "", err + return res, err } ref, err := r.Head() if err != nil { - return -1, "", "", err + return res, err } tags, err := r.Tags() if err != nil { - return -1, "", "", err + return res, err } tagMap := make(map[plumbing.Hash]string) err = tags.ForEach(func(t *plumbing.Reference) error { @@ -74,29 +109,34 @@ func GetGitRepoVersion() (int, string, string, error) { return nil }) if err != nil { - return -1, "", "", err + return res, err } cIter, err := r.Log(&git.LogOptions{From: ref.Hash()}) - aheadCnt := 0 - releaseVersion := "" + commitOffset := 0 + version := "" // iterates over the commits err = cIter.ForEach(func(c *object.Commit) error { tag, ok := tagMap[c.Hash] if ok { - if releaseVersion == "" { - releaseVersion = tag + if version == "" { + version = tag } } - if releaseVersion == "" { - aheadCnt++ + if version == "" { + commitOffset++ } return nil }) if err != nil { - return -1, "", "", err + return res, err } - return aheadCnt, ref.Hash().String(), releaseVersion, nil + res = &VersionInfo{ + Version: version, + CommitId: ref.Hash().String(), + CommitOffset: commitOffset, + } + return res, nil } diff --git a/util/sysytem_test.go b/util/system_test.go similarity index 93% rename from util/sysytem_test.go rename to util/system_test.go index 2c206b47..1970c988 100644 --- a/util/sysytem_test.go +++ b/util/system_test.go @@ -29,21 +29,21 @@ import ( ) func TestGetCpuUsage(t *testing.T) { - usage, err := GetCpuUsage() + usage, err := getCpuUsage() assert.Nil(t, err) t.Log(usage) } func TestGetMemoryUsage(t *testing.T) { - used, total, err := GetMemoryUsage() + used, total, err := getMemoryUsage() assert.Nil(t, err) t.Log(used, total) } func TestGetGitRepoVersion(t *testing.T) { - aheadCnt, commit, version, err := GetGitRepoVersion() + versionInfo, err := GetVersionInfo() assert.Nil(t, err) - t.Log(aheadCnt, commit, version) + t.Log(versionInfo) } func TestGetVersion(t *testing.T) { diff --git a/web/src/SystemInfo.js b/web/src/SystemInfo.js index 6818c5ba..5dec4583 100644 --- a/web/src/SystemInfo.js +++ b/web/src/SystemInfo.js @@ -23,31 +23,24 @@ class SystemInfo extends React.Component { constructor(props) { super(props); this.state = { - cpuUsage: [], - memUsed: 0, - memTotal: 0, - latestVersion: undefined, + systemInfo: {cpuUsage: [], memoryUsed: 0, memoryTotal: 0}, + versionInfo: {}, intervalId: null, - href: "", loading: true, }; } UNSAFE_componentWillMount() { - SystemBackend.getSystemInfo(this.props.account?.owner, this.props.account?.name).then(res => { + SystemBackend.getSystemInfo().then(res => { this.setState({ - cpuUsage: res.cpu_usage, - memUsed: res.memory_used, - memTotal: res.memory_total, + systemInfo: res.data, loading: false, }); const id = setInterval(() => { - SystemBackend.getSystemInfo(this.props.account?.owner, this.props.account?.name).then(res => { + SystemBackend.getSystemInfo().then(res => { this.setState({ - cpuUsage: res.cpu_usage, - memUsed: res.memory_used, - memTotal: res.memory_total, + systemInfo: res.data, }); }).catch(error => { Setting.showMessage("error", `System info failed to get: ${error}`); @@ -58,12 +51,12 @@ class SystemInfo extends React.Component { Setting.showMessage("error", `System info failed to get: ${error}`); }); - SystemBackend.getGitHubLatestReleaseVersion().then(res => { - const href = res.version && res.version.length > 0 ? `https://github.com/casdoor/casdoor/releases/tag/${res.version}` : ""; - const versionText = res.version && res.version.length > 0 ? res.version : i18next.t("system:Unknown Version"); - this.setState({latestVersion: versionText, href: href}); + SystemBackend.getVersionInfo().then(res => { + this.setState({ + versionInfo: res.data, + }); }).catch(err => { - Setting.showMessage("error", `get latest commit version failed: ${err}`); + Setting.showMessage("error", `Version info failed to get: ${err}`); }); } @@ -74,21 +67,25 @@ class SystemInfo extends React.Component { } render() { - const CPUInfo = this.state.cpuUsage?.length > 0 ? - this.state.cpuUsage.map((usage, i) => { + const cpuUi = this.state.systemInfo.cpuUsage?.length <= 0 ? i18next.t("system:Get CPU Usage Failed") : + this.state.systemInfo.cpuUsage.map((usage, i) => { return ( ); - }) : i18next.t("system:Get CPU Usage Failed"); + }); - const MemInfo = ( - this.state.memUsed && this.state.memTotal && this.state.memTotal !== 0 ? -