mirror of https://github.com/grafana/loki
parent
034e2a63cf
commit
cfb4fc1f55
@ -0,0 +1,82 @@ |
||||
package flagext |
||||
|
||||
import ( |
||||
"net" |
||||
"strings" |
||||
|
||||
"github.com/pkg/errors" |
||||
) |
||||
|
||||
// CIDR is a network CIDR.
|
||||
type CIDR struct { |
||||
Value *net.IPNet |
||||
} |
||||
|
||||
// String implements flag.Value.
|
||||
func (c CIDR) String() string { |
||||
if c.Value == nil { |
||||
return "" |
||||
} |
||||
return c.Value.String() |
||||
} |
||||
|
||||
// Set implements flag.Value.
|
||||
func (c *CIDR) Set(s string) error { |
||||
_, value, err := net.ParseCIDR(s) |
||||
if err != nil { |
||||
return err |
||||
} |
||||
c.Value = value |
||||
return nil |
||||
} |
||||
|
||||
// CIDRSliceCSV is a slice of CIDRs that is parsed from a comma-separated string.
|
||||
// It implements flag.Value and yaml Marshalers.
|
||||
type CIDRSliceCSV []CIDR |
||||
|
||||
// String implements flag.Value
|
||||
func (c CIDRSliceCSV) String() string { |
||||
values := make([]string, 0, len(c)) |
||||
for _, cidr := range c { |
||||
values = append(values, cidr.String()) |
||||
} |
||||
|
||||
return strings.Join(values, ",") |
||||
} |
||||
|
||||
// Set implements flag.Value
|
||||
func (c *CIDRSliceCSV) Set(s string) error { |
||||
parts := strings.Split(s, ",") |
||||
|
||||
for _, part := range parts { |
||||
cidr := &CIDR{} |
||||
if err := cidr.Set(part); err != nil { |
||||
return errors.Wrapf(err, "cidr: %s", part) |
||||
} |
||||
|
||||
*c = append(*c, *cidr) |
||||
} |
||||
|
||||
return nil |
||||
} |
||||
|
||||
// UnmarshalYAML implements yaml.Unmarshaler.
|
||||
func (c *CIDRSliceCSV) UnmarshalYAML(unmarshal func(interface{}) error) error { |
||||
var s string |
||||
if err := unmarshal(&s); err != nil { |
||||
return err |
||||
} |
||||
|
||||
// An empty string means no CIDRs has been configured.
|
||||
if s == "" { |
||||
*c = nil |
||||
return nil |
||||
} |
||||
|
||||
return c.Set(s) |
||||
} |
||||
|
||||
// MarshalYAML implements yaml.Marshaler.
|
||||
func (c CIDRSliceCSV) MarshalYAML() (interface{}, error) { |
||||
return c.String(), nil |
||||
} |
||||
@ -0,0 +1,59 @@ |
||||
package flagext |
||||
|
||||
import ( |
||||
"time" |
||||
|
||||
"github.com/prometheus/common/model" |
||||
) |
||||
|
||||
const secondsInDay = 24 * 60 * 60 |
||||
|
||||
// DayValue is a model.Time that can be used as a flag.
|
||||
// NB it only parses days!
|
||||
type DayValue struct { |
||||
model.Time |
||||
set bool |
||||
} |
||||
|
||||
// NewDayValue makes a new DayValue; will round t down to the nearest midnight.
|
||||
func NewDayValue(t model.Time) DayValue { |
||||
return DayValue{ |
||||
Time: model.TimeFromUnix((t.Unix() / secondsInDay) * secondsInDay), |
||||
set: true, |
||||
} |
||||
} |
||||
|
||||
// String implements flag.Value
|
||||
func (v DayValue) String() string { |
||||
return v.Time.Time().Format(time.RFC3339) |
||||
} |
||||
|
||||
// Set implements flag.Value
|
||||
func (v *DayValue) Set(s string) error { |
||||
t, err := time.Parse("2006-01-02", s) |
||||
if err != nil { |
||||
return err |
||||
} |
||||
v.Time = model.TimeFromUnix(t.Unix()) |
||||
v.set = true |
||||
return nil |
||||
} |
||||
|
||||
// IsSet returns true is the DayValue has been set.
|
||||
func (v *DayValue) IsSet() bool { |
||||
return v.set |
||||
} |
||||
|
||||
// UnmarshalYAML implements yaml.Unmarshaler.
|
||||
func (v *DayValue) UnmarshalYAML(unmarshal func(interface{}) error) error { |
||||
var s string |
||||
if err := unmarshal(&s); err != nil { |
||||
return err |
||||
} |
||||
return v.Set(s) |
||||
} |
||||
|
||||
// MarshalYAML implements yaml.Marshaler.
|
||||
func (v DayValue) MarshalYAML() (interface{}, error) { |
||||
return v.Time.Time().Format("2006-01-02"), nil |
||||
} |
||||
@ -0,0 +1,37 @@ |
||||
package flagext |
||||
|
||||
import ( |
||||
"flag" |
||||
|
||||
"github.com/go-kit/kit/log" |
||||
"github.com/go-kit/kit/log/level" |
||||
"github.com/prometheus/client_golang/prometheus" |
||||
"github.com/prometheus/client_golang/prometheus/promauto" |
||||
) |
||||
|
||||
// DeprecatedFlagsUsed is the metric that counts deprecated flags set.
|
||||
var DeprecatedFlagsUsed = promauto.NewCounter( |
||||
prometheus.CounterOpts{ |
||||
Name: "deprecated_flags_inuse_total", |
||||
Help: "The number of deprecated flags currently set.", |
||||
}) |
||||
|
||||
type deprecatedFlag struct { |
||||
name string |
||||
logger log.Logger |
||||
} |
||||
|
||||
func (deprecatedFlag) String() string { |
||||
return "deprecated" |
||||
} |
||||
|
||||
func (d deprecatedFlag) Set(string) error { |
||||
level.Warn(d.logger).Log("msg", "flag disabled", "flag", d.name) |
||||
DeprecatedFlagsUsed.Inc() |
||||
return nil |
||||
} |
||||
|
||||
// DeprecatedFlag logs a warning when you try to use it.
|
||||
func DeprecatedFlag(f *flag.FlagSet, name, message string, logger log.Logger) { |
||||
f.Var(deprecatedFlag{name: name, logger: logger}, name, message) |
||||
} |
||||
@ -0,0 +1,22 @@ |
||||
package flagext |
||||
|
||||
import ( |
||||
"flag" |
||||
) |
||||
|
||||
type ignoredFlag struct { |
||||
name string |
||||
} |
||||
|
||||
func (ignoredFlag) String() string { |
||||
return "ignored" |
||||
} |
||||
|
||||
func (d ignoredFlag) Set(string) error { |
||||
return nil |
||||
} |
||||
|
||||
// IgnoredFlag ignores set value, without any warning
|
||||
func IgnoredFlag(f *flag.FlagSet, name, message string) { |
||||
f.Var(ignoredFlag{name}, name, message) |
||||
} |
||||
@ -0,0 +1,24 @@ |
||||
package flagext |
||||
|
||||
import "flag" |
||||
|
||||
// Registerer is a thing that can RegisterFlags
|
||||
type Registerer interface { |
||||
RegisterFlags(*flag.FlagSet) |
||||
} |
||||
|
||||
// RegisterFlags registers flags with the provided Registerers
|
||||
func RegisterFlags(rs ...Registerer) { |
||||
for _, r := range rs { |
||||
r.RegisterFlags(flag.CommandLine) |
||||
} |
||||
} |
||||
|
||||
// DefaultValues initiates a set of configs (Registerers) with their defaults.
|
||||
func DefaultValues(rs ...Registerer) { |
||||
fs := flag.NewFlagSet("", flag.PanicOnError) |
||||
for _, r := range rs { |
||||
r.RegisterFlags(fs) |
||||
} |
||||
_ = fs.Parse([]string{}) |
||||
} |
||||
@ -0,0 +1,34 @@ |
||||
package flagext |
||||
|
||||
type Secret struct { |
||||
Value string |
||||
} |
||||
|
||||
// String implements flag.Value
|
||||
func (v Secret) String() string { |
||||
return v.Value |
||||
} |
||||
|
||||
// Set implements flag.Value
|
||||
func (v *Secret) Set(s string) error { |
||||
v.Value = s |
||||
return nil |
||||
} |
||||
|
||||
// UnmarshalYAML implements yaml.Unmarshaler.
|
||||
func (v *Secret) UnmarshalYAML(unmarshal func(interface{}) error) error { |
||||
var s string |
||||
if err := unmarshal(&s); err != nil { |
||||
return err |
||||
} |
||||
|
||||
return v.Set(s) |
||||
} |
||||
|
||||
// MarshalYAML implements yaml.Marshaler.
|
||||
func (v Secret) MarshalYAML() (interface{}, error) { |
||||
if len(v.Value) == 0 { |
||||
return "", nil |
||||
} |
||||
return "********", nil |
||||
} |
||||
@ -0,0 +1,17 @@ |
||||
package flagext |
||||
|
||||
import "fmt" |
||||
|
||||
// StringSlice is a slice of strings that implements flag.Value
|
||||
type StringSlice []string |
||||
|
||||
// String implements flag.Value
|
||||
func (v StringSlice) String() string { |
||||
return fmt.Sprintf("%s", []string(v)) |
||||
} |
||||
|
||||
// Set implements flag.Value
|
||||
func (v *StringSlice) Set(s string) error { |
||||
*v = append(*v, s) |
||||
return nil |
||||
} |
||||
@ -0,0 +1,33 @@ |
||||
package flagext |
||||
|
||||
import "strings" |
||||
|
||||
// StringSliceCSV is a slice of strings that is parsed from a comma-separated string
|
||||
// It implements flag.Value and yaml Marshalers
|
||||
type StringSliceCSV []string |
||||
|
||||
// String implements flag.Value
|
||||
func (v StringSliceCSV) String() string { |
||||
return strings.Join(v, ",") |
||||
} |
||||
|
||||
// Set implements flag.Value
|
||||
func (v *StringSliceCSV) Set(s string) error { |
||||
*v = strings.Split(s, ",") |
||||
return nil |
||||
} |
||||
|
||||
// UnmarshalYAML implements yaml.Unmarshaler.
|
||||
func (v *StringSliceCSV) UnmarshalYAML(unmarshal func(interface{}) error) error { |
||||
var s string |
||||
if err := unmarshal(&s); err != nil { |
||||
return err |
||||
} |
||||
|
||||
return v.Set(s) |
||||
} |
||||
|
||||
// MarshalYAML implements yaml.Marshaler.
|
||||
func (v StringSliceCSV) MarshalYAML() (interface{}, error) { |
||||
return v.String(), nil |
||||
} |
||||
@ -0,0 +1,60 @@ |
||||
package flagext |
||||
|
||||
import ( |
||||
"fmt" |
||||
"time" |
||||
) |
||||
|
||||
// Time usable as flag or in YAML config.
|
||||
type Time time.Time |
||||
|
||||
// String implements flag.Value
|
||||
func (t Time) String() string { |
||||
if time.Time(t).IsZero() { |
||||
return "0" |
||||
} |
||||
|
||||
return time.Time(t).Format(time.RFC3339) |
||||
} |
||||
|
||||
// Set implements flag.Value
|
||||
func (t *Time) Set(s string) error { |
||||
if s == "0" { |
||||
*t = Time(time.Time{}) |
||||
return nil |
||||
} |
||||
|
||||
p, err := time.Parse("2006-01-02", s) |
||||
if err == nil { |
||||
*t = Time(p) |
||||
return nil |
||||
} |
||||
|
||||
p, err = time.Parse("2006-01-02T15:04", s) |
||||
if err == nil { |
||||
*t = Time(p) |
||||
return nil |
||||
} |
||||
|
||||
p, err = time.Parse("2006-01-02T15:04:05Z07:00", s) |
||||
if err == nil { |
||||
*t = Time(p) |
||||
return nil |
||||
} |
||||
|
||||
return fmt.Errorf("failed to parse time: %q", s) |
||||
} |
||||
|
||||
// UnmarshalYAML implements yaml.Unmarshaler.
|
||||
func (t *Time) UnmarshalYAML(unmarshal func(interface{}) error) error { |
||||
var s string |
||||
if err := unmarshal(&s); err != nil { |
||||
return err |
||||
} |
||||
return t.Set(s) |
||||
} |
||||
|
||||
// MarshalYAML implements yaml.Marshaler.
|
||||
func (t Time) MarshalYAML() (interface{}, error) { |
||||
return t.String(), nil |
||||
} |
||||
@ -0,0 +1,59 @@ |
||||
package flagext |
||||
|
||||
import "net/url" |
||||
|
||||
// URLValue is a url.URL that can be used as a flag.
|
||||
type URLValue struct { |
||||
*url.URL |
||||
} |
||||
|
||||
// String implements flag.Value
|
||||
func (v URLValue) String() string { |
||||
if v.URL == nil { |
||||
return "" |
||||
} |
||||
return v.URL.String() |
||||
} |
||||
|
||||
// Set implements flag.Value
|
||||
func (v *URLValue) Set(s string) error { |
||||
u, err := url.Parse(s) |
||||
if err != nil { |
||||
return err |
||||
} |
||||
v.URL = u |
||||
return nil |
||||
} |
||||
|
||||
// UnmarshalYAML implements yaml.Unmarshaler.
|
||||
func (v *URLValue) UnmarshalYAML(unmarshal func(interface{}) error) error { |
||||
var s string |
||||
if err := unmarshal(&s); err != nil { |
||||
return err |
||||
} |
||||
|
||||
// An empty string means no URL has been configured.
|
||||
if s == "" { |
||||
v.URL = nil |
||||
return nil |
||||
} |
||||
|
||||
return v.Set(s) |
||||
} |
||||
|
||||
// MarshalYAML implements yaml.Marshaler.
|
||||
func (v URLValue) MarshalYAML() (interface{}, error) { |
||||
if v.URL == nil { |
||||
return "", nil |
||||
} |
||||
|
||||
// Mask out passwords when marshalling URLs back to YAML.
|
||||
u := *v.URL |
||||
if u.User != nil { |
||||
if _, set := u.User.Password(); set { |
||||
u.User = url.UserPassword(u.User.Username(), "********") |
||||
} |
||||
} |
||||
|
||||
return u.String(), nil |
||||
} |
||||
Loading…
Reference in new issue