diff --git a/config/options.go b/config/options.go index 9110368..da0d382 100644 --- a/config/options.go +++ b/config/options.go @@ -2,6 +2,6 @@ package config type Options struct { ConfigFile string `short:"c" long:"config" required:"true" description:"path to YAML config file"` - Variables []string `short:"v" long:"variable" required:"false" description:"variable for script ${var-name} placeholder" long-description:"one or more variables can be specified as flags, in order to replace repeated patterns in the scripts, which can be replaced with {$variable-name} placeholder" ` + Variables []string `short:"v" long:"variable" required:"false" description:"specify name=value variable to use in script placeholder as $name" long-description:"one or more variables can be specified as flags, in order to replace repeated patterns in the scripts, which can be replaced with {$variable-name} placeholder" ` Examples []string `short:"e" long:"example" required:"false" choice:"runchart" choice:"barchart" choice:"asciibox" choice:"textbox" choice:"gauge" choice:"sparkline" description:"add an example component to the specified config file" long-description:"one or more example component types can be added to the specified config file, in order to jump-start the configuration"` } diff --git a/data/item.go b/data/item.go index b09478d..6f3a58e 100644 --- a/data/item.go +++ b/data/item.go @@ -3,6 +3,7 @@ package data import ( ui "github.com/gizak/termui/v3" "github.com/sqshq/sampler/config" + "os" "os/exec" "strings" ) @@ -25,9 +26,16 @@ func NewItems(cfgs []config.Item) []Item { return items } -func (i *Item) nextValue() (value string, err error) { +func (i *Item) nextValue(variables []string) (value string, err error) { - output, err := exec.Command("sh", "-c", i.Script).Output() + cmd := exec.Command("sh", "-c", i.Script) + cmd.Env = os.Environ() + + for _, variable := range variables { + cmd.Env = append(cmd.Env, variable) + } + + output, err := cmd.Output() if err != nil { return "", err diff --git a/data/sampler.go b/data/sampler.go index 5e60418..cc35ba4 100644 --- a/data/sampler.go +++ b/data/sampler.go @@ -1,6 +1,7 @@ package data import ( + "github.com/sqshq/sampler/config" "os/exec" "time" ) @@ -12,11 +13,9 @@ type Sampler struct { triggersChannel chan *Sample } -func NewSampler(consumer *Consumer, items []Item, triggers []Trigger, rateMs int) Sampler { +func NewSampler(consumer *Consumer, items []Item, triggers []Trigger, options config.Options, rateMs int) Sampler { - ticker := time.NewTicker( - time.Duration(rateMs * int(time.Millisecond)), - ) + ticker := time.NewTicker(time.Duration(rateMs * int(time.Millisecond))) sampler := Sampler{ consumer, @@ -28,7 +27,7 @@ func NewSampler(consumer *Consumer, items []Item, triggers []Trigger, rateMs int go func() { for ; true; <-ticker.C { for _, item := range sampler.items { - go sampler.sample(item) + go sampler.sample(item, options) } } }() @@ -47,9 +46,9 @@ func NewSampler(consumer *Consumer, items []Item, triggers []Trigger, rateMs int return sampler } -func (s *Sampler) sample(item Item) { +func (s *Sampler) sample(item Item, options config.Options) { - val, err := item.nextValue() + val, err := item.nextValue(options.Variables) if err == nil { sample := &Sample{Label: item.Label, Value: val, Color: item.Color} diff --git a/data/trigger.go b/data/trigger.go index 1e46190..4972a8c 100644 --- a/data/trigger.go +++ b/data/trigger.go @@ -21,6 +21,7 @@ type Trigger struct { actions *Actions consumer *Consumer valuesByLabel map[string]Values + options config.Options player *asset.AudioPlayer digitsRegexp *regexp.Regexp } @@ -37,23 +38,24 @@ type Values struct { previous string } -func NewTriggers(cfgs []config.TriggerConfig, consumer *Consumer, player *asset.AudioPlayer) []Trigger { +func NewTriggers(cfgs []config.TriggerConfig, consumer *Consumer, options config.Options, player *asset.AudioPlayer) []Trigger { triggers := make([]Trigger, 0) for _, cfg := range cfgs { - triggers = append(triggers, NewTrigger(cfg, consumer, player)) + triggers = append(triggers, NewTrigger(cfg, consumer, options, player)) } return triggers } -func NewTrigger(config config.TriggerConfig, consumer *Consumer, player *asset.AudioPlayer) Trigger { +func NewTrigger(config config.TriggerConfig, consumer *Consumer, options config.Options, player *asset.AudioPlayer) Trigger { return Trigger{ title: config.Title, condition: config.Condition, consumer: consumer, valuesByLabel: make(map[string]Values), + options: options, player: player, digitsRegexp: regexp.MustCompile("[^0-9]+"), actions: &Actions{ @@ -85,7 +87,7 @@ func (t *Trigger) Execute(sample *Sample) { } if t.actions.script != nil { - _, _ = runScript(*t.actions.script, sample.Label, t.valuesByLabel[sample.Label]) + _, _ = t.runScript(*t.actions.script, sample.Label, t.valuesByLabel[sample.Label]) } } } @@ -100,7 +102,7 @@ func (t *Trigger) evaluate(sample *Sample) bool { t.valuesByLabel[sample.Label] = Values{previous: InitialValue, current: sample.Value} } - output, err := runScript(t.condition, sample.Label, t.valuesByLabel[sample.Label]) + output, err := t.runScript(t.condition, sample.Label, t.valuesByLabel[sample.Label]) if err != nil { t.consumer.AlertChannel <- &Alert{ @@ -112,10 +114,15 @@ func (t *Trigger) evaluate(sample *Sample) bool { return t.digitsRegexp.ReplaceAllString(string(output), "") == TrueIndicator } -func runScript(script, label string, data Values) ([]byte, error) { +func (t *Trigger) runScript(script, label string, data Values) ([]byte, error) { cmd := exec.Command("sh", "-c", script) cmd.Env = os.Environ() + + for _, variable := range t.options.Variables { + cmd.Env = append(cmd.Env, variable) + } + cmd.Env = append(cmd.Env, fmt.Sprintf("prev=%v", data.previous), fmt.Sprintf("cur=%v", data.current), diff --git a/main.go b/main.go index 69534ff..e478009 100644 --- a/main.go +++ b/main.go @@ -23,8 +23,8 @@ type Starter struct { func (s *Starter) start(drawable ui.Drawable, consumer *data.Consumer, conponentConfig config.ComponentConfig, itemsConfig []config.Item, triggersConfig []config.TriggerConfig) { cpt := component.NewComponent(drawable, consumer, conponentConfig) - triggers := data.NewTriggers(triggersConfig, consumer, s.player) - data.NewSampler(consumer, data.NewItems(itemsConfig), triggers, *conponentConfig.RefreshRateMs) + triggers := data.NewTriggers(triggersConfig, consumer, s.opt, s.player) + data.NewSampler(consumer, data.NewItems(itemsConfig), triggers, s.opt, *conponentConfig.RefreshRateMs) s.lout.AddComponent(cpt) }