diff --git a/client/installer.nsis b/client/installer.nsis index 7dbd21ad9..b92cb9bc1 100644 --- a/client/installer.nsis +++ b/client/installer.nsis @@ -15,6 +15,13 @@ !define REG_ROOT "HKLM" !define REG_APP_PATH "Software\Microsoft\Windows\CurrentVersion\App Paths\${MAIN_APP_EXE}" !define UNINSTALL_PATH "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" + +!define UI_APP_NAME "Wiretrustee UI" +!define UI_APP_EXE "Wiretrustee-ui" + +!define UI_REG_APP_PATH "Software\Microsoft\Windows\CurrentVersion\App Paths\${UI_APP_EXE}" +!define UI_UNINSTALL_PATH "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UI_APP_NAME}" + Unicode True ###################################################################### @@ -77,6 +84,7 @@ Section -MainProgram SetOverwrite ifnewer SetOutPath "$INSTDIR" File /r "..\\dist\\wiretrustee_windows_amd64\\" + File /r "..\\dist\\wiretrustee-ui_windows_amd64\\" SectionEnd @@ -93,6 +101,13 @@ WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "DisplayIcon" "$INSTDIR\${MAIN_APP_ WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "DisplayVersion" "${VERSION}" WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "Publisher" "${COMP_NAME}" +WriteRegStr ${REG_ROOT} "${UI_REG_APP_PATH}" "" "$INSTDIR\${UI_APP_EXE}" +WriteRegStr ${REG_ROOT} "${UI_UNINSTALL_PATH}" "DisplayName" "${UI_APP_NAME}" +WriteRegStr ${REG_ROOT} "${UI_UNINSTALL_PATH}" "UninstallString" "$INSTDIR\wiretrustee_uninstall.exe" +WriteRegStr ${REG_ROOT} "${UI_UNINSTALL_PATH}" "DisplayIcon" "$INSTDIR\${UI_APP_EXE}" +WriteRegStr ${REG_ROOT} "${UI_UNINSTALL_PATH}" "DisplayVersion" "${VERSION}" +WriteRegStr ${REG_ROOT} "${UI_UNINSTALL_PATH}" "Publisher" "${COMP_NAME}" + EnVar::SetHKLM EnVar::AddValueEx "path" "$INSTDIR" @@ -117,4 +132,4 @@ DeleteRegKey ${REG_ROOT} "${REG_APP_PATH}" DeleteRegKey ${REG_ROOT} "${UNINSTALL_PATH}" EnVar::SetHKLM EnVar::DeleteValue "path" "$INSTDIR" -SectionEnd \ No newline at end of file +SectionEnd diff --git a/client/ui/client_ui.go b/client/ui/client_ui.go index d72663d16..6d8cff76f 100644 --- a/client/ui/client_ui.go +++ b/client/ui/client_ui.go @@ -4,8 +4,13 @@ import ( "context" "flag" "fmt" + "io/ioutil" + "os" + "path" "runtime" + "strconv" "strings" + "syscall" "time" _ "embed" @@ -22,6 +27,11 @@ import ( func main() { var daemonAddr string + if err := checkPIDFile(); err != nil { + fmt.Println(err) + return + } + defaultDaemonAddr := "unix:///var/run/wiretrustee.sock" if runtime.GOOS == "windows" { defaultDaemonAddr = "tcp://127.0.0.1:41731" @@ -214,3 +224,19 @@ func (s *serviceClient) client() (proto.DaemonServiceClient, error) { s.conn = proto.NewDaemonServiceClient(conn) return s.conn, nil } + +// checkPIDFile exists and return error, or write new. +func checkPIDFile() error { + pidFile := path.Join(os.TempDir(), "wiretrustee-ui.pid") + if piddata, err := ioutil.ReadFile(pidFile); err == nil { + if pid, err := strconv.Atoi(string(piddata)); err == nil { + if process, err := os.FindProcess(pid); err == nil { + if err := process.Signal(syscall.Signal(0)); err == nil { + return fmt.Errorf("process already exists: %d", pid) + } + } + } + } + + return ioutil.WriteFile(pidFile, []byte(fmt.Sprintf("%d", os.Getpid())), 0o664) +}