summaryrefslogtreecommitdiff
path: root/args/args.go
blob: 59eb441af1c34bbdd80fcc1df977a2c02c5ad82f (plain)
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 args

import (
	"errors"
	"flag"
	"os"
	"strings"

	"golang.org/x/oauth2"
)

type Arguments struct {
	DatabasePath string
	TemplatePath string
	StaticPath   string
	UploadPath   string

	Migrate   bool
	Scheduler bool

	Port             int
	Server           bool
	OauthConfig      *oauth2.Config
	OauthUserInfoURI string

	DnsResolvers []string
	Dns          bool
	DnsPort      int

	CloudflareToken string
	CloudflareZone  string

	HcaptchaSecret  string
	HcaptchaSiteKey string
}

func GetArgs() (*Arguments, error) {
	databasePath := flag.String("database-path", "./hatecomputers.db", "Path to the SQLite database")

	uploadPath := flag.String("upload-path", "./uploads", "Path to the uploads directory")
	uploadPathValue := *uploadPath
	if uploadPathValue[len(uploadPathValue)-1] != '/' {
		uploadPathValue += "/"
	}

	templatePath := flag.String("template-path", "./templates", "Path to the template directory")
	staticPath := flag.String("static-path", "./static", "Path to the static directory")
	dnsResolvers := flag.String("dns-resolvers", "1.1.1.1:53,1.0.0.1:53", "Comma-separated list of DNS resolvers")

	scheduler := flag.Bool("scheduler", false, "Run scheduled jobs via cron")
	migrate := flag.Bool("migrate", false, "Run the migrations")

	port := flag.Int("port", 8080, "Port to listen on")
	server := flag.Bool("server", false, "Run the server")

	dns := flag.Bool("dns", false, "Run DNS resolver")
	dnsPort := flag.Int("dns-port", 8053, "Port to listen on for DNS resolver")

	flag.Parse()

	cloudflareToken := os.Getenv("CLOUDFLARE_TOKEN")
	cloudflareZone := os.Getenv("CLOUDFLARE_ZONE")

	oauthClientID := os.Getenv("OAUTH_CLIENT_ID")
	oauthClientSecret := os.Getenv("OAUTH_CLIENT_SECRET")
	oauthScopes := os.Getenv("OAUTH_SCOPES")
	oauthAuthURL := os.Getenv("OAUTH_AUTH_URL")
	oauthTokenURL := os.Getenv("OAUTH_TOKEN_URL")
	oauthRedirectURI := os.Getenv("OAUTH_REDIRECT_URI")
	oauthUserInfoURI := os.Getenv("OAUTH_USER_INFO_URI")

	hcaptchaSecret := os.Getenv("HCAPTCHA_SECRET")
	hcaptchaSiteKey := os.Getenv("HCAPTCHA_SITE_KEY")

	envVars := [][]string{
		{cloudflareToken, "CLOUDFLARE_TOKEN"},
		{cloudflareZone, "CLOUDFLARE_ZONE"},
		{oauthClientID, "OAUTH_CLIENT_ID"},
		{oauthClientSecret, "OAUTH_CLIENT_SECRET"},
		{oauthScopes, "OAUTH_SCOPES"},
		{oauthAuthURL, "OAUTH_AUTH_URL"},
		{oauthTokenURL, "OAUTH_TOKEN_URL"},
		{oauthRedirectURI, "OAUTH_REDIRECT_URI"},
		{oauthUserInfoURI, "OAUTH_USER_INFO_URI"},
	}

	for _, envVar := range envVars {
		if envVar[0] == "" {
			return nil, errors.New("please set the " + envVar[1] + " environment variable")
		}
	}

	oauthConfig := &oauth2.Config{
		ClientID:     oauthClientID,
		ClientSecret: oauthClientSecret,
		Scopes:       strings.Split(oauthScopes, ","),
		Endpoint: oauth2.Endpoint{
			AuthURL:  oauthAuthURL,
			TokenURL: oauthTokenURL,
		},
		RedirectURL: oauthRedirectURI,
	}

	arguments := &Arguments{
		DatabasePath:    *databasePath,
		TemplatePath:    *templatePath,
		UploadPath:      uploadPathValue,
		StaticPath:      *staticPath,
		CloudflareToken: cloudflareToken,
		CloudflareZone:  cloudflareZone,
		Port:            *port,
		Server:          *server,
		Migrate:         *migrate,
		Scheduler:       *scheduler,

		Dns:          *dns,
		DnsPort:      *dnsPort,
		DnsResolvers: strings.Split(*dnsResolvers, ","),

		OauthConfig:      oauthConfig,
		OauthUserInfoURI: oauthUserInfoURI,

		HcaptchaSecret:  hcaptchaSecret,
		HcaptchaSiteKey: hcaptchaSiteKey,
	}

	return arguments, nil
}