/
main.go
120 lines (112 loc) · 3.27 KB
/
main.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
package main
import (
"flag"
"fmt"
sheepstor "github.com/antleaf/sheepstor"
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
"go.uber.org/zap"
"net/http"
"os"
"sync"
)
var logger *zap.SugaredLogger
var config = Configuration{}
var router chi.Router
var registry sheepstor.WebsiteRegistry
func main() {
debugPtr := flag.Bool("debug", false, "-debug true|false")
configFilePathPtr := flag.String("config", "./config.yaml", "-config <file_path>")
updatePtr := flag.String("update", "", "-update all|<some_id>")
flag.Parse()
err := (&config).Initialise(*debugPtr, *configFilePathPtr)
if err != nil {
fmt.Print(err.Error() + "\n")
fmt.Printf("Halting execution because SheepsTorConfig file not loaded from %s\n", *configFilePathPtr)
os.Exit(1)
}
logger, err = ConfigureZapSugarLogger(config.DebugLogging)
if config.DebugLogging {
logger.Infof("Debugging enabled")
}
sheepstor.SetLogger(logger)
registry = sheepstor.NewRegistry(config.SourceRoot, config.WebRoot, os.Getenv(config.GitHubWebHookSecretEnvKey))
for _, w := range config.WebsiteConfigs {
website := sheepstor.NewWebsite(
w.ID, w.ContentProcessor,
w.ProcessorRootSubFolderPath,
config.SourceRoot,
config.WebRoot,
w.GitRepoConfig.CloneId,
w.GitRepoConfig.RepoName,
w.GitRepoConfig.BranchName,
)
registry.Add(&website)
}
logger.Infof("WebRoot folder path set to: %s", config.WebRoot)
logger.Infof("Source Root folder path set to: %s", config.SourceRoot)
if *updatePtr != "" {
runAsCLIProcess(*updatePtr)
} else {
runAsHTTPProcess()
}
}
func runAsCLIProcess(sitesToUpdate string) {
logger.Info(fmt.Sprintf("Running as CLI Process, updating website(s): '%s'...", sitesToUpdate))
if sitesToUpdate == "all" {
processAllWebsites()
} else {
website := *registry.GetWebsiteByID(sitesToUpdate)
err := website.ProvisionSources()
if err != nil {
logger.Error(err.Error())
return
}
err = website.Build()
if err != nil {
logger.Error(err.Error())
}
}
}
func runAsHTTPProcess() {
router = chi.NewRouter()
router.Use(middleware.Logger)
router.Use(middleware.StripSlashes)
router.Use(middleware.Throttle(10))
//TODO: figure out if it is possible to use this CORS module to add common HTTP headers to all HTTP Responses. Otherwise write a middleware handler to do this.
router.Get("/", DefaultHandler)
router.Post("/update", registry.GitHubWebHookHandler)
logger.Infof("Running as HTTP Process on port %d", config.Port)
err := http.ListenAndServe(fmt.Sprintf(":%v", config.Port), router)
if err != nil {
logger.Error(err.Error())
}
}
func processWebsiteInSynchronousWorker(websitePtr *sheepstor.Website, wg *sync.WaitGroup) {
website := *websitePtr
err := website.ProvisionSources()
if err != nil {
logger.Error(err.Error())
} else {
logger.Infof("Provisioned sources for website: '%s'", website.ID)
err = website.Build()
if err != nil {
logger.Error(err.Error())
} else {
logger.Infof("Built website: '%s'", website.ID)
}
}
wg.Done()
}
func processAllWebsites() {
var wg sync.WaitGroup
for _, website := range registry.WebSites {
wg.Add(1)
go processWebsiteInSynchronousWorker(website, &wg)
}
wg.Wait()
}
func DefaultHandler(resp http.ResponseWriter, req *http.Request) {
resp.Write([]byte("Hello world"))
resp.WriteHeader(http.StatusOK)
}