diff --git a/admin/handlers/json-logs.go b/admin/handlers/json-logs.go
index 7565634b..14271b40 100644
--- a/admin/handlers/json-logs.go
+++ b/admin/handlers/json-logs.go
@@ -75,22 +75,29 @@ func (h *HandlersAdmin) JSONLogsHandler(w http.ResponseWriter, r *http.Request)
return
}
// Extract environment
- env, ok := vars["environment"]
+ envVar, ok := vars["environment"]
if !ok {
log.Println("environment is missing")
h.Inc(metricJSONErr)
return
}
+ // Get environment
+ env, err := h.Envs.Get(envVar)
+ if err != nil {
+ log.Printf("error getting environment %s - %v", envVar, err)
+ h.Inc(metricJSONErr)
+ return
+ }
// Check if environment is valid
- if !h.Envs.Exists(env) {
- log.Printf("error unknown environment (%s)", env)
+ if !h.Envs.Exists(envVar) {
+ log.Printf("error unknown environment (%s)", envVar)
h.Inc(metricJSONErr)
return
}
// Get context data
ctx := r.Context().Value(sessions.ContextKey("session")).(sessions.ContextValue)
// Check permissions
- if !h.Users.CheckPermissions(ctx[sessions.CtxUser], users.EnvLevel, env) {
+ if !h.Users.CheckPermissions(ctx[sessions.CtxUser], users.EnvLevel, env.Name) {
log.Printf("%s has insuficient permissions", ctx[sessions.CtxUser])
h.Inc(metricJSONErr)
return
@@ -116,7 +123,7 @@ func (h *HandlersAdmin) JSONLogsHandler(w http.ResponseWriter, r *http.Request)
// Get logs
logJSON := []LogJSON{}
if logType == "status" {
- statusLogs, err := h.LoggerDB.StatusLogs(UUID, env, secondsBack)
+ statusLogs, err := h.LoggerDB.StatusLogs(UUID, env.Name, secondsBack)
if err != nil {
log.Printf("error getting logs %v", err)
h.Inc(metricJSONErr)
@@ -136,7 +143,7 @@ func (h *HandlersAdmin) JSONLogsHandler(w http.ResponseWriter, r *http.Request)
logJSON = append(logJSON, _l)
}
} else if logType == "result" {
- resultLogs, err := h.LoggerDB.ResultLogs(UUID, env, secondsBack)
+ resultLogs, err := h.LoggerDB.ResultLogs(UUID, env.Name, secondsBack)
if err != nil {
log.Printf("error getting logs %v", err)
h.Inc(metricJSONErr)
diff --git a/admin/handlers/json-nodes.go b/admin/handlers/json-nodes.go
index 11142471..24a17786 100644
--- a/admin/handlers/json-nodes.go
+++ b/admin/handlers/json-nodes.go
@@ -45,22 +45,29 @@ func (h *HandlersAdmin) JSONEnvironmentHandler(w http.ResponseWriter, r *http.Re
utils.DebugHTTPDump(r, h.Settings.DebugHTTP(settings.ServiceAdmin), false)
vars := mux.Vars(r)
// Extract environment
- env, ok := vars["environment"]
+ envVar, ok := vars["environment"]
if !ok {
log.Println("error getting environment")
h.Inc(metricJSONErr)
return
}
// Check if environment is valid
- if !h.Envs.Exists(env) {
- log.Printf("error unknown environment (%s)", env)
+ if !h.Envs.Exists(envVar) {
+ log.Printf("error unknown environment (%s)", envVar)
+ h.Inc(metricJSONErr)
+ return
+ }
+ // Get environment
+ env, err := h.Envs.Get(envVar)
+ if err != nil {
+ log.Printf("error getting environment %s - %v", envVar, err)
h.Inc(metricJSONErr)
return
}
// Get context data
ctx := r.Context().Value(sessions.ContextKey("session")).(sessions.ContextValue)
// Check permissions
- if !h.Users.CheckPermissions(ctx[sessions.CtxUser], users.EnvLevel, env) {
+ if !h.Users.CheckPermissions(ctx[sessions.CtxUser], users.EnvLevel, env.Name) {
log.Printf("%s has insuficient permissions", ctx[sessions.CtxUser])
h.Inc(metricJSONErr)
return
@@ -78,7 +85,7 @@ func (h *HandlersAdmin) JSONEnvironmentHandler(w http.ResponseWriter, r *http.Re
h.Inc(metricJSONErr)
return
}
- nodes, err := h.Nodes.GetByEnv(env, target, h.Settings.InactiveHours())
+ nodes, err := h.Nodes.GetByEnv(env.Name, target, h.Settings.InactiveHours())
if err != nil {
log.Printf("error getting nodes %v", err)
h.Inc(metricJSONErr)
diff --git a/admin/handlers/post.go b/admin/handlers/post.go
index 8e5eb671..5a16d695 100644
--- a/admin/handlers/post.go
+++ b/admin/handlers/post.go
@@ -712,8 +712,16 @@ func (h *HandlersAdmin) IntervalsPOSTHandler(w http.ResponseWriter, r *http.Requ
utils.DebugHTTPDump(r, h.Settings.DebugHTTP(settings.ServiceAdmin), true)
vars := mux.Vars(r)
// Extract environment and verify
- environmentVar, ok := vars["environment"]
- if !ok || !h.Envs.Exists(environmentVar) {
+ envVar, ok := vars["environment"]
+ if !ok || !h.Envs.Exists(envVar) {
+ adminErrorResponse(w, "error getting environment", http.StatusInternalServerError, nil)
+ h.Inc(metricAdminErr)
+ return
+ }
+ // TODO do the exist and get in one step
+ // Get environment
+ env, err := h.Envs.Get(envVar)
+ if err != nil {
adminErrorResponse(w, "error getting environment", http.StatusInternalServerError, nil)
h.Inc(metricAdminErr)
return
@@ -722,7 +730,7 @@ func (h *HandlersAdmin) IntervalsPOSTHandler(w http.ResponseWriter, r *http.Requ
// Get context data
ctx := r.Context().Value(sessions.ContextKey("session")).(sessions.ContextValue)
// Check permissions
- if !h.Users.CheckPermissions(ctx[sessions.CtxUser], users.EnvLevel, environmentVar) {
+ if !h.Users.CheckPermissions(ctx[sessions.CtxUser], users.EnvLevel, env.Name) {
adminErrorResponse(w, fmt.Sprintf("%s has insuficient permissions", ctx[sessions.CtxUser]), http.StatusForbidden, nil)
h.Inc(metricAdminErr)
return
@@ -742,20 +750,20 @@ func (h *HandlersAdmin) IntervalsPOSTHandler(w http.ResponseWriter, r *http.Requ
h.Inc(metricAdminErr)
return
}
- if err := h.Envs.UpdateIntervals(environmentVar, c.ConfigInterval, c.LogInterval, c.QueryInterval); err != nil {
+ if err := h.Envs.UpdateIntervals(env.Name, c.ConfigInterval, c.LogInterval, c.QueryInterval); err != nil {
adminErrorResponse(w, "error updating intervals", http.StatusInternalServerError, err)
h.Inc(metricAdminErr)
return
}
// After updating interval, you need to re-generate flags
- flags, err := h.Envs.GenerateFlagsEnv(environmentVar, "", "")
+ flags, err := h.Envs.GenerateFlagsEnv(envVar, "", "")
if err != nil {
adminErrorResponse(w, "error re-generating flags", http.StatusInternalServerError, err)
h.Inc(metricAdminErr)
return
}
// Update flags in the newly created environment
- if err := h.Envs.UpdateFlags(environmentVar, flags); err != nil {
+ if err := h.Envs.UpdateFlags(envVar, flags); err != nil {
adminErrorResponse(w, "error updating flags", http.StatusInternalServerError, err)
h.Inc(metricAdminErr)
return
diff --git a/admin/handlers/templates.go b/admin/handlers/templates.go
index e3af148e..c60f566b 100644
--- a/admin/handlers/templates.go
+++ b/admin/handlers/templates.go
@@ -91,22 +91,29 @@ func (h *HandlersAdmin) EnvironmentHandler(w http.ResponseWriter, r *http.Reques
utils.DebugHTTPDump(r, h.Settings.DebugHTTP(settings.ServiceAdmin), false)
vars := mux.Vars(r)
// Extract environment
- env, ok := vars["environment"]
+ envVar, ok := vars["environment"]
if !ok {
h.Inc(metricAdminErr)
log.Println("error getting environment")
return
}
// Check if environment is valid
- if !h.Envs.Exists(env) {
+ if !h.Envs.Exists(envVar) {
h.Inc(metricAdminErr)
- log.Printf("error unknown environment (%s)", env)
+ log.Printf("error unknown environment (%s)", envVar)
+ return
+ }
+ // Get environment
+ env, err := h.Envs.Get(envVar)
+ if err != nil {
+ h.Inc(metricAdminErr)
+ log.Printf("error getting environment: %v", err)
return
}
// Get context data
ctx := r.Context().Value(sessions.ContextKey("session")).(sessions.ContextValue)
// Check permissions
- if !h.Users.CheckPermissions(ctx[sessions.CtxUser], users.EnvLevel, env) {
+ if !h.Users.CheckPermissions(ctx[sessions.CtxUser], users.EnvLevel, env.Name) {
log.Printf("%s has insuficient permissions", ctx[sessions.CtxUser])
h.Inc(metricTokenErr)
return
@@ -122,7 +129,6 @@ func (h *HandlersAdmin) EnvironmentHandler(w http.ResponseWriter, r *http.Reques
// Prepare template
tempateFiles := NewTemplateFiles(templatesFilesFolder, "table.html").filepaths
t, err := template.ParseFiles(tempateFiles...)
-
if err != nil {
h.Inc(metricAdminErr)
log.Printf("error getting table template: %v", err)
@@ -151,10 +157,10 @@ func (h *HandlersAdmin) EnvironmentHandler(w http.ResponseWriter, r *http.Reques
}
// Prepare template data
templateData := TableTemplateData{
- Title: "Nodes in " + env,
+ Title: "Nodes in " + env.Name,
Metadata: h.TemplateMetadata(ctx, h.ServiceVersion),
Selector: "environment",
- SelectorName: env,
+ SelectorName: env.Name,
Target: target,
Tags: tags,
Environments: h.allowedEnvironments(ctx[sessions.CtxUser], envAll),
@@ -743,7 +749,7 @@ func (h *HandlersAdmin) ConfGETHandler(w http.ResponseWriter, r *http.Request) {
}
// Prepare template data
templateData := ConfTemplateData{
- Title: envVar + " Configuration",
+ Title: env.Name + " Configuration",
Metadata: h.TemplateMetadata(ctx, h.ServiceVersion),
Environment: env,
Environments: h.allowedEnvironments(ctx[sessions.CtxUser], envAll),
@@ -821,9 +827,9 @@ func (h *HandlersAdmin) EnrollGETHandler(w http.ResponseWriter, r *http.Request)
shellQuickRemove, _ := environments.QuickRemoveOneLinerShell(env)
powershellQuickRemove, _ := environments.QuickRemoveOneLinerPowershell(env)
templateData := EnrollTemplateData{
- Title: envVar + " Enroll",
+ Title: env.Name + " Enroll",
Metadata: h.TemplateMetadata(ctx, h.ServiceVersion),
- EnvName: envVar,
+ EnvName: env.Name,
EnrollExpiry: strings.ToUpper(utils.InFutureTime(env.EnrollExpire)),
EnrollExpired: environments.IsItExpired(env.EnrollExpire),
RemoveExpiry: strings.ToUpper(utils.InFutureTime(env.RemoveExpire)),
diff --git a/admin/static/js/stats.js b/admin/static/js/stats.js
index 61f95f5f..194cd6a1 100644
--- a/admin/static/js/stats.js
+++ b/admin/static/js/stats.js
@@ -1,18 +1,15 @@
-function statsRefresh(_target, _name) {
+function statsRefresh(_target, _identifier) {
$.ajax({
- url: '/json/stats/' + _target + '/' + _name,
+ url: '/json/stats/' + _target + '/' + _identifier,
dataType: 'json',
type: 'GET',
contentType: 'application/json',
- success: function(data, textStatus, jQxhr){
- $('.stats-' + _target + '-' + _name + '-active').text(data.active);
- $('.stats-' + _target + '-' + _name + '-inactive').text(data.inactive);
- $('.stats-' + _target + '-' + _name + '-total').text(data.total);
- //console.log('Active: ' + data.active);
- //console.log('Inactive: ' + data.inactive);
- //console.log('Total: ' + data.total);
+ success: function (data, textStatus, jQxhr) {
+ $('.stats-' + _target + '-' + _identifier + '-active').text(data.active);
+ $('.stats-' + _target + '-' + _identifier + '-inactive').text(data.inactive);
+ $('.stats-' + _target + '-' + _identifier + '-total').text(data.total);
},
- error: function(jqXhr, textStatus, errorThrown){
+ error: function (jqXhr, textStatus, errorThrown) {
var _clientmsg = 'Client: ' + errorThrown;
var _serverJSON = $.parseJSON(jqXhr.responseText);
var _servermsg = 'Server: ' + _serverJSON.message;
@@ -25,9 +22,8 @@ function statsRefresh(_target, _name) {
function beginStats() {
var _stats = ['environment', 'platform'];
- for (var i = 0; i<_stats.length; i++) {
- //console.log('Doing ' + _stats[i]);
- $('input[type="hidden"].stats-' + _stats[i] + '-value').each(function() {
+ for (var i = 0; i < _stats.length; i++) {
+ $('input[type="hidden"].stats-' + _stats[i] + '-value').each(function () {
statsRefresh(_stats[i], $(this).val());
});
}
diff --git a/admin/templates/components/page-aside-left.html b/admin/templates/components/page-aside-left.html
index 64804cca..5a557b35 100644
--- a/admin/templates/components/page-aside-left.html
+++ b/admin/templates/components/page-aside-left.html
@@ -17,39 +17,39 @@
-
+
{{ $e.Name }}
- X
+ X
-
-
+
active
- X
+ X
-
-
+
inactive
- X
+ X
-
-
+
all
- X
+ X
-
-
+
osquery conf
-
-
+
enroll nodes
diff --git a/environments/environments.go b/environments/environments.go
index 815fc948..f824d0f1 100644
--- a/environments/environments.go
+++ b/environments/environments.go
@@ -119,13 +119,13 @@ func (environment *Environment) Empty(name, hostname string) TLSEnvironment {
Type: DefaultEnvironmentType,
DebugHTTP: false,
Icon: DefaultEnvironmentIcon,
- Flags: "",
- Options: "",
- Schedule: "",
- Packs: "",
- Decorators: "",
- ATC: "",
- Configuration: "",
+ Flags: "{}",
+ Options: "{}",
+ Schedule: "{}",
+ Packs: "{}",
+ Decorators: "{}",
+ ATC: "{}",
+ Configuration: "{}",
Certificate: "",
ConfigTLS: true,
ConfigInterval: DefaultConfigInterval,
@@ -237,56 +237,56 @@ func (environment *Environment) Update(e TLSEnvironment) error {
}
// UpdateOptions to update options for an environment
-func (environment *Environment) UpdateOptions(name, options string) error {
- if err := environment.DB.Model(&TLSEnvironment{}).Where("name = ?", name).Update("options", options).Error; err != nil {
+func (environment *Environment) UpdateOptions(idEnv, options string) error {
+ if err := environment.DB.Model(&TLSEnvironment{}).Where("name = ? OR uuid = ?", idEnv, idEnv).Update("options", options).Error; err != nil {
return fmt.Errorf("Update options %v", err)
}
return nil
}
// UpdateSchedule to update schedule for an environment
-func (environment *Environment) UpdateSchedule(name, schedule string) error {
- if err := environment.DB.Model(&TLSEnvironment{}).Where("name = ?", name).Update("schedule", schedule).Error; err != nil {
+func (environment *Environment) UpdateSchedule(idEnv, schedule string) error {
+ if err := environment.DB.Model(&TLSEnvironment{}).Where("name = ? OR uuid = ?", idEnv, idEnv).Update("schedule", schedule).Error; err != nil {
return fmt.Errorf("Update schedule %v", err)
}
return nil
}
// UpdatePacks to update packs for an environment
-func (environment *Environment) UpdatePacks(name, packs string) error {
- if err := environment.DB.Model(&TLSEnvironment{}).Where("name = ?", name).Update("packs", packs).Error; err != nil {
+func (environment *Environment) UpdatePacks(idEnv, packs string) error {
+ if err := environment.DB.Model(&TLSEnvironment{}).Where("name = ? OR uuid = ?", idEnv, idEnv).Update("packs", packs).Error; err != nil {
return fmt.Errorf("Update packs %v", err)
}
return nil
}
// UpdateDecorators to update decorators for an environment
-func (environment *Environment) UpdateDecorators(name, decorators string) error {
- if err := environment.DB.Model(&TLSEnvironment{}).Where("name = ?", name).Update("decorators", decorators).Error; err != nil {
+func (environment *Environment) UpdateDecorators(idEnv, decorators string) error {
+ if err := environment.DB.Model(&TLSEnvironment{}).Where("name = ? OR uuid = ?", idEnv, idEnv).Update("decorators", decorators).Error; err != nil {
return fmt.Errorf("Update decorators %v", err)
}
return nil
}
// UpdateATC to update ATC for an environment
-func (environment *Environment) UpdateATC(name, atc string) error {
- if err := environment.DB.Model(&TLSEnvironment{}).Where("name = ?", name).Update("atc", atc).Error; err != nil {
+func (environment *Environment) UpdateATC(idEnv, atc string) error {
+ if err := environment.DB.Model(&TLSEnvironment{}).Where("name = ? OR uuid = ?", idEnv, idEnv).Update("atc", atc).Error; err != nil {
return fmt.Errorf("Update ATC %v", err)
}
return nil
}
// UpdateCertificate to update decorators for an environment
-func (environment *Environment) UpdateCertificate(name, certificate string) error {
- if err := environment.DB.Model(&TLSEnvironment{}).Where("name = ?", name).Update("certificate", certificate).Error; err != nil {
+func (environment *Environment) UpdateCertificate(idEnv, certificate string) error {
+ if err := environment.DB.Model(&TLSEnvironment{}).Where("name = ? OR uuid = ?", idEnv, idEnv).Update("certificate", certificate).Error; err != nil {
return fmt.Errorf("Update %v", err)
}
return nil
}
// UpdateFlags to update flags for an environment
-func (environment *Environment) UpdateFlags(name, flags string) error {
- if err := environment.DB.Model(&TLSEnvironment{}).Where("name = ?", name).Update("flags", flags).Error; err != nil {
+func (environment *Environment) UpdateFlags(idEnv, flags string) error {
+ if err := environment.DB.Model(&TLSEnvironment{}).Where("name = ? OR uuid = ?", idEnv, idEnv).Update("flags", flags).Error; err != nil {
return fmt.Errorf("Update %v", err)
}
return nil
@@ -384,8 +384,8 @@ func (environment *Environment) RotateRemove(name string) error {
}
// ExpireRemove to expire the remove in an environment
-func (environment *Environment) ExpireRemove(name string) error {
- if err := environment.DB.Model(&TLSEnvironment{}).Where("name = ?", name).Update("remove_expire", time.Now()).Error; err != nil {
+func (environment *Environment) ExpireRemove(idEnv string) error {
+ if err := environment.DB.Model(&TLSEnvironment{}).Where("name = ? OR uuid = ?", idEnv, idEnv).Update("remove_expire", time.Now()).Error; err != nil {
return fmt.Errorf("Update %v", err)
}
return nil
@@ -401,8 +401,8 @@ func (environment *Environment) DebugHTTP(name string) bool {
}
// ChangeDebugHTTP to change the value of DebugHTTP for an environment
-func (environment *Environment) ChangeDebugHTTP(name string, value bool) error {
- if err := environment.DB.Model(&TLSEnvironment{}).Where("name = ?", name).Updates(map[string]interface{}{"debug_http": value}).Error; err != nil {
+func (environment *Environment) ChangeDebugHTTP(idEnv string, value bool) error {
+ if err := environment.DB.Model(&TLSEnvironment{}).Where("name = ? OR uuid = ?", idEnv, idEnv).Updates(map[string]interface{}{"debug_http": value}).Error; err != nil {
return fmt.Errorf("Updates %v", err)
}
return nil
diff --git a/environments/flags.go b/environments/flags.go
index 690c3d7f..7679f09e 100644
--- a/environments/flags.go
+++ b/environments/flags.go
@@ -15,25 +15,25 @@ const (
--force=true
--utc=true
--enroll_secret_path={{ .SecretFile }}
---enroll_tls_endpoint=/{{ .Environment.Name }}/{{ .Environment.EnrollPath }}
+--enroll_tls_endpoint=/{{ .Environment.UUID }}/{{ .Environment.EnrollPath }}
--config_plugin=tls
---config_tls_endpoint=/{{ .Environment.Name }}/{{ .Environment.ConfigPath }}
+--config_tls_endpoint=/{{ .Environment.UUID }}/{{ .Environment.ConfigPath }}
--config_tls_refresh={{ .Environment.ConfigInterval }}
--config_tls_max_attempts=5
--logger_plugin=tls
--logger_tls_compress=true
---logger_tls_endpoint=/{{ .Environment.Name }}/{{ .Environment.LogPath }}
+--logger_tls_endpoint=/{{ .Environment.UUID }}/{{ .Environment.LogPath }}
--logger_tls_period={{ .Environment.LogInterval }}
--disable_carver=false
--carver_disable_function=false
---carver_start_endpoint=/{{ .Environment.Name }}/{{ .Environment.CarverInitPath }}
---carver_continue_endpoint=/{{ .Environment.Name }}/{{ .Environment.CarverBlockPath }}
+--carver_start_endpoint=/{{ .Environment.UUID }}/{{ .Environment.CarverInitPath }}
+--carver_continue_endpoint=/{{ .Environment.UUID }}/{{ .Environment.CarverBlockPath }}
--disable_distributed=false
--distributed_interval={{ .Environment.QueryInterval }}
--distributed_plugin=tls
--distributed_tls_max_attempts=5
---distributed_tls_read_endpoint=/{{ .Environment.Name }}/{{ .Environment.QueryReadPath }}
---distributed_tls_write_endpoint=/{{ .Environment.Name }}/{{ .Environment.QueryWritePath }}
+--distributed_tls_read_endpoint=/{{ .Environment.UUID }}/{{ .Environment.QueryReadPath }}
+--distributed_tls_write_endpoint=/{{ .Environment.UUID }}/{{ .Environment.QueryWritePath }}
--tls_hostname={{ .Environment.Hostname }}
{{ .FlagServerCerts }}
`
@@ -104,8 +104,8 @@ func GenerateFlags(env TLSEnvironment, secretPath, certPath string) (string, err
}
// GenerateFlagsEnv to generate flags by environment name
-func (environment *Environment) GenerateFlagsEnv(name string, secretPath, certPath string) (string, error) {
- env, err := environment.Get(name)
+func (environment *Environment) GenerateFlagsEnv(idEnv string, secretPath, certPath string) (string, error) {
+ env, err := environment.Get(idEnv)
if err != nil {
return "", fmt.Errorf("error getting environment %v", err)
}
diff --git a/environments/oneliners.go b/environments/oneliners.go
index 2087eee3..f07c1dc2 100644
--- a/environments/oneliners.go
+++ b/environments/oneliners.go
@@ -60,7 +60,7 @@ func PrepareOneLiner(oneliner string, environment TLSEnvironment, target string)
InsecureTLS string
}{
TLSHost: environment.Hostname,
- Environment: environment.Name,
+ Environment: environment.UUID,
SecretPath: secretPath,
InsecureTLS: insecureTLS,
}
diff --git a/environments/osqueryconf.go b/environments/osqueryconf.go
index 08d7cf27..06d99028 100644
--- a/environments/osqueryconf.go
+++ b/environments/osqueryconf.go
@@ -65,8 +65,8 @@ type DecoratorConf struct {
type ATCConf map[string]interface{}
// RefreshConfiguration to take all parts and put them together in the configuration
-func (environment *Environment) RefreshConfiguration(name string) error {
- env, err := environment.Get(name)
+func (environment *Environment) RefreshConfiguration(idEnv string) error {
+ env, err := environment.Get(idEnv)
if err != nil {
return fmt.Errorf("error structuring environment %v", err)
}
@@ -108,12 +108,12 @@ func (environment *Environment) RefreshConfiguration(name string) error {
}
// UpdateConfiguration to update configuration for an environment
-func (environment *Environment) UpdateConfiguration(name string, cnf OsqueryConf) error {
+func (environment *Environment) UpdateConfiguration(idEnv string, cnf OsqueryConf) error {
indentedConf, err := environment.GenSerializedConf(cnf, true)
if err != nil {
return fmt.Errorf("error serializing configuration %v", err)
}
- if err := environment.DB.Model(&TLSEnvironment{}).Where("name = ?", name).Update("configuration", indentedConf).Error; err != nil {
+ if err := environment.DB.Model(&TLSEnvironment{}).Where("name = ? OR uuid = ?", idEnv, idEnv).Update("configuration", indentedConf).Error; err != nil {
return fmt.Errorf("Update configuration %v", err)
}
return nil
diff --git a/tls/handlers/handlers.go b/tls/handlers/handlers.go
index 24493b6a..e726350c 100644
--- a/tls/handlers/handlers.go
+++ b/tls/handlers/handlers.go
@@ -167,20 +167,28 @@ func (h *HandlersTLS) EnrollHandler(w http.ResponseWriter, r *http.Request) {
h.Inc(metricEnrollReq)
// Retrieve environment variable
vars := mux.Vars(r)
- env, ok := vars["environment"]
+ envVar, ok := vars["environment"]
if !ok {
h.Inc(metricEnrollErr)
log.Println("Environment is missing")
return
}
// Check if environment is valid
- if !h.Envs.Exists(env) {
+ if !h.Envs.Exists(envVar) {
h.Inc(metricEnrollErr)
- log.Printf("error unknown environment (%s)", env)
+ log.Printf("error unknown environment (%s)", envVar)
+ return
+ }
+ // TODO do the exist and get in one step
+ // Get environment
+ env, err := h.Envs.Get(envVar)
+ if err != nil {
+ h.Inc(metricEnrollErr)
+ log.Printf("error getting environment %v", err)
return
}
// Debug HTTP for environment
- utils.DebugHTTPDump(r, (*h.EnvsMap)[env].DebugHTTP, true)
+ utils.DebugHTTPDump(r, (*h.EnvsMap)[env.Name].DebugHTTP, true)
// Decode read POST body
var t types.EnrollRequest
if err := json.NewDecoder(r.Body).Decode(&t); err != nil {
@@ -192,12 +200,12 @@ func (h *HandlersTLS) EnrollHandler(w http.ResponseWriter, r *http.Request) {
var nodeKey string
var newNode nodes.OsqueryNode
nodeInvalid := true
- if h.checkValidSecret(t.EnrollSecret, env) {
+ if h.checkValidSecret(t.EnrollSecret, env.Name) {
// Generate node_key using UUID as entropy
nodeKey = generateNodeKey(t.HostIdentifier, time.Now())
- newNode = nodeFromEnroll(t, env, r.Header.Get("X-Real-IP"), nodeKey)
+ newNode = nodeFromEnroll(t, env.Name, r.Header.Get("X-Real-IP"), nodeKey)
// Check if UUID exists already, if so archive node and enroll new node
- if h.Nodes.CheckByUUIDEnv(t.HostIdentifier, env) {
+ if h.Nodes.CheckByUUIDEnv(t.HostIdentifier, env.Name) {
if err := h.Nodes.Archive(t.HostIdentifier, "exists"); err != nil {
h.Inc(metricEnrollErr)
log.Printf("error archiving node %v", err)
@@ -215,7 +223,7 @@ func (h *HandlersTLS) EnrollHandler(w http.ResponseWriter, r *http.Request) {
log.Printf("error creating node %v", err)
} else {
nodeInvalid = false
- if err := h.Tags.TagNode(env, newNode); err != nil {
+ if err := h.Tags.TagNode(env.Name, newNode); err != nil {
h.Inc(metricEnrollErr)
log.Printf("error tagging node %v", err)
}
@@ -227,7 +235,7 @@ func (h *HandlersTLS) EnrollHandler(w http.ResponseWriter, r *http.Request) {
}
response := types.EnrollResponse{NodeKey: nodeKey, NodeInvalid: nodeInvalid}
// Debug HTTP
- if (*h.EnvsMap)[env].DebugHTTP {
+ if (*h.EnvsMap)[env.Name].DebugHTTP {
log.Printf("Response: %+v", response)
}
// Serialize and send response
@@ -241,27 +249,28 @@ func (h *HandlersTLS) ConfigHandler(w http.ResponseWriter, r *http.Request) {
var response interface{}
// Retrieve environment variable
vars := mux.Vars(r)
- env, ok := vars["environment"]
+ envVar, ok := vars["environment"]
if !ok {
h.Inc(metricConfigErr)
log.Println("Environment is missing")
return
}
// Check if environment is valid
- if !h.Envs.Exists(env) {
+ if !h.Envs.Exists(envVar) {
h.Inc(metricConfigErr)
- log.Printf("error unknown environment (%s)", env)
+ log.Printf("error unknown environment (%s)", envVar)
return
}
- // Debug HTTP for environment
- utils.DebugHTTPDump(r, (*h.EnvsMap)[env].DebugHTTP, true)
+ // TODO do the exist and get in one step
// Get environment
- e, err := h.Envs.Get(env)
+ env, err := h.Envs.Get(envVar)
if err != nil {
- h.Inc(metricConfigErr)
+ h.Inc(metricEnrollErr)
log.Printf("error getting environment %v", err)
return
}
+ // Debug HTTP for environment
+ utils.DebugHTTPDump(r, (*h.EnvsMap)[env.Name].DebugHTTP, true)
// Decode read POST body
var t types.ConfigRequest
err = json.NewDecoder(r.Body).Decode(&t)
@@ -283,12 +292,12 @@ func (h *HandlersTLS) ConfigHandler(w http.ResponseWriter, r *http.Request) {
h.Inc(metricConfigErr)
log.Printf("error refreshing last config %v", err)
}
- response = []byte(e.Configuration)
+ response = []byte(env.Configuration)
} else {
response = types.ConfigResponse{NodeInvalid: true}
}
// Debug HTTP
- if (*h.EnvsMap)[env].DebugHTTP {
+ if (*h.EnvsMap)[env.Name].DebugHTTP {
if x, ok := response.([]byte); ok {
log.Printf("Configuration: %s", string(x))
} else {
@@ -305,20 +314,27 @@ func (h *HandlersTLS) LogHandler(w http.ResponseWriter, r *http.Request) {
h.Inc(metricLogReq)
// Retrieve environment variable
vars := mux.Vars(r)
- env, ok := vars["environment"]
+ envVar, ok := vars["environment"]
if !ok {
h.Inc(metricLogErr)
log.Println("Environment is missing")
return
}
// Check if environment is valid
- if !h.Envs.Exists(env) {
+ if !h.Envs.Exists(envVar) {
h.Inc(metricLogErr)
- log.Printf("error unknown environment (%s)", env)
+ log.Printf("error unknown environment (%s)", envVar)
+ return
+ }
+ // TODO do the exist and get in one step
+ // Get environment
+ env, err := h.Envs.Get(envVar)
+ if err != nil {
+ h.Inc(metricEnrollErr)
+ log.Printf("error getting environment %v", err)
return
}
// Check if body is compressed, if so, uncompress
- var err error
if r.Header.Get("Content-Encoding") == "gzip" {
r.Body, err = gzip.NewReader(r.Body)
if err != nil {
@@ -334,7 +350,7 @@ func (h *HandlersTLS) LogHandler(w http.ResponseWriter, r *http.Request) {
}()
}
// Debug HTTP here so the body will be uncompressed
- utils.DebugHTTPDump(r, (*h.EnvsMap)[env].DebugHTTP, true)
+ utils.DebugHTTPDump(r, (*h.EnvsMap)[env.Name].DebugHTTP, true)
// Extract POST body and decode JSON
var t types.LogRequest
err = json.NewDecoder(r.Body).Decode(&t)
@@ -355,14 +371,14 @@ func (h *HandlersTLS) LogHandler(w http.ResponseWriter, r *http.Request) {
if h.Nodes.CheckByKey(t.NodeKey) {
nodeInvalid = false
// Process logs and update metadata
- h.Logs.ProcessLogs(t.Data, t.LogType, env, r.Header.Get("X-Real-IP"), (*h.EnvsMap)[env].DebugHTTP)
+ h.Logs.ProcessLogs(t.Data, t.LogType, env.Name, r.Header.Get("X-Real-IP"), (*h.EnvsMap)[env.Name].DebugHTTP)
} else {
nodeInvalid = true
}
// Prepare response
response := types.LogResponse{NodeInvalid: nodeInvalid}
// Debug
- if (*h.EnvsMap)[env].DebugHTTP {
+ if (*h.EnvsMap)[env.Name].DebugHTTP {
log.Printf("Response: %+v", response)
}
// Serialize and send response
@@ -375,20 +391,28 @@ func (h *HandlersTLS) QueryReadHandler(w http.ResponseWriter, r *http.Request) {
h.Inc(metricReadReq)
// Retrieve environment variable
vars := mux.Vars(r)
- env, ok := vars["environment"]
+ envVar, ok := vars["environment"]
if !ok {
h.Inc(metricReadErr)
log.Println("Environment is missing")
return
}
// Check if environment is valid
- if !h.Envs.Exists(env) {
+ if !h.Envs.Exists(envVar) {
h.Inc(metricReadErr)
- log.Printf("error unknown environment (%s)", env)
+ log.Printf("error unknown environment (%s)", envVar)
+ return
+ }
+ // TODO do the exist and get in one step
+ // Get environment
+ env, err := h.Envs.Get(envVar)
+ if err != nil {
+ h.Inc(metricEnrollErr)
+ log.Printf("error getting environment %v", err)
return
}
// Debug HTTP
- utils.DebugHTTPDump(r, (*h.EnvsMap)[env].DebugHTTP, true)
+ utils.DebugHTTPDump(r, (*h.EnvsMap)[env.Name].DebugHTTP, true)
// Decode read POST body
var t types.QueryReadRequest
if err := json.NewDecoder(r.Body).Decode(&t); err != nil {
@@ -431,7 +455,7 @@ func (h *HandlersTLS) QueryReadHandler(w http.ResponseWriter, r *http.Request) {
response = types.QueryReadResponse{Queries: qs, NodeInvalid: nodeInvalid}
}
// Debug HTTP
- if (*h.EnvsMap)[env].DebugHTTP {
+ if (*h.EnvsMap)[env.Name].DebugHTTP {
log.Printf("Response: %+v", response)
}
// Serialize and send response
@@ -444,20 +468,28 @@ func (h *HandlersTLS) QueryWriteHandler(w http.ResponseWriter, r *http.Request)
h.Inc(metricWriteReq)
// Retrieve environment variable
vars := mux.Vars(r)
- env, ok := vars["environment"]
+ envVar, ok := vars["environment"]
if !ok {
h.Inc(metricWriteErr)
log.Println("Environment is missing")
return
}
// Check if environment is valid
- if !h.Envs.Exists(env) {
+ if !h.Envs.Exists(envVar) {
h.Inc(metricWriteErr)
- log.Printf("error unknown environment (%s)", env)
+ log.Printf("error unknown environment (%s)", envVar)
+ return
+ }
+ // TODO do the exist and get in one step
+ // Get environment
+ env, err := h.Envs.Get(envVar)
+ if err != nil {
+ h.Inc(metricEnrollErr)
+ log.Printf("error getting environment %v", err)
return
}
// Debug HTTP
- utils.DebugHTTPDump(r, (*h.EnvsMap)[env].DebugHTTP, true)
+ utils.DebugHTTPDump(r, (*h.EnvsMap)[env.Name].DebugHTTP, true)
// Decode read POST body
var t types.QueryWriteRequest
if err := json.NewDecoder(r.Body).Decode(&t); err != nil {
@@ -474,14 +506,14 @@ func (h *HandlersTLS) QueryWriteHandler(w http.ResponseWriter, r *http.Request)
}
nodeInvalid = false
// Process submitted results
- go h.Logs.ProcessLogQueryResult(t.Queries, t.Statuses, t.NodeKey, env, (*h.EnvsMap)[env].DebugHTTP)
+ go h.Logs.ProcessLogQueryResult(t.Queries, t.Statuses, t.NodeKey, env.Name, (*h.EnvsMap)[env.Name].DebugHTTP)
} else {
nodeInvalid = true
}
// Prepare response
response := types.QueryWriteResponse{NodeInvalid: nodeInvalid}
// Debug HTTP
- if (*h.EnvsMap)[env].DebugHTTP {
+ if (*h.EnvsMap)[env.Name].DebugHTTP {
log.Printf("Response: %+v", response)
}
// Send response
@@ -494,26 +526,28 @@ func (h *HandlersTLS) QuickEnrollHandler(w http.ResponseWriter, r *http.Request)
h.Inc(metricOnelinerReq)
// Retrieve environment variable
vars := mux.Vars(r)
- env, ok := vars["environment"]
+ envVar, ok := vars["environment"]
if !ok {
h.Inc(metricOnelinerErr)
log.Println("Environment is missing")
return
}
// Check if environment is valid
- if !h.Envs.Exists(env) {
+ if !h.Envs.Exists(envVar) {
h.Inc(metricOnelinerErr)
- log.Printf("error unknown environment (%s)", env)
+ log.Printf("error unknown environment (%s)", envVar)
return
}
- // Debug HTTP
- utils.DebugHTTPDump(r, (*h.EnvsMap)[env].DebugHTTP, true)
- e, err := h.Envs.Get(env)
+ // TODO do the exist and get in one step
+ // Get environment
+ env, err := h.Envs.Get(envVar)
if err != nil {
- h.Inc(metricOnelinerErr)
+ h.Inc(metricEnrollErr)
log.Printf("error getting environment %v", err)
return
}
+ // Debug HTTP
+ utils.DebugHTTPDump(r, (*h.EnvsMap)[env.Name].DebugHTTP, true)
// Retrieve type of script
script, ok := vars["script"]
if !ok {
@@ -530,20 +564,20 @@ func (h *HandlersTLS) QuickEnrollHandler(w http.ResponseWriter, r *http.Request)
}
// Check if provided SecretPath is valid and is not expired
if strings.HasPrefix(script, "enroll") {
- if !h.checkValidEnrollSecretPath(env, secretPath) {
+ if !h.checkValidEnrollSecretPath(env.Name, secretPath) {
h.Inc(metricOnelinerErr)
log.Println("Invalid secret path for enrolling")
return
}
} else if strings.HasPrefix(script, "remove") {
- if !h.checkValidRemoveSecretPath(env, secretPath) {
+ if !h.checkValidRemoveSecretPath(env.Name, secretPath) {
h.Inc(metricOnelinerErr)
log.Println("Invalid secret path for removing")
return
}
}
// Prepare response with the script
- quickScript, err := environments.QuickAddScript("osctrl-"+e.Name, script, e)
+ quickScript, err := environments.QuickAddScript("osctrl-"+env.Name, script, env)
if err != nil {
h.Inc(metricOnelinerErr)
log.Printf("error getting script %v", err)
@@ -561,20 +595,28 @@ func (h *HandlersTLS) CarveInitHandler(w http.ResponseWriter, r *http.Request) {
h.Inc(metricInitReq)
// Retrieve environment variable
vars := mux.Vars(r)
- env, ok := vars["environment"]
+ envVar, ok := vars["environment"]
if !ok {
h.Inc(metricInitErr)
log.Println("Environment is missing")
return
}
// Check if environment is valid
- if !h.Envs.Exists(env) {
+ if !h.Envs.Exists(envVar) {
h.Inc(metricInitErr)
- log.Printf("error unknown environment (%s)", env)
+ log.Printf("error unknown environment (%s)", envVar)
+ return
+ }
+ // TODO do the exist and get in one step
+ // Get environment
+ env, err := h.Envs.Get(envVar)
+ if err != nil {
+ h.Inc(metricEnrollErr)
+ log.Printf("error getting environment %v", err)
return
}
// Debug HTTP
- utils.DebugHTTPDump(r, (*h.EnvsMap)[env].DebugHTTP, true)
+ utils.DebugHTTPDump(r, (*h.EnvsMap)[env.Name].DebugHTTP, true)
// Decode read POST body
var t types.CarveInitRequest
if err := json.NewDecoder(r.Body).Decode(&t); err != nil {
@@ -593,7 +635,7 @@ func (h *HandlersTLS) CarveInitHandler(w http.ResponseWriter, r *http.Request) {
initCarve = true
carveSessionID = generateCarveSessionID()
// Process carve init
- if err := h.ProcessCarveInit(t, carveSessionID, env); err != nil {
+ if err := h.ProcessCarveInit(t, carveSessionID, env.Name); err != nil {
h.Inc(metricInitErr)
log.Printf("error procesing carve init %v", err)
initCarve = false
@@ -602,7 +644,7 @@ func (h *HandlersTLS) CarveInitHandler(w http.ResponseWriter, r *http.Request) {
// Prepare response
response := types.CarveInitResponse{Success: initCarve, SessionID: carveSessionID}
// Debug HTTP
- if (*h.EnvsMap)[env].DebugHTTP {
+ if (*h.EnvsMap)[env.Name].DebugHTTP {
log.Printf("Response: %+v", response)
}
// Send response
@@ -615,20 +657,28 @@ func (h *HandlersTLS) CarveBlockHandler(w http.ResponseWriter, r *http.Request)
h.Inc(metricBlockReq)
// Retrieve environment variable
vars := mux.Vars(r)
- env, ok := vars["environment"]
+ envVar, ok := vars["environment"]
if !ok {
h.Inc(metricBlockErr)
log.Println("Environment is missing")
return
}
// Check if environment is valid
- if !h.Envs.Exists(env) {
+ if !h.Envs.Exists(envVar) {
h.Inc(metricBlockErr)
- log.Printf("error unknown environment (%s)", env)
+ log.Printf("error unknown environment (%s)", envVar)
+ return
+ }
+ // TODO do the exist and get in one step
+ // Get environment
+ env, err := h.Envs.Get(envVar)
+ if err != nil {
+ h.Inc(metricEnrollErr)
+ log.Printf("error getting environment %v", err)
return
}
// Debug HTTP
- utils.DebugHTTPDump(r, (*h.EnvsMap)[env].DebugHTTP, true)
+ utils.DebugHTTPDump(r, (*h.EnvsMap)[env.Name].DebugHTTP, true)
// Decode read POST body
var t types.CarveBlockRequest
if err := json.NewDecoder(r.Body).Decode(&t); err != nil {
@@ -641,11 +691,11 @@ func (h *HandlersTLS) CarveBlockHandler(w http.ResponseWriter, r *http.Request)
if h.Carves.CheckCarve(t.SessionID, t.RequestID) {
blockCarve = true
// Process received block
- go h.ProcessCarveBlock(t, env)
+ go h.ProcessCarveBlock(t, env.Name)
}
// Prepare response
response := types.CarveBlockResponse{Success: blockCarve}
- if (*h.EnvsMap)[env].DebugHTTP {
+ if (*h.EnvsMap)[env.Name].DebugHTTP {
log.Printf("Response: %+v", response)
}
// Send response