2021-11-10 19:06:12 +00:00
|
|
|
package setting
|
|
|
|
|
|
|
|
import (
|
2021-11-29 17:16:27 +00:00
|
|
|
"bytes"
|
|
|
|
"errors"
|
2021-11-10 19:06:12 +00:00
|
|
|
"flag"
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/dcarrillo/whatismyip/internal/core"
|
|
|
|
)
|
|
|
|
|
|
|
|
type geodbPath struct {
|
|
|
|
City string
|
|
|
|
ASN string
|
|
|
|
}
|
|
|
|
type serverSettings struct {
|
|
|
|
ReadTimeout time.Duration
|
|
|
|
WriteTimeout time.Duration
|
|
|
|
}
|
|
|
|
type settings struct {
|
|
|
|
GeodbPath geodbPath
|
|
|
|
TemplatePath string
|
|
|
|
BindAddress string
|
|
|
|
TLSAddress string
|
|
|
|
TLSCrtPath string
|
|
|
|
TLSKeyPath string
|
|
|
|
TrustedHeader string
|
|
|
|
Server serverSettings
|
2021-11-29 17:16:27 +00:00
|
|
|
version bool
|
2021-11-10 19:06:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
const defaultAddress = ":8080"
|
|
|
|
|
2021-11-30 16:21:01 +00:00
|
|
|
// ErrVersion is the custom error triggered when -version flag is passed
|
2021-11-29 17:16:27 +00:00
|
|
|
var ErrVersion = errors.New("setting: version requested")
|
2021-11-30 16:21:01 +00:00
|
|
|
|
|
|
|
// App is the var with the parsed settings
|
2021-11-29 17:16:27 +00:00
|
|
|
var App = settings{
|
|
|
|
// hard-coded for the time being
|
|
|
|
Server: serverSettings{
|
|
|
|
ReadTimeout: 10 * time.Second,
|
|
|
|
WriteTimeout: 10 * time.Second,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
2021-11-30 16:21:01 +00:00
|
|
|
// Setup initializes the App object parsing the flags
|
2021-11-29 17:16:27 +00:00
|
|
|
func Setup(args []string) (output string, err error) {
|
|
|
|
flags := flag.NewFlagSet("whatismyip", flag.ContinueOnError)
|
|
|
|
var buf bytes.Buffer
|
|
|
|
flags.SetOutput(&buf)
|
2021-11-10 19:06:12 +00:00
|
|
|
|
2021-11-29 17:16:27 +00:00
|
|
|
flags.StringVar(&App.GeodbPath.City, "geoip2-city", "", "Path to GeoIP2 city database")
|
|
|
|
flags.StringVar(&App.GeodbPath.ASN, "geoip2-asn", "", "Path to GeoIP2 ASN database")
|
|
|
|
flags.StringVar(&App.TemplatePath, "template", "", "Path to template file")
|
|
|
|
flags.StringVar(
|
|
|
|
&App.BindAddress,
|
2021-11-18 18:26:53 +00:00
|
|
|
"bind",
|
|
|
|
defaultAddress,
|
|
|
|
"Listening address (see https://pkg.go.dev/net?#Listen)",
|
|
|
|
)
|
2021-11-29 17:16:27 +00:00
|
|
|
flags.StringVar(
|
|
|
|
&App.TLSAddress,
|
2021-11-18 18:26:53 +00:00
|
|
|
"tls-bind",
|
|
|
|
"",
|
|
|
|
"Listening address for TLS (see https://pkg.go.dev/net?#Listen)",
|
|
|
|
)
|
2021-11-29 17:16:27 +00:00
|
|
|
flags.StringVar(&App.TLSCrtPath, "tls-crt", "", "When using TLS, path to certificate file")
|
|
|
|
flags.StringVar(&App.TLSKeyPath, "tls-key", "", "When using TLS, path to private key file")
|
|
|
|
flags.StringVar(&App.TrustedHeader,
|
2021-11-18 18:26:53 +00:00
|
|
|
"trusted-header",
|
|
|
|
"",
|
|
|
|
"Trusted request header for remote IP (e.g. X-Real-IP)",
|
|
|
|
)
|
2021-11-29 17:16:27 +00:00
|
|
|
flags.BoolVar(&App.version, "version", false, "Output version information and exit")
|
2021-11-10 19:06:12 +00:00
|
|
|
|
2021-11-29 17:16:27 +00:00
|
|
|
err = flags.Parse(args)
|
|
|
|
if err != nil {
|
|
|
|
return buf.String(), err
|
2021-11-10 19:06:12 +00:00
|
|
|
}
|
|
|
|
|
2021-11-29 17:16:27 +00:00
|
|
|
if App.version {
|
|
|
|
return fmt.Sprintf("whatismyip version %s", core.Version), ErrVersion
|
2021-11-10 19:06:12 +00:00
|
|
|
}
|
|
|
|
|
2021-11-29 17:16:27 +00:00
|
|
|
if App.GeodbPath.City == "" || App.GeodbPath.ASN == "" {
|
|
|
|
return "", fmt.Errorf("geoip2-city and geoip2-asn parameters are mandatory")
|
2021-11-10 19:06:12 +00:00
|
|
|
}
|
|
|
|
|
2021-11-29 17:16:27 +00:00
|
|
|
if (App.TLSAddress != "") && (App.TLSCrtPath == "" || App.TLSKeyPath == "") {
|
|
|
|
return "", fmt.Errorf("In order to use TLS -tls-crt and -tls-key flags are mandatory")
|
2021-11-10 19:06:12 +00:00
|
|
|
}
|
|
|
|
|
2021-11-29 17:16:27 +00:00
|
|
|
if App.TemplatePath != "" {
|
|
|
|
info, err := os.Stat(App.TemplatePath)
|
|
|
|
if os.IsNotExist(err) {
|
|
|
|
return "", fmt.Errorf("%s no such file or directory", App.TemplatePath)
|
|
|
|
}
|
|
|
|
if info.IsDir() {
|
|
|
|
return "", fmt.Errorf("%s must be a file", App.TemplatePath)
|
|
|
|
}
|
2021-11-10 19:06:12 +00:00
|
|
|
}
|
|
|
|
|
2021-11-29 17:16:27 +00:00
|
|
|
return buf.String(), nil
|
2021-11-10 19:06:12 +00:00
|
|
|
}
|