Skip to content

Commit

Permalink
Work in progress
Browse files Browse the repository at this point in the history
  • Loading branch information
gpoblon committed Mar 6, 2020
2 parents d25ff95 + f0bf4e3 commit 8dd633e
Show file tree
Hide file tree
Showing 18 changed files with 350 additions and 60 deletions.
26 changes: 13 additions & 13 deletions rudder-lang/libs/stdlib.rl
@@ -1,21 +1,21 @@
@format=0

resource kernel_module(p0)
resource file(p0)
resource variable(p0,p1)
resource environment(p0)
resource service(p0)
resource command(p0)
resource package(p0)
resource file(p0)
resource directory(p0)
resource http(p0)
resource user(p0)
resource permissions(p0)
resource group(p0)
resource condition(p0)
resource schedule(p0)
resource kernel_module(p0)
resource monitoring(p0)
resource package(p0)
resource sharedfile(p0)
resource group(p0)
resource http_request(p0,p1)
resource permissions(p0)
resource user(p0)
resource monitoring(p0)
resource directory(p0)
resource environment(p0)

command state execution(){}
command state execution_once(p1,p2,p3){}
Expand Down Expand Up @@ -101,8 +101,8 @@ file state symlink_present_option(p1,p2){}
file state template_expand(p1,p2,p3,p4){}
group state absent(){}
group state present(){}
http state request_check_status_headers(p1,p2,p3){}
http state request_content_headers(p1,p2,p3){}
http_request state check_status_headers(p2,p3){}
http_request state content_headers(p2,p3){}
kernel_module state configuration(p1){}
kernel_module state enabled_at_boot(){}
kernel_module state loaded(){}
Expand Down Expand Up @@ -180,8 +180,8 @@ variable state iterator(p2,p3){}
variable state iterator_from_file(p2,p3,p4){}
variable state string(p2){}
variable state string_default(p2,p3){}
variable state string_escaped(){}
variable state string_from_command(p2){}
variable state string_from_file(p2){}
variable state string_from_math_expression(p2,p3){}
variable state string_match(){}

