ollama

Форк
0
/
lifecycle.go 
92 строки · 2.0 Кб
1
package lifecycle
2

3
import (
4
	"context"
5
	"fmt"
6
	"log"
7
	"log/slog"
8
	"os"
9
	"os/signal"
10
	"syscall"
11

12
	"github.com/jmorganca/ollama/app/store"
13
	"github.com/jmorganca/ollama/app/tray"
14
)
15

16
func Run() {
17
	InitLogging()
18

19
	ctx, cancel := context.WithCancel(context.Background())
20
	var done chan int
21

22
	t, err := tray.NewTray()
23
	if err != nil {
24
		log.Fatalf("Failed to start: %s", err)
25
	}
26
	callbacks := t.GetCallbacks()
27

28
	signals := make(chan os.Signal, 1)
29
	signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)
30

31
	go func() {
32
		slog.Debug("starting callback loop")
33
		for {
34
			select {
35
			case <-callbacks.Quit:
36
				slog.Debug("quit called")
37
				t.Quit()
38
			case <-signals:
39
				slog.Debug("shutting down due to signal")
40
				t.Quit()
41
			case <-callbacks.Update:
42
				err := DoUpgrade(cancel, done)
43
				if err != nil {
44
					slog.Warn(fmt.Sprintf("upgrade attempt failed: %s", err))
45
				}
46
			case <-callbacks.ShowLogs:
47
				ShowLogs()
48
			case <-callbacks.DoFirstUse:
49
				err := GetStarted()
50
				if err != nil {
51
					slog.Warn(fmt.Sprintf("Failed to launch getting started shell: %s", err))
52
				}
53
			}
54
		}
55
	}()
56

57
	// Are we first use?
58
	if !store.GetFirstTimeRun() {
59
		slog.Debug("First time run")
60
		err = t.DisplayFirstUseNotification()
61
		if err != nil {
62
			slog.Debug(fmt.Sprintf("XXX failed to display first use notification %v", err))
63
		}
64
		store.SetFirstTimeRun(true)
65
	} else {
66
		slog.Debug("Not first time, skipping first run notification")
67
	}
68

69
	if IsServerRunning(ctx) {
70
		slog.Info("Detected another instance of ollama running, exiting")
71
		os.Exit(1)
72
	} else {
73
		done, err = SpawnServer(ctx, CLIName)
74
		if err != nil {
75
			// TODO - should we retry in a backoff loop?
76
			// TODO - should we pop up a warning and maybe add a menu item to view application logs?
77
			slog.Error(fmt.Sprintf("Failed to spawn ollama server %s", err))
78
			done = make(chan int, 1)
79
			done <- 1
80
		}
81
	}
82

83
	StartBackgroundUpdaterChecker(ctx, t.UpdateAvailable)
84

85
	t.Run()
86
	cancel()
87
	slog.Info("Waiting for ollama server to shutdown...")
88
	if done != nil {
89
		<-done
90
	}
91
	slog.Info("Ollama app exiting")
92
}
93

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.