** Copyright (C) 2001-2025 Zabbix SIA
** This program is free software: you can redistribute it and/or modify it under the terms of
** the GNU Affero General Public License as published by the Free Software Foundation, version 3.
** This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
** without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
** See the GNU Affero General Public License for more details.
** You should have received a copy of the GNU Affero General Public License along with this program.
** If not, see <https://www.gnu.org/licenses/>.
"golang.zabbix.com/agent2/pkg/zbxlib"
Name string `json:"name"`
Body string `json:"expression"`
Type *int `json:"expression_type"`
Delimiter *string `json:"exp_delimiter"`
Mode *int `json:"case_sensitive"`
expressions []*Expression
func SortExpressions(expressions []*Expression) {
sort.Slice(expressions, func(i, j int) bool {
if expressions[i].Name != expressions[j].Name {
return expressions[i].Name < expressions[j].Name
if expressions[i].Body != expressions[j].Body {
return expressions[i].Body < expressions[j].Body
if *expressions[i].Type != *expressions[j].Type {
return *expressions[i].Type < *expressions[j].Type
if *expressions[i].Mode != *expressions[j].Mode {
return *expressions[i].Mode < *expressions[j].Mode
return *expressions[i].Delimiter < *expressions[j].Delimiter
func (b *Bundle) CompareExpressions(expressions []*Expression) bool {
if len(expressions) != len(b.expressions) {
for i := range expressions {
if l.Name != r.Name || l.Body != r.Body || *l.Type != *r.Type || *l.Mode != *r.Mode || *l.Delimiter != *r.Delimiter {
func (b *Bundle) Match(value string, pattern string, mode int, output_template *string) (match bool, output string) {
match, output, _ = zbxlib.MatchGlobalRegexp(b.Cblob, value, pattern, mode, output_template)
func NewBundle(expressions []*Expression) (bundle *Bundle) {
bundle = &Bundle{expressions: expressions}
bundle.Cblob = zbxlib.NewGlobalRegexp()
for _, e := range expressions {
if 0 != len(*e.Delimiter) {
delimeter = (*e.Delimiter)[0]
zbxlib.AddGlobalRegexp(bundle.Cblob, e.Name, e.Body, *e.Type, delimeter, *e.Mode)