You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@casbin.apache.org by hs...@apache.org on 2026/08/22 07:59:36 UTC

(casbin-gateway) branch master updated: fix(run): remove desktop shortcut and self-start

This is an automated email from the ASF dual-hosted git repository.

hsluoyz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/casbin-gateway.git


The following commit(s) were added to refs/heads/master by this push:
     new 5878eae  fix(run): remove desktop shortcut and self-start
5878eae is described below

commit 5878eaed69580415a7eb44231f967fb1fff1e8bb
Author: Yang Luo <hs...@gmail.com>
AuthorDate: Sat Aug 22 15:59:27 2026 +0800

    fix(run): remove desktop shortcut and self-start
---
 main.go             |  1 -
 object/site.go      |  6 ++--
 run/run.go          | 26 ---------------
 run/self.go         | 52 ------------------------------
 run/util.go         | 42 ------------------------
 run/util_path.go    | 25 --------------
 run/util_process.go | 93 +++++++++++++++++++++--------------------------------
 7 files changed, 39 insertions(+), 206 deletions(-)

diff --git a/main.go b/main.go
index fd44b2f..a67561f 100644
--- a/main.go
+++ b/main.go
@@ -58,7 +58,6 @@ func main() {
 	object.InitRuleMap()
 	run.InitAppMap()
 	run.InitRdsClient()
-	run.InitSelfStart()
 	object.StartMonitorSitesLoop()
 
 	agentmonitor.Configure(
diff --git a/object/site.go b/object/site.go
index d1bbd14..792769c 100644
--- a/object/site.go
+++ b/object/site.go
@@ -292,12 +292,12 @@ func (site *Site) checkNodes() error {
 					msg = addErrorToMsg(msg, "IsProcessActive", err)
 				}
 			}
-			// Also check if the window title exists (process may be starting/compiling)
+			// Also check if the process exists (it may be starting/compiling)
 			if !ok {
 				var err error
-				ok, err = run.IsWindowTitleActive(site.Name)
+				ok, err = run.IsSiteProcessActive(site.Name)
 				if err != nil {
-					msg = addErrorToMsg(msg, "IsWindowTitleActive", err)
+					msg = addErrorToMsg(msg, "IsSiteProcessActive", err)
 				}
 			}
 		}
diff --git a/run/run.go b/run/run.go
index 37064e1..28af6ca 100644
--- a/run/run.go
+++ b/run/run.go
@@ -94,19 +94,6 @@ func CreateRepo(siteName string, needStart bool, diff string, providerName strin
 				return wrapRepoError("gitUploadCdn", path, err)
 			}
 		}
-
-		_, err = updateBatFile(siteName)
-		if err != nil {
-			return wrapRepoError("updateBatFile", path, err)
-		}
-
-		shortcutPath := getShortcutPath(siteName)
-		if !util.FileExist(shortcutPath) {
-			err = updateShortcutFile(siteName)
-			if err != nil {
-				return wrapRepoError("updateShortcutFile", path, err)
-			}
-		}
 	} else {
 		// For existing repositories, check if upgrade is allowed
 		affected := false
@@ -154,19 +141,6 @@ func CreateRepo(siteName string, needStart bool, diff string, providerName strin
 			}
 		}
 
