Newer
Older
/*
* Copyright (C) 2021 Orange & contributors
*
* This program is free software; you can redistribute it and/or modify it under the terms
*
* of the GNU Lesser General Public License as published by the Free Software Foundation;
* either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301, USA.
*/
package main
import (
"bytes"
"encoding/json"
"flag"
"fmt"
"log"
"os"
. "tbc.orange.com/gitlab-templates-tracking/cmd/tracking_service/internal"
)
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
type Configuration struct {
Clients []ClientTracking `json:"clients"`
}
type runEnvironment struct {
service bool
skipTracking bool
port int
template string
version string
}
func readConfigurationFromEnv() (Configuration, error) {
config := os.Getenv("TRACKING_CONFIGURATION")
if config != "" {
return readConfiguration([]byte(config))
}
return Configuration{}, nil
}
func readConfiguration(config []byte) (Configuration, error) {
var conf Configuration
if config != nil {
err := json.Unmarshal(config, &conf)
return conf, err
}
return conf, nil
}
func readArguments(program string, args []string) (error, *runEnvironment) {
var usage bytes.Buffer
fs := flag.NewFlagSet(program, flag.ExitOnError)
service := fs.Bool("service", false, "Launch send tracking as a service")
skipTracking := fs.Bool("skip_tracking", false, "Does not send tracking")
port := fs.Int("port", PORT, "Service port")
fs.SetOutput(&usage)
if err := fs.Parse(args); err != nil {
fs.Usage()
return fmt.Errorf(usage.String()), nil
} else if fs.NArg() != 2 {
usage.Write([]byte(fmt.Sprintf("%s: specify template name and version\n", program)))
fs.Usage()
return fmt.Errorf(usage.String()), nil
}
return nil, &runEnvironment{service: *service, skipTracking: *skipTracking, port: *port, template: fs.Arg(0), version: fs.Arg(1)}
}
func main() {
var arguments []string
if len(os.Args) == 1 {
arguments = []string{}
} else {
arguments = os.Args[1:]
}
err, environment := readArguments(os.Args[0], arguments)
if err != nil {
_, _ = fmt.Fprint(os.Stderr, err)
os.Exit(1)
}
config, err := readConfigurationFromEnv()
if err != nil {
_, _ = fmt.Fprint(os.Stderr, err)
os.Exit(2)
}
if !environment.skipTracking {
log.Printf("Sending tracking for %s %s\n", environment.template, environment.version)
for _, client := range config.Clients {
if err := client.SendTracking(CiTrackingMessage(environment.template, environment.version)); err != nil {
log.Println(err)
} else {
log.Println("Tracking sent")
}
}
} else {
log.Println("Skip send tracking")
}
if !environment.service {
log.Println("Service not launched")
} else {
log.Printf("Launching service on port %d\n", environment.port)
if err, server := HealthService(environment.port); err != nil {
panic(err)
} else {
defer server.Close()
}
}
}