Files
Fabric/internal/plugins/template/sys.go
Kayvan Sylvan 4004c51b9e refactor: restructure project to align with standard Go layout
### CHANGES

- Introduce `cmd` directory for all main application binaries.
- Move all Go packages into the `internal` directory.
- Rename the `restapi` package to `server` for clarity.
- Consolidate patterns and strategies into a new `data` directory.
- Group all auxiliary scripts into a new `scripts` directory.
- Move all documentation and images into a `docs` directory.
- Update all Go import paths to reflect the new structure.
- Adjust CI/CD workflows and build commands for new layout.
2025-07-08 22:47:17 -07:00

88 lines
2.3 KiB
Go

// Package template provides system information operations for the template system.
package template
import (
"fmt"
"os"
"os/user"
"runtime"
)
// SysPlugin provides access to system-level information.
// Security Note: This plugin provides access to system information and
// environment variables. Be cautious with exposed variables in templates.
type SysPlugin struct{}
// Apply executes system operations with the following options:
// - hostname: System hostname
// - user: Current username
// - os: Operating system (linux, darwin, windows)
// - arch: System architecture (amd64, arm64, etc)
// - env:VALUE: Environment variable lookup
// - pwd: Current working directory
// - home: User's home directory
func (p *SysPlugin) Apply(operation string, value string) (string, error) {
debugf("Sys: operation=%q value=%q", operation, value)
switch operation {
case "hostname":
hostname, err := os.Hostname()
if err != nil {
debugf("Sys: hostname error: %v", err)
return "", fmt.Errorf("sys: hostname error: %v", err)
}
debugf("Sys: hostname=%q", hostname)
return hostname, nil
case "user":
currentUser, err := user.Current()
if err != nil {
debugf("Sys: user error: %v", err)
return "", fmt.Errorf("sys: user error: %v", err)
}
debugf("Sys: user=%q", currentUser.Username)
return currentUser.Username, nil
case "os":
result := runtime.GOOS
debugf("Sys: os=%q", result)
return result, nil
case "arch":
result := runtime.GOARCH
debugf("Sys: arch=%q", result)
return result, nil
case "env":
if value == "" {
debugf("Sys: env error: missing variable name")
return "", fmt.Errorf("sys: env operation requires a variable name")
}
result := os.Getenv(value)
debugf("Sys: env %q=%q", value, result)
return result, nil
case "pwd":
dir, err := os.Getwd()
if err != nil {
debugf("Sys: pwd error: %v", err)
return "", fmt.Errorf("sys: pwd error: %v", err)
}
debugf("Sys: pwd=%q", dir)
return dir, nil
case "home":
homeDir, err := os.UserHomeDir()
if err != nil {
debugf("Sys: home error: %v", err)
return "", fmt.Errorf("sys: home error: %v", err)
}
debugf("Sys: home=%q", homeDir)
return homeDir, nil
default:
debugf("Sys: unknown operation %q", operation)
return "", fmt.Errorf("sys: unknown operation %q (supported: hostname, user, os, arch, env, pwd, home)", operation)
}
}