From 161deba5f61e2b26b95494a216ace0445604db0f Mon Sep 17 00:00:00 2001 From: lensferno Date: Mon, 5 Apr 2021 16:47:23 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=93=E4=BF=83=E9=87=8D=E5=86=99=E4=BA=86?= =?UTF-8?q?=E4=B8=80=E4=B8=8B=E5=90=AF=E5=8A=A8=E5=99=A8=EF=BC=88=E5=BA=94?= =?UTF-8?q?=E8=AF=A5=E6=B2=A1=E4=BB=80=E4=B9=88=E5=A4=A7=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=BA=86=E5=90=A7=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 6 +- DogenameLauncher/src/checkers/dogeChecker.go | 25 ++++++ .../src/checkers/runtimeChecker.go | 65 ++++++++++++++ DogenameLauncher/src/config/configLoader.go | 38 ++++++++ DogenameLauncher/src/config/launcherConfig.go | 7 ++ DogenameLauncher/src/dogename.syso | Bin 0 -> 95806 bytes DogenameLauncher/src/go.mod | 8 ++ DogenameLauncher/src/go.sum | 6 ++ DogenameLauncher/src/launcher.conf | 3 + DogenameLauncher/src/launcher.go | 84 ++++++++++++++++++ DogenameLauncher/src/utils/fileUtil.go | 15 ++++ DogenameLauncher/src/utils/process.go | 21 +++++ 12 files changed, 277 insertions(+), 1 deletion(-) create mode 100644 DogenameLauncher/src/checkers/dogeChecker.go create mode 100644 DogenameLauncher/src/checkers/runtimeChecker.go create mode 100644 DogenameLauncher/src/config/configLoader.go create mode 100644 DogenameLauncher/src/config/launcherConfig.go create mode 100644 DogenameLauncher/src/dogename.syso create mode 100644 DogenameLauncher/src/go.mod create mode 100644 DogenameLauncher/src/go.sum create mode 100644 DogenameLauncher/src/launcher.conf create mode 100644 DogenameLauncher/src/utils/fileUtil.go create mode 100644 DogenameLauncher/src/utils/process.go diff --git a/.gitignore b/.gitignore index 6445b33..2e1b65d 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,8 @@ target log logs .idea -process \ No newline at end of file +process +pkg +*.exe +*.jar +*.log \ No newline at end of file diff --git a/DogenameLauncher/src/checkers/dogeChecker.go b/DogenameLauncher/src/checkers/dogeChecker.go new file mode 100644 index 0000000..32171ab --- /dev/null +++ b/DogenameLauncher/src/checkers/dogeChecker.go @@ -0,0 +1,25 @@ +package checkers + +import ( + "os" + "path/filepath" +) + +func SearchDoge(dogeLocation string) (bool, string) { + + var err error + dogeLocation, err = filepath.Abs(dogeLocation) + + if err != nil { + return false, "" + } + + _, err1 := os.Stat(dogeLocation) + + if err1 != nil { + return false, "" + } else { + return true, dogeLocation + } + +} diff --git a/DogenameLauncher/src/checkers/runtimeChecker.go b/DogenameLauncher/src/checkers/runtimeChecker.go new file mode 100644 index 0000000..a4ce8ad --- /dev/null +++ b/DogenameLauncher/src/checkers/runtimeChecker.go @@ -0,0 +1,65 @@ +package checkers + +import ( + "fmt" + "os" + "os/exec" + "path/filepath" +) + +func SearchRuntime(runtimeLocation string) (bool, string) { + + var err error + runtimeLocation, err = filepath.Abs(runtimeLocation) + + if err != nil { + return false, "" + } + + //try to find javaw.exe + javawExists, javawLocation := FindJava(runtimeLocation, "javaw") + + if javawExists == true { + fmt.Println("[RuntimeChecker]javawExists:", javawExists) + fmt.Println("[RuntimeChecker]javawLocation:", javawLocation) + return true, javawLocation + } + + //try to find java.exe + javaExists, javaLocation := FindJava(runtimeLocation, "java") + + if javaExists == true { + fmt.Println("[RuntimeChecker]javaExists:", javaExists) + fmt.Println("[RuntimeChecker]javaLocation:", javaLocation) + return true, javaLocation + } else { + return false, "" + } +} + +func FindJava(runtimeLocation string, runtimeName string) (bool, string) { + fmt.Println("[RuntimeChecker]Finding:", runtimeLocation+"/"+runtimeName+".exe") + _, err := os.Stat(runtimeLocation + "/" + runtimeName + ".exe") + + if err == nil { + return true, runtimeLocation + "/" + runtimeName + } + + installedJavaExists, installedJavaLocation := FindInstalledRuntime(runtimeName) + + if installedJavaExists == true { + return true, installedJavaLocation + } else { + return false, "" + } +} + +func FindInstalledRuntime(program string) (bool, string) { + findResult, err := exec.LookPath(program) + + if err == nil { + return true, findResult + } else { + return false, "" + } +} diff --git a/DogenameLauncher/src/config/configLoader.go b/DogenameLauncher/src/config/configLoader.go new file mode 100644 index 0000000..131db9e --- /dev/null +++ b/DogenameLauncher/src/config/configLoader.go @@ -0,0 +1,38 @@ +package config + +import ( + "fmt" + "os" + + "gopkg.in/ini.v1" +) + +const DEFAULT_MAIN_PROGRAM_LOCATION = "./dogename_program.jar" +const DEFAULT_RUNTIME_LOCATION = "./runtime/java8/bin" + +func GetEffectiveConfig() LauncherConfig { + + launcherConfig := &LauncherConfig{ConfigVersion: 1, DogenameLocation: DEFAULT_MAIN_PROGRAM_LOCATION, RuntimeLocation: DEFAULT_RUNTIME_LOCATION} + + _, err := os.Stat("./launcher.conf") + + if err != nil { + fmt.Println("[ConfigLoader]Config file doesn't exist,use default value.") + return *launcherConfig + } + + config, _ := ini.Load("./launcher.conf") + config.MapTo(launcherConfig) + + if launcherConfig.DogenameLocation == "<@DEFAULT>" { + fmt.Println("[ConfigLoader]Use default program location.") + launcherConfig.DogenameLocation = DEFAULT_MAIN_PROGRAM_LOCATION + } + + if launcherConfig.RuntimeLocation == "<@DEFAULT>" { + fmt.Println("[ConfigLoader]Use default runtime location.") + launcherConfig.RuntimeLocation = DEFAULT_RUNTIME_LOCATION + } + + return *launcherConfig +} diff --git a/DogenameLauncher/src/config/launcherConfig.go b/DogenameLauncher/src/config/launcherConfig.go new file mode 100644 index 0000000..4328eef --- /dev/null +++ b/DogenameLauncher/src/config/launcherConfig.go @@ -0,0 +1,7 @@ +package config + +type LauncherConfig struct { + ConfigVersion int + DogenameLocation string + RuntimeLocation string +} diff --git a/DogenameLauncher/src/dogename.syso b/DogenameLauncher/src/dogename.syso new file mode 100644 index 0000000000000000000000000000000000000000..082cfad1fa11e5bb9ce934049eff12a0f7270c7c GIT binary patch literal 95806 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 literal 0 HcmV?d00001 diff --git a/DogenameLauncher/src/go.mod b/DogenameLauncher/src/go.mod new file mode 100644 index 0000000..7dba5b7 --- /dev/null +++ b/DogenameLauncher/src/go.mod @@ -0,0 +1,8 @@ +module launcher + +require ( + github.com/sqweek/dialog v0.0.0-20200911184034-8a3d98e8211d + gopkg.in/ini.v1 v1.62.0 +) + +go 1.16 diff --git a/DogenameLauncher/src/go.sum b/DogenameLauncher/src/go.sum new file mode 100644 index 0000000..7ee7685 --- /dev/null +++ b/DogenameLauncher/src/go.sum @@ -0,0 +1,6 @@ +github.com/TheTitanrain/w32 v0.0.0-20180517000239-4f5cfb03fabf h1:FPsprx82rdrX2jiKyS17BH6IrTmUBYqZa/CXT4uvb+I= +github.com/TheTitanrain/w32 v0.0.0-20180517000239-4f5cfb03fabf/go.mod h1:peYoMncQljjNS6tZwI9WVyQB3qZS6u79/N3mBOcnd3I= +github.com/sqweek/dialog v0.0.0-20200911184034-8a3d98e8211d h1:Chay1rwJnXxI27H+pzu7P81BKf647un9GOoRPTdXN18= +github.com/sqweek/dialog v0.0.0-20200911184034-8a3d98e8211d/go.mod h1:/qNPSY91qTz/8TgHEMioAUc6q7+3SOybeKczHMXFcXw= +gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= diff --git a/DogenameLauncher/src/launcher.conf b/DogenameLauncher/src/launcher.conf new file mode 100644 index 0000000..3e73461 --- /dev/null +++ b/DogenameLauncher/src/launcher.conf @@ -0,0 +1,3 @@ +ConfigVersion = 1 +DogenameLocation = <@DEFAULT> +RuntimeLocation = <@DEFAULT> \ No newline at end of file diff --git a/DogenameLauncher/src/launcher.go b/DogenameLauncher/src/launcher.go index e69de29..a005c66 100644 --- a/DogenameLauncher/src/launcher.go +++ b/DogenameLauncher/src/launcher.go @@ -0,0 +1,84 @@ +package main + +import ( + "fmt" + "os" + "os/exec" + + "launcher/checkers" + "launcher/config" + "launcher/utils" + + "github.com/sqweek/dialog" +) + +var workDir string + +func main() { + + var err error = nil + workDir, err = utils.GetDir(os.Args[0]) + + if err != nil { + os.Exit(1) + } + + var launcherConfig config.LauncherConfig + + launcherConfig = config.GetEffectiveConfig() + + dogenameDir, _ := utils.GetDir(launcherConfig.DogenameLocation) + + // solve existent dogename process + pidFilesExist, pids := utils.FindDogeProcess(dogenameDir) + if pidFilesExist == true { + killDogeProcess := dialog.Message("发现可能有至少一个dogename在运行,要把它关掉吗?").Title("DogenameLauncher - 诶嘿!").YesNo() + if killDogeProcess == false { + os.Exit(0) + } else { + for _, pid := range pids { + fmt.Println("killing:", pid) + exec.Command("taskkill", "/PID", pid).Start() + os.Remove(workDir + "/process/" + pid) + } + } + } + + // check necessary files + + // check main program + programExists, programLocation := checkers.SearchDoge(launcherConfig.DogenameLocation) + fmt.Println("programLocation: ", programLocation) + fmt.Println("programExists: ", programExists) + if programExists != true { + + dialog.Message("主程序文件“dogename.jar”不见惹,没办法运行啦。\n请检查主程序文件是否存在或访问,若不存在请前往https://github.com/lensferno/dogename下载主程序文件,并放置在" + dogenameDir + "下。").Title("DogenameLauncher - 诶嘿!").Error() + + exec.Command("rundll32", "url.dll,FileProtocolHandler", "https://github.com/lensferno/dogename").Start() + + os.Exit(1) + } + + // check runtime + runtimeExists, runtimeLocation := checkers.SearchRuntime(launcherConfig.RuntimeLocation) + + fmt.Println("RuntimeLocation: ", runtimeLocation) + fmt.Println("RuntimeExists: ", runtimeExists) + if runtimeExists != true { + dialog.Message("Java运行环境不见惹,没法运行啦!请确认是否安装Java。\n若您知道哪里有正确的Java,请编辑" + workDir + "下的“launcher.config”文件:)").Title("DogenameLauncher - 诶嘿!").Error() + os.Exit(1) + } + + // try to run program + cmd := exec.Command(runtimeLocation, "-jar", programLocation) + cmd.Dir = dogenameDir + + runError := cmd.Run() + + fmt.Println("runError:", runError) + + if runError != nil { + dialog.Message("程序已经找到并且试图运行,但好像出了点错误,他托我告诉你一下(嗯?)\n大概是这样的:" + runError.Error() + "\n不过我把具体信息给忘了(懒得说了)(嗯?)\n这边建议您去https://github.com/lensferno/dogename那里重新下载一个呢:)").Title("DogenameLauncher - 诶嘿!").Info() + } + +} diff --git a/DogenameLauncher/src/utils/fileUtil.go b/DogenameLauncher/src/utils/fileUtil.go new file mode 100644 index 0000000..7bd6274 --- /dev/null +++ b/DogenameLauncher/src/utils/fileUtil.go @@ -0,0 +1,15 @@ +package utils + +import ( + "path/filepath" +) + +func GetDir(filePath string) (string, error) { + absResult, err := filepath.Abs(filepath.Dir(filePath)) + if err != nil { + return "", err + } else { + return filepath.ToSlash(absResult), err + } + +} diff --git a/DogenameLauncher/src/utils/process.go b/DogenameLauncher/src/utils/process.go new file mode 100644 index 0000000..d5cabed --- /dev/null +++ b/DogenameLauncher/src/utils/process.go @@ -0,0 +1,21 @@ +package utils + +import ( + "fmt" + "path/filepath" +) + +func FindDogeProcess(dogePath string) (bool, []string) { + pids, _ := filepath.Glob(dogePath + "/process/*") + + if pids == nil { + return false, nil + } else { + for i := 0; i < len(pids); i++ { + pids[i] = filepath.Base(pids[i]) + } + fmt.Println("[Process]found pids:", pids) + return true, pids + } + +}