@@ -9,13 +9,16 @@ import (
99 "net/http"
1010 "time"
1111
12+ "github.com/rs/zerolog"
1213 "github.com/txn2/txeh"
1314 "golang.org/x/sys/unix"
1415
1516 "github.com/e2b-dev/infra/packages/envd/internal/host"
1617 "github.com/e2b-dev/infra/packages/envd/internal/logs"
1718)
1819
20+ var ErrAccessTokenAlreadySet = errors .New ("access token is already set" )
21+
1922func (a * API ) PostInit (w http.ResponseWriter , r * http.Request ) {
2023 defer r .Body .Close ()
2124
@@ -33,37 +36,23 @@ func (a *API) PostInit(w http.ResponseWriter, r *http.Request) {
3336 return
3437 }
3538
36- if initRequest .Timestamp != nil {
37- logger .Debug ().Msgf ("Setting sandbox start time to: %v" , * initRequest .Timestamp )
38- ts := unix .NsecToTimespec (initRequest .Timestamp .UnixNano ())
39- err = unix .ClockSettime (unix .CLOCK_REALTIME , & ts )
40- if err != nil {
41- logger .Error ().Msgf ("Failed to set system time: %v" , err )
42- }
43- }
44-
45- if initRequest .EnvVars != nil {
46- logger .Debug ().Msg (fmt .Sprintf ("Setting %d env vars" , len (* initRequest .EnvVars )))
47-
48- for key , value := range * initRequest .EnvVars {
49- logger .Debug ().Msgf ("Setting env var for %s" , key )
50- a .envVars .Store (key , value )
51- }
52- }
39+ a .initLock .Lock ()
40+ defer a .initLock .Unlock ()
5341
54- if initRequest .AccessToken != nil {
55- if a .accessToken != nil && * initRequest .AccessToken != * a .accessToken {
56- logger .Error ().Msg ("Access token is already set and cannot be changed" )
57- w .WriteHeader (http .StatusConflict )
42+ // Update data only if the request is newer or if there's no timestamp at all
43+ if initRequest .Timestamp == nil || a .lastSetTime .SetToGreater (initRequest .Timestamp .UnixNano ()) {
44+ err = a .SetData (logger , initRequest )
45+ if err != nil {
46+ switch {
47+ case errors .Is (err , ErrAccessTokenAlreadySet ):
48+ w .WriteHeader (http .StatusConflict )
49+ default :
50+ logger .Error ().Msgf ("Failed to set data: %v" , err )
51+ w .WriteHeader (http .StatusBadRequest )
52+ }
53+ w .Write ([]byte (err .Error ()))
5854 return
5955 }
60-
61- logger .Debug ().Msg ("Setting access token" )
62- a .accessToken = initRequest .AccessToken
63- }
64-
65- if initRequest .HyperloopIP != nil {
66- go a .SetupHyperloop (* initRequest .HyperloopIP )
6756 }
6857 }
6958
@@ -79,6 +68,42 @@ func (a *API) PostInit(w http.ResponseWriter, r *http.Request) {
7968 w .WriteHeader (http .StatusNoContent )
8069}
8170
71+ func (a * API ) SetData (logger zerolog.Logger , data PostInitJSONBody ) error {
72+ if data .Timestamp != nil {
73+ logger .Debug ().Msgf ("Setting sandbox start time to: %v" , * data .Timestamp )
74+ ts := unix .NsecToTimespec (data .Timestamp .UnixNano ())
75+ err := unix .ClockSettime (unix .CLOCK_REALTIME , & ts )
76+ if err != nil {
77+ logger .Error ().Msgf ("Failed to set system time: %v" , err )
78+ }
79+ }
80+
81+ if data .EnvVars != nil {
82+ logger .Debug ().Msg (fmt .Sprintf ("Setting %d env vars" , len (* data .EnvVars )))
83+
84+ for key , value := range * data .EnvVars {
85+ logger .Debug ().Msgf ("Setting env var for %s" , key )
86+ a .envVars .Store (key , value )
87+ }
88+ }
89+
90+ if data .AccessToken != nil {
91+ if a .accessToken != nil && * data .AccessToken != * a .accessToken {
92+ logger .Error ().Msg ("Access token is already set and cannot be changed" )
93+ return ErrAccessTokenAlreadySet
94+ }
95+
96+ logger .Debug ().Msg ("Setting access token" )
97+ a .accessToken = data .AccessToken
98+ }
99+
100+ if data .HyperloopIP != nil {
101+ go a .SetupHyperloop (* data .HyperloopIP )
102+ }
103+
104+ return nil
105+ }
106+
82107func (a * API ) SetupHyperloop (address string ) {
83108 a .hyperloopLock .Lock ()
84109 defer a .hyperloopLock .Unlock ()
0 commit comments