Skip to content

Commit e93c072

Browse files
committed
Perform actions to enroll-remove nodes in osctrl-api
1 parent 1204983 commit e93c072

File tree

5 files changed

+210
-10
lines changed

5 files changed

+210
-10
lines changed

admin/handlers/post.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -911,28 +911,28 @@ func (h *HandlersAdmin) ExpirationPOSTHandler(w http.ResponseWriter, r *http.Req
911911
}
912912
case settings.ScriptRemove:
913913
switch e.Action {
914-
case "expire":
914+
case settings.ActionExpire:
915915
if err := h.Envs.ExpireRemove(env.UUID); err != nil {
916916
adminErrorResponse(w, "error expiring remove", http.StatusInternalServerError, err)
917917
h.Inc(metricAdminErr)
918918
return
919919
}
920920
adminOKResponse(w, "link expired successfully")
921-
case "extend":
921+
case settings.ActionExtend:
922922
if err := h.Envs.ExtendRemove(env.UUID); err != nil {
923923
adminErrorResponse(w, "error extending remove", http.StatusInternalServerError, err)
924924
h.Inc(metricAdminErr)
925925
return
926926
}
927927
adminOKResponse(w, "link extended successfully")
928-
case "rotate":
928+
case settings.ActionRotate:
929929
if err := h.Envs.RotateRemove(env.UUID); err != nil {
930930
adminErrorResponse(w, "error rotating remove", http.StatusInternalServerError, err)
931931
h.Inc(metricAdminErr)
932932
return
933933
}
934934
adminOKResponse(w, "link rotated successfully")
935-
case "notexpire":
935+
case settings.ActionNotexpire:
936936
if err := h.Envs.NotExpireRemove(env.UUID); err != nil {
937937
adminErrorResponse(w, "error not expiring remove", http.StatusInternalServerError, err)
938938
h.Inc(metricAdminErr)

api/handlers-environments.go

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package main
22

33
import (
4+
"encoding/json"
45
"fmt"
56
"log"
67
"net/http"
@@ -216,3 +217,179 @@ func apiEnvRemoveHandler(w http.ResponseWriter, r *http.Request) {
216217
utils.HTTPResponse(w, utils.JSONApplicationUTF8, http.StatusOK, env)
217218
incMetric(metricAPIEnvsOK)
218219
}
220+
221+
// POST Handler to perform actions (extend, expire) in enroll values
222+
func apiEnvEnrollActionsHandler(w http.ResponseWriter, r *http.Request) {
223+
incMetric(metricAPIQueriesReq)
224+
utils.DebugHTTPDump(r, settingsmgr.DebugHTTP(settings.ServiceAPI, settings.NoEnvironmentID), false)
225+
// Extract environment
226+
envVar := r.PathValue("env")
227+
if envVar == "" {
228+
apiErrorResponse(w, "error with environment", http.StatusInternalServerError, nil)
229+
incMetric(metricAPIQueriesErr)
230+
return
231+
}
232+
// Get environment
233+
env, err := envs.Get(envVar)
234+
if err != nil {
235+
apiErrorResponse(w, "error getting environment", http.StatusInternalServerError, nil)
236+
incMetric(metricAPIQueriesErr)
237+
return
238+
}
239+
// Get context data and check access
240+
ctx := r.Context().Value(contextKey(contextAPI)).(contextValue)
241+
if !apiUsers.CheckPermissions(ctx[ctxUser], users.AdminLevel, env.UUID) {
242+
apiErrorResponse(w, "no access", http.StatusForbidden, fmt.Errorf("attempt to use API by user %s", ctx[ctxUser]))
243+
incMetric(metricAPIQueriesErr)
244+
return
245+
}
246+
// Extract action
247+
actionVar := r.PathValue("action")
248+
if actionVar == "" {
249+
apiErrorResponse(w, "error getting action", http.StatusInternalServerError, nil)
250+
incMetric(metricAPIEnvsErr)
251+
return
252+
}
253+
var e types.ApiActionsRequest
254+
// Parse request JSON body
255+
if err := json.NewDecoder(r.Body).Decode(&e); err != nil {
256+
apiErrorResponse(w, "error parsing POST body", http.StatusInternalServerError, err)
257+
incMetric(metricAPIEnvsErr)
258+
return
259+
}
260+
var msgReturn string
261+
switch actionVar {
262+
case settings.ActionExtend:
263+
if err := envs.ExtendEnroll(env.UUID); err != nil {
264+
apiErrorResponse(w, "error extending enrollment", http.StatusInternalServerError, err)
265+
incMetric(metricAPIEnvsErr)
266+
return
267+
}
268+
msgReturn = "enrollment extended successfully"
269+
case settings.ActionExpire:
270+
if err := envs.ExpireEnroll(env.UUID); err != nil {
271+
apiErrorResponse(w, "error expiring enrollment", http.StatusInternalServerError, err)
272+
incMetric(metricAPIEnvsErr)
273+
return
274+
}
275+
case settings.ActionRotate:
276+
if err := envs.RotateEnroll(env.UUID); err != nil {
277+
apiErrorResponse(w, "error rotating enrollment", http.StatusInternalServerError, err)
278+
incMetric(metricAPIEnvsErr)
279+
return
280+
}
281+
msgReturn = "enrollment rotated successfully"
282+
case settings.ActionNotexpire:
283+
if err := envs.NotExpireEnroll(env.UUID); err != nil {
284+
apiErrorResponse(w, "error setting no expiration", http.StatusInternalServerError, err)
285+
incMetric(metricAPIEnvsErr)
286+
return
287+
}
288+
msgReturn = "enrollment set to not expire"
289+
case settings.SetMacPackage:
290+
if err := envs.UpdatePkgPackage(env.UUID, e.MacPkgURL); err != nil {
291+
apiErrorResponse(w, "error setting PKG", http.StatusInternalServerError, err)
292+
incMetric(metricAPIEnvsErr)
293+
return
294+
}
295+
msgReturn = "PKG updated successfully"
296+
case settings.SetMsiPackage:
297+
if err := envs.UpdateMsiPackage(env.UUID, e.MsiPkgURL); err != nil {
298+
apiErrorResponse(w, "error setting MSI", http.StatusInternalServerError, err)
299+
incMetric(metricAPIEnvsErr)
300+
return
301+
}
302+
msgReturn = "MSI updated successfully"
303+
case settings.SetDebPackage:
304+
if err := envs.UpdateDebPackage(env.UUID, e.DebPkgURL); err != nil {
305+
apiErrorResponse(w, "error setting DEB", http.StatusInternalServerError, err)
306+
incMetric(metricAPIEnvsErr)
307+
return
308+
}
309+
msgReturn = "DEB updated successfully"
310+
case settings.SetRpmPackage:
311+
if err := envs.UpdateRpmPackage(env.UUID, e.RpmPkgURL); err != nil {
312+
apiErrorResponse(w, "error setting RPM", http.StatusInternalServerError, err)
313+
incMetric(metricAPIEnvsErr)
314+
return
315+
}
316+
msgReturn = "RPM updated successfully"
317+
}
318+
// Return query name as serialized response
319+
utils.HTTPResponse(w, utils.JSONApplicationUTF8, http.StatusOK, types.ApiGenericResponse{Message: msgReturn})
320+
incMetric(metricAPIEnvsOK)
321+
}
322+
323+
// POST Handler to perform actions (extend, expire) in remove values
324+
func apiEnvRemoveActionsHandler(w http.ResponseWriter, r *http.Request) {
325+
incMetric(metricAPIQueriesReq)
326+
utils.DebugHTTPDump(r, settingsmgr.DebugHTTP(settings.ServiceAPI, settings.NoEnvironmentID), false)
327+
// Extract environment
328+
envVar := r.PathValue("env")
329+
if envVar == "" {
330+
apiErrorResponse(w, "error with environment", http.StatusInternalServerError, nil)
331+
incMetric(metricAPIQueriesErr)
332+
return
333+
}
334+
// Get environment
335+
env, err := envs.Get(envVar)
336+
if err != nil {
337+
apiErrorResponse(w, "error getting environment", http.StatusInternalServerError, nil)
338+
incMetric(metricAPIQueriesErr)
339+
return
340+
}
341+
// Get context data and check access
342+
ctx := r.Context().Value(contextKey(contextAPI)).(contextValue)
343+
if !apiUsers.CheckPermissions(ctx[ctxUser], users.AdminLevel, env.UUID) {
344+
apiErrorResponse(w, "no access", http.StatusForbidden, fmt.Errorf("attempt to use API by user %s", ctx[ctxUser]))
345+
incMetric(metricAPIQueriesErr)
346+
return
347+
}
348+
// Extract action
349+
actionVar := r.PathValue("action")
350+
if actionVar == "" {
351+
apiErrorResponse(w, "error getting action", http.StatusInternalServerError, nil)
352+
incMetric(metricAPIEnvsErr)
353+
return
354+
}
355+
var e types.ApiActionsRequest
356+
// Parse request JSON body
357+
if err := json.NewDecoder(r.Body).Decode(&e); err != nil {
358+
apiErrorResponse(w, "error parsing POST body", http.StatusInternalServerError, err)
359+
incMetric(metricAPIEnvsErr)
360+
return
361+
}
362+
var msgReturn string
363+
switch actionVar {
364+
case settings.ActionExtend:
365+
if err := envs.ExtendEnroll(env.UUID); err != nil {
366+
apiErrorResponse(w, "error extending remove", http.StatusInternalServerError, err)
367+
incMetric(metricAPIEnvsErr)
368+
return
369+
}
370+
msgReturn = "remove extended successfully"
371+
case settings.ActionExpire:
372+
if err := envs.ExpireEnroll(env.UUID); err != nil {
373+
apiErrorResponse(w, "error expiring remove", http.StatusInternalServerError, err)
374+
incMetric(metricAPIEnvsErr)
375+
return
376+
}
377+
case settings.ActionRotate:
378+
if err := envs.RotateEnroll(env.UUID); err != nil {
379+
apiErrorResponse(w, "error rotating remove", http.StatusInternalServerError, err)
380+
incMetric(metricAPIEnvsErr)
381+
return
382+
}
383+
msgReturn = "remove rotated successfully"
384+
case settings.ActionNotexpire:
385+
if err := envs.NotExpireEnroll(env.UUID); err != nil {
386+
apiErrorResponse(w, "error setting no remove", http.StatusInternalServerError, err)
387+
incMetric(metricAPIEnvsErr)
388+
return
389+
}
390+
msgReturn = "remove set to not expire"
391+
}
392+
// Return query name as serialized response
393+
utils.HTTPResponse(w, utils.JSONApplicationUTF8, http.StatusOK, types.ApiGenericResponse{Message: msgReturn})
394+
incMetric(metricAPIEnvsOK)
395+
}

api/main.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,9 @@ func osctrlAPIService() {
549549
// API: environments by environment
550550
muxAPI.Handle("GET "+_apiPath(apiEnvironmentsPath)+"/{env}", handlerAuthCheck(http.HandlerFunc(apiEnvironmentHandler)))
551551
muxAPI.Handle("GET "+_apiPath(apiEnvironmentsPath)+"/{env}/enroll/{target}", handlerAuthCheck(http.HandlerFunc(apiEnvEnrollHandler)))
552+
muxAPI.Handle("POST "+_apiPath(apiEnvironmentsPath)+"/{env}/enroll/{action}", handlerAuthCheck(http.HandlerFunc(apiEnvEnrollActionsHandler)))
552553
muxAPI.Handle("GET "+_apiPath(apiEnvironmentsPath)+"/{env}/remove/{target}", handlerAuthCheck(http.HandlerFunc(apiEnvironmentHandler)))
554+
muxAPI.Handle("POST "+_apiPath(apiEnvironmentsPath)+"/{env}/remove/{action}", handlerAuthCheck(http.HandlerFunc(apiEnvRemoveActionsHandler)))
553555
muxAPI.Handle("GET "+_apiPath(apiEnvironmentsPath), handlerAuthCheck(http.HandlerFunc(apiEnvironmentsHandler)))
554556
// API: tags
555557
muxAPI.Handle("GET "+_apiPath(apiTagsPath), handlerAuthCheck(http.HandlerFunc(apiTagsHandler)))

settings/settings.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,18 @@ const (
5959
ScriptRemove string = "remove"
6060
)
6161

62+
// Types of enroll/remove actions
63+
const (
64+
ActionExpire string = "expire"
65+
ActionExtend string = "extend"
66+
ActionRotate string = "rotate"
67+
ActionNotexpire string = "notexpire"
68+
SetMacPackage string = "set_pkg"
69+
SetMsiPackage string = "set_msi"
70+
SetDebPackage string = "set_deb"
71+
SetRpmPackage string = "set_rpm"
72+
)
73+
6274
// Types of package
6375
const (
6476
PackageDeb string = "deb"

types/types.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,12 @@ type ScriptRequest struct {
9797

9898
// ApiDistributedQueryRequest to receive query requests
9999
type ApiDistributedQueryRequest struct {
100-
UUIDs []string `json:"uuid_list"`
101-
Platforms []string `json:"platform_list"`
102-
Environments []string `json:"environment_list"`
103-
Hosts []string `json:"host_list"`
104-
Query string `json:"query"`
105-
Hidden bool `json:"hidden"`
100+
UUIDs []string `json:"uuid_list"`
101+
Platforms []string `json:"platform_list"`
102+
Environments []string `json:"environment_list"`
103+
Hosts []string `json:"host_list"`
104+
Query string `json:"query"`
105+
Hidden bool `json:"hidden"`
106106
}
107107

108108
// ApiDistributedCarveRequest to receive query requests
@@ -146,3 +146,12 @@ type ApiDataResponse struct {
146146
type ApiLoginResponse struct {
147147
Token string `json:"token"`
148148
}
149+
150+
// ApiActionsRequest to receive action requests
151+
type ApiActionsRequest struct {
152+
Certificate string `json:"certificate"`
153+
MacPkgURL string `json:"url_mac_pkg"`
154+
MsiPkgURL string `json:"url_msi_pkg"`
155+
RpmPkgURL string `json:"url_rpm_pkg"`
156+
DebPkgURL string `json:"url_deb_pkg"`
157+
}

0 commit comments

Comments
 (0)