syntaxcfengine

CFE syntax errors


Trying to write a cfengine3 promise that will take an entire directory and move it down one level.

I've used my policy hub to distribute the promise, but I've not yet folded it into my active promise.cf

Here's the promise:

body common control

{

        bundlesequence => { dirstructure };
}


#Find out by existance of directories if filesystem is old structure or new
#Set classes for each instance. If old, copy down one level.
#If new file system already, pat yourself on the back

bundle agent dirstructure
{     
classes:

    "oldFILEstructure"expression => isdir("/old/dir/structure/");
    "newFILEstructure" expression => isdir("/new/dir/structure/");


reports:

    oldFILEstructure::
        "system has old file structure..";
    newFILEstructure::
        "system has new file structure..";

methods:
    oldFILEstructure::
        "migratedirectories" usebundle => movedirectories
}

bundle agent movedirectories

{
files:
        "/new/dir/"

        copy_from => local_cp ("/old/dir/structure/.");
        depth_search => recurse ("inf");
}

I've used this "isdir" source and this example for local_cp, both from CFE to base the promise on. When invoked, I get the following error output and I'm trying to figure out why.

:/var/cfengine/inputs/standalone# cf-agent --no-lock --inform --file ./file_structure.cf
./file_structure.cf:41:12: error: syntax error
depth_search => recurse ("inf");
           ^
./file_structure.cf:41:12: error: Expected promiser string, got 'depth_search'
depth_search => recurse ("inf");
           ^
./file_structure.cf:41:15: error: Expected ';', got '=>'
depth_search => recurse ("inf");
              ^
./file_structure.cf:41:23: error: Expected promiser string, got 'recurse'
depth_search => recurse ("inf");
                      ^
./file_structure.cf:41:25: error: Expected ';', got '('
depth_search => recurse ("inf");
                        ^
./file_structure.cf:41:31: error: Expected ';', got ')'
depth_search => recurse ("inf");
                              ^
./file_structure.cf:41:32: error: Expected promiser string, got ';'
depth_search => recurse ("inf");
                               ^
./file_structure.cf:42:1: error: Expected ';', got '}'
}

Solution

  • files:
            "/new/dir/"
    
            copy_from => local_cp ("/old/dir/structure/.");
            depth_search => recurse ("inf");
    }
    

    You have an extra semicolon at the end of the copy_from line.

    A semicolon ; identifies the end of a promise. Try switching the semicolon at the end of the copy_from line to a comma ,.

    files:
            "/new/dir/"
    
            copy_from => local_cp ("/old/dir/structure/."),
            depth_search => recurse ("inf");
    }
    

    Additionally you may want to check out the transformer attribute. It may or may not be a good use for your case.\

    bundle agent example
    {
        files:
          "/old/dir/structure" -> { "jira:EXAMPLE-1234" }
            transformer => "/bin/mv /old/dir/structure /new/dir/structure",
            comment => "The standard is to use the new location because x, y, z. Bad thing Q or U might happen if this is not managed properly.";
    }