start_windows.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package cmd
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "os"
  7. "os/exec"
  8. "path/filepath"
  9. "strings"
  10. "syscall"
  11. "golang.org/x/sys/windows"
  12. "github.com/jmorganca/ollama/api"
  13. )
  14. func init() {
  15. var inMode uint32
  16. var outMode uint32
  17. var errMode uint32
  18. in := windows.Handle(os.Stdin.Fd())
  19. if err := windows.GetConsoleMode(in, &inMode); err == nil {
  20. windows.SetConsoleMode(in, inMode|windows.ENABLE_VIRTUAL_TERMINAL_INPUT) //nolint:errcheck
  21. }
  22. out := windows.Handle(os.Stdout.Fd())
  23. if err := windows.GetConsoleMode(out, &outMode); err == nil {
  24. windows.SetConsoleMode(out, outMode|windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING) //nolint:errcheck
  25. }
  26. errf := windows.Handle(os.Stderr.Fd())
  27. if err := windows.GetConsoleMode(errf, &errMode); err == nil {
  28. windows.SetConsoleMode(errf, errMode|windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING) //nolint:errcheck
  29. }
  30. }
  31. func startApp(ctx context.Context, client *api.Client) error {
  32. // log.Printf("XXX Attempting to find and start ollama app")
  33. AppName := "ollama app.exe"
  34. exe, err := os.Executable()
  35. if err != nil {
  36. return err
  37. }
  38. appExe := filepath.Join(filepath.Dir(exe), AppName)
  39. _, err = os.Stat(appExe)
  40. if errors.Is(err, os.ErrNotExist) {
  41. // Try the standard install location
  42. localAppData := os.Getenv("LOCALAPPDATA")
  43. appExe = filepath.Join(localAppData, "Ollama", AppName)
  44. _, err := os.Stat(appExe)
  45. if errors.Is(err, os.ErrNotExist) {
  46. // Finally look in the path
  47. appExe, err = exec.LookPath(AppName)
  48. if err != nil {
  49. return fmt.Errorf("could not locate ollama app")
  50. }
  51. }
  52. }
  53. // log.Printf("XXX attempting to start app %s", appExe)
  54. cmd_path := "c:\\Windows\\system32\\cmd.exe"
  55. cmd := exec.Command(cmd_path, "/c", appExe)
  56. // TODO - these hide flags aren't working - still pops up a command window for some reason
  57. cmd.SysProcAttr = &syscall.SysProcAttr{CreationFlags: 0x08000000, HideWindow: true}
  58. // TODO this didn't help either...
  59. cmd.Stdin = strings.NewReader("")
  60. cmd.Stdout = os.Stdout
  61. cmd.Stderr = os.Stderr
  62. if err := cmd.Start(); err != nil {
  63. return fmt.Errorf("unable to start ollama app %w", err)
  64. }
  65. if cmd.Process != nil {
  66. defer cmd.Process.Release() //nolint:errcheck
  67. }
  68. return waitForServer(ctx, client)
  69. }