From 6015773258131a39897162ed1509d34b4f3839dd Mon Sep 17 00:00:00 2001 From: Mike Weilgart Date: Tue, 13 Aug 2019 19:22:58 +0000 Subject: [PATCH 1/2] Commit all modified example policy files from 2019 policy writer training sessions --- source/250-101-Scalars-0018-scalar.cf | 4 +-- .../250-101-Scalars-0411-variable_scope_2.cf | 6 ++++ ...260-List_variables_and_implicit_looping.cf | 9 +++++- .../250-120-Lists-0290-Lists_of_integers.cf | 2 +- ...50-120-Lists-0300-Lists_of_real_numbers.cf | 2 +- ...ata_Structures_Arrays-0346-array_values.cf | 28 +++++++++++++++--- source/250-210-Methods-0010-simple_example.cf | 17 +++++++++-- ...ples_Classes_2-0134-soft_classes_simple.cf | 10 +++++++ ...lasses_4-0030-Ensuring_httpd_is_running.cf | 4 +-- .../310-040-Ordering-0020-normal_ordering.cf | 10 +++---- ...50-Knowledge_Management-0260-depends_on.cf | 8 +++-- ...320-150-Editing_Files-0360-delete_lines.cf | 6 +++- source/320-270-0015.mustache | 2 ++ ...-Mustache_Templates_with_Datastate-0010.cf | 2 +- ...rts_Setting_group_ownership_based_on_OS.cf | 11 +++++-- ...-010-Body_Parts-0545-parameterized_body.cf | 4 +-- ...e_Copying-1070-Local_copy_a_single_file.cf | 1 + ...Classes_ORing_of_classes_and_fileexists.cf | 7 +++-- ..._class_based_on_hard_classes_expression.cf | 29 +++++++++++++++++-- ..._Report_type_of_weekday_Uses_ifvarclass.cf | 25 ++++++++-------- .../440-070-Patterns-0840-Classes_GOTCHA.cf | 19 ++++++++++-- source/440-070-Patterns-0870-Classes_Scope.cf | 20 +++++++++++++ .../510-050-Special_Variables-0310-Const.cf | 2 ++ ...Selection-0520-Select_by_several_things.cf | 2 +- source/hello_world.cf | 22 +++++++++++++- 25 files changed, 202 insertions(+), 50 deletions(-) diff --git a/source/250-101-Scalars-0018-scalar.cf b/source/250-101-Scalars-0018-scalar.cf index 90f7865..61c3d9b 100644 --- a/source/250-101-Scalars-0018-scalar.cf +++ b/source/250-101-Scalars-0018-scalar.cf @@ -6,8 +6,8 @@ bundle agent main { "greeting" string => "Hello. My name is $(name). "; - "name" - string => "Inigo Montoya"; +# "name" +# string => "Inigo Montoya"; reports: diff --git a/source/250-101-Scalars-0411-variable_scope_2.cf b/source/250-101-Scalars-0411-variable_scope_2.cf index 6afc2ff..43d97f3 100644 --- a/source/250-101-Scalars-0411-variable_scope_2.cf +++ b/source/250-101-Scalars-0411-variable_scope_2.cf @@ -1,5 +1,10 @@ # Simplify / break in parts +body common control { + bundlesequence => { bundle_0, "bundle_1", bundle_2, bundle_4, }; +} + + bundle agent bundle_0 { vars: "fruit" string => "banana"; reports: "This is bundle_0"; @@ -17,3 +22,4 @@ bundle agent bundle_2 { } bundle agent bundle_4 { vars: "xyzzy" string => "magic"; } + diff --git a/source/250-120-Lists-0260-List_variables_and_implicit_looping.cf b/source/250-120-Lists-0260-List_variables_and_implicit_looping.cf index 41b1987..01efd67 100644 --- a/source/250-120-Lists-0260-List_variables_and_implicit_looping.cf +++ b/source/250-120-Lists-0260-List_variables_and_implicit_looping.cf @@ -12,8 +12,15 @@ bundle agent main { "hamburgers", }; + "second_list" + slist => { + "some item", + @(shopping_list), + "last item", + }; + reports: - "Buy $(shopping_list)"; + "Buy $(second_list)"; } diff --git a/source/250-120-Lists-0290-Lists_of_integers.cf b/source/250-120-Lists-0290-Lists_of_integers.cf index a192395..bed4c19 100644 --- a/source/250-120-Lists-0290-Lists_of_integers.cf +++ b/source/250-120-Lists-0290-Lists_of_integers.cf @@ -5,7 +5,7 @@ bundle agent main { "my_list" comment => "Demonstrate a list of integers", - ilist => { "1", "2", "3" }; + ilist => { 1, 2, 3 }; reports: diff --git a/source/250-120-Lists-0300-Lists_of_real_numbers.cf b/source/250-120-Lists-0300-Lists_of_real_numbers.cf index c5f9a0f..d2abf97 100644 --- a/source/250-120-Lists-0300-Lists_of_real_numbers.cf +++ b/source/250-120-Lists-0300-Lists_of_real_numbers.cf @@ -6,7 +6,7 @@ bundle agent main { handle => "rlist_demo", comment => "Create an rlist", - rlist => { "1.5", "3.0", "4.5" }; + rlist => { 1.5, 3.0, 4.5 }; reports: diff --git a/source/250-130-Data_Structures_Arrays-0346-array_values.cf b/source/250-130-Data_Structures_Arrays-0346-array_values.cf index f6e7258..aa9c2b6 100644 --- a/source/250-130-Data_Structures_Arrays-0346-array_values.cf +++ b/source/250-130-Data_Structures_Arrays-0346-array_values.cf @@ -2,16 +2,36 @@ bundle agent main { vars: - "food_prices[Apple]" + any:: + "price_map" + data => '{ "Apple": 58, "Banana": 30 }'; + + "price_of[Apple]" string => "58c"; - "food_prices[Banana]" + "price_of[Banana]" string => "30c"; "food" - slist => getindices("food_prices"); + slist => getindices("price_of"); + + "prices_only" + slist => getvalues("price_of"); + "for_reporting_only" + string => format("%S", "price_map"); reports: - "Values of 'food_prices' array: $(food): $(food_prices[$(food)])"; + "Values of 'price_of' array: $(food): $(price_of[$(food)])"; + + "Just apples: $(price_of[Apple])"; + + "The result of the getindices call includes: $(food)"; + + "For printing only: $(for_reporting_only)"; + + "The prices (of what we don't know) include: $(prices_only)"; + + "Match everything with everything: $(food), $(prices_only)"; + } diff --git a/source/250-210-Methods-0010-simple_example.cf b/source/250-210-Methods-0010-simple_example.cf index abb4314..3901ee9 100644 --- a/source/250-210-Methods-0010-simple_example.cf +++ b/source/250-210-Methods-0010-simple_example.cf @@ -1,3 +1,9 @@ +body file control { + inputs => { + "$(sys.libdir)/stdlib.cf" + }; +} + bundle agent main { vars: @@ -14,6 +20,13 @@ bundle agent remove_user(user) { commands: "/usr/sbin/userdel $(user)"; - "/bin/rm /var/spool/cron/$(user)"; - "/bin/rm /var/mail/$(user)"; + + files: + any:: + "/var/spool/cron/$(user)" + delete => tidy; + + "/var/mail/$(user)" + delete => tidy; + } diff --git a/source/300-015-Basic_Examples_Classes_2-0134-soft_classes_simple.cf b/source/300-015-Basic_Examples_Classes_2-0134-soft_classes_simple.cf index 9de9cb2..5ba2d3c 100644 --- a/source/300-015-Basic_Examples_Classes_2-0134-soft_classes_simple.cf +++ b/source/300-015-Basic_Examples_Classes_2-0134-soft_classes_simple.cf @@ -4,9 +4,19 @@ bundle agent main { "weekend" expression => "Saturday|Sunday"; + classes: + any:: # Valid even as far back as 3.7 "weekday" expression => "Monday|Tuesday|Wednesday|Thursday|Friday"; + Monday|Tuesday|Wednesday|Thursday|Friday:: + "weekday" + expression => "any"; # 3.7 and earlier require expression attribute + + Monday|Tuesday|Wednesday|Thursday|Friday:: + "weekday"; # In 3.10 and later the expression attribute can be left out. + # When left out, it defaults to "any". + reports: weekend:: "Yay! I get to rest today."; diff --git a/source/300-040-Classes_4-0030-Ensuring_httpd_is_running.cf b/source/300-040-Classes_4-0030-Ensuring_httpd_is_running.cf index 08fb7c4..7b3e2b4 100644 --- a/source/300-040-Classes_4-0030-Ensuring_httpd_is_running.cf +++ b/source/300-040-Classes_4-0030-Ensuring_httpd_is_running.cf @@ -2,10 +2,10 @@ bundle agent main { processes: "httpd" - restart_class => "start_httpd"; + restart_class => "httpd_is_not_running"; commands: - start_httpd:: + httpd_is_not_running:: "/etc/init.d/httpd start"; } diff --git a/source/310-040-Ordering-0020-normal_ordering.cf b/source/310-040-Ordering-0020-normal_ordering.cf index f2bb6b1..020ea50 100644 --- a/source/310-040-Ordering-0020-normal_ordering.cf +++ b/source/310-040-Ordering-0020-normal_ordering.cf @@ -3,20 +3,20 @@ bundle agent main { classes: - "file_exists" + "file_exists" # 4 expression => fileexists("/tmp/newfile"); - "file_absent" + "file_absent" # 1 not => fileexists("/tmp/newfile"); files: - "/tmp/newfile" + "/tmp/newfile" # 2 create => "true"; reports: - file_exists:: + file_exists:: # 5 "file /tmp/newfile exists"; - file_absent:: + file_absent:: # 3 "file /tmp/newfile does not exist"; } diff --git a/source/310-050-Knowledge_Management-0260-depends_on.cf b/source/310-050-Knowledge_Management-0260-depends_on.cf index a229d4b..b602683 100644 --- a/source/310-050-Knowledge_Management-0260-depends_on.cf +++ b/source/310-050-Knowledge_Management-0260-depends_on.cf @@ -5,8 +5,8 @@ bundle agent main reports: - "System Check" - handle => "systems_check"; + "We launched" + depends_on => { "ignition" }; "Launch!!" depends_on => { "fuel_check", "systems_check" }, @@ -14,8 +14,12 @@ bundle agent main comment => "Demonstrate flow control with depends_on"; "Fueling..." + depends_on => { "systems_check" }, handle => "fuel_check"; + "System Check" + handle => "systems_check"; + } # Try to think declaratively (not imperatively), and use depends_on diff --git a/source/320-150-Editing_Files-0360-delete_lines.cf b/source/320-150-Editing_Files-0360-delete_lines.cf index f3e53b0..11b7d2f 100644 --- a/source/320-150-Editing_Files-0360-delete_lines.cf +++ b/source/320-150-Editing_Files-0360-delete_lines.cf @@ -3,11 +3,15 @@ bundle agent main { files: "/etc/motd" - handle => "motd", comment => "Create and populate motd", create => "true", edit_line => my_motd; + + "/tmp/motd_example" + create => "true", + edit_line => my_motd; + } diff --git a/source/320-270-0015.mustache b/source/320-270-0015.mustache index 998c566..a5eeb1b 100644 --- a/source/320-270-0015.mustache +++ b/source/320-270-0015.mustache @@ -19,4 +19,6 @@ my hostname is {{vars.sys.fqhost}} The value of foo is {{vars.main.foo}} +The literal value of foo is {{{vars.main.foo}}} + Have a nice day. diff --git a/source/320-270-Mustache_Templates_with_Datastate-0010.cf b/source/320-270-Mustache_Templates_with_Datastate-0010.cf index a0d1f28..d00dfee 100644 --- a/source/320-270-Mustache_Templates_with_Datastate-0010.cf +++ b/source/320-270-Mustache_Templates_with_Datastate-0010.cf @@ -12,7 +12,7 @@ bundle common g { bundle agent main { - vars: "foo" string => "bar"; + vars: "foo" string => "bar/baz"; files: "/etc/motd" diff --git a/source/400-010-Body_Parts-0540-Parts_Setting_group_ownership_based_on_OS.cf b/source/400-010-Body_Parts-0540-Parts_Setting_group_ownership_based_on_OS.cf index 6cd7c1b..9b6cb38 100644 --- a/source/400-010-Body_Parts-0540-Parts_Setting_group_ownership_based_on_OS.cf +++ b/source/400-010-Body_Parts-0540-Parts_Setting_group_ownership_based_on_OS.cf @@ -11,8 +11,13 @@ bundle agent main { body perms admin_group { - linux:: groups => { "wheel" }; - darwin:: groups => { "admin" }; - sunos:: groups => { "sys" }; + linux:: + groups => { "wheel" }; + + darwin:: + groups => { "admin" }; + + sunos:: + groups => { "sys" }; } diff --git a/source/400-010-Body_Parts-0545-parameterized_body.cf b/source/400-010-Body_Parts-0545-parameterized_body.cf index 1fbd9a5..8566f38 100644 --- a/source/400-010-Body_Parts-0545-parameterized_body.cf +++ b/source/400-010-Body_Parts-0545-parameterized_body.cf @@ -9,11 +9,11 @@ bundle agent main { handle => "set_file_attributes_automagically", comment => "Set appropriate file attributes everywhere", create => "true", - perms => set_mode_700_admin_group_and_specified_user("sam"); + perms => admin_700_file_owned_by("mike"); } -body perms set_mode_700_admin_group_and_specified_user(user) { +body perms admin_700_file_owned_by(user) { mode => "0700"; owners => { "$(user)" }; diff --git a/source/430-100-File_Copying-1070-Local_copy_a_single_file.cf b/source/430-100-File_Copying-1070-Local_copy_a_single_file.cf index d239835..82f7040 100644 --- a/source/430-100-File_Copying-1070-Local_copy_a_single_file.cf +++ b/source/430-100-File_Copying-1070-Local_copy_a_single_file.cf @@ -6,6 +6,7 @@ bundle agent main { "/root/etc_group.bak" + edit_defaults => backup_timestamp, copy_from => local_cp("/etc/group"), comment => "Demonstrate local file copy"; diff --git a/source/440-070-Patterns-0780-Classes_ORing_of_classes_and_fileexists.cf b/source/440-070-Patterns-0780-Classes_ORing_of_classes_and_fileexists.cf index 5a05833..7d37404 100644 --- a/source/440-070-Patterns-0780-Classes_ORing_of_classes_and_fileexists.cf +++ b/source/440-070-Patterns-0780-Classes_ORing_of_classes_and_fileexists.cf @@ -10,9 +10,10 @@ bundle agent main handle => "or_list", comment => "Demonstrate list form of class expression useful for including functions", - or => { "linux", - "solaris", - fileexists("/etc/fstab") + or => { + "linux", + "solaris", + fileexists("/etc/fstab"), }; diff --git a/source/440-070-Patterns-0790-Classes_Set_a_private_class_based_on_hard_classes_expression.cf b/source/440-070-Patterns-0790-Classes_Set_a_private_class_based_on_hard_classes_expression.cf index 9d942e6..531c7a4 100644 --- a/source/440-070-Patterns-0790-Classes_Set_a_private_class_based_on_hard_classes_expression.cf +++ b/source/440-070-Patterns-0790-Classes_Set_a_private_class_based_on_hard_classes_expression.cf @@ -1,15 +1,40 @@ bundle agent main { + classes: + GMT_Hr00|GMT_Hr01:: + "maintenance_window_for_storage_changes" + scope => "namespace"; + + GMT_Hr02|GMT_Hr03:: + "maintenance_window_for_ldap_changes" + scope => "namespace"; + + vars: + any:: + "all_maintenance_window_classes" + slist => classesmatching("maintenance_window.*"); + + vars: + any:: + "mw_numbers" + slist => { "1", "2" }; + + classes: + any:: + "some_mw_is_set" + expression => "maintenance_window_$(mw_numbers)"; + classes: "good_technology" + meta => { "some tag", "report" }, handle => "good_technology_class", comment => "Set a custom class based on built-in classes", - expression => "linux|solaris"; + expression => "linux|(solaris.x86_64)"; reports: - good_technology:: + linux|solaris:: "I love good technology" handle => "show_respect", comment => "Show respect for good technology"; diff --git a/source/440-070-Patterns-0830-Classes_Report_type_of_weekday_Uses_ifvarclass.cf b/source/440-070-Patterns-0830-Classes_Report_type_of_weekday_Uses_ifvarclass.cf index 71c0a47..62acb94 100644 --- a/source/440-070-Patterns-0830-Classes_Report_type_of_weekday_Uses_ifvarclass.cf +++ b/source/440-070-Patterns-0830-Classes_Report_type_of_weekday_Uses_ifvarclass.cf @@ -1,35 +1,34 @@ bundle agent main { vars: + any:: "days" handle => "days", comment => "Build a list of days to report day of the week", - slist => { "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday", - "Sunday", + slist => { + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sunday", }; - - - reports: "Hello world! I love $(days)s!" comment => "Report day of the week", - ifvarclass => "$(days)"; + if => "$(days)"; # The above promise creates 7 promises: # "Hello world! I love Mondays!" # comment => "Report day of the week", -# ifvarclass => "Monday"; +# if => "Monday"; # # ... # # "Hello world! I love Sundays!" # comment => "Report day of the week", -# ifvarclass => "Sunday"; +# if => "Sunday"; } diff --git a/source/440-070-Patterns-0840-Classes_GOTCHA.cf b/source/440-070-Patterns-0840-Classes_GOTCHA.cf index 5b410c6..d66c8d4 100644 --- a/source/440-070-Patterns-0840-Classes_GOTCHA.cf +++ b/source/440-070-Patterns-0840-Classes_GOTCHA.cf @@ -2,14 +2,27 @@ bundle agent main { commands: - linux&Hr08:: - "/bin/echo Linux system AND we are in the 8th hour."; + any:: "/bin/echo hello world"; # this promise is NOT in the class "any" !!! - any:: + "/bin/date"; + + "/bin/date"; + + "/bin/date"; + + something:: + "/bin/ls"; + + "/bin/date"; "/bin/date"; + + "/bin/date"; + + "/bin/something-else"; + } diff --git a/source/440-070-Patterns-0870-Classes_Scope.cf b/source/440-070-Patterns-0870-Classes_Scope.cf index be7f9f1..2d4d340 100644 --- a/source/440-070-Patterns-0870-Classes_Scope.cf +++ b/source/440-070-Patterns-0870-Classes_Scope.cf @@ -1,9 +1,25 @@ +# Standalone example - in a real codebase, you can only have ONE body common control. +body common control { + bundlesequence => { + "example_1", + "example_2", + }; +} + bundle agent example_1 { +# For common bundles, the default scope for classes promises is "namespace". +# For agent bundles, the default scope for classes promises is "bundle". +# Either one can be overridden explicitly. classes: "its_monday" expression => "Monday"; + classes: + "its_wednesday" + scope => "namespace", + expression => "Wednesday"; + classes: "its_thur" expression => "Thursday"; @@ -16,6 +32,10 @@ bundle agent example_2 { its_monday:: "Yay! I love Mondays!"; + reports: + its_wednesday:: + "Yay! I love Wednesdays!"; + reports: its_thur:: "Yay! I love Thursdays!"; diff --git a/source/510-050-Special_Variables-0310-Const.cf b/source/510-050-Special_Variables-0310-Const.cf index 159301e..27c7a3c 100644 --- a/source/510-050-Special_Variables-0310-Const.cf +++ b/source/510-050-Special_Variables-0310-Const.cf @@ -22,4 +22,6 @@ bundle agent main { "A newline with either $(const.n) or with $(const.endl) is ok"; "But a string with \n in it does not have a newline!"; + "This line has a double backslash: \\ let's see how it looks"; + "A backslash doublequote: \" like that"; } diff --git a/source/520-060-File_Selection-0520-Select_by_several_things.cf b/source/520-060-File_Selection-0520-Select_by_several_things.cf index 319867a..74c5a7c 100644 --- a/source/520-060-File_Selection-0520-Select_by_several_things.cf +++ b/source/520-060-File_Selection-0520-Select_by_several_things.cf @@ -16,7 +16,7 @@ body file_select compound_filter search_mode => { "777" }; leaf_name => { ".*\.pdf" }; # leaf_name = regex to match - file_result => "leaf_name&mode"; # this is a class expression + file_result => "(leaf_name|mode).!(leaf_name.mode)"; # this is a class expression } # Exercise: delete world-writable PDF files owned by root from /tmp diff --git a/source/hello_world.cf b/source/hello_world.cf index 44d4381..b0e463d 100644 --- a/source/hello_world.cf +++ b/source/hello_world.cf @@ -1,4 +1,8 @@ -bundle agent main +body common control { + bundlesequence => { "hello_world" }; +} + +bundle agent hello_world { reports: @@ -13,4 +17,20 @@ reports: # # "$(myclasses)"; + methods: + "whatever" + usebundle => second; + + methods: + "whatever" + usebundle => second; + } + +bundle agent second { + + reports: + + "This is a reports promise"; + +} From 1d9dd80feb651453ec40eaf58cb8bb99e1710aff Mon Sep 17 00:00:00 2001 From: Mike Weilgart Date: Tue, 13 Aug 2019 19:27:05 +0000 Subject: [PATCH 2/2] Add all the extra throwaway examples from the training --- source/extra-examples/adam.cf | 65 ++++++++++++++++++ source/extra-examples/adam2.cf | 57 +++++++++++++++ source/extra-examples/adrians_file.cf | 24 +++++++ source/extra-examples/backup-sbin.cf | 17 +++++ source/extra-examples/classes.cf | 10 +++ source/extra-examples/comment-days.cf | 8 +++ source/extra-examples/conditional_report.cf | 5 ++ source/extra-examples/data_example1.cf | 24 +++++++ source/extra-examples/data_example2.cf | 22 ++++++ source/extra-examples/data_example3.cf | 23 +++++++ source/extra-examples/delme.cf | 10 +++ source/extra-examples/delme1.cf | 12 ++++ source/extra-examples/delme2.cf | 6 ++ source/extra-examples/example.cf | 30 ++++++++ source/extra-examples/file-edit-example.cf | 18 +++++ source/extra-examples/file-owners.cf | 34 +++++++++ source/extra-examples/filetimecompare.cf | 25 +++++++ source/extra-examples/five_files.cf | 28 ++++++++ source/extra-examples/methods.cf | 19 +++++ source/extra-examples/motd.cf | 21 ++++++ source/extra-examples/phone_prices.json | 5 ++ source/extra-examples/random.cf | 17 +++++ .../regex-markup-0.10.0-1.x86_64.rpm | Bin 0 -> 63621 bytes source/extra-examples/simple-methods.cf | 31 +++++++++ source/extra-examples/stop_processes.cf | 16 +++++ source/extra-examples/vince.cf | 31 +++++++++ source/extra-examples/webserver.cf | 48 +++++++++++++ .../extra-examples/whatever_filename.mustache | 36 ++++++++++ 28 files changed, 642 insertions(+) create mode 100644 source/extra-examples/adam.cf create mode 100644 source/extra-examples/adam2.cf create mode 100644 source/extra-examples/adrians_file.cf create mode 100644 source/extra-examples/backup-sbin.cf create mode 100644 source/extra-examples/classes.cf create mode 100644 source/extra-examples/comment-days.cf create mode 100644 source/extra-examples/conditional_report.cf create mode 100644 source/extra-examples/data_example1.cf create mode 100644 source/extra-examples/data_example2.cf create mode 100644 source/extra-examples/data_example3.cf create mode 100644 source/extra-examples/delme.cf create mode 100644 source/extra-examples/delme1.cf create mode 100644 source/extra-examples/delme2.cf create mode 100644 source/extra-examples/example.cf create mode 100644 source/extra-examples/file-edit-example.cf create mode 100644 source/extra-examples/file-owners.cf create mode 100644 source/extra-examples/filetimecompare.cf create mode 100644 source/extra-examples/five_files.cf create mode 100644 source/extra-examples/methods.cf create mode 100644 source/extra-examples/motd.cf create mode 100644 source/extra-examples/phone_prices.json create mode 100644 source/extra-examples/random.cf create mode 100644 source/extra-examples/regex-markup-0.10.0-1.x86_64.rpm create mode 100644 source/extra-examples/simple-methods.cf create mode 100644 source/extra-examples/stop_processes.cf create mode 100644 source/extra-examples/vince.cf create mode 100644 source/extra-examples/webserver.cf create mode 100644 source/extra-examples/whatever_filename.mustache diff --git a/source/extra-examples/adam.cf b/source/extra-examples/adam.cf new file mode 100644 index 0000000..b930518 --- /dev/null +++ b/source/extra-examples/adam.cf @@ -0,0 +1,65 @@ +bundle agent old_main { + + reports: + + linux:: + "running on LINUX"; + + ubuntu_14:: + "running on ubuntu 14"; + + redhat:: + "running on redhat"; + + July:: + "It is the month of July"; +} + +bundle agent main { + + vars: + any:: + "files" + slist => { + "/etc/passwd", + "/etc/shadow", + "/etc/adamfile", + }; + + classes: + any:: + "file_exists$(files)" + expression => fileexists("$(files)"); + + reports: + file_exists_etc_passwd.file_exists_etc_shadow:: + "Both the files exist"; + + reports: + any:: + "$(files) is missing" + unless => fileexists("$(files)"); + + reports: + any:: + "$(files) is present" + if => fileexists("$(files)"); + + classes: + any:: + "adams_class" + handle => "file_check", + comment => "Checks for existence of a file", + and => { + fileexists("/etc/passwd"), + fileexists("/etc/shadow") + }; + + reports: + adams_class:: + "/etc/password and /etc/shadow exists!"; + + !adams_class:: + "/etc/password and/or /etc/shadow missing!!!!"; + +} diff --git a/source/extra-examples/adam2.cf b/source/extra-examples/adam2.cf new file mode 100644 index 0000000..9526463 --- /dev/null +++ b/source/extra-examples/adam2.cf @@ -0,0 +1,57 @@ +bundle agent main { + + methods: + + "any" + + handle => "group_exists", + comment => "make sure the specified group is always present", + usebundle => groupadd("adam"); + + methods: + any:: + "add a students group" + usebundle => groupadd("students"); + +} + +bundle agent groupadd(groupname) { + + vars: + linux:: + "groupadd" + string => "/usr/sbin/groupadd"; + + aix:: + "groupadd" + string => "/sbin/addgroup"; + + hpux:: + "groupadd" + string => "/usr/sbin/addgroup"; + + classes: + "gname" + expression => groupexists("$(groupname)"); + + commands: + !gname:: + "$(groupadd)" + classes => if_repaired("group_$(groupname)_added"), + args => "$(groupname)"; + + reports: + + gname:: + "Group $(groupname) exists!" + unless => "group_$(groupname)_added"; + + any:: + "Group $(groupname) added!" + if => "group_$(groupname)_added"; + +} + +body file control { + inputs => { "$(sys.libdir)/stdlib.cf" }; +} diff --git a/source/extra-examples/adrians_file.cf b/source/extra-examples/adrians_file.cf new file mode 100644 index 0000000..6c20b91 --- /dev/null +++ b/source/extra-examples/adrians_file.cf @@ -0,0 +1,24 @@ +bundle agent adrian { + + vars: + any:: + "fruit" string => "apples"; + special_class:: + "fruit" string => "lemons"; + + reports: + any:: + "This is bundle adrian"; + +} + +bundle agent luke { + + vars: + "fruit" + string => "oranges"; + + reports: + "I like $(adrian.fruit), Luke likes $(luke.fruit)"; + +} diff --git a/source/extra-examples/backup-sbin.cf b/source/extra-examples/backup-sbin.cf new file mode 100644 index 0000000..696bf00 --- /dev/null +++ b/source/extra-examples/backup-sbin.cf @@ -0,0 +1,17 @@ +bundle agent main { + files: + any:: + "/tmp/mirror/." + depth_search => recursive, + copy_from => sbin; +} + +body copy_from sbin { + source => "/usr/local/sbin"; + preserve => "true"; + stealth => "true"; +} + +body depth_search recursive { + depth => "inf"; +} diff --git a/source/extra-examples/classes.cf b/source/extra-examples/classes.cf new file mode 100644 index 0000000..c80c62a --- /dev/null +++ b/source/extra-examples/classes.cf @@ -0,0 +1,10 @@ +bundle agent main { + classes: + any:: + "This_class_name_is_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_long"; + + reports: + This_class_name_is_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_very_long:: + "Wow!"; + +} diff --git a/source/extra-examples/comment-days.cf b/source/extra-examples/comment-days.cf new file mode 100644 index 0000000..8b16c3d --- /dev/null +++ b/source/extra-examples/comment-days.cf @@ -0,0 +1,8 @@ +bundle agent main { + files: + any:: + "/tmp/date.txt" + edit_line => comment_lines_matching("[^#].*(Mon|Tue|Wed|Thur|Fri|Sat|Sun).*" , "#"); +} + +body file control { inputs => { "$(sys.libdir)/stdlib.cf" }; } diff --git a/source/extra-examples/conditional_report.cf b/source/extra-examples/conditional_report.cf new file mode 100644 index 0000000..ee36124 --- /dev/null +++ b/source/extra-examples/conditional_report.cf @@ -0,0 +1,5 @@ +bundle agent main { + reports: + ec2_instance:: + "I am in AWS!"; +} diff --git a/source/extra-examples/data_example1.cf b/source/extra-examples/data_example1.cf new file mode 100644 index 0000000..b3a75ce --- /dev/null +++ b/source/extra-examples/data_example1.cf @@ -0,0 +1,24 @@ +bundle agent main { + + vars: + any:: + + "phone_prices[Pixel]" + string => "$800"; + + "phone_prices[Galaxy]" + string => "$700"; + + "phone_prices[iPhone]" + string => "$999"; + + vars: + any:: + "phones" + slist => getindices("phone_prices"); + + reports: + any:: + "The price of a $(phones) is $(phone_prices[$(phones)])"; + +} diff --git a/source/extra-examples/data_example2.cf b/source/extra-examples/data_example2.cf new file mode 100644 index 0000000..51aceae --- /dev/null +++ b/source/extra-examples/data_example2.cf @@ -0,0 +1,22 @@ +bundle agent main { + + vars: + any:: + "phone_prices" + data => ' + { + "Pixel" : "$800", + "Galaxy": "$700", + "iPhone": "$999", + }'; + + vars: + any:: + "phones" + slist => getindices("phone_prices"); + + reports: + any:: + "The price of a $(phones) is $(phone_prices[$(phones)])"; + +} diff --git a/source/extra-examples/data_example3.cf b/source/extra-examples/data_example3.cf new file mode 100644 index 0000000..edd8d82 --- /dev/null +++ b/source/extra-examples/data_example3.cf @@ -0,0 +1,23 @@ +bundle agent main { + + vars: + any:: + "phone_prices" + data => readjson("$(this.promise_dirname)/phone_prices.json"); + + vars: + any:: + "phones" + slist => getindices("phone_prices"); + + reports: + any:: + "The price of a $(phones) is $(phone_prices[$(phones)])"; + + "Attempt to iterate over a data container directly: $(phone_prices)"; + + files: + any:: + "/etc/motd" + +} diff --git a/source/extra-examples/delme.cf b/source/extra-examples/delme.cf new file mode 100644 index 0000000..48ad086 --- /dev/null +++ b/source/extra-examples/delme.cf @@ -0,0 +1,10 @@ +bundle agent apple { + vars: + any:: + "mikes_var" string => "I am a cool var"; +} + +bundle agent orange { + reports: + "apple.mikes_var is: $(apple.mikes_var)"; +} diff --git a/source/extra-examples/delme1.cf b/source/extra-examples/delme1.cf new file mode 100644 index 0000000..d94050b --- /dev/null +++ b/source/extra-examples/delme1.cf @@ -0,0 +1,12 @@ +body file control { + inputs => { + "delme2.cf", + }; +} + +bundle agent my_name_can_be_anything { + vars: + "myvar" string => "This is the first bundle"; + reports: + "$(myvar)"; +} diff --git a/source/extra-examples/delme2.cf b/source/extra-examples/delme2.cf new file mode 100644 index 0000000..e59a92b --- /dev/null +++ b/source/extra-examples/delme2.cf @@ -0,0 +1,6 @@ +bundle agent second_bundle { + vars: + "myvar" string => "This is the second bundle"; + reports: + "$(myvar)"; +} diff --git a/source/extra-examples/example.cf b/source/extra-examples/example.cf new file mode 100644 index 0000000..2080008 --- /dev/null +++ b/source/extra-examples/example.cf @@ -0,0 +1,30 @@ +body common control { + bundlesequence => { "example" }; +} + +bundle agent example { + + classes: + any:: + "file_compare" + expression => isnewerthan("/tmp/later", "/tmp/earlier"); + + classes: + any:: + "do_it" + and => { + "class1", + "class2", + "class3", + "file_compare", + }; + #expression => isnewerthan("/tmp/later", "/tmp/earlier"); + + reports: + do_it:: + "/tmp/later is older than /tmp/earlier"; + + !class1:: + "Class 1 wasn't set"; + +} diff --git a/source/extra-examples/file-edit-example.cf b/source/extra-examples/file-edit-example.cf new file mode 100644 index 0000000..1cc0737 --- /dev/null +++ b/source/extra-examples/file-edit-example.cf @@ -0,0 +1,18 @@ +bundle agent main { + + files: + any:: + "/etc/motd" + edit_template => "$(this.promise_dirname)/whatever_filename.mustache", + #template_data => '{ + #"org": "AT&T", + #"hostname": "$(sys.fqhost)" + #}', + template_method => "mustache"; + + vars: + any:: + "org" + string => "AT&T"; + +} diff --git a/source/extra-examples/file-owners.cf b/source/extra-examples/file-owners.cf new file mode 100644 index 0000000..0329172 --- /dev/null +++ b/source/extra-examples/file-owners.cf @@ -0,0 +1,34 @@ +bundle agent main { + + vars: + any:: + "file_owners" + data => '{ + "/etc/passwd": "root", + "/etc/shadow": "root", + "/tmp/myfile": "mike", + }'; + + any:: + "files" + slist => getindices("file_owners"); + + users: + any:: + "pete" + policy => "absent"; + + files: + any:: + "$(files)" + if => fileexists("$(files)"), + perms => owner("$(file_owners[$(files)])"); + +} + +# Needs standard library to work standalone +body file control { + inputs => { + "$(sys.libdir)/stdlib.cf", + }; +} diff --git a/source/extra-examples/filetimecompare.cf b/source/extra-examples/filetimecompare.cf new file mode 100644 index 0000000..41b952a --- /dev/null +++ b/source/extra-examples/filetimecompare.cf @@ -0,0 +1,25 @@ +bundle agent main { + + classes: + any:: + "motd_newer_than_passwd" + expression => isnewerthan("/etc/motd", "/etc/passwd"); + + reports: + motd_newer_than_passwd:: + "The motd file is newer than the passwd file."; + +} + +bundle common students { + + classes: + any:: + "student" + expression => "working_on_exercises"; + + any:: + "observer" + not => "working_on_exercises"; + +} diff --git a/source/extra-examples/five_files.cf b/source/extra-examples/five_files.cf new file mode 100644 index 0000000..b40e43e --- /dev/null +++ b/source/extra-examples/five_files.cf @@ -0,0 +1,28 @@ +bundle agent main { + + vars: + any:: + "files_to_create" + slist => { + "file1", + "file2", + "file3", + "file4", + "file5", + }; + + files: + any:: + "/tmp/$(files_to_create)" + create => "true"; + + vars: + any:: + "at_index_2" + string => nth("files_to_create", 2); + + reports: + any:: + "At index 2 is $(at_index_2)"; + +} diff --git a/source/extra-examples/methods.cf b/source/extra-examples/methods.cf new file mode 100644 index 0000000..955284f --- /dev/null +++ b/source/extra-examples/methods.cf @@ -0,0 +1,19 @@ +bundle agent main { + + reports: + any:: + "$(this.bundle)"; + + methods: + any:: + "apple"; + +} + +bundle agent apple { + + reports: + any:: + "$(this.bundle)"; + +} diff --git a/source/extra-examples/motd.cf b/source/extra-examples/motd.cf new file mode 100644 index 0000000..7855781 --- /dev/null +++ b/source/extra-examples/motd.cf @@ -0,0 +1,21 @@ +body file control { + inputs => { "$(sys.libdir)/stdlib.cf" }; +} + +bundle agent main { + + files: + any:: + "/etc/motd" + edit_defaults => backup_timestamp, + edit_line => insert_lines("Unauthorized use is forbidden"); + +} + +body agent control { + default_repository => "/var/cfengine/backups"; +} + +body copy_from my_local_cp(banana) { + source => "$(banana)"; +} diff --git a/source/extra-examples/phone_prices.json b/source/extra-examples/phone_prices.json new file mode 100644 index 0000000..630f465 --- /dev/null +++ b/source/extra-examples/phone_prices.json @@ -0,0 +1,5 @@ +{ + "Pixel" : "$800", + "Galaxy": "$700", + "iPhone": "$999", +} diff --git a/source/extra-examples/random.cf b/source/extra-examples/random.cf new file mode 100644 index 0000000..5fa2c11 --- /dev/null +++ b/source/extra-examples/random.cf @@ -0,0 +1,17 @@ +bundle agent main +{ + vars: + "low" string => "4"; + "high" string => "60"; + + "random" int => randomint($(low), $(high)); + classes: + "isabove" expression => isgreaterthan($(random), 3); + + reports: + isabove:: + "The generated random number was above 3"; + + any:: + "Randomly generated '$(random)'"; +} diff --git a/source/extra-examples/regex-markup-0.10.0-1.x86_64.rpm b/source/extra-examples/regex-markup-0.10.0-1.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..87c0c26cf364f990dc89080a47b1f57bc878eb88 GIT binary patch literal 63621 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 z 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 apple("baz"); + +} + +bundle agent banana { + + reports: + any:: + "This is the banana bundle."; + +} + +bundle agent apple(foo) { + + reports: + any:: + "The apple bundle received parameter $(foo)"; + +} diff --git a/source/extra-examples/stop_processes.cf b/source/extra-examples/stop_processes.cf new file mode 100644 index 0000000..a2937ec --- /dev/null +++ b/source/extra-examples/stop_processes.cf @@ -0,0 +1,16 @@ +bundle agent main { + + vars: + any:: + "process_blacklist" + slist => { + "eggdrop", + "trn", + }; + + processes: + any:: + "$(process_blacklist)" + signals => { "term", "kill" }; + +} diff --git a/source/extra-examples/vince.cf b/source/extra-examples/vince.cf new file mode 100644 index 0000000..a0cad00 --- /dev/null +++ b/source/extra-examples/vince.cf @@ -0,0 +1,31 @@ +bundle agent main { + + methods: + + "any" + comment => "make sure the specified group is always present", + usebundle => bundle_1; + +} + +bundle agent bundle_1 { + + classes: + any:: + "namespace_context" + scope => "namespace", + expression => "whatever"; + + methods: + any:: + "bundle_2"; + +} + + +bundle agent bundle_2 +{ + reports: + webserver:: + "Bundle bundle_1: I am a Web server"; +} diff --git a/source/extra-examples/webserver.cf b/source/extra-examples/webserver.cf new file mode 100644 index 0000000..a369388 --- /dev/null +++ b/source/extra-examples/webserver.cf @@ -0,0 +1,48 @@ +body file control { + inputs => { "$(sys.libdir)/stdlib.cf" }; +} + +body common control { + package_module => $(package_module_knowledge.platform_default); +} + +bundle agent main { + + methods: + any:: + "Set up as not a webserver" + usebundle => webserver("off"); + +} + +bundle agent webserver(on_or_off) { + + classes: + + any:: + "webserver_on" + expression => strcmp("$(on_or_off)", "on"); + + any:: + "webserver_off" + expression => strcmp("$(on_or_off)", "off"); + + packages: + webserver_on:: + "httpd" + policy => "present"; + + webserver_off:: + "httpd" + policy => "absent"; + + services: + webserver_on:: + "httpd" + service_policy => "start"; + + webserver_off:: + "httpd" + service_policy => "stop"; + +} diff --git a/source/extra-examples/whatever_filename.mustache b/source/extra-examples/whatever_filename.mustache new file mode 100644 index 0000000..ff9dbd1 --- /dev/null +++ b/source/extra-examples/whatever_filename.mustache @@ -0,0 +1,36 @@ +UNAUTHORIZED USE FORBIDDEN + +(This file is managed by CFEngine.) + +The organization is {{{vars.main.org}}} + +New reference to org: {{{org}}} + +This host is {{{vars.sys.fqhost}}} + +New reference to hostname: {{{hostname}}} + +{{#vars.sys.ip_addresses}} + One of its IP addresses is {{{.}}} +{{/vars.sys.ip_addresses}} + +{{#classes.linux}} +This is a linux host. + +{{#classes.ubuntu}} +This is an Ubuntu host. +{{/classes.ubuntu}} +{{^classes.ubuntu}} +This is not an Ubuntu host. +{{/classes.ubuntu}} + +{{#classes.centos}} +This is a CentOS host. +{{/classes.centos}} +{{^classes.centos}} +This is not a CentOS host. +{{/classes.centos}} +{{/classes.linux}} +{{^classes.linux}} +This is not a linux host. +{{/classes.linux}}