diff --git a/changes/issue-1629-centos b/changes/issue-1629-centos new file mode 100644 index 0000000000..dc74e6b125 --- /dev/null +++ b/changes/issue-1629-centos @@ -0,0 +1 @@ +* Improve detection of CentOS in label membership. diff --git a/server/datastore/mysql/labels.go b/server/datastore/mysql/labels.go index cdb40d13ee..6dedf096f3 100644 --- a/server/datastore/mysql/labels.go +++ b/server/datastore/mysql/labels.go @@ -265,9 +265,20 @@ func (d *Datastore) ListLabels(filter fleet.TeamFilter, opt fleet.ListOptions) ( return labels, nil } +func platformForHost(host *fleet.Host) string { + if host.Platform != "rhel" { + return host.Platform + } + if strings.Contains(strings.ToLower(host.OSVersion), "centos") { + return "centos" + } + return host.Platform +} + func (d *Datastore) LabelQueriesForHost(host *fleet.Host, cutoff time.Time) (map[string]string, error) { var rows *sql.Rows var err error + platform := platformForHost(host) if host.LabelUpdatedAt.Before(cutoff) { // Retrieve all labels (with matching platform) for this host sql := ` @@ -276,7 +287,7 @@ func (d *Datastore) LabelQueriesForHost(host *fleet.Host, cutoff time.Time) (map WHERE platform = ? OR platform = '' AND label_membership_type = ? ` - rows, err = d.db.Query(sql, host.Platform, fleet.LabelMembershipTypeDynamic) + rows, err = d.db.Query(sql, platform, fleet.LabelMembershipTypeDynamic) } else { // Retrieve all labels (with matching platform) iff there is a label // that has been created since this host last reported label query @@ -290,9 +301,9 @@ func (d *Datastore) LabelQueriesForHost(host *fleet.Host, cutoff time.Time) (map ` rows, err = d.db.Query( sql, - host.Platform, + platform, host.LabelUpdatedAt, - host.Platform, + platform, fleet.LabelMembershipTypeDynamic, ) } diff --git a/server/datastore/mysql/labels_test.go b/server/datastore/mysql/labels_test.go index 464a9d5082..4094aab8fc 100644 --- a/server/datastore/mysql/labels_test.go +++ b/server/datastore/mysql/labels_test.go @@ -677,3 +677,35 @@ func TestSaveLabel(t *testing.T) { assert.Equal(t, label.Name, saved.Name) assert.Equal(t, label.Description, saved.Description) } + +func TestLabelQueriesForCentOSHost(t *testing.T) { + db := CreateMySQLDS(t) + defer db.Close() + + host, err := db.EnrollHost("0", "0", nil, 0) + require.Nil(t, err, "enrollment should succeed") + host.Platform = "rhel" + host.OSVersion = "CentOS 6" + require.NoError(t, db.SaveHost(host)) + + label, err := db.NewLabel(&fleet.Label{ + UpdateCreateTimestamps: fleet.UpdateCreateTimestamps{ + CreateTimestamp: fleet.CreateTimestamp{CreatedAt: time.Now()}, + UpdateTimestamp: fleet.UpdateTimestamp{UpdatedAt: time.Now()}, + }, + ID: 42, + Name: "centos labe", + Query: "select 1;", + Platform: "centos", + LabelType: fleet.LabelTypeRegular, + LabelMembershipType: fleet.LabelMembershipTypeDynamic, + }) + require.NoError(t, err) + + baseTime := time.Now().Add(-5 * time.Minute) + + queries, err := db.LabelQueriesForHost(host, baseTime) + require.NoError(t, err) + require.Len(t, queries, 1) + assert.Equal(t, "select 1;", queries[fmt.Sprint(label.ID)]) +}