@@ -6,14 +6,19 @@ import (
66 "encoding/json"
77 "fmt"
88 "io"
9+ "net"
910 "net/http"
1011 "os"
12+ "path/filepath"
1113 "strconv"
1214 "strings"
15+ "time"
1316
17+ "github.com/loft-sh/devpod/cmd/agent/container"
1418 "github.com/loft-sh/devpod/cmd/flags"
1519 "github.com/loft-sh/devpod/pkg/dockercredentials"
1620 devpodhttp "github.com/loft-sh/devpod/pkg/http"
21+ "github.com/loft-sh/devpod/pkg/ts"
1722 "github.com/loft-sh/log"
1823 "github.com/spf13/cobra"
1924)
@@ -111,6 +116,17 @@ func (cmd *DockerCredentialsCmd) handleGet(log log.Logger) error {
111116 return fmt .Errorf ("no credentials server URL" )
112117 }
113118
119+ credentials := getDockerCredentialsFromWorkspaceServer (& dockercredentials.Credentials {ServerURL : strings .TrimSpace (string (url ))})
120+ if credentials != nil {
121+ raw , err := json .Marshal (credentials )
122+ if err != nil {
123+ log .Errorf ("Error encoding credentials: %v" , err )
124+ return nil
125+ }
126+ fmt .Print (string (raw ))
127+ return nil
128+ }
129+
114130 rawJSON , err := json .Marshal (& dockercredentials.Request {ServerURL : strings .TrimSpace (string (url ))})
115131 if err != nil {
116132 return err
@@ -146,3 +162,65 @@ func (cmd *DockerCredentialsCmd) handleGet(log log.Logger) error {
146162 fmt .Print (string (raw ))
147163 return nil
148164}
165+
166+ func getDockerCredentialsFromWorkspaceServer (credentials * dockercredentials.Credentials ) * dockercredentials.Credentials {
167+ if _ , err := os .Stat (filepath .Join (container .RootDir , ts .RunnerProxySocket )); err != nil {
168+ // workspace server is not running
169+ return nil
170+ }
171+
172+ httpClient := & http.Client {
173+ Transport : & http.Transport {
174+ DialContext : func (_ context.Context , _ , _ string ) (net.Conn , error ) {
175+ return net .Dial ("unix" , filepath .Join (container .RootDir , ts .RunnerProxySocket ))
176+ },
177+ },
178+ Timeout : 15 * time .Second ,
179+ }
180+
181+ credentials , credentialsErr := requestDockerCredentials (httpClient , credentials , "http://runner-proxy/docker-credentials" )
182+ if credentialsErr != nil {
183+ // append error to /var/devpod/docker-credentials.log
184+ file , err := os .OpenFile ("/var/devpod/docker-credentials-error.log" , os .O_APPEND | os .O_CREATE | os .O_WRONLY , 0644 )
185+ if err != nil {
186+ return nil
187+ }
188+ defer file .Close ()
189+
190+ _ , _ = file .WriteString (fmt .Sprintf ("get credentials from workspace server: %v\n " , credentialsErr ))
191+ return nil
192+ }
193+
194+ return credentials
195+ }
196+
197+ func requestDockerCredentials (httpClient * http.Client , credentials * dockercredentials.Credentials , url string ) (* dockercredentials.Credentials , error ) {
198+ rawJSON , err := json .Marshal (credentials )
199+ if err != nil {
200+ return nil , fmt .Errorf ("error marshalling credentials: %w" , err )
201+ }
202+
203+ response , err := httpClient .Post (url , "application/json" , bytes .NewReader (rawJSON ))
204+ if err != nil {
205+ return nil , fmt .Errorf ("error retrieving credentials from credentials server: %w" , err )
206+ }
207+ defer response .Body .Close ()
208+
209+ raw , err := io .ReadAll (response .Body )
210+ if err != nil {
211+ return nil , fmt .Errorf ("error reading credentials: %w" , err )
212+ }
213+
214+ // has the request succeeded?
215+ if response .StatusCode != http .StatusOK {
216+ return nil , fmt .Errorf ("error reading credentials (%d): %s" , response .StatusCode , string (raw ))
217+ }
218+
219+ credentials = & dockercredentials.Credentials {}
220+ err = json .Unmarshal (raw , credentials )
221+ if err != nil {
222+ return nil , fmt .Errorf ("error decoding credentials: %w" , err )
223+ }
224+
225+ return credentials , nil
226+ }
0 commit comments