diff options
Diffstat (limited to 'internal/ipxe/ipxescript.go')
-rw-r--r-- | internal/ipxe/ipxescript.go | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/internal/ipxe/ipxescript.go b/internal/ipxe/ipxescript.go new file mode 100644 index 0000000..7253195 --- /dev/null +++ b/internal/ipxe/ipxescript.go @@ -0,0 +1,87 @@ +// Copyright 2018 ThousandEyes Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ipxe + +import ( + "io/ioutil" + "path/filepath" + "strings" + + "github.com/thousandeyes/shoelaces/internal/environment" + "github.com/thousandeyes/shoelaces/internal/log" +) + +// ScriptName keeps the name of a script +type ScriptName string + +// EnvName holds the name of an environment +type EnvName string + +// ScriptPath holds the path of a script +type ScriptPath string + +// Script holds information regarding an IPXE script. +type Script struct { + Name ScriptName + Env EnvName + Path ScriptPath +} + +// ScriptList receives the global environment and return a list of IPXE +// scripts. +func ScriptList(env *environment.Environment) []Script { + ipxeScripts := make([]Script, 0) + // Collect scripts from the main config dir. + ipxeScripts = appendScriptsFromDir(env.Logger, ipxeScripts, env.TemplateExtension, + filepath.Join(env.DataDir, "ipxe"), "", "/configs/") + + // Collect scripts from the config environments if any + if len(env.Environments) > 0 { + for _, e := range env.Environments { + ep := filepath.Join(env.DataDir, env.EnvDir, e, "ipxe") + ipxeScripts = appendScriptsFromDir(env.Logger, ipxeScripts, env.TemplateExtension, ep, + EnvName(e), ScriptPath("/env/"+e+"/configs/")) + } + } + return ipxeScripts +} + +func appendScriptsFromDir(logger log.Logger, scripts []Script, templateExtension string, dir string, e EnvName, p ScriptPath) []Script { + for _, s := range scriptDirList(logger, templateExtension, dir) { + scripts = append(scripts, Script{Name: s, Env: e, Path: p}) + } + return scripts +} + +// scriptDirList returns the names of all available ipxe script templates +func scriptDirList(logger log.Logger, templateExtension string, datadir string) []ScriptName { + files, err := ioutil.ReadDir(datadir) + if err != nil { + logger.Info("component=ipxescript action=dir-list dir=%s err=\"%v\"", datadir, err.Error()) + return nil + } + + ipxeSuffix := ".ipxe" + suffix := ipxeSuffix + templateExtension + var pxeFiles []ScriptName + for _, f := range files { + // Skip over directories and non-template files. + if f.IsDir() || !strings.HasSuffix(f.Name(), suffix) { + continue + } + pxeFiles = append(pxeFiles, ScriptName(strings.TrimSuffix(f.Name(), templateExtension))) + } + return pxeFiles +} |