From a05b6a927ea0b89db67bd428db67da482392daa0 Mon Sep 17 00:00:00 2001 From: James Shubin Date: Fri, 16 Feb 2024 11:52:36 -0500 Subject: [PATCH] lang: funcs: core: os: Add an args function to read argv --- examples/lang/args.mcl | 7 +++++ lang/funcs/core/os/args_func.go | 47 +++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 examples/lang/args.mcl create mode 100644 lang/funcs/core/os/args_func.go diff --git a/examples/lang/args.mcl b/examples/lang/args.mcl new file mode 100644 index 00000000..0e7f98bb --- /dev/null +++ b/examples/lang/args.mcl @@ -0,0 +1,7 @@ +import "fmt" +import "os" + +# show the argv of this process +print "print" { + msg => fmt.printf("args(%d): %v", len(os.args()), os.args()), +} diff --git a/lang/funcs/core/os/args_func.go b/lang/funcs/core/os/args_func.go new file mode 100644 index 00000000..fd9e2d3b --- /dev/null +++ b/lang/funcs/core/os/args_func.go @@ -0,0 +1,47 @@ +// Mgmt +// Copyright (C) 2013-2024+ James Shubin and the project contributors +// Written by James Shubin and the project contributors +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +package coreos + +import ( + "os" + + "github.com/purpleidea/mgmt/lang/funcs/simple" + "github.com/purpleidea/mgmt/lang/types" +) + +func init() { + simple.ModuleRegister(ModuleName, "args", &types.FuncValue{ + T: types.NewType("func() []str"), + V: Args, + }) +} + +// Args returns the `argv` of the current process. Keep in mind that this will +// return different values depending on how this is deployed, so don't expect a +// result on your deploy client to behave the same as a server receiving code. +// FIXME: Sanitize any command-line secrets we might pass in by cli. +func Args([]types.Value) (types.Value, error) { + values := []types.Value{} + for _, s := range os.Args { + values = append(values, &types.StrValue{V: s}) + } + return &types.ListValue{ + V: values, + T: types.NewType("[]str"), + }, nil +}