diff --git a/go.mod b/go.mod index a242d85..233540e 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,4 @@ module github.com/aslamcodes/powerappstream-builder go 1.24.1 -require github.com/goccy/go-yaml v1.19.0 // indirect +require github.com/goccy/go-yaml v1.19.0 diff --git a/internal/backend/local_test.go b/internal/backend/local_test.go index 768eca9..8ad870a 100644 --- a/internal/backend/local_test.go +++ b/internal/backend/local_test.go @@ -34,7 +34,43 @@ func TestGetConfig(t *testing.T) { {Path: `C:\AppStream\Scripts\End-System.ps1`, Content: "Write-EventLog -LogName Application -Source AppStream -EventID 200 -Message \"System cleanup\"\n"}, {Path: `C:\AppStream\Scripts\End-User.ps1`, Content: "Write-Host \"User session cleanup\"\n"}, }, - } + SessionScripts: config.SessionScripts{ + SessionStart: config.SessionConfig{ + Executables: []config.Executable{ + { + Context: "system", + Filename: `C:\AppStream\Scripts\Start-System.ps1`, + Arguments: "-Init", + S3LogEnabled: true, + }, + { + Context: "user", + Filename: `C:\AppStream\Scripts\Start-User.ps1`, + Arguments: "-UserSetup", + S3LogEnabled: true, + }, + }, + WaitingTime: 60, + }, + SessionTermination: config.SessionConfig{ + Executables: []config.Executable{ + { + Context: "system", + Filename: `C:\AppStream\Scripts\End-System.ps1`, + Arguments: "-Cleanup", + S3LogEnabled: true, + }, + { + Context: "user", + Filename: `C:\AppStream\Scripts\End-User.ps1`, + Arguments: "-CleanupUser", + S3LogEnabled: true, + }, + }, + WaitingTime: 60, + }, + }, +} if !reflect.DeepEqual(expected, *actual) { t.Fatalf("GetConfig() mismatch.\nexpected: %#v\nactual: %#v", expected, *actual) diff --git a/internal/config/config.go b/internal/config/config.go index f195302..1536f4f 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -3,8 +3,9 @@ package config import "io" type Config struct { - Installers []Installer `yaml:"installers"` - Files []File `yaml:"files"` + Installers []Installer `yaml:"installers"` + Files []File `yaml:"files"` + SessionScripts SessionScripts `yaml:"session_scripts"` } func (c *Config) Setup(out io.Writer) error { @@ -24,5 +25,9 @@ func (c *Config) Setup(out io.Writer) error { } } + if err := c.SessionScripts.UpdateSessionScriptConfig(out); err != nil { + return err + } + return nil } diff --git a/internal/config/session_script.go b/internal/config/session_script.go new file mode 100644 index 0000000..6a3037e --- /dev/null +++ b/internal/config/session_script.go @@ -0,0 +1,54 @@ +package config + +import ( + "bufio" + "encoding/json" + "io" + "os" + "path/filepath" +) + +type Executable struct { + Context string `yaml:"context" json:"context"` + Filename string `yaml:"filename" json:"filename"` + Arguments string `yaml:"arguments" json:"arguments"` + S3LogEnabled bool `yaml:"s3LogEnabled" json:"s3LogEnabled"` +} + +type SessionConfig struct { + Executables []Executable `yaml:"executables" json:"executables"` + WaitingTime int `yaml:"waitingTime" json:"waitingTime"` +} + +type SessionScripts struct { + SessionStart SessionConfig `yaml:"session_start" json:"SessionStart"` + SessionTermination SessionConfig `yaml:"session_termination" json:"SessionTermination"` +} + +func (ss *SessionScripts) UpdateSessionScriptConfig(out io.Writer) error { + if err := os.MkdirAll(filepath.Dir(SESSION_SCRIPT_CONFIG_LOCATION), 0770); err != nil { + return err + } + + config, err := json.MarshalIndent(ss, "", " ") + + if err != nil { + return err + } + + file, err := os.Create(SESSION_SCRIPT_CONFIG_LOCATION) + + if err != nil { + return err + } + + defer file.Close() + + bw := bufio.NewWriter(file) + + if _, err := bw.Write(config); err != nil { + return err + } + + return bw.Flush() +} diff --git a/internal/config/session_script_unix.go b/internal/config/session_script_unix.go new file mode 100644 index 0000000..b5cf610 --- /dev/null +++ b/internal/config/session_script_unix.go @@ -0,0 +1,5 @@ +//go:build !windows + +package config + +const SESSION_SCRIPT_CONFIG_LOCATION = "C:\\Appstream\\SessionScripts\\config.json" diff --git a/internal/config/session_script_win.go b/internal/config/session_script_win.go new file mode 100644 index 0000000..6da0e40 --- /dev/null +++ b/internal/config/session_script_win.go @@ -0,0 +1,5 @@ +//go:build windows + +package config + +const SESSION_SCRIPT_CONFIG_LOCATION = "C:\\Appstream\\SessionScripts\\config.json" diff --git a/testdata/config_win.yaml b/testdata/config_win.yaml index 87d90cb..1c1b08a 100644 --- a/testdata/config_win.yaml +++ b/testdata/config_win.yaml @@ -20,7 +20,7 @@ catalog: iconPath: "" workingDir: "" -registryConfig: +registry_config: - path: "HKEY_LOCAL_MACHINE\\Software\\MyApp" values: LogLevel: "DEBUG" @@ -48,8 +48,8 @@ files: content: | Write-Host "User session cleanup" -sessionScripts: - SessionStart: +session_scripts: + session_start: executables: - context: "system" filename: "C:\\AppStream\\Scripts\\Start-System.ps1" @@ -61,7 +61,9 @@ sessionScripts: arguments: "-UserSetup" s3LogEnabled: true - SessionTermination: + waitingTime: 60 + + session_termination: executables: - context: "system" filename: "C:\\AppStream\\Scripts\\End-System.ps1" @@ -72,3 +74,5 @@ sessionScripts: filename: "C:\\AppStream\\Scripts\\End-User.ps1" arguments: "-CleanupUser" s3LogEnabled: true + + waitingTime: 60