31 changes: 22 additions & 9 deletions rudder-lang/src/generators/cfengine.rs
Expand Up @@ -84,18 +84,30 @@ impl CFEngine {
}
fn format_case_expr(&mut self, gc: &AST, case: &EnumExpression) -> Result<String> {
Ok(match case {
EnumExpression::And(e1, e2) => format!(
"({}).({})",
self.format_case_expr(gc, e1)?,
self.format_case_expr(gc, e2)?
),
EnumExpression::And(e1, e2) => {
let mut lexpr = self.format_case_expr(gc, e1)?;
let mut rexpr = self.format_case_expr(gc, e2)?;
if lexpr.contains("|") {
lexpr = format!("({})", lexpr);
}
if rexpr.contains("|") {
rexpr = format!("({})", rexpr);
}
format!("{}.{}", lexpr, rexpr)
},
EnumExpression::Or(e1, e2) => format!(
"({})|({})",
"{}|{}",
self.format_case_expr(gc, e1)?,
self.format_case_expr(gc, e2)?
),
// TODO what about classes that have not yet been set ? can it happen ?
EnumExpression::Not(e1) => format!("!({})", self.format_case_expr(gc, e1)?),
EnumExpression::Not(e1) => {
let mut expr = self.format_case_expr(gc, e1)?;
if expr.contains("|") || expr.contains("&") {
expr = format!("!({})", expr);
}
format!("!{}", expr)
},
EnumExpression::Compare(var, e, item) => {
if gc.enum_list.is_global(*e) {
let final_enum = gc.enum_list.find_descendant_enum(*e, *item);
Expand Down Expand Up @@ -168,8 +180,9 @@ impl CFEngine {
", ",
)?;
let class = self.format_class(in_class)?;
let state_param = if sd.state_params.len() > 0 {
if let Ok(param) = self.parameter_to_cfengine(&sd.state_params[0]) {
println!("state param empty ? {:#?}", sd.state_params);
let state_param = if sd.resource_params.len() > 0 {
if let Ok(param) = self.parameter_to_cfengine(&sd.resource_params[0]) {
format!(", {}", param)
} else {
"".to_string()
Expand Down
21 changes: 13 additions & 8 deletions rudder-lang/src/translate.rs
Expand Up @@ -360,7 +360,11 @@ fn translate_condition(_config: &toml::Value, cond: &str) -> Result<String> {
// matches a word that can be negative and that be followed by .| + word... possibly wrapped into parenthesis
static ref OS_RE: Regex = Regex::new(
// OS part: debian_9_0 \ And optional condition: (!(ubuntu|otheros).something)
r"^\(?(?P<os>([a-zA-Z\d]+)(_([a-zA-Z\d]+))*(\|([a-zA-Z\d]+)(_([a-zA-Z\d]+))*)*)\)?(.(?P<cdt>\(\(*!*\(*\w+\)*([.|]\(*!*\(*\w+\)*)*\)))?$"
// r"^\(?(?P<os>([a-zA-Z\d]+)(_([a-zA-Z\d]+))*(\|([a-zA-Z\d]+)(_([a-zA-Z\d]+))*)*)\)?(.(?P<cdt>\(\(*!*\(*\w+\)*([.|]\(*!*\(*\w+\)*)*\)))?$"
r"^(\(*\w+\(*\)*(\||\.)\(*\w+\)*)*$"
).unwrap();
static ref AND_RE: Regex = Regex::new(
r"^[^\.]+((?P<and>\.)[^\.]+)*$"
).unwrap();
}

Expand Down Expand Up @@ -390,15 +394,16 @@ fn translate_condition(_config: &toml::Value, cond: &str) -> Result<String> {
cond
)))
}
let os = OS_RE.replace_all(cond, "$os");
let mut result = os.to_string();
let cdt = OS_RE.replace_all(cond, "$cdt");
if cdt.len() > 0 {
result.push_str(&format!("&& {}", cdt));
};
// let os = OS_RE.replace_all(cond, "$os");
// let mut result = os.to_string();
// let cdt = OS_RE.replace_all(cond, "$cdt");
// if cdt.len() > 0 {
// result.push_str(&format!(" & {}", cdt));
// };
let transformed_and = cond.replace(".", "&");
// TODO here we consider any match is an os match, should we have an OS whitelist ?
// OS are global enum so we don't have to say which enum to match
return Ok(result.into());
return Ok(transformed_and.into());
}

// TODO detect condition expressions
Expand Down
Expand Up @@ -8,7 +8,7 @@ bundle agent conditional_method_technique
vars:
"resources_dir" string => "${this.promise_dirname}/resources";
methods:
"HTTP request check status with headers_${report_data.directive_id}_0" usebundle => _method_reporting_context("HTTP request check status with headers", "/myurl"),
"HTTP request check status with headers_${report_data.directive_id}_0" usebundle => _method_reporting_context("HTTP request check status with headers", "GET"),
if => concat("debian");
"HTTP request check status with headers_${report_data.directive_id}_0" usebundle => http_request_check_status_headers("GET", "/myurl", "200", ""),
if => concat("debian");
Expand Down
34 changes: 34 additions & 0 deletions rudder-lang/tests/test_files/tester/parameters/technique.json
@@ -0,0 +1,34 @@
{
"name": "parameters",
"description": "technique using parameters",
"version": "1.0",
"parameter": [
{
"name": "paramtest",
"id": "d74a03dd-5b0b-4b06-8dcf-b4e0cb387c60",
"constraints": {
"allow_whitespace_string": false,
"allow_empty_string": false,
"max_length": 16384
},
"type": "string"
}
],
"bundle_name": "parameters",
"bundle_args": [
"paramtest"
],
"method_calls": [
{
"class_context": "any",
"component": "Package absent",
"method_name": "package_absent",
"args": [
"vpn",
"",
"",
""
]
}
]
}
14 changes: 14 additions & 0 deletions rudder-lang/tests/test_files/tester/parameters/technique.rl
@@ -0,0 +1,14 @@
# This file has been generated with rltranslate
@format=0

@name="parameters"
@description="technique using parameters"
@version="1.0"
@parameters=[{"constraints":{"allow_empty_string":false,"allow_whitespace_string":false,"max_length":16384},"id":"d74a03dd-5b0b-4b06-8dcf-b4e0cb387c60","name":"paramtest","type":"string"}]

resource parameters(paramtest)

parameters state technique() {
@component = "Package absent"
package("vpn").absent("","","") as package_absent_vpn
}
14 changes: 14 additions & 0 deletions rudder-lang/tests/test_files/tester/parameters/technique.rl.cf
@@ -0,0 +1,14 @@
# generated by rudder-lang
# @name parameters
# @description technique using parameters
# @version 1.0
# @parameter { "name": "paramtest", "id": "d74a03dd-5b0b-4b06-8dcf-b4e0cb387c60", "constraints": { "max_length":16384,"allow_empty_string":1,"allow_whitespace_string":1 } }

bundle agent parameters_technique(paramtest)
{
vars:
"resources_dir" string => "${this.promise_dirname}/resources";
methods:
"Package absent_${report_data.directive_id}_0" usebundle => _method_reporting_context("Package absent", "vpn");
"Package absent_${report_data.directive_id}_0" usebundle => package_absent("vpn", "", "", "");
}
@@ -0,0 +1,34 @@
{
"name": "parameters",
"description": "technique using parameters",
"version": "1.0",
"parameter": [
{
"name": "paramtest",
"id": "d74a03dd-5b0b-4b06-8dcf-b4e0cb387c60",
"constraints": {
"allow_whitespace_string": false,
"allow_empty_string": false,
"max_length": 16384
},
"type": "string"
}
],
"bundle_name": "parameters_technique",
"bundle_args": [
"paramtest"
],
"method_calls": [
{
"class_context": "any",
"component": "Package absent",
"method_name": "package_absent",
"args": [
"vpn",
"",
"",
""
]
}
]
}
45 changes: 45 additions & 0 deletions rudder-lang/tests/test_files/tester/parameters_mult/technique.json
@@ -0,0 +1,45 @@
{
"name": "parameters mult",
"description": "technique using multiple parameters",
"version": "1.0",
"parameter": [
{
"name": "paramtest",
"id": "d74a03dd-5b0b-4b06-8dcf-b4e0cb387c60",
"constraints": {
"allow_whitespace_string": false,
"allow_empty_string": false,
"max_length": 16384
},
"type": "string"
},
{
"name": "12",
"id": "6e82d276-1181-4596-8fd8-bc3c007ae9ff",
"constraints": {
"allow_whitespace_string": false,
"allow_empty_string": false,
"max_length": 16384
},
"type": "string"
}
],
"bundle_name": "parameters_mult",
"bundle_args": [
"paramtest",
"12"
],
"method_calls": [
{
"class_context": "any",
"component": "Package absent",
"method_name": "package_absent",
"args": [
"vpn",
"",
"",
""
]
}
]
}
14 changes: 14 additions & 0 deletions rudder-lang/tests/test_files/tester/parameters_mult/technique.rl
@@ -0,0 +1,14 @@
# This file has been generated with rltranslate
@format=0

@name="parameters mult"
@description="technique using multiple parameters"
@version="1.0"
@parameters=[{"constraints":{"allow_empty_string":false,"allow_whitespace_string":false,"max_length":16384},"id":"d74a03dd-5b0b-4b06-8dcf-b4e0cb387c60","name":"paramtest","type":"string"},{"constraints":{"allow_empty_string":false,"allow_whitespace_string":false,"max_length":16384},"id":"6e82d276-1181-4596-8fd8-bc3c007ae9ff","name":"12","type":"string"}]

resource parameters_mult(paramtest,12)

parameters_mult state technique() {
@component = "Package absent"
package("vpn").absent("","","") as package_absent_vpn
}
@@ -0,0 +1,15 @@
# generated by rudder-lang
# @name parameters mult
# @description technique using multiple parameters
# @version 1.0
# @parameter { "name": "paramtest", "id": "d74a03dd-5b0b-4b06-8dcf-b4e0cb387c60", "constraints": { "allow_empty_string":1,"max_length":16384,"allow_whitespace_string":1 } }
# @parameter { "name": "12", "id": "6e82d276-1181-4596-8fd8-bc3c007ae9ff", "constraints": { "allow_whitespace_string":1,"allow_empty_string":1,"max_length":16384 } }

bundle agent parameters_mult_technique(paramtest,12)
{
vars:
"resources_dir" string => "${this.promise_dirname}/resources";
methods:
"Package absent_${report_data.directive_id}_0" usebundle => _method_reporting_context("Package absent", "vpn");
"Package absent_${report_data.directive_id}_0" usebundle => package_absent("vpn", "", "", "");
}
@@ -0,0 +1,45 @@
{
"name": "parameters mult",
"description": "technique using multiple parameters",
"version": "1.0",
"parameter": [
{
"name": "paramtest",
"id": "d74a03dd-5b0b-4b06-8dcf-b4e0cb387c60",
"constraints": {
"allow_whitespace_string": false,
"allow_empty_string": false,
"max_length": 16384
},
"type": "string"
},
{
"name": "12",
"id": "6e82d276-1181-4596-8fd8-bc3c007ae9ff",
"constraints": {
"allow_whitespace_string": false,
"allow_empty_string": false,
"max_length": 16384
},
"type": "string"
}
],
"bundle_name": "parameters_mult_technique",
"bundle_args": [
"paramtest",
"12"
],
"method_calls": [
{
"class_context": "any",
"component": "Package absent",
"method_name": "package_absent",
"args": [
"vpn",
"",
"",
""
]
}
]
}
Expand Up @@ -8,7 +8,7 @@ bundle agent simplest_technique
vars:
"resources_dir" string => "${this.promise_dirname}/resources";
methods:
"File absent_${report_data.directive_id}_0" usebundle => _method_reporting_context("File absent"),
"File absent_${report_data.directive_id}_0" usebundle => _method_reporting_context("File absent", "tmp"),
if => concat("scientific_linux");
"File absent_${report_data.directive_id}_0" usebundle => file_absent("tmp"),
if => concat("scientific_linux");
Expand Down

0 comments on commit 8dd633e

Please sign in to comment.