-		_, err = updateBatFile(siteName)
-		if err != nil {
-			return wrapRepoError("updateBatFile", path, err)
-		}
-
-		shortcutPath := getShortcutPath(siteName)
-		if !util.FileExist(shortcutPath) {
-			err = updateShortcutFile(siteName)
-			if err != nil {
-				return wrapRepoError("updateShortcutFile", path, err)
-			}
-		}
-
 		if affected {
 			if !needStart {
 				if !strings.HasPrefix(siteName, "casdoor") && !strings.HasPrefix(siteName, "casibase") && !strings.HasPrefix(siteName, "opendata") {
diff --git a/run/self.go b/run/self.go
deleted file mode 100644
index b1456b4..0000000
--- a/run/self.go
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2023 The casbin Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package run
-
-import (
-	"runtime"
-	"strings"
-
-	"github.com/apache/casbin-gateway/util"
-	"github.com/beego/beego"
-)
-
-func InitSelfStart() {
-	if runtime.GOOS != "windows" {
-		return
-	}
-
-	hostname := util.GetHostname()
-	if strings.Count(hostname, "-") == 2 {
-		return
-	}
-
-	siteName := beego.AppConfig.String("dbName")
-	if siteName == "" {
-		panic("InitSelfStart() error, siteName should not be empty")
-	}
-
-	_, err := updateBatFile(siteName)
-	if err != nil {
-		panic(err)
-	}
-
-	shortcutPath := getShortcutPath(siteName)
-	if !util.FileExist(shortcutPath) {
-		err = updateShortcutFile(siteName)
-		if err != nil {
-			panic(err)
-		}
-	}
-}
diff --git a/run/util.go b/run/util.go
index 4319861..cfbdefa 100644
--- a/run/util.go
+++ b/run/util.go
@@ -18,7 +18,6 @@ import (
 	"fmt"
 	"os"
 	"os/exec"
-	"path/filepath"
 	"strings"
 
 	"github.com/apache/casbin-gateway/conf"
@@ -64,22 +63,6 @@ func getRepoUrl(name string) string {
 	}
 }
 
-func getShortcut() string {
-	res := "Shortcut"
-	language := conf.GetConfigStringUnquoted("language")
-	if language != "en" {
-		res = "快捷方式"
-	}
-	return res
-}
-
-func ensureFileFolderExists(path string) error {
-	if !util.FileExist(path) {
-		return os.MkdirAll(path, os.ModePerm)
-	}
-	return nil
-}
-
 func updateAppConfFile(name string, i int, orgName string) {
 	fmt.Printf("updateAppConfFile(): [%s]\n", name)
 	confPath := getCodeAppConfPath(name)
@@ -132,28 +115,3 @@ func updateAppConfFile(name string, i int, orgName string) {
 
 	util.WriteStringToPath(content, confPath)
 }
-
-func updateBatFile(name string) (bool, error) {
-	batPath := getBatPath(name)
-	err := ensureFileFolderExists(filepath.Dir(batPath))
-	if err != nil {
-		return false, err
-	}
-
-	if util.FileExist(batPath) {
-		return true, nil
-	}
-
-	fmt.Printf("updateBatFile(): [%s]\n", name)
-
-	content := fmt.Sprintf("cd %s\ngo run main.go", GetRepoPath(name))
-	util.WriteStringToPath(content, batPath)
-	return false, nil
-}
-
-func updateShortcutFile(name string) error {
-	fmt.Printf("updateShortcutFile(): [%s]\n", name)
-
-	cmd := exec.Command("powershell", fmt.Sprintf("$s=(New-Object -COM WScript.Shell).CreateShortcut('%s');$s.TargetPath='%s';$s.Save()", getShortcutPath(name), getBatPath(name)))
-	return cmd.Run()
-}
diff --git a/run/util_path.go b/run/util_path.go
index 9934cab..1c705f5 100644
--- a/run/util_path.go
+++ b/run/util_path.go
@@ -17,29 +17,14 @@ package run
 import (
 	"encoding/json"
 	"fmt"
-	"os/user"
 	"path/filepath"
 	"strings"
 
 	"github.com/apache/casbin-gateway/conf"
 )
 
-var username string
 var appMap = map[string]string{}
 
-func init() {
-	usr, err := user.Current()
-	if err != nil {
-		panic(err)
-	}
-
-	username = usr.Username
-	tokens := strings.Split(username, "\\")
-	if len(tokens) == 2 {
-		username = tokens[1]
-	}
-}
-
 func InitAppMap() {
 	res := conf.GetConfigStringUnquoted("appMap")
 	if res != "" {
@@ -80,13 +65,3 @@ func getCodeAppConfPath(name string) string {
 	appDir := conf.GetConfigStringUnquoted("appDir")
 	return fmt.Sprintf("%s/%s/conf/app.conf", appDir, name)
 }
-
-func getBatPath(name string) string {
-	name = getMappedName(name)
-	return fmt.Sprintf("C:/Users/%s/Desktop/run/%s.bat", username, name)
-}
-
-func getShortcutPath(name string) string {
-	name = getMappedName(name)
-	return fmt.Sprintf("C:/Users/%s/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Startup/%s.bat - %s.lnk", username, name, getShortcut())
-}
diff --git a/run/util_process.go b/run/util_process.go
index 762f5ee..481199b 100644
--- a/run/util_process.go
+++ b/run/util_process.go
@@ -17,25 +17,23 @@ package run
 import (
 	"bytes"
 	"fmt"
-	"io"
 	"os/exec"
 	"regexp"
 	"strconv"
 	"strings"
-
-	"github.com/apache/casbin-gateway/util"
-	"golang.org/x/text/encoding/simplifiedchinese"
-	"golang.org/x/text/transform"
 )
 
-var reBatNames *regexp.Regexp
+// A site runs in its own console window started from its repo folder. The
+// "title" sets the window title so the user can tell the windows apart, and it
+// is also what identifies the process in the command line listing below.
+var reSiteNames = regexp.MustCompile(`title (\S+) & go run main\.go`)
 
-func init() {
-	reBatNames = regexp.MustCompile(`\\Desktop\\run\\(.*?)\.bat`)
+func getRunCommand(name string) string {
+	return fmt.Sprintf("title %s & go run main.go", name)
 }
 
-func parseBatName(s string) string {
-	res := reBatNames.FindStringSubmatch(s)
+func parseSiteName(s string) string {
+	res := reSiteNames.FindStringSubmatch(s)
 	if res == nil {
 		return ""
 	}
@@ -43,31 +41,27 @@ func parseBatName(s string) string {
 	return res[1]
 }
 
-func getBatNamesFromOutput(output string) map[string]int {
-	batNameMap := map[string]int{}
+func getSiteNamesFromOutput(output string) map[string]int {
+	siteNameMap := map[string]int{}
 
 	output = strings.ReplaceAll(output, "\r", "")
 	lines := strings.Split(output, "\n")
 	for _, line := range lines {
-		tokens := strings.Split(line, " ")
-		tokens2 := []string{}
-		for _, token := range tokens {
-			if token != "" {
-				tokens2 = append(tokens2, token)
-			}
+		name := parseSiteName(line)
+		if name == "" {
+			continue
 		}
 
-		if len(tokens2) < 5 || strings.ToLower(tokens2[0]) != `c:\windows\system32\cmd.exe` || tokens2[1] != "/c" {
+		tokens := strings.Fields(line)
+		processId, err := strconv.Atoi(tokens[len(tokens)-1])
+		if err != nil {
 			continue
 		}
 
-		batName := parseBatName(tokens2[2])
-		processId := util.ParseInt(tokens2[len(tokens2)-1])
-		batNameMap[batName] = processId
-		//fmt.Printf("%s, %d\n", batName, processId)
+		siteNameMap[name] = processId
 	}
 
-	return batNameMap
+	return siteNameMap
 }
 
 func getPid(name string) (int, error) {
@@ -85,30 +79,33 @@ func getPid(name string) (int, error) {
 		return 0, fmt.Errorf("powershell command failed: %v, stderr: %s", err, stderr.String())
 	}
 
-	batNameMap := getBatNamesFromOutput(out.String())
-	pid, ok := batNameMap[name]
+	siteNameMap := getSiteNamesFromOutput(out.String())
+	pid, ok := siteNameMap[name]
 	if ok {
 		return pid, nil
 	} else {
-		return 0, fmt.Errorf("getBatNamesFromOutput() error, name = %s, batNameMap = %v", name, batNameMap)
+		return 0, fmt.Errorf("getSiteNamesFromOutput() error, name = %s, siteNameMap = %v", name, siteNameMap)
 	}
 }
 
 func startProcess(name string) error {
 	fmt.Printf("startProcess(): [%s]\n", name)
 
-	cmd := exec.Command("cmd", "/C", "start", "", getShortcutPath(name))
+	cmd := exec.Command("cmd", "/C", "start", "", "cmd", "/C", getRunCommand(getMappedName(name)))
+	cmd.Dir = GetRepoPath(name)
 	return cmd.Run()
 }
 
 func stopProcess(name string) error {
 	fmt.Printf("stopProcess(): [%s]\n", name)
 
-	name = getMappedName(name)
-	windowName := fmt.Sprintf("%s.bat - %s", name, getShortcut())
-	// taskkill /IM "casdoor.bat - Shortcut" /F
-	// taskkill /F /FI "WINDOWTITLE eq casdoor.bat - Shortcut" /T
-	cmd := exec.Command("taskkill", "/F", "/FI", fmt.Sprintf("WINDOWTITLE eq %s", windowName), "/T")
+	pid, err := getPid(name)
+	if err != nil {
+		// Not running is not an error to report here.
+		return nil
+	}
+
+	cmd := exec.Command("taskkill", "/F", "/T", "/PID", strconv.Itoa(pid))
 	return cmd.Run()
 }
 
@@ -126,31 +123,13 @@ func IsProcessActive(pid int) (bool, error) {
 	return res, nil
 }
 
-func IsWindowTitleActive(name string) (bool, error) {
-	name = getMappedName(name)
-	windowName := fmt.Sprintf("%s.bat - %s", name, getShortcut())
-
-	// Use tasklist to check if a window with the specific title exists
-	cmd := exec.Command("tasklist", "/V", "/FI", fmt.Sprintf("WINDOWTITLE eq %s", windowName))
-	var out bytes.Buffer
-	cmd.Stdout = &out
-	err := cmd.Run()
-	if err != nil {
-		return false, err
-	}
-
-	// Decode output from GBK (Windows default codepage) to UTF-8
-	decoder := simplifiedchinese.GBK.NewDecoder()
-	reader := transform.NewReader(&out, decoder)
-	decoded, err := io.ReadAll(reader)
+// IsSiteProcessActive covers the window between "started" and "serving", while
+// go run is still compiling and the port is not up yet.
+func IsSiteProcessActive(name string) (bool, error) {
+	_, err := getPid(name)
 	if err != nil {
-		// If decoding fails, fall back to original output
-		decoded = out.Bytes()
+		return false, nil
 	}
-	output := string(decoded)
 
-	// Check if cmd.exe process with the window title exists
-	// If window title is found, output will contain "cmd.exe" and the window title
-	res := strings.Contains(output, "cmd.exe") && strings.Contains(output, windowName)
-	return res, nil
+	return true, nil
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@casbin.apache.org
For additional commands, e-mail: commits-help@casbin.apache.org