Skip to content

Commit

Permalink
Merge branch 'main' into remove-gin-references
Browse files Browse the repository at this point in the history
  • Loading branch information
juanfont committed Sep 20, 2022
2 parents f2928d7 + cdc8bab commit 2c73f8e
Show file tree
Hide file tree
Showing 10 changed files with 72 additions and 17 deletions.
7 changes: 7 additions & 0 deletions CHANGELOG.md
Expand Up @@ -2,12 +2,19 @@

## 0.17.0 (2022-XX-XX)

### BREAKING

- Log level option `log_level` was moved to a distinct `log` config section and renamed to `level` [#768](https://github.com/juanfont/headscale/pull/768)

### Changes

- Added support for Tailscale TS2021 protocol [#738](https://github.com/juanfont/headscale/pull/738)
- Add ability to specify config location via env var `HEADSCALE_CONFIG` [#674](https://github.com/juanfont/headscale/issues/674)
- Target Go 1.19 for Headscale [#778](https://github.com/juanfont/headscale/pull/778)
- Target Tailscale v1.30.0 to build Headscale [#780](https://github.com/juanfont/headscale/pull/780)
- Give a warning when running Headscale with reverse proxy improperly configured for WebSockets [#788](https://github.com/juanfont/headscale/pull/788)
- Fix subnet routers with Primary Routes [#811](https://github.com/juanfont/headscale/pull/811)
- Added support for JSON logs [#653](https://github.com/juanfont/headscale/issues/653)

## 0.16.4 (2022-08-21)

Expand Down
6 changes: 5 additions & 1 deletion cmd/headscale/cli/root.go
Expand Up @@ -47,14 +47,18 @@ func initConfig() {

machineOutput := HasMachineOutputFlag()

zerolog.SetGlobalLevel(cfg.LogLevel)
zerolog.SetGlobalLevel(cfg.Log.Level)

// If the user has requested a "machine" readable format,
// then disable login so the output remains valid.
if machineOutput {
zerolog.SetGlobalLevel(zerolog.Disabled)
}

if cfg.Log.Format == headscale.JSONLogFormat {
log.Logger = log.Output(os.Stdout)
}

if !cfg.DisableUpdateCheck && !machineOutput {
if (runtime.GOOS == "linux" || runtime.GOOS == "darwin") &&
Version != "dev" {
Expand Down
5 changes: 4 additions & 1 deletion config-example.yaml
Expand Up @@ -172,7 +172,10 @@ tls_letsencrypt_listen: ":http"
tls_cert_path: ""
tls_key_path: ""

log_level: info
log:
# Output formatting for logs: text or json
format: text
level: info

# Path to a file containg ACL policies.
# ACLs can be defined as YAML or HUJSON.
Expand Down
50 changes: 41 additions & 9 deletions config.go
Expand Up @@ -22,6 +22,9 @@ import (
const (
tlsALPN01ChallengeType = "TLS-ALPN-01"
http01ChallengeType = "HTTP-01"

JSONLogFormat = "json"
TextLogFormat = "text"
)

// Config contains the initial Headscale configuration.
Expand All @@ -37,7 +40,7 @@ type Config struct {
PrivateKeyPath string
NoisePrivateKeyPath string
BaseDomain string
LogLevel zerolog.Level
Log LogConfig
DisableUpdateCheck bool

DERP DERPConfig
Expand Down Expand Up @@ -124,6 +127,11 @@ type ACLConfig struct {
PolicyPath string
}

type LogConfig struct {
Format string
Level zerolog.Level
}

func LoadConfig(path string, isFile bool) error {
if isFile {
viper.SetConfigFile(path)
Expand All @@ -147,7 +155,8 @@ func LoadConfig(path string, isFile bool) error {
viper.SetDefault("tls_letsencrypt_challenge_type", http01ChallengeType)
viper.SetDefault("tls_client_auth_mode", "relaxed")

viper.SetDefault("log_level", "info")
viper.SetDefault("log.level", "info")
viper.SetDefault("log.format", TextLogFormat)

viper.SetDefault("dns_config", nil)

Expand Down Expand Up @@ -334,6 +343,34 @@ func GetACLConfig() ACLConfig {
}
}

func GetLogConfig() LogConfig {
logLevelStr := viper.GetString("log.level")
logLevel, err := zerolog.ParseLevel(logLevelStr)
if err != nil {
logLevel = zerolog.DebugLevel
}

logFormatOpt := viper.GetString("log.format")
var logFormat string
switch logFormatOpt {
case "json":
logFormat = JSONLogFormat
case "text":
logFormat = TextLogFormat
case "":
logFormat = TextLogFormat
default:
log.Error().
Str("func", "GetLogConfig").
Msgf("Could not parse log format: %s. Valid choices are 'json' or 'text'", logFormatOpt)
}

return LogConfig{
Format: logFormat,
Level: logLevel,
}
}

func GetDNSConfig() (*tailcfg.DNSConfig, string) {
if viper.IsSet("dns_config") {
dnsConfig := &tailcfg.DNSConfig{}
Expand Down Expand Up @@ -430,12 +467,6 @@ func GetHeadscaleConfig() (*Config, error) {
configuredPrefixes := viper.GetStringSlice("ip_prefixes")
parsedPrefixes := make([]netip.Prefix, 0, len(configuredPrefixes)+1)

logLevelStr := viper.GetString("log_level")
logLevel, err := zerolog.ParseLevel(logLevelStr)
if err != nil {
logLevel = zerolog.DebugLevel
}

legacyPrefixField := viper.GetString("ip_prefix")
if len(legacyPrefixField) > 0 {
log.
Expand Down Expand Up @@ -488,7 +519,6 @@ func GetHeadscaleConfig() (*Config, error) {
GRPCAddr: viper.GetString("grpc_listen_addr"),
GRPCAllowInsecure: viper.GetBool("grpc_allow_insecure"),
DisableUpdateCheck: viper.GetBool("disable_check_updates"),
LogLevel: logLevel,

IPPrefixes: prefixes,
PrivateKeyPath: AbsolutePathFromConfigPath(
Expand Down Expand Up @@ -550,5 +580,7 @@ func GetHeadscaleConfig() (*Config, error) {
},

ACL: GetACLConfig(),

Log: GetLogConfig(),
}, nil
}
4 changes: 3 additions & 1 deletion integration_test/etc/alt-config.dump.gold.yaml
Expand Up @@ -28,7 +28,9 @@ ip_prefixes:
- fd7a:115c:a1e0::/48
- 100.64.0.0/10
listen_addr: 0.0.0.0:18080
log_level: disabled
log:
level: disabled
format: text
logtail:
enabled: false
metrics_listen_addr: 127.0.0.1:19090
Expand Down
3 changes: 2 additions & 1 deletion integration_test/etc/alt-config.yaml
@@ -1,4 +1,5 @@
log_level: trace
log:
level: trace
acl_policy_path: ""
db_type: sqlite3
ephemeral_node_inactivity_timeout: 30m
Expand Down
4 changes: 3 additions & 1 deletion integration_test/etc/alt-env-config.dump.gold.yaml
Expand Up @@ -27,7 +27,9 @@ ip_prefixes:
- fd7a:115c:a1e0::/48
- 100.64.0.0/10
listen_addr: 0.0.0.0:18080
log_level: disabled
log:
level: disabled
format: text
logtail:
enabled: false
metrics_listen_addr: 127.0.0.1:19090
Expand Down
3 changes: 2 additions & 1 deletion integration_test/etc/alt-env-config.yaml
@@ -1,4 +1,5 @@
log_level: trace
log:
level: trace
acl_policy_path: ""
db_type: sqlite3
ephemeral_node_inactivity_timeout: 30m
Expand Down
4 changes: 3 additions & 1 deletion integration_test/etc/config.dump.gold.yaml
Expand Up @@ -28,7 +28,9 @@ ip_prefixes:
- fd7a:115c:a1e0::/48
- 100.64.0.0/10
listen_addr: 0.0.0.0:8080
log_level: disabled
log:
format: text
level: disabled
logtail:
enabled: false
metrics_listen_addr: 127.0.0.1:9090
Expand Down
3 changes: 2 additions & 1 deletion integration_test/etc/config.yaml
@@ -1,4 +1,5 @@
log_level: trace
log:
level: trace
acl_policy_path: ""
db_type: sqlite3
ephemeral_node_inactivity_timeout: 30m
Expand Down

0 comments on commit 2c73f8e

Please sign in to comment.