Skip to content

Commit b1488a8

Browse files
committed
fix: copy the needed javaagent libs into a writable location
1 parent 7680064 commit b1488a8

File tree

5 files changed

+65
-43
lines changed

5 files changed

+65
-43
lines changed

.github/workflows/ci.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ jobs:
134134
- uses: docker/setup-buildx-action@v3 # NOSONAR githubactions:S7637 - verified action creator
135135

136136
- name: Log in to the container registry
137-
if: github.event_name != 'pull_request'
137+
if: true
138138
uses: docker/login-action@v3 # NOSONAR githubactions:S7637 - verified action creator
139139
with:
140140
registry: ghcr.io
@@ -157,7 +157,7 @@ jobs:
157157
uses: docker/build-push-action@v6 # NOSONAR githubactions:S7637 - verified action creator
158158
with:
159159
context: ./
160-
push: ${{ github.event_name != 'pull_request' }}
160+
push: true
161161
tags: ${{ steps.meta.outputs.tags }}
162162
labels: ${{ steps.meta.outputs.labels }}
163163
platforms: linux/amd64,linux/arm64
@@ -244,7 +244,7 @@ jobs:
244244
version: latest
245245

246246
- name: "[build] Upload packages to gcp internal repositories"
247-
if: github.event_name != 'pull_request'
247+
if: true
248248
working-directory: ./dist
249249
run: |
250250
for deb in $(find * -name '*.deb'); do

Dockerfile

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,10 @@ COPY --from=build /app/extension /extension
8181
COPY --from=build /app/licenses /licenses
8282

8383
#We declare the javaagent directory a volume, so we can write the heartbeat to it, when read only
84-
VOLUME /javaagent
8584
COPY --chown=$USER_UID:$USER_GID javaagents/download/target/javaagent /javaagent
8685

8786

88-
ENV STEADYBIT_EXTENSION_JAVA_AGENT_PATH=/javaagent
87+
ENV STEADYBIT_EXTENSION_JAVA_AGENT_PATH=/javaagent:/tmp/javaagent
8988
EXPOSE 8085 8081
9089

9190
ENTRYPOINT ["/extension"]

extjvm/jvm/java_process_inspector_test.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
package jvm
22

33
import (
4-
"github.com/steadybit/extension-jvm/extjvm/jvm/hsperf"
5-
"github.com/steadybit/extension-jvm/extjvm/jvm/test"
6-
"github.com/steadybit/extension-jvm/extjvm/utils"
7-
"github.com/stretchr/testify/assert"
84
"os"
9-
"strconv"
105
"strings"
116
"testing"
127
"time"
8+
9+
"github.com/steadybit/extension-jvm/extjvm/jvm/hsperf"
10+
"github.com/steadybit/extension-jvm/extjvm/jvm/test"
11+
"github.com/steadybit/extension-jvm/extjvm/utils"
12+
"github.com/stretchr/testify/assert"
1313
)
1414

