package main import ( "fmt" "os" "os/exec" "strings" "github.com/towgo/towgo/lib/system" g "tgk-touch/internal/global" ) func isFirefoxUsable() bool { cmd := exec.Command("firefox", "--version") out, err := cmd.CombinedOutput() ok := err == nil kioskInfof("firefox usability check ok=%v output=%q err=%v", ok, strings.TrimSpace(string(out)), err) return ok } func isFirefoxInstalled() bool { cmd := exec.Command("which", "firefox") out, err := cmd.CombinedOutput() ok := err == nil kioskDebugf("firefox install path check ok=%v output=%q err=%v", ok, strings.TrimSpace(string(out)), err) return ok } func installFirefox() error { var p struct { DebPkgPath string `json:"DebPkgPath"` DebPkgName string `json:"DebPkgName"` InstallShellPath string `json:"InstallShellPath"` } p.DebPkgPath = g.Config().Firefox.DebPkgPath p.DebPkgName = g.Config().Firefox.DebPkgName p.InstallShellPath = g.Config().Firefox.InstallShellPath kioskInfof("firefox install begin programPath=%s debPath=%s debName=%s installShell=%s", system.GetPathOfProgram(), p.DebPkgPath, p.DebPkgName, p.InstallShellPath) command := exec.Command("sudo", "sh", "-c", fmt.Sprintf(` echo "=== 当前工作目录 ===" pwd echo "" echo "=== 卸载旧版 Firefox ===" dpkg -P firefox || echo "警告:卸载旧版 Firefox 失败(可能未安装)" echo "" echo "=== 清理残留文件 ===" rm -rf /opt/firefox* 2>/dev/null echo "" echo "=== 开始安装 Firefox ===" echo "1. 复制安装包到 /opt 目录..." cp -v %s%s/%s /opt/firefox-deb.tar.gz || { echo "错误:复制安装包失败"; exit 1; } echo "" echo "2. 解压安装包..." cd /opt && tar -xzvf firefox-deb.tar.gz || { echo "错误:解压失败"; exit 1; } echo "" echo "3. 安装依赖和主程序..." cd /opt/firefox-deb && sudo dpkg -i *.deb || { echo "错误:安装 deb 包失败"; exit 1; } echo "" echo "4. 验证安装..." firefox --version || { echo "错误:Firefox 未正确安装"; exit 1; } echo "" echo "=== Firefox 安装完成 ===" `, system.GetPathOfProgram(), p.DebPkgPath, p.DebPkgName)) command.Stdout = os.Stdout command.Stderr = os.Stderr err := command.Run() if err != nil { kioskErrorf("firefox install command failed err=%v", err) return err } kioskInfof("firefox install command finished successfully") return nil }