diff --git a/controllers/workspace/devworkspace_controller.go b/controllers/workspace/devworkspace_controller.go index a27d79098..08cf8bd62 100644 --- a/controllers/workspace/devworkspace_controller.go +++ b/controllers/workspace/devworkspace_controller.go @@ -18,6 +18,7 @@ package controllers import ( "context" "fmt" + "github.com/devfile/devworkspace-operator/pkg/library/ssh" "strconv" "strings" "time" @@ -278,6 +279,12 @@ func (r *DevWorkspaceReconciler) Reconcile(ctx context.Context, req ctrl.Request reconcileStatus.addWarning(flatten.FormatVariablesWarning(warnings)) } workspace.Spec.Template = *flattenedWorkspace + + err = ssh.AddSshAgentPostStartEvent(&workspace.Spec.Template) + if err != nil { + return r.failWorkspace(workspace, "hello", metrics.ReasonWorkspaceEngineFailure, reqLogger, &reconcileStatus), nil + } + reconcileStatus.setConditionTrue(conditions.DevWorkspaceResolved, "Resolved plugins and parents from DevWorkspace") // Verify that the devworkspace components are valid after flattening diff --git a/pkg/constants/constants.go b/pkg/constants/constants.go index a1b162580..d50079c2c 100644 --- a/pkg/constants/constants.go +++ b/pkg/constants/constants.go @@ -45,6 +45,8 @@ const ( HomeInitEventId = "init-persistent-home" + SshAgentStartEventId = "init-ssh-agent" + ServiceAccount = "devworkspace" PVCStorageSize = "10Gi" diff --git a/pkg/library/ssh/event.go b/pkg/library/ssh/event.go new file mode 100644 index 000000000..72d609e05 --- /dev/null +++ b/pkg/library/ssh/event.go @@ -0,0 +1,56 @@ +// Copyright (c) 2019-2024 Red Hat, Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ssh + +import ( + "github.com/devfile/api/v2/pkg/apis/workspaces/v1alpha2" + "github.com/devfile/devworkspace-operator/pkg/constants" + "github.com/devfile/devworkspace-operator/pkg/library/lifecycle" +) + +// AddSshAgentPostStartEvent Start ssh-agent and add the default ssh key to it, if the ssh key has a passphrase. +// Initialise the ssh-agent session env variables in the user .bashrc file. +func AddSshAgentPostStartEvent(spec *v1alpha2.DevWorkspaceTemplateSpec) error { + if spec.Commands == nil { + spec.Commands = []v1alpha2.Command{} + } + + if spec.Events == nil { + spec.Events = &v1alpha2.Events{} + } + + var commandLine = `SSH_ENV_PATH=/home/user/ssh-environment \ +&& if [ -f /etc/ssh/passphrase ] && command -v ssh-add >/dev/null; \ +then ssh-agent | sed 's/^echo/#echo/' > $SSH_ENV_PATH \ +&& chmod 600 $SSH_ENV_PATH && . $SSH_ENV_PATH \ +&& ssh-add /etc/ssh/dwo_ssh_key < /etc/ssh/passphrase \ +&& echo ". ${SSH_ENV_PATH}" >> /home/user/.bashrc; fi` + _, mainComponents, err := lifecycle.GetInitContainers(spec.DevWorkspaceTemplateSpecContent) + for _, component := range mainComponents { + if component.Container == nil { + continue + } + spec.Commands = append(spec.Commands, v1alpha2.Command{ + Id: constants.SshAgentStartEventId, + CommandUnion: v1alpha2.CommandUnion{ + Exec: &v1alpha2.ExecCommand{ + CommandLine: commandLine, + Component: component.Name, + }, + }, + }) + } + spec.Events.PostStart = append(spec.Events.PostStart, constants.SshAgentStartEventId) + return err +}