added some features
- Added `cron` command to run lists with `cron` time specifed - Changed `-c` flag to `-f` flag for passing config file - Modified some config keys - cmdArgs -> Args - Got rid of `hosts.config` - better SSH handling - respects values in config file
This commit is contained in:
209
pkg/backy/utils.go
Normal file
209
pkg/backy/utils.go
Normal file
@@ -0,0 +1,209 @@
|
||||
// utils.go
|
||||
// Copyright (C) Andrew Woodlee 2023
|
||||
// License: Apache-2.0
|
||||
|
||||
package backy
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"git.andrewnw.xyz/CyberShell/backy/pkg/logging"
|
||||
"github.com/joho/godotenv"
|
||||
"github.com/rs/zerolog"
|
||||
"github.com/spf13/viper"
|
||||
"golang.org/x/crypto/ssh"
|
||||
)
|
||||
|
||||
func injectEnvIntoSSH(envVarsToInject environmentVars, process *ssh.Session, log *zerolog.Logger) {
|
||||
if envVarsToInject.file != "" {
|
||||
envPath, envPathErr := resolveDir(envVarsToInject.file)
|
||||
if envPathErr != nil {
|
||||
log.Fatal().Str("envFile", envPath).Err(envPathErr).Send()
|
||||
}
|
||||
file, err := os.Open(envPath)
|
||||
if err != nil {
|
||||
log.Fatal().Str("envFile", envPath).Err(err).Send()
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
envMap, err := godotenv.Parse(file)
|
||||
if err != nil {
|
||||
log.Error().Str("envFile", envPath).Err(err).Send()
|
||||
goto errEnvFile
|
||||
}
|
||||
for key, val := range envMap {
|
||||
process.Setenv(key, val)
|
||||
}
|
||||
}
|
||||
|
||||
errEnvFile:
|
||||
if len(envVarsToInject.env) > 0 {
|
||||
for _, envVal := range envVarsToInject.env {
|
||||
// don't append env Vars for Backy
|
||||
if strings.Contains(envVal, "=") && !strings.HasPrefix(envVal, "BACKY_") {
|
||||
envVarArr := strings.Split(envVal, "=")
|
||||
process.Setenv(envVarArr[0], envVarArr[1])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func injectEnvIntoLocalCMD(envVarsToInject environmentVars, process *exec.Cmd, log *zerolog.Logger) {
|
||||
if envVarsToInject.file != "" {
|
||||
envPath, _ := resolveDir(envVarsToInject.file)
|
||||
|
||||
file, _ := os.Open(envPath)
|
||||
// if err != nil {
|
||||
// log.Fatal().Str("envFile", envPath).Err(err).Send()
|
||||
// }
|
||||
defer file.Close()
|
||||
envMap, err := godotenv.Parse(file)
|
||||
if err != nil {
|
||||
log.Error().Str("envFile", envPath).Err(err).Send()
|
||||
goto errEnvFile
|
||||
}
|
||||
for key, val := range envMap {
|
||||
process.Env = append(process.Env, fmt.Sprintf("%s=%s", key, val))
|
||||
}
|
||||
|
||||
}
|
||||
errEnvFile:
|
||||
if len(envVarsToInject.env) > 0 {
|
||||
for _, envVal := range envVarsToInject.env {
|
||||
if strings.Contains(envVal, "=") {
|
||||
process.Env = append(process.Env, envVal)
|
||||
}
|
||||
}
|
||||
}
|
||||
envVarsToInject.env = append(envVarsToInject.env, os.Environ()...)
|
||||
}
|
||||
|
||||
func (cmd *Command) checkCmdExists() bool {
|
||||
_, err := exec.LookPath(cmd.Cmd)
|
||||
return err == nil
|
||||
}
|
||||
|
||||
func contains(s []string, e string) bool {
|
||||
for _, a := range s {
|
||||
if a == e {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func CheckConfigValues(config *viper.Viper) {
|
||||
|
||||
for _, key := range requiredKeys {
|
||||
isKeySet := config.IsSet(key)
|
||||
if !isKeySet {
|
||||
logging.ExitWithMSG(Sprintf("Config key %s is not defined in %s", key, config.ConfigFileUsed()), 1, nil)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
func testFile(c string) error {
|
||||
if strings.TrimSpace(c) != "" {
|
||||
file, fileOpenErr := os.Open(c)
|
||||
file.Close()
|
||||
if errors.Is(fileOpenErr, os.ErrNotExist) {
|
||||
return fileOpenErr
|
||||
}
|
||||
|
||||
fmt.Printf("%s\t\t%v", c, fileOpenErr)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *BackyConfigOpts) LogLvl(level string) BackyOptionFunc {
|
||||
|
||||
return func(bco *BackyConfigOpts) {
|
||||
c.BackyLogLvl = &level
|
||||
}
|
||||
}
|
||||
|
||||
// AddCommands adds commands to BackyConfigOpts
|
||||
func AddCommands(commands []string) BackyOptionFunc {
|
||||
return func(bco *BackyConfigOpts) {
|
||||
bco.executeCmds = append(bco.executeCmds, commands...)
|
||||
}
|
||||
}
|
||||
|
||||
// AddCommandLists adds lists to BackyConfigOpts
|
||||
func AddCommandLists(lists []string) BackyOptionFunc {
|
||||
return func(bco *BackyConfigOpts) {
|
||||
bco.executeLists = append(bco.executeLists, lists...)
|
||||
}
|
||||
}
|
||||
|
||||
// UseCron enables the execution of command lists at specified times
|
||||
func UseCron() BackyOptionFunc {
|
||||
return func(bco *BackyConfigOpts) {
|
||||
bco.useCron = true
|
||||
}
|
||||
}
|
||||
|
||||
// UseCron enables the execution of command lists at specified times
|
||||
func (c *BackyConfigOpts) AddViper(v *viper.Viper) BackyOptionFunc {
|
||||
return func(bco *BackyConfigOpts) {
|
||||
c.viper = v
|
||||
}
|
||||
}
|
||||
|
||||
func NewOpts(configFilePath string, opts ...BackyOptionFunc) *BackyConfigOpts {
|
||||
b := &BackyConfigOpts{}
|
||||
b.ConfigFilePath = configFilePath
|
||||
for _, opt := range opts {
|
||||
if opt != nil {
|
||||
opt(b)
|
||||
}
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
||||
/*
|
||||
NewConfig initializes new config that holds information from the config file
|
||||
*/
|
||||
func NewConfig() *BackyConfigFile {
|
||||
return &BackyConfigFile{
|
||||
Cmds: make(map[string]*Command),
|
||||
CmdConfigLists: make(map[string]*CmdList),
|
||||
Hosts: make(map[string]*Host),
|
||||
Notifications: make(map[string]*NotificationsConfig),
|
||||
}
|
||||
}
|
||||
|
||||
func IsTerminalActive() bool {
|
||||
return os.Getenv("BACKY_TERM") == "enabled"
|
||||
}
|
||||
|
||||
func IsCmdStdOutEnabled() bool {
|
||||
return os.Getenv("BACKY_STDOUT") == "enabled"
|
||||
}
|
||||
|
||||
func resolveDir(path string) (string, error) {
|
||||
if path == "~" {
|
||||
homeDir, err := os.UserHomeDir()
|
||||
if err != nil {
|
||||
return path, err
|
||||
}
|
||||
// In case of "~", which won't be caught by the "else if"
|
||||
path = homeDir
|
||||
} else if strings.HasPrefix(path, "~/") {
|
||||
homeDir, err := os.UserHomeDir()
|
||||
if err != nil {
|
||||
return path, err
|
||||
}
|
||||
// Use strings.HasPrefix so we don't match paths like
|
||||
// "/something/~/something/"
|
||||
path = filepath.Join(homeDir, path[2:])
|
||||
}
|
||||
return path, nil
|
||||
}
|
||||
Reference in New Issue
Block a user