From 3ea2e325821bf1df2961e081c0bf71bb418b24bc Mon Sep 17 00:00:00 2001 From: aslamcodes Date: Fri, 5 Dec 2025 20:53:39 +0530 Subject: [PATCH 1/4] feat: update sample config file to snake_case --- go.mod | 2 +- testdata/config_win.yaml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) 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/testdata/config_win.yaml b/testdata/config_win.yaml index 87d90cb..1bb61b3 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,7 @@ sessionScripts: arguments: "-UserSetup" s3LogEnabled: true - SessionTermination: + session_termination: executables: - context: "system" filename: "C:\\AppStream\\Scripts\\End-System.ps1" From 1fcbbe150eb248caad9ddf664349d1aeef9be82c Mon Sep 17 00:00:00 2001 From: aslamcodes Date: Fri, 5 Dec 2025 21:05:00 +0530 Subject: [PATCH 2/4] feat: add struct definition for session script config --- internal/config/session_script.go | 17 ++++++++++++++++ testdata/config_win.yaml | 34 +++++++++++++++---------------- 2 files changed, 33 insertions(+), 18 deletions(-) create mode 100644 internal/config/session_script.go diff --git a/internal/config/session_script.go b/internal/config/session_script.go new file mode 100644 index 0000000..d101f53 --- /dev/null +++ b/internal/config/session_script.go @@ -0,0 +1,17 @@ +package config + +type baseConfig struct { + Filename string `yaml:"filename"` + Arguments string `yaml:"arguments"` + S3LogEnabled bool `yaml:"s3LogEnabled"` +} + +type Executables struct { + SystemContext baseConfig `yaml:"system_context"` + UserContext baseConfig `yaml:"user_context"` +} + +type SessionScript struct { + SessionStart Executables `yaml:"session_start"` + SessionTermination Executables `yaml:"session_termination"` +} diff --git a/testdata/config_win.yaml b/testdata/config_win.yaml index 1bb61b3..db69b0e 100644 --- a/testdata/config_win.yaml +++ b/testdata/config_win.yaml @@ -50,25 +50,23 @@ files: session_scripts: session_start: - executables: - - context: "system" - filename: "C:\\AppStream\\Scripts\\Start-System.ps1" - arguments: "-Init" - s3LogEnabled: true + system_context: + filename: "C:\\AppStream\\Scripts\\Start-System.ps1" + arguments: "-Init" + s3LogEnabled: true - - context: "user" - filename: "C:\\AppStream\\Scripts\\Start-User.ps1" - arguments: "-UserSetup" - s3LogEnabled: true + user_context: + filename: "C:\\AppStream\\Scripts\\Start-User.ps1" + arguments: "-UserSetup" + s3LogEnabled: true session_termination: - executables: - - context: "system" - filename: "C:\\AppStream\\Scripts\\End-System.ps1" - arguments: "-Cleanup" - s3LogEnabled: true + system_context: + filename: "C:\\AppStream\\Scripts\\End-System.ps1" + arguments: "-Cleanup" + s3LogEnabled: true - - context: "user" - filename: "C:\\AppStream\\Scripts\\End-User.ps1" - arguments: "-CleanupUser" - s3LogEnabled: true + user_context: + filename: "C:\\AppStream\\Scripts\\End-User.ps1" + arguments: "-CleanupUser" + s3LogEnabled: true From e18bc45132c0b72792583cacb67e152ec7d67e51 Mon Sep 17 00:00:00 2001 From: aslamcodes Date: Fri, 5 Dec 2025 21:59:12 +0530 Subject: [PATCH 3/4] feat: setup yaml parsing for session script configuration --- internal/backend/local_test.go | 28 +++++++++++++++++++++++++++- internal/config/config.go | 5 +++-- internal/config/session_script.go | 8 ++++---- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/internal/backend/local_test.go b/internal/backend/local_test.go index 768eca9..1eaa8cb 100644 --- a/internal/backend/local_test.go +++ b/internal/backend/local_test.go @@ -34,7 +34,33 @@ 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.Executables{ + SystemContext: config.BaseConfig{ + Filename: `C:\AppStream\Scripts\Start-System.ps1`, + Arguments: "-Init", + S3LogEnabled: true, + }, + UserContext: config.BaseConfig{ + Filename: `C:\AppStream\Scripts\Start-User.ps1`, + Arguments: "-UserSetup", + S3LogEnabled: true, + }, + }, + SessionTermination: config.Executables{ + SystemContext: config.BaseConfig{ + Filename: `C:\AppStream\Scripts\End-System.ps1`, + Arguments: "-Cleanup", + S3LogEnabled: true, + }, + UserContext: config.BaseConfig{ + Filename: `C:\AppStream\Scripts\End-User.ps1`, + Arguments: "-CleanupUser", + S3LogEnabled: true, + }, + }, + }, +} 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..6f7473e 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 { diff --git a/internal/config/session_script.go b/internal/config/session_script.go index d101f53..95333a2 100644 --- a/internal/config/session_script.go +++ b/internal/config/session_script.go @@ -1,17 +1,17 @@ package config -type baseConfig struct { +type BaseConfig struct { Filename string `yaml:"filename"` Arguments string `yaml:"arguments"` S3LogEnabled bool `yaml:"s3LogEnabled"` } type Executables struct { - SystemContext baseConfig `yaml:"system_context"` - UserContext baseConfig `yaml:"user_context"` + SystemContext BaseConfig `yaml:"system_context"` + UserContext BaseConfig `yaml:"user_context"` } -type SessionScript struct { +type SessionScripts struct { SessionStart Executables `yaml:"session_start"` SessionTermination Executables `yaml:"session_termination"` } From 48a6fc82ae3c042606b0d2ac43a59a2db60ddbb7 Mon Sep 17 00:00:00 2001 From: aslamcodes Date: Fri, 5 Dec 2025 22:22:07 +0530 Subject: [PATCH 4/4] feat: setup session script configuration logic --- internal/backend/local_test.go | 50 +++++++++++++---------- internal/config/config.go | 8 +++- internal/config/session_script.go | 55 +++++++++++++++++++++----- internal/config/session_script_unix.go | 5 +++ internal/config/session_script_win.go | 5 +++ testdata/config_win.yaml | 38 ++++++++++-------- 6 files changed, 114 insertions(+), 47 deletions(-) create mode 100644 internal/config/session_script_unix.go create mode 100644 internal/config/session_script_win.go diff --git a/internal/backend/local_test.go b/internal/backend/local_test.go index 1eaa8cb..8ad870a 100644 --- a/internal/backend/local_test.go +++ b/internal/backend/local_test.go @@ -35,29 +35,39 @@ func TestGetConfig(t *testing.T) { {Path: `C:\AppStream\Scripts\End-User.ps1`, Content: "Write-Host \"User session cleanup\"\n"}, }, SessionScripts: config.SessionScripts{ - SessionStart: config.Executables{ - SystemContext: config.BaseConfig{ - Filename: `C:\AppStream\Scripts\Start-System.ps1`, - Arguments: "-Init", - S3LogEnabled: true, - }, - UserContext: config.BaseConfig{ - Filename: `C:\AppStream\Scripts\Start-User.ps1`, - Arguments: "-UserSetup", - S3LogEnabled: true, + 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.Executables{ - SystemContext: config.BaseConfig{ - Filename: `C:\AppStream\Scripts\End-System.ps1`, - Arguments: "-Cleanup", - S3LogEnabled: true, - }, - UserContext: config.BaseConfig{ - Filename: `C:\AppStream\Scripts\End-User.ps1`, - Arguments: "-CleanupUser", - S3LogEnabled: true, + 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, }, }, } diff --git a/internal/config/config.go b/internal/config/config.go index 6f7473e..1536f4f 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -3,8 +3,8 @@ 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"` } @@ -25,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 index 95333a2..6a3037e 100644 --- a/internal/config/session_script.go +++ b/internal/config/session_script.go @@ -1,17 +1,54 @@ package config -type BaseConfig struct { - Filename string `yaml:"filename"` - Arguments string `yaml:"arguments"` - S3LogEnabled bool `yaml:"s3LogEnabled"` +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 Executables struct { - SystemContext BaseConfig `yaml:"system_context"` - UserContext BaseConfig `yaml:"user_context"` +type SessionConfig struct { + Executables []Executable `yaml:"executables" json:"executables"` + WaitingTime int `yaml:"waitingTime" json:"waitingTime"` } type SessionScripts struct { - SessionStart Executables `yaml:"session_start"` - SessionTermination Executables `yaml:"session_termination"` + 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 db69b0e..1c1b08a 100644 --- a/testdata/config_win.yaml +++ b/testdata/config_win.yaml @@ -50,23 +50,29 @@ files: session_scripts: session_start: - system_context: - filename: "C:\\AppStream\\Scripts\\Start-System.ps1" - arguments: "-Init" - s3LogEnabled: true + executables: + - context: "system" + filename: "C:\\AppStream\\Scripts\\Start-System.ps1" + arguments: "-Init" + s3LogEnabled: true - user_context: - filename: "C:\\AppStream\\Scripts\\Start-User.ps1" - arguments: "-UserSetup" - s3LogEnabled: true + - context: "user" + filename: "C:\\AppStream\\Scripts\\Start-User.ps1" + arguments: "-UserSetup" + s3LogEnabled: true + + waitingTime: 60 session_termination: - system_context: - filename: "C:\\AppStream\\Scripts\\End-System.ps1" - arguments: "-Cleanup" - s3LogEnabled: true + executables: + - 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 - user_context: - filename: "C:\\AppStream\\Scripts\\End-User.ps1" - arguments: "-CleanupUser" - s3LogEnabled: true + waitingTime: 60