1515
var hostname string
@@ -37,8 +37,8 @@ func Test_should_inspect_host_process_via_process(t *testing.T) {
3737
case j := <-inspector.JavaVms:
3838
assert.Equal(t, jvm.Pid(), j.Pid())
3939
assert.Contains(t, j.CommandLine(), "60000")
40-
assert.Equal(t, strconv.Itoa(os.Geteuid()), j.UserId())
41-
assert.Equal(t, strconv.Itoa(os.Geteuid()), j.UserId())
40+
assert.Equal(t, os.Getuid(), j.UserId())
41+
assert.Equal(t, os.Getgid(), j.GroupId())
4242
assert.Equal(t, hostname, j.Hostname())
4343
assert.True(t, j.IsRunning())
4444
assert.Condition(t, func() bool {
@@ -81,8 +81,8 @@ func Test_should_inspect_host_process_via_hsperf(t *testing.T) {
8181
case j := <-inspector.JavaVms:
8282
assert.Equal(t, jvm.Pid(), j.Pid())
8383
assert.Contains(t, j.CommandLine(), "60000")
84-
assert.Equal(t, strconv.Itoa(os.Geteuid()), j.UserId())
85-
assert.Equal(t, strconv.Itoa(os.Geteuid()), j.UserId())
84+
assert.Equal(t, os.Getuid, j.UserId())
85+
assert.Equal(t, os.Getgid(), j.GroupId())
8686
assert.Equal(t, hostname, j.Hostname())
8787
assert.True(t, j.IsRunning())
8888
assert.Condition(t, func() bool {

extjvm/jvm/jvm_attach.go

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@ import (
55
"fmt"
66
"os"
77
"os/exec"
8-
"os/user"
98
"runtime"
9+
"strings"
10+
"sync"
1011
"time"
1112

1213
"github.com/rs/zerolog/log"
@@ -23,12 +24,36 @@ const (
2324
initJarName = "javaagent-init.jar"
2425
)
2526

27+
var (
28+
javaagentWorkDir string
29+
javaagentWorkDirOnce = sync.OnceFunc(func() {
30+
paths := strings.SplitN(os.Getenv("STEADYBIT_EXTENSION_JAVA_AGENT_PATH"), ":", 2)
31+
if len(paths) == 0 {
32+
panic("STEADYBIT_EXTENSION_JAVA_AGENT_PATH not set")
33+
}
34+
35+
if len(paths) == 1 {
36+
javaagentWorkDir = paths[0]
37+
return
38+
}
39+
40+
// A single time we copy the javaagent files to a writable location, as there will be also the heartbeat file created
41+
javaagentWorkDir = paths[1]
42+
if err := os.MkdirAll(javaagentWorkDir, 0777); err != nil {
43+
panic("Could not create javaagent working directory: " + err.Error())
44+
}
45+
46+
if err := os.CopyFS(javaagentWorkDir, os.DirFS(paths[0])); err != nil {
47+
panic("Could not copy javaagent: " + err.Error())
48+
}
49+
50+
log.Info().Str("dir", javaagentWorkDir).Msg("prepared javaagent directory")
51+
})
52+
)
53+
2654
func javaagentPath() string {
27-
pathByEnv := os.Getenv("STEADYBIT_EXTENSION_JAVA_AGENT_PATH")
28-
if pathByEnv != "" {
29-
return pathByEnv
30-
}
31-
panic("STEADYBIT_EXTENSION_JAVA_AGENT_PATH not set")
55+
javaagentWorkDirOnce()
56+
return javaagentWorkDir
3257
}
3358

3459
func GetAttachment(jvm JavaVm) Attachment {
@@ -66,7 +91,7 @@ func externalAttach(jvm JavaVm, agentJar, initJar string, heartbeatFile string,
6691
}
6792

6893
if needsUserSwitch(jvm) {
69-
attachCommand = append(attachCommand, "uid="+jvm.UserId(), "gid="+jvm.GroupId())
94+
attachCommand = append(attachCommand, fmt.Sprintf("uid=%d", jvm.UserId()), fmt.Sprintf("gid=%d", jvm.GroupId()))
7095
}
7196

7297
var ctx, cancel = context.WithTimeout(context.Background(), time.Duration(60)*time.Second)
@@ -86,16 +111,11 @@ func externalAttach(jvm JavaVm, agentJar, initJar string, heartbeatFile string,
86111
}
87112

88113
func needsUserSwitch(jvm JavaVm) bool {
89-
if jvm.UserId() == "" || jvm.GroupId() == "" {
114+
if jvm.UserId() == -1 || jvm.GroupId() == -1 {
90115
return false
91116
}
92117

93-
current, err := user.Current()
94-
if err != nil {
95-
log.Warn().Err(err).Msg("Could not determine current user")
96-
return false
97-
}
98-
return jvm.UserId() != current.Uid || jvm.GroupId() != current.Gid
118+
return jvm.UserId() != os.Getuid() || jvm.GroupId() != os.Getgid()
99119
}
100120

101121
func getExecutable(jvm JavaVm) string {

extjvm/jvm/types.go

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,21 @@ import (
44
"context"
55
"errors"
66
"fmt"
7+
"strings"
8+
79
"github.com/rs/zerolog/log"
810
"github.com/shirou/gopsutil/v4/process"
911
"github.com/steadybit/extension-jvm/extjvm/jvm/starttime"
1012
"github.com/steadybit/extension-kit/extruntime"
11-
"strings"
1213
)
1314

1415
type JavaVm interface {
1516
Pid() int32
1617
CommandLine() string
1718
MainClass() string
1819
ClassPath() string
19-
UserId() string
20-
GroupId() string
20+
UserId() int
21+
GroupId() int
2122
Path() string
2223
Hostname() string
2324
HostFQDN() string
@@ -43,8 +44,8 @@ type defaultJavaVm struct {
4344
vmVendor string
4445
vmName string
4546
vmArgs string
46-
userId string
47-
groupId string
47+
userId int
48+
groupId int
4849
path string
4950
discoveredVia string
5051
hostname string
@@ -68,11 +69,11 @@ func (vm defaultJavaVm) ClassPath() string {
6869
return vm.classPath
6970
}
7071

71-
func (vm defaultJavaVm) UserId() string {
72+
func (vm defaultJavaVm) UserId() int {
7273
return vm.userId
7374
}
7475

75-
func (vm defaultJavaVm) GroupId() string {
76+
func (vm defaultJavaVm) GroupId() int {
7677
return vm.groupId
7778
}
7879

@@ -126,11 +127,15 @@ func newJavaVm(p *process.Process, via string) *defaultJavaVm {
126127
}
127128

128129
if uids, err := p.Uids(); err == nil && len(uids) > 0 {
129-
vm.userId = fmt.Sprintf("%d", uids[0])
130+
vm.userId = int(uids[0])
131+
} else {
132+
vm.userId = -1
130133
}
131134

132135
if gids, err := p.Gids(); err == nil && len(gids) > 0 {
133-
vm.groupId = fmt.Sprintf("%d", gids[0])
136+
vm.groupId = int(gids[0])
137+
} else {
138+
vm.groupId = -1
134139
}
135140

136141
if processPath, err := getProcessPath(context.Background(), p); err == nil && processPath != "" {
@@ -155,13 +160,12 @@ func (vm defaultJavaVm) StartTime() starttime.Time {
155160
}
156161

157162
func (vm defaultJavaVm) ToDebugString() string {
158-
return fmt.Sprintf("JavaVm{pid=%d, discoveredVia=%s, commandLine=%s, mainClass=%s, classpath=%s, vmVersion=%s, vmVendor=%s, vmName=%s, vmArgs=%s, userId=%s, groupId=%s, path=%s}",
163+
return fmt.Sprintf("JavaVm{pid=%d, discoveredVia=%s, commandLine=%s, mainClass=%s, classpath=%s, vmVersion=%s, vmVendor=%s, vmName=%s, vmArgs=%s, userId=%d, groupId=%d, path=%s}",
159164
vm.p.Pid, vm.discoveredVia, vm.commandLine, vm.mainClass, vm.classPath, vm.vmVersion, vm.vmVendor, vm.vmName, vm.vmArgs, vm.userId, vm.groupId, vm.path)
160165
}
161166

162167
func (vm defaultJavaVm) ToInfoString() string {
163-
return fmt.Sprintf("JavaVm{pid=%d, discoveredVia=%s, mainClass=%s}",
164-
vm.p.Pid, vm.discoveredVia, vm.mainClass)
168+
return fmt.Sprintf("JavaVm{pid=%d (%d:%d), discoveredVia=%s, mainClass=%s}", vm.p.Pid, vm.userId, vm.groupId, vm.discoveredVia, vm.mainClass)
165169
}
166170

167171
type defaultJavaVmInContainer struct {
@@ -179,11 +183,10 @@ func (vm defaultJavaVmInContainer) PidInContainer() int32 {
179183
}
180184

181185
func (vm defaultJavaVmInContainer) ToDebugString() string {
182-
return fmt.Sprintf("JavaVm{pid=%d, containerId=%s, pidInContainer=%d, discoveredVia=%s, commandLine=%s, mainClass=%s, classpath=%s, vmVersion=%s, vmVendor=%s, vmName=%s, vmArgs=%s, userId=%s, groupId=%s, path=%s}",
186+
return fmt.Sprintf("JavaVm{pid=%d, containerId=%s, pidInContainer=%d, discoveredVia=%s, commandLine=%s, mainClass=%s, classpath=%s, vmVersion=%s, vmVendor=%s, vmName=%s, vmArgs=%s, userId=%d, groupId=%d, path=%s}",
183187
vm.p.Pid, vm.containerId, vm.pidInContainer, vm.discoveredVia, vm.commandLine, vm.mainClass, vm.classPath, vm.vmVersion, vm.vmVendor, vm.vmName, vm.vmArgs, vm.userId, vm.groupId, vm.path)
184188
}
185189

186190
func (vm defaultJavaVmInContainer) ToInfoString() string {
187-
return fmt.Sprintf("JavaVm{pid=%d, containerId=%s, discoveredVia=%s, mainClass=%s}",
188-
vm.p.Pid, vm.containerId, vm.discoveredVia, vm.mainClass)
191+
return fmt.Sprintf("JavaVm{pid=%d (%d:%d), containerId=%s, discoveredVia=%s, mainClass=%s}", vm.p.Pid, vm.userId, vm.groupId, vm.containerId, vm.discoveredVia, vm.mainClass)
189192
}

0 commit comments

Comments
 (0)