forked from gaulliath/operative-framework
-
Notifications
You must be signed in to change notification settings - Fork 0
/
supervisor.go
128 lines (110 loc) · 3.35 KB
/
supervisor.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package supervisor
import (
"github.com/Oni-kuki/operative-framework/engine"
"github.com/Oni-kuki/operative-framework/session"
"github.com/joho/godotenv"
"log"
"os"
"time"
)
type Supervisor struct {
Services []session.Listener
History []string
Session *session.Session
}
func GetNewSupervisor(s *session.Session) *Supervisor {
return &Supervisor{
Session: s,
}
}
func (sup *Supervisor) GetStandaloneSession() *session.Session {
newSession := engine.New()
newSession.PushPrompt()
newSession.Config.Common.ConfigurationFile = sup.Session.Config.Common.ConfigurationFile
newSession.Config.Common.ConfigurationJobs = sup.Session.Config.Common.ConfigurationJobs
return newSession
}
func (sup *Supervisor) AddHistory(s string) {
sup.History = append(sup.History, s)
return
}
func (sup *Supervisor) Launch(service session.Listener, routine chan int) session.Listener {
path := sup.Session.Config.Common.ConfigurationJobs + service.CronJob.Name() + "/cron.conf"
if service.CronJob.HasConfiguration() {
configuration, err := godotenv.Read(path)
if err != nil {
log.Fatalln("'" + path + "' Config as been not found")
}
for _, validator := range service.CronJob.GetRequired() {
if _, ok := configuration[validator]; !ok {
log.Fatalln("'" + validator + "' field as required in configuration file")
}
}
}
service.ExecutedAt = time.Now()
service.NextExecution = time.Now().Add(service.CronJob.GetHibernate())
routine <- 1
go func() {
log.Println("execution of service:", service.CronJob.Name(), "at", service.ExecutedAt)
log.Println("next execution at:", service.NextExecution)
_, err := service.CronJob.Run()
if err != nil {
log.Println(err.Error())
}
<-routine
}()
return service
}
func (sup *Supervisor) Configure() error {
log.Println("Running service configuration...")
if _, err := os.Stat(sup.Session.Config.Common.ConfigurationJobs); os.IsNotExist(err) {
_ = os.Mkdir(sup.Session.Config.Common.ConfigurationJobs, os.ModePerm)
}
for _, service := range sup.Services {
if _, err := os.Stat(sup.Session.Config.Common.ConfigurationJobs + service.CronJob.Name()); os.IsNotExist(err) {
_ = os.Mkdir(sup.Session.Config.Common.ConfigurationJobs+service.CronJob.Name(), os.ModePerm)
}
if !service.CronJob.HasConfiguration() {
continue
}
if _, err := os.Stat(sup.Session.Config.Common.ConfigurationJobs + service.CronJob.Name() + "/cron.conf"); !os.IsNotExist(err) {
continue
}
// Generate a .env
var file *os.File
var errPath error
file, errPath = os.OpenFile(sup.Session.Config.Common.ConfigurationJobs+service.CronJob.Name()+"/cron.conf", os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0755)
if errPath != nil {
return errPath
}
defer file.Close()
// Writing parameters
for key, param := range service.CronJob.GetConfiguration() {
if param == "" {
_, _ = file.WriteString(key + "=\n")
} else {
_, _ = file.WriteString(key + "=" + "\"" + param + "\"\n")
}
}
sup.Session.AddService(service)
}
return nil
}
func (sup *Supervisor) Read() {
err := sup.Configure()
if err != nil {
log.Fatalln(err.Error())
return
}
routine := make(chan int, 3)
currentTime := time.Now()
for {
for key, listen := range sup.Services {
currentTime = time.Now()
if listen.NextExecution.Before(currentTime) {
sup.Services[key] = sup.Launch(listen, routine)
}
}
time.Sleep(5 * time.Second)
}
}