Skip to content

Commit 7cbd6fb

Browse files
authored
Merge pull request #22 from koooosh/patch-ssm-agent
amazon-ssm-agent: Add dynamically-linked agent binaries
2 parents a4226f4 + 3073ff8 commit 7cbd6fb

File tree

5 files changed

+255
-7
lines changed

5 files changed

+255
-7
lines changed
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
From c835d2ddc855439173a8a59828c335d169c03d15 Mon Sep 17 00:00:00 2001
2+
From: Kush Upadhyay <kushupad@amazon.com>
3+
Date: Tue, 2 Jul 2024 20:54:29 +0000
4+
Subject: [PATCH] agent: Add config to make shell optional
5+
6+
Signed-off-by: Kush Upadhyay <kushupad@amazon.com>
7+
---
8+
agent/appconfig/appconfig.go | 1 +
9+
agent/appconfig/contracts.go | 2 ++
10+
agent/plugins/runscript/runscript.go | 36 +++++++++++++++++++---------
11+
3 files changed, 28 insertions(+), 11 deletions(-)
12+
13+
diff --git a/agent/appconfig/appconfig.go b/agent/appconfig/appconfig.go
14+
index b6abcf1..e214cd5 100644
15+
--- a/agent/appconfig/appconfig.go
16+
+++ b/agent/appconfig/appconfig.go
17+
@@ -118,6 +118,7 @@ func DefaultConfig() SsmagentConfig {
18+
SessionLogsRetentionDurationHours: DefaultSessionLogsRetentionDurationHours,
19+
PluginLocalOutputCleanup: DefaultPluginOutputRetention,
20+
OrchestrationDirectoryCleanup: DefaultOrchestrationDirCleanup,
21+
+ UseShell: false,
22+
}
23+
var agent = AgentInfo{
24+
Name: "amazon-ssm-agent",
25+
diff --git a/agent/appconfig/contracts.go b/agent/appconfig/contracts.go
26+
index 1337398..0a66441 100644
27+
--- a/agent/appconfig/contracts.go
28+
+++ b/agent/appconfig/contracts.go
29+
@@ -50,6 +50,8 @@ type SsmCfg struct {
30+
PluginLocalOutputCleanup string
31+
// Configure only when it is safe to delete orchestration folder after document execution. This config overrides PluginLocalOutputCleanup when set.
32+
OrchestrationDirectoryCleanup string
33+
+ // Flag for shell dependency
34+
+ UseShell bool
35+
}
36+
37+
// AgentInfo represents metadata for amazon-ssm-agent
38+
diff --git a/agent/plugins/runscript/runscript.go b/agent/plugins/runscript/runscript.go
39+
index 48be5e7..d8cbcf1 100644
40+
--- a/agent/plugins/runscript/runscript.go
41+
+++ b/agent/plugins/runscript/runscript.go
42+
@@ -174,23 +174,37 @@ func (p *Plugin) runCommands(pluginID string, pluginInput RunScriptPluginInput,
43+
return
44+
}
45+
46+
- // Create script file path
47+
- scriptPath := filepath.Join(orchestrationDir, p.ScriptName)
48+
- log.Debugf("Writing commands %v to file %v", pluginInput, scriptPath)
49+
+ appConfig := p.Context.AppConfig()
50+
51+
- // Create script file
52+
- if err = pluginutil.CreateScriptFile(log, scriptPath, pluginInput.RunCommand, p.ByteOrderMark); err != nil {
53+
- output.MarkAsFailed(fmt.Errorf("failed to create script file. %v", err))
54+
- return
55+
+ var commandName string
56+
+ var commandArguments []string
57+
+
58+
+ if appConfig.Ssm.UseShell {
59+
+
60+
+ // Create script file path
61+
+ scriptPath := filepath.Join(orchestrationDir, p.ScriptName)
62+
+ log.Debugf("Writing commands %v to file %v", pluginInput, scriptPath)
63+
+
64+
+ // Create script file
65+
+ if err = pluginutil.CreateScriptFile(log, scriptPath, pluginInput.RunCommand, p.ByteOrderMark); err != nil {
66+
+ output.MarkAsFailed(fmt.Errorf("failed to create script file. %v", err))
67+
+ return
68+
+ }
69+
+
70+
+ // Construct Command Name and Arguments
71+
+ commandName = p.ShellCommand
72+
+ commandArguments = append(p.ShellArguments, scriptPath)
73+
+ } else {
74+
+
75+
+ // Take only the first element of RunCommand since we prefer single-line commands
76+
+ commandInput := strings.Split(pluginInput.RunCommand[0], " ")
77+
+ commandName = commandInput[0]
78+
+ commandArguments = append(commandInput[1:])
79+
}
80+
81+
// Set execution time
82+
executionTimeout := pluginutil.ValidateExecutionTimeout(log, pluginInput.TimeoutSeconds)
83+
84+
- // Construct Command Name and Arguments
85+
- commandName := p.ShellCommand
86+
- commandArguments := append(p.ShellArguments, scriptPath)
87+
-
88+
// Execute Command
89+
exitCode, err := p.CommandExecuter.NewExecute(p.Context, workingDir, output.GetStdoutWriter(), output.GetStderrWriter(), cancelFlag, executionTimeout, commandName, commandArguments, pluginInput.Environment)
90+
91+
--
92+
2.40.1
93+
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
{
2+
"Profile":{
3+
"ShareCreds" : true,
4+
"ShareProfile" : "",
5+
"ForceUpdateCreds" : false,
6+
"KeyAutoRotateDays": 0
7+
},
8+
"Mds": {
9+
"CommandWorkersLimit" : 5,
10+
"StopTimeoutMillis" : 20000,
11+
"Endpoint": "",
12+
"CommandRetryLimit": 15
13+
},
14+
"Ssm": {
15+
"Endpoint": "",
16+
"HealthFrequencyMinutes": 5,
17+
"CustomInventoryDefaultLocation" : "",
18+
"AssociationLogsRetentionDurationHours" : 24,
19+
"RunCommandLogsRetentionDurationHours" : 336,
20+
"SessionLogsRetentionDurationHours" : 336,
21+
"PluginLocalOutputCleanup": "",
22+
"OrchestrationDirectoryCleanup": "",
23+
"UseShell": false
24+
},
25+
"Mgs": {
26+
"Region": "",
27+
"Endpoint": "",
28+
"StopTimeoutMillis" : 20000,
29+
"SessionWorkersLimit" : 1000,
30+
"DeniedPortForwardingRemoteIPs" : [
31+
"169.254.169.254",
32+
"fd00:ec2::254",
33+
"169.254.169.253",
34+
"fd00:ec2::253",
35+
"169.254.169.123",
36+
"169.254.169.250"
37+
]
38+
},
39+
"Agent": {
40+
"Region": "",
41+
"OrchestrationRootDir": "",
42+
"SelfUpdate": false,
43+
"TelemetryMetricsToCloudWatch": false,
44+
"TelemetryMetricsToSSM": true,
45+
"AuditExpirationDay" : 7,
46+
"LongRunningWorkerMonitorIntervalSeconds": 60
47+
},
48+
"Os": {
49+
"Lang": "en-US",
50+
"Name": "",
51+
"Version": "1"
52+
},
53+
"S3": {
54+
"Endpoint": "",
55+
"Region": "",
56+
"LogBucket":"",
57+
"LogKey":""
58+
},
59+
"Kms": {
60+
"Endpoint": ""
61+
}
62+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
[Unit]
2+
Description=Amazon SSM agent
3+
4+
[Service]
5+
Type=simple
6+
ExecStart=/usr/bin/amazon-ssm-agent
7+
KillMode=process
8+
9+
# Restart the agent regardless of whether it crashes (and returns a non-zero result code) or if
10+
# is terminated normally (e.g. via 'kill -HUP'). Delay restart so that the agent is less likely
11+
# to restart during a reboot initiated by a script. If the agent exits with status 194 (reboot
12+
# requested), don't restart at all.
13+
Restart=always
14+
RestartPreventExitStatus=194
15+
RestartSec=5
16+
17+
[Install]
18+
WantedBy=multi-user.target

packages/amazon-ssm-agent/amazon-ssm-agent.spec

Lines changed: 81 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,12 @@ Summary: An agent to enable remote management of EC2 instances
99
License: Apache-2.0
1010
URL: https://github.com/aws/amazon-ssm-agent
1111
Source0: %{gorepo}-%{version}.tar.gz
12+
Source1: amazon-ssm-agent.service
13+
Source2: amazon-ssm-agent.json
1214
Source1000: clarify.toml
1315

16+
Patch0001: 0001-agent-Add-config-to-make-shell-optional.patch
17+
1418
BuildRequires: %{_cross_os}glibc-devel
1519
Requires: %{name}(binaries)
1620

@@ -35,11 +39,36 @@ Conflicts: (%{_cross_os}image-feature(no-fips) or %{name}-bin)
3539
%description fips-bin
3640
%{summary}.
3741

42+
%package plugin
43+
Summary: A statically-linked agent to enable remote management of EC2 instances
44+
Requires: %{name}-plugin(binaries)
45+
46+
%description plugin
47+
%{summary}.
48+
49+
%package plugin-bin
50+
Summary: Statically-linked remote management agent binaries
51+
Provides: %{name}-plugin(binaries)
52+
Requires: (%{_cross_os}image-feature(no-fips) and %{name}-plugin)
53+
Conflicts: (%{_cross_os}image-feature(fips) or %{name}-plugin-fips-bin)
54+
55+
%description plugin-bin
56+
%{summary}.
57+
58+
%package plugin-fips-bin
59+
Summary: Statically-linked remote management agent binaries, FIPS edition
60+
Provides: %{name}-plugin(binaries)
61+
Requires: (%{_cross_os}image-feature(fips) and %{name}-plugin)
62+
Conflicts: (%{_cross_os}image-feature(no-fips) or %{name}-plugin-bin)
63+
64+
%description plugin-fips-bin
65+
%{summary}.
66+
3867
%prep
39-
%setup -n %{gorepo}-%{version}
68+
%autosetup -n %{gorepo}-%{version} -p0001
4069

4170
%build
42-
%set_cross_go_flags_static
71+
%set_cross_go_flags
4372

4473
go build -ldflags "${GOLDFLAGS}" -o amazon-ssm-agent \
4574
./core/agent.go ./core/agent_unix.go ./core/agent_parser.go
@@ -59,12 +88,43 @@ go build -ldflags "${GOLDFLAGS}" -o ssm-session-worker \
5988
gofips build -ldflags "${GOLDFLAGS}" -o fips/ssm-session-worker \
6089
./agent/framework/processor/executer/outofproc/sessionworker/main.go
6190

91+
%set_cross_go_flags_static
92+
93+
go build -ldflags "${GOLDFLAGS}" -o static/amazon-ssm-agent \
94+
./core/agent.go ./core/agent_unix.go ./core/agent_parser.go
95+
96+
gofips build -ldflags "${GOLDFLAGS}" -o fips-static/amazon-ssm-agent \
97+
./core/agent.go ./core/agent_unix.go ./core/agent_parser.go
98+
99+
go build -ldflags "${GOLDFLAGS}" -o static/ssm-agent-worker \
100+
./agent/agent.go ./agent/agent_unix.go ./agent/agent_parser.go
101+
102+
gofips build -ldflags "${GOLDFLAGS}" -o fips-static/ssm-agent-worker \
103+
./agent/agent.go ./agent/agent_unix.go ./agent/agent_parser.go
104+
105+
go build -ldflags "${GOLDFLAGS}" -o static/ssm-session-worker \
106+
./agent/framework/processor/executer/outofproc/sessionworker/main.go
107+
108+
gofips build -ldflags "${GOLDFLAGS}" -o fips-static/ssm-session-worker \
109+
./agent/framework/processor/executer/outofproc/sessionworker/main.go
110+
62111
%install
63-
# Install the SSM agent under 'libexecdir', since it is meant to be used by other programs
112+
install -D -p -m 0644 %{S:1} %{buildroot}%{_cross_unitdir}/amazon-ssm-agent.service
113+
114+
install -d %{buildroot}%{_cross_factorydir}%{_cross_sysconfdir}/amazon/ssm
115+
install -m 0644 %{S:2} %{buildroot}%{_cross_factorydir}%{_cross_sysconfdir}/amazon/ssm/amazon-ssm-agent.json
116+
117+
install -d %{buildroot}{%{_cross_bindir},%{_cross_fips_bindir}}
118+
for b in amazon-ssm-agent ssm-agent-worker ssm-session-worker; do
119+
install -p -m 0755 ${b} %{buildroot}%{_cross_bindir}
120+
install -p -m 0755 fips/${b} %{buildroot}%{_cross_fips_bindir}
121+
done
122+
123+
# Install the statically-linked SSM agent under 'libexecdir', since it is meant to be used by other programs
64124
install -d %{buildroot}{%{_cross_libexecdir},%{_cross_fips_libexecdir}}/amazon-ssm-agent/bin/%{version}
65125
for b in amazon-ssm-agent ssm-agent-worker ssm-session-worker; do
66-
install -p -m 0755 ${b} %{buildroot}%{_cross_libexecdir}/amazon-ssm-agent/bin/%{version}
67-
install -p -m 0755 fips/${b} %{buildroot}%{_cross_fips_libexecdir}/amazon-ssm-agent/bin/%{version}
126+
install -p -m 0755 static/${b} %{buildroot}%{_cross_libexecdir}/amazon-ssm-agent/bin/%{version}
127+
install -p -m 0755 fips-static/${b} %{buildroot}%{_cross_fips_libexecdir}/amazon-ssm-agent/bin/%{version}
68128
done
69129

70130
%cross_scan_attribution --clarify %{S:1000} go-vendor vendor
@@ -76,15 +136,30 @@ ln -sf %{version} %{buildroot}%{_cross_fips_libexecdir}/amazon-ssm-agent/bin/lat
76136
%license LICENSE
77137
%{_cross_attribution_file}
78138
%{_cross_attribution_vendor_dir}
139+
%{_cross_unitdir}/amazon-ssm-agent.service
140+
%dir %{_cross_factorydir}%{_cross_sysconfdir}/amazon/ssm
141+
%{_cross_factorydir}%{_cross_sysconfdir}/amazon/ssm/amazon-ssm-agent.json
79142

80143
%files bin
144+
%{_cross_bindir}/amazon-ssm-agent
145+
%{_cross_bindir}/ssm-agent-worker
146+
%{_cross_bindir}/ssm-session-worker
147+
148+
%files fips-bin
149+
%{_cross_fips_bindir}/amazon-ssm-agent
150+
%{_cross_fips_bindir}/ssm-agent-worker
151+
%{_cross_fips_bindir}/ssm-session-worker
152+
153+
%files plugin
154+
155+
%files plugin-bin
81156
%dir %{_cross_libexecdir}/amazon-ssm-agent
82157
%{_cross_libexecdir}/amazon-ssm-agent/bin/%{version}/amazon-ssm-agent
83158
%{_cross_libexecdir}/amazon-ssm-agent/bin/%{version}/ssm-agent-worker
84159
%{_cross_libexecdir}/amazon-ssm-agent/bin/%{version}/ssm-session-worker
85160
%{_cross_libexecdir}/amazon-ssm-agent/bin/latest
86161

87-
%files fips-bin
162+
%files plugin-fips-bin
88163
%dir %{_cross_fips_libexecdir}/amazon-ssm-agent
89164
%{_cross_fips_libexecdir}/amazon-ssm-agent/bin/%{version}/amazon-ssm-agent
90165
%{_cross_fips_libexecdir}/amazon-ssm-agent/bin/%{version}/ssm-agent-worker

packages/ecs-agent/ecs-agent.spec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ BuildRequires: %{_cross_os}glibc-devel
8383

8484
Requires: %{_cross_os}docker-engine
8585
Requires: %{_cross_os}iptables
86-
Requires: %{_cross_os}amazon-ssm-agent
86+
Requires: %{_cross_os}amazon-ssm-agent-plugin
8787
Requires: %{name}(binaries)
8888

8989
%description

0 commit comments

Comments
 (0)