#  Copyright 2021 Northern.tech AS
#  This file is part of CFEngine 3 - written and maintained by Northern.tech AS.
#  This program is free software; you can redistribute it and/or modify it
#  under the terms of the GNU 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 General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
# To the extent this program is licensed as part of the Enterprise
# versions of Cfengine, the applicable Commercial Open Source License
# (COSL) may apply to this file if you as a licensee so wish it. See
# included file COSL.txt.
#
# Testing some variable/class definitions - note scope
#
# Use browser -f promise_output_agent.html to view
body common control
{
  bundlesequence => { "mycommon", "assign" };
}

###########################################################
bundle common mycommon
{
  classes:
    "global_class" expression => "any";
    "another_global" xor => { "any", "linux", "solaris" };
}

###########################################################
bundle agent assign
{
  vars:
    "scalar" int => "16k";

    # "xxx"    string => readfile( "/home/mark/tmp/testfile" , "33" );
    "ran" int => randomint(4, 88);

    # "yyy"    slist  => { readstringlist("/home/mark/tmp/testlist","#[a-zA-Z0-9 ]*","[^a-zA-Z0-9]",15,4000) };
    # "zzz"    slist  => { readstringlist("/home/mark/tmp/testlist2","#[^\n]*",",",5,4000) };
    # "aaa"    ilist  => { readintlist("/home/mark/tmp/testilist","#[a-zA-Z0-9 ]*",",",10,4000) };
    "dim_array"
      int => readstringarray(
        "array_name", "/etc/passwd", "#[^\n]*", ":", 10, 4000
      );

  classes:
    # Standard aliasing
    "myclass" or => { "solaris", "linux" };

    # got_array is a class that says whether the read was successful
    # array_name[] is the lval
    # Create a distribution
    "my_dist" dist => { "10", "20", "30", "40" };

  # Now like "alerts" in cf2
  reports:
    "Dimension of passwd array $(dim_array)";
    "Read item from list: $(yyy)";

    # Any kind of rule can define classes on exit
    "Read this file: [$(xxx)] ..." classes => persist("alertclass", "20");
}

######################################################################
body classes persist(class, time)
{
  promise_repaired => { "$(class)" };
  persist_time => "$(time)";
  timer_policy => "absolute";
}
