hatecomputers.club/args/args.go

129 lines
3.4 KiB
Go

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
}