const regex = /(cmd|command)\s+?=\s?\\?(.*\"|concat\s?\{(?:(?:\{(?:(?:\{(?:[^{}])*\})|(?:[^{}]))*\})|(?:[^{}]))*\})/gm;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('(cmd|command)\\s+?=\\s?\\\\?(.*\\"|concat\\s?\\{(?:(?:\\{(?:(?:\\{(?:[^{}])*\\})|(?:[^{}]))*\\})|(?:[^{}]))*\\})', 'gm')
const str = `<?xml version="1.0" encoding="UTF-8"?>
<unload unload_date="2021-09-23 23:48:46">
<sa_pattern action="INSERT_OR_UPDATE">
<active>true</active>
<ci_type>cmdb_ci_appl_generic</ci_type>
<cpattern_type>2</cpattern_type>
<description/>
<directory>false</directory>
<enforce_proc_classy>false</enforce_proc_classy>
<has_draft>false</has_draft>
<invoke_per_account>false</invoke_per_account>
<metadata_id>0ae107e39f2032001d753758442e70ec</metadata_id>
<name>Linux - Network</name>
<ndl>library {
name = "Linux - Network"
id = "0ae107e39f2032001d753758442e70ec"
description = "null"
step {
name = "Check kernel version"
runcmd_to_var {
cmd = "uname -r |cut -d'.' -f1"
var_names = "kernel"
parsing_strategy = delimited_parsing {
selected_positions = 1
}
if_not_found_do = nop {}
cache_flag = 0
}
}
step {
name = "Get Interfaces"
if {
condition = neq {
get_attr {"use_net_tools"}
"false"
}
on_true = runcmd_to_var {
cmd = "ifconfig -a | awk '{line=\$0} {printf \\"%s\\",line!=\\"\\"?line:\\"\\\\n\\"}'"
var_names = table {
name = "interfaces"
col_names = "interface_data"
}
parsing_strategy = delimited_parsing {
selected_positions = 1
}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "Failover: Get Interfaces"
set_attr {
"tmp"
eval {"javascript: var rtn = \\"\\";
var command = \\"ip addr\\";
var response = CTX.getCommandManager().shellCommand(command, false, null, null, CTX);
var spl = response.split(\\"\\\\n\\");
var reg = /^\\\\d+:\\\\s+/;
var data = \\"\\";
var interfaceData = spl[0];
var match = /^\\\\d+:\\\\s+(.*)/.exec(interfaceData);
var reqtext = '';
if(match){
reqtext = match[1];
if(reqtext.slice(-1)==':'){
reqtext = reqtext.slice(0, -1);
}
}
data = data + reqtext;
var new_table = new Packages.java.util.ArrayList();
var row = new Packages.java.util.HashMap();
for(var i=1;i<spl.length;i++) {
if(reg.test(spl[i])) {
var row = new Packages.java.util.HashMap();
row.put(\\"interface_data\\",data);
new_table.add(row)
data = \\"\\";
interfaceData = spl[i];
match = /^\\\\d+:\\\\s+(.*)/.exec(interfaceData);
reqtext = '';
if(match){
reqtext = match[1];
if(reqtext.slice(-1)==':'){
reqtext = reqtext.slice(0, -1);
}
}
data = data + reqtext;
} else {
data = data + \\" \\" + spl[i];
}
}
var row = new Packages.java.util.HashMap();
row.put(\\"interface_data\\",data);
new_table.add(row)
CTX.setAttribute('interfaces_ss', new_table); "}
}
}
step {
name = "merge interfaces and interfaces_ss"
if {
condition = any {
is_not_empty {get_attr {"interfaces"}}
is_not_empty {get_attr {"interfaces_ss"}}
}
on_true = union {
table1_name = "interfaces"
table2_name = "interfaces_ss"
result_table_name = "interfaces"
}
on_false = nop {}
}
}
step {
name = "Extract interface data - for kernel 3 and above"
if {
condition = any {
eq {
get_attr {"kernel"}
"3"
}
eq {
get_attr {"kernel"}
"4"
}
}
on_true = set_attr {
"interface_data_kernel3"
eval {"javascript: var rtn = \\"\\";
var command = \\"ip -o link show\\";
var response = CTX.getCommandManager().shellCommand(command, false, null, null, CTX);
var spl = response.split(\\" \\");
var data = \\"\\";
var flag = false;
for(var i = 0 ; i < spl.length; i++){
if (i == 1){
data = spl[i].replace(\\":\\",\\"\\");
}
if(flag == true){
flag = false;
data = data + \\" \\" +spl[i] + \\" \\" + \\"NEWLINE\\";
}
if(spl[i].includes(\\"link/\\")){
flag = true;
}
if(spl[i].includes(\\"brd\\")){
i = i + 2;
if(i < spl.length)
data = data +\\" \\" +spl[i].replace(\\":\\",\\"\\");
}
}
rtn = data;"}
}
on_false = nop {}
}
}
step {
name = "Get interface names & Mac - for kernel 3 and above"
if {
condition = any {
eq {
get_attr {"kernel"}
"3"
}
eq {
get_attr {"kernel"}
"4"
}
}
on_true = parse_var_to_var {
from_var_name = "interface_data_kernel3"
to_var_names = table {
name = "interfaces_kernel3"
col_names = "name","mac"
}
parsing_strategy = delimited_parsing {
delimiters = " "
selected_positions = 1,2
line_seperator = "NEWLINE"
}
if_not_found_do = nop {}
}
on_false = nop {}
}
}
step {
name = "Gateway - for kernel 3 and above"
if {
condition = any {
eq {
get_attr {"kernel"}
"3"
}
eq {
get_attr {"kernel"}
"4"
}
}
on_true = runcmd_to_var {
cmd = "ip route list | awk ' /^default/ {print \$3}'"
var_names = table {
name = "gateway_kernel3"
col_names = "DefGateway"
}
parsing_strategy = delimited_parsing {
selected_positions = 1
}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "Extract interface name and MAC (if exists) from interfaces data"
if {
condition = is_not_empty {get_attr {"interfaces"}}
on_true = transform {
src_table_name = "interfaces"
target_table_name = "interfaces"
operation {
set_field {
field_name = "name"
value = eval {"javascript:
var rtrn = '';
var interfaceData = \${interfaces[].interface_data};
var match = /([^:\\\\s]+).*/.exec(interfaceData);
var interfaceName='';
if(match){
interfaceName = match[1];
if(interfaceName.slice(-1)==':'){
interfaceName = interfaceName.slice(0, -1);
}
}
rtrn = interfaceName;
"}
}
set_field {
field_name = "mac_address"
value = eval {"javascript:
var rtrn = '';
var interfaceData = \${interfaces[].interface_data};
var match = /[^0-9\\\\s]+\\\\S+\\\\s*:?.*HWaddr (\\\\S+)/.exec(interfaceData);
if(!match){
match = /ether (\\\\S+)/.exec(interfaceData);
}
rtrn = match?match[1]:'';
"}
}
}
}
on_false = nop {}
}
}
step {
name = "Remove interfaces without name and MAC"
if {
condition = is_not_empty {get_attr {"interfaces"}}
on_true = filter {
src_table_name = "interfaces"
target_table_name = "interfaces"
condition = all {
is_not_empty {get_attr {"interfaces[].name"}}
is_not_empty {get_attr {"interfaces[].mac_address"}}
}
}
on_false = nop {}
}
}
step {
name = "remove duplicates from interfaces"
set_attr {
"tmp"
eval {"javascript: var tableWithoutDuplicates = '';
tableWithoutDuplicates = DuplicateRemover.removeDuplicates(\${interfaces},[\\"name\\",\\"mac_address\\"]);
CTX.setAttribute(\\"interfaces\\", tableWithoutDuplicates);
"}
}
}
step {
name = "Separate IPs"
if {
condition = is_not_empty {get_attr {"interfaces"}}
on_true = parse_var_to_var {
from_var_name = "interfaces[*].interface_data"
to_var_names = table {
name = "ip_addresses"
col_names = "ip_address_data"
}
parsing_strategy = delimited_parsing {
selected_positions = 1
line_seperator = "inet"
}
if_not_found_do = nop {}
}
on_false = nop {}
}
}
step {
name = "Extract IPv4 and netmask from IPs data"
if {
condition = is_not_empty {get_attr {"ip_addresses"}}
on_true = transform {
src_table_name = "ip_addresses"
target_table_name = "ip_v4_addresses"
operation {
set_field {
field_name = "ip"
value = eval {"javascript: var rtrn = '';
var ipAddressData = \${ip_addresses[].ip_address_data};
var patt = /\\\\s?(?:addr:)?(\\\\S+).*?(?:(?:mask:)|(?:netmask ))\\\\S+/gi;
var fip = /^(?:\\\\s+)?(addr:)?(\\\\d+.\\\\d+.\\\\d+.\\\\d+)/gi;
var match = patt.exec(ipAddressData);
var fmatch = fip.exec(ipAddressData);
if(match) {
rtrn = match[1];
} else {
if(fmatch) {
rtrn = fmatch[0];
}
else{
rtrn ='';
}
}
rtrn;"}
}
set_field {
field_name = "netmask"
value = eval {"javascript: var rtrn = '';
var ipAddressData = \${ip_addresses[].ip_address_data};
var patt = /\\\\s?(?:addr:)?\\\\S+.*?(?:(?:mask:)|(?:netmask ))(\\\\S+)/gi;
var match = patt.exec(ipAddressData);
rtrn = match?match[1]:'';
if(match) {
match[1];
} else {
var fmaskpatt = /^.*\\\\d+.\\\\d+.\\\\d+.\\\\d+\\\\/([^\\\\s]+).*/gi;
var fmatch = fmaskpatt.exec(ipAddressData);
if(fmatch) {
try{
if (fmatch[1]){
function createNetmaskAddr(bitCount) {
var mask=[];
for(i=0;i<4;i++) {
var n = Math.min(bitCount, 8);
mask.push(256 - Math.pow(2, 8-n));
bitCount -= n;
}
return mask.join('.');
}
rtrn = createNetmaskAddr(fmatch[1]);
}
} catch(e){
ms.log(\\"Linux Server pattern step Subnet Mask for ip v4 - for kernel 3 and above failed with error: \\" + e);
}
} else {
rtrn = '';
}
}
"}
}
set_field {
field_name = "version"
value = "4"
}
}
}
on_false = nop {}
}
}
step {
name = "Get ip v4 - for kernel 3 and above"
if {
condition = any {
eq {
get_attr {"kernel"}
"3"
}
eq {
get_attr {"kernel"}
"4"
}
}
on_true = runcmd_to_var {
cmd = "ip -4 -o addr show | awk '{print \$2,\$4}'"
var_names = table {
name = "ip_v4_kernel"
col_names = "interface_name","ip","net_mask_bits"
}
parsing_strategy = delimited_parsing {
delimiters = "/"," "
selected_positions = 1,2,3
}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "Subnet Mask for ip v4 - for kernel 3 and above"
if {
condition = any {
eq {
get_attr {"kernel"}
"3"
}
eq {
get_attr {"kernel"}
"4"
}
}
on_true = transform {
src_table_name = "ip_v4_kernel"
target_table_name = "ip_v4_kernel"
operation {set_field {
field_name = "netmask"
value = eval {"javascript:
try{
if (\${ip_v4_kernel[].net_mask_bits}){
function createNetmaskAddr(bitCount) {
var mask=[];
for(i=0;i<4;i++) {
var n = Math.min(bitCount, 8);
mask.push(256 - Math.pow(2, 8-n));
bitCount -= n;
}
return mask.join('.');
}
createNetmaskAddr(\${ip_v4_kernel[].net_mask_bits});
}
} catch(e){
ms.log(\\"Linux Server pattern step Subnet Mask for ip v4 - for kernel 3 and above failed with error: \\" + e);
}
"}
}}
}
on_false = nop {}
}
}
step {
name = "Transform IP v4 - for kernel 3 and above"
if {
condition = any {
eq {
get_attr {"kernel"}
"3"
}
eq {
get_attr {"kernel"}
"4"
}
}
on_true = transform {
src_table_name = "ip_v4_kernel"
target_table_name = "ip_v4_kernel"
operation {
set_field {
field_name = "ip"
value = get_attr {"ip_v4_kernel[].ip"}
}
set_field {
field_name = "netmask"
value = get_attr {"ip_v4_kernel[].netmask"}
}
set_field {
field_name = "version"
value = "4"
}
}
}
on_false = nop {}
}
}
step {
name = "Extract IPv6 and netmask from IPs data"
if {
condition = is_not_empty {get_attr {"ip_addresses"}}
on_true = transform {
src_table_name = "ip_addresses"
target_table_name = "ip_v6_addresses"
operation {
set_field {
field_name = "ip"
value = eval {"javascript: var rtrn = '';
var ipAddressData = \${ip_addresses[].ip_address_data};
var patt = /6 (?:addr: )?(\\\\S+)(?:\\\\/|(?:\\\\s+prefixlen ))\\\\d*/gi;
var match = patt.exec(ipAddressData);
rtrn = match?match[1]:'';
"}
}
set_field {
field_name = "netmask"
value = eval {"javascript: var rtrn = '';
var ipAddressData = \${ip_addresses[].ip_address_data};
var patt = /6 (?:addr: )?\\\\S+(?:\\\\/|(?:\\\\s+prefixlen ))(\\\\d*)/gi;
var match = patt.exec(ipAddressData);
rtrn = match?match[1]:'';
"}
}
set_field {
field_name = "version"
value = "6"
}
}
}
on_false = nop {}
}
}
step {
name = "Get ip v6 - for kernel 3 and above"
if {
condition = any {
eq {
get_attr {"kernel"}
"3"
}
eq {
get_attr {"kernel"}
"4"
}
}
on_true = runcmd_to_var {
cmd = "ip -6 -o a| awk '{print \$2,\$4}'"
var_names = table {
name = "ip_v6_kernel"
col_names = "interface_name","ip"
}
parsing_strategy = delimited_parsing {
delimiters = " ","/"
selected_positions = 1,2
}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "Subnet Mask for ip v6 - for kernel 3 and above"
if {
condition = any {
eq {
get_attr {"kernel"}
"3"
}
eq {
get_attr {"kernel"}
"4"
}
}
on_true = runcmd_to_var {
cmd = "ip=\$(ip -6 -o addr show | awk '{print \$4}' | tail -1 | cut -d'/' -f2);i=0;mask='';full_octets=\$((\$ip/8));partial_octet=\$((\$ip%8));for ((i=0;i<4;i+=1)); do if [ \$i -lt \$full_octets ]; then mask+=255; elif [ \$i -eq \$full_octets ]; then mask+=\$((256 - 2**(8-\$partial_octet))); else mask+=0; fi; test \$i -lt 3 && mask+=. ;done;echo \$mask;"
var_names = table {
name = "subnet_v6"
col_names = "subnet_mask_v6"
}
parsing_strategy = delimited_parsing {
selected_positions = 1
}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "Transform IP v6 - for kernel 3 and above"
if {
condition = any {
eq {
get_attr {"kernel"}
"3"
}
eq {
get_attr {"kernel"}
"4"
}
}
on_true = transform {
src_table_name = "ip_v6_kernel"
target_table_name = "ip_v6_kernel"
operation {
set_field {
field_name = "ip"
value = get_attr {"ip_v6_kernel[].ip"}
}
set_field {
field_name = "netmask"
value = get_attr {"subnet_v6[1].subnet_mask_v6"}
}
set_field {
field_name = "version"
value = "6"
}
}
}
on_false = nop {}
}
}
step {
name = "Union IPs tables"
union {
table1_name = "ip_v4_addresses"
table2_name = "ip_v6_addresses"
result_table_name = "ip_addresses"
}
}
step {
name = "Union ip_addresses - for kernel 3 and above"
if {
condition = any {
eq {
get_attr {"kernel"}
"3"
}
eq {
get_attr {"kernel"}
"4"
}
}
on_true = union {
table1_name = "ip_v4_kernel"
table2_name = "ip_v6_kernel"
result_table_name = "ip_addresses_final"
}
on_false = nop {}
}
}
step {
name = "Filter IP addresses final - for kernel 3 and above"
if {
condition = any {
eq {
get_attr {"kernel"}
"3"
}
eq {
get_attr {"kernel"}
"4"
}
}
on_true = filter {
src_table_name = "ip_addresses_final"
target_table_name = "ip_addresses_final"
condition = all {
neq {
get_attr {"ip_addresses_final[].ip"}
"127.0.0.1"
}
neq {
get_attr {"ip_addresses_final[].ip"}
"0.0.0.0"
}
neq {
get_attr {"ip_addresses_final[].ip"}
"255.255.255.255"
}
neq {
get_attr {"ip_addresses_final[].ip"}
"::1"
}
}
}
on_false = nop {}
}
}
step {
name = "Merge IP & interfaces tables - for kernel 3 and above"
if {
condition = any {
eq {
get_attr {"kernel"}
"3"
}
eq {
get_attr {"kernel"}
"4"
}
}
on_true = merge {
table1_name = "interfaces_kernel3"
table2_name = "ip_addresses_final"
result_table_name = "interfaces_kernel3"
unmatched_lines = remove
condition = contains {
get_attr {"interfaces_kernel3[].name"}
get_attr {"ip_addresses_final[].interface_name"}
}
}
on_false = nop {}
}
}
step {
name = "Remove lines that doesn't represent an IP"
filter {
src_table_name = "ip_addresses"
target_table_name = "ip_addresses"
condition = all {
is_not_empty {get_attr {"ip_addresses[].ip"}}
is_not_empty {get_attr {"ip_addresses[].netmask"}}
}
}
}
step {
name = "Filter unwanted IPs"
filter {
src_table_name = "ip_addresses"
target_table_name = "ip_addresses"
condition = all {
neq {
get_attr {"ip_addresses.ip"}
"127.0.0.1"
}
neq {
get_attr {"ip_addresses.ip"}
"0.0.0.0"
}
neq {
get_attr {"ip_addresses.ip"}
"255.255.255.255"
}
not_contains {
get_attr {"ip_addresses.ip"}
"::1"
}
not_contains {
get_attr {"ip_addresses.ip"}
"::"
}
}
}
}
step {
name = "Match each IP to its interface"
merge {
table1_name = "ip_addresses"
table2_name = "interfaces"
result_table_name = "ip_addresses"
unmatched_lines = remove
condition = contains {
get_attr {"interfaces[].interface_data"}
get_attr {"ip_addresses[].ip_address_data"}
}
}
}
step {
name = "Update cmdb_ci_ip_address table"
transform {
src_table_name = "ip_addresses"
target_table_name = "cmdb_ci_ip_address"
operation {
set_field {
field_name = "ip_address"
value = get_attr {"ip_addresses[].ip"}
}
set_field {
field_name = "netmask"
value = get_attr {"ip_addresses[].netmask"}
}
set_field {
field_name = "ip_version"
value = get_attr {"ip_addresses[].version"}
}
set_field {
field_name = "name"
value = get_attr {"ip_addresses[].name"}
}
}
}
}
step {
name = "Update cmdb_ci_ip_address table - for kernel 3 and above"
if {
condition = any {
eq {
get_attr {"kernel"}
"3"
}
eq {
get_attr {"kernel"}
"4"
}
}
on_true = transform {
src_table_name = "ip_addresses_final"
target_table_name = "cmdb_ci_ip_address"
operation {
set_field {
field_name = "ip_address"
value = get_attr {"ip_addresses_final[].ip"}
}
set_field {
field_name = "netmask"
value = get_attr {"ip_addresses_final[].netmask"}
}
set_field {
field_name = "ip_version"
value = get_attr {"ip_addresses_final[].version"}
}
set_field {
field_name = "name"
value = get_attr {"ip_addresses_final[].interface_name"}
}
}
}
on_false = nop {}
}
}
step {
name = "Remove duplicate IP addresses"
set_attr {
"dump_var"
eval {"javascript:
var tableWithoutDuplicates = '';
tableWithoutDuplicates = DuplicateRemover.removeDuplicates(\${cmdb_ci_ip_address},[\\"ip_address\\",\\"netmask\\"]);
CTX.setAttribute(\\"cmdb_ci_ip_address\\", tableWithoutDuplicates);
"}
}
}
step {
name = "Remove interfaces without IP"
merge {
table1_name = "ip_addresses"
table2_name = "interfaces"
result_table_name = "interfaces"
unmatched_lines = remove
condition = contains {
get_attr {"interfaces[].interface_data"}
get_attr {"ip_addresses[].ip_address_data"}
}
}
}
step {
name = "Remove duplicate interfaces"
set_attr {
"dump_var"
eval {"javascript:
var tableWithoutDuplicates = '';
tableWithoutDuplicates = DuplicateRemover.removeDuplicates(\${interfaces},\\"name\\");
CTX.setAttribute(\\"interfaces\\", tableWithoutDuplicates);
"}
}
}
step {
name = "Update cmdb_ci_network_adapter table"
transform {
src_table_name = "interfaces"
target_table_name = "cmdb_ci_network_adapter"
operation {
set_field {
field_name = "name"
value = get_attr {"interfaces[].name"}
}
set_field {
field_name = "ip_address"
value = get_attr {"interfaces[].ip"}
}
set_field {
field_name = "mac_address"
value = get_attr {"interfaces[].mac_address"}
}
set_field {
field_name = "netmask"
value = get_attr {"interfaces[].netmask"}
}
}
}
}
step {
name = "Update cmdb_ci_network_adapter table - for kernel and above"
if {
condition = any {
eq {
get_attr {"kernel"}
"3"
}
eq {
get_attr {"kernel"}
"4"
}
}
on_true = transform {
src_table_name = "interfaces_kernel3"
target_table_name = "cmdb_ci_network_adapter"
operation {
set_field {
field_name = "name"
value = get_attr {"interfaces_kernel3[].name"}
}
set_field {
field_name = "ip_address"
value = get_attr {"interfaces_kernel3[].ip"}
}
set_field {
field_name = "mac_address"
value = get_attr {"interfaces_kernel3[].mac"}
}
set_field {
field_name = "netmask"
value = get_attr {"interfaces_kernel3[].netmask"}
}
}
}
on_false = nop {}
}
}
step {
name = "Remove duplicate mac from adapter"
set_attr {
"dump_var"
eval {"javascript: var tableWithoutDuplicates = '';
tableWithoutDuplicates = DuplicateRemover.removeDuplicates(\${cmdb_ci_network_adapter},[\\"mac_address\\", \\"name\\"]);
CTX.setAttribute(\\"cmdb_ci_network_adapter\\", tableWithoutDuplicates);
"}
}
}
step {
name = "Ref/Rel between cmdb_ci_ip_address and cmdb_ci_network_adapter"
relation_reference {
table1_name = "cmdb_ci_ip_address"
table2_name = "cmdb_ci_network_adapter"
result_table_name = "ip_to_nic"
unmatched_lines = remove
condition = eq {
get_attr {"cmdb_ci_network_adapter[].name"}
get_attr {"cmdb_ci_ip_address[].name"}
}
ref_direction = parentToChild
ref_field_name = "nic"
}
}
step {
name = "Ref/Rel between cmdb_ci_network_adapter and Linux CI"
relation_reference {
table1_name = "cmdb_ci_linux_server"
table2_name = "cmdb_ci_network_adapter"
result_table_name = "lix_nic_rel"
unmatched_lines = remove
condition = eq {
"1"
"1"
}
relation_type = "Owns::Owned by"
ref_direction = childToParent
ref_field_name = "cmdb_ci"
}
}
step {
name = "Ref/Rel between cmdb_ci_ip_address and Linux CI"
relation_reference {
table1_name = "cmdb_ci_linux_server"
table2_name = "cmdb_ci_ip_address"
result_table_name = "lix_ip_rel"
unmatched_lines = remove
condition = eq {
"1"
"1"
}
relation_type = "Owns::Owned by"
ref_direction = parentToChild
ref_field_name = ""
}
}
step {
name = "Get the routes and gateway"
if {
condition = neq {
get_attr {"use_net_tools"}
"false"
}
on_true = runcmd_to_var {
cmd = "route -n"
var_names = "routeOut"
parsing_strategy = delimited_parsing {
selected_positions = 1
}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "Get the routes - for kernel 3 and above"
if {
condition = any {
eq {
get_attr {"kernel"}
"3"
}
eq {
get_attr {"kernel"}
"4"
}
}
on_true = runcmd_to_var {
cmd = "ip r"
var_names = table {
name = "routeTable_kernel_3"
col_names = "destination","ifName"
}
parsing_strategy = delimited_parsing {
exclude_lines_pattern = "via"
delimiters = " "
selected_positions = 1,3
}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "Get the Gateway route - for kernel 3 and above"
if {
condition = any {
eq {
get_attr {"kernel"}
"3"
}
eq {
get_attr {"kernel"}
"4"
}
}
on_true = runcmd_to_var {
cmd = "ip r"
var_names = table {
name = "routeTable_kernel_3G"
col_names = "destination","gateway","ifName"
}
parsing_strategy = delimited_parsing {
include_lines_pattern = "via"
delimiters = " "
selected_positions = 1,3,5
}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "Filter gateway"
if {
condition = any {
eq {
get_attr {"kernel"}
"3"
}
eq {
get_attr {"kernel"}
"4"
}
}
on_true = set_attr {
"gateways_filter_temp"
eval {"javascript: rtrn = '';
var originalTable = \${routeTable_kernel_3G};
var filteredTable = new Packages.java.util.ArrayList();
var SncIPAddressV4 = Packages.com.snc.commons.networks.IPAddressV4;
var SncIPAddressV6 = Packages.com.snc.commons.networks.IPAddressV6;
for (var i = 0 ; i < originalTable.size() ; i++) {
var destination = originalTable.get(i).get('destination');
var gateway = originalTable.get(i).get('gateway');
var ifName = originalTable.get(i).get('ifName');
if (destination == 'default')
destination = '0.0.0.0/0';
var destinationParts = destination.split('/');
if (!destinationParts)
continue;
var destIpv4 = SncIPAddressV4.get(destinationParts[0]);
var destIpv6 = SncIPAddressV6.get(destinationParts[0]);
if (!destIpv4 && !destIpv6 )
continue;
if (destIpv4 && destinationParts.length == 1)
destination = destIpv4 + '/32';
if (destIpv6 && destinationParts.length == 1)
destination = destIpv4 + '/64';
if (!SncIPAddressV4.get(gateway) && !SncIPAddressV6.get(gateway) )
continue;
if (!ifName)
continue;
var entry = new Packages.java.util.HashMap();
entry.put(\\"destination\\", destination);
entry.put(\\"gateway\\", gateway);
entry.put(\\"ifName\\", ifName);
filteredTable.add(entry);
}
CTX.setAttribute(\\"routeTable_kernel_3G\\", filteredTable);"}
}
on_false = nop {}
}
}
step {
name = "Extract the gateway"
if {
condition = is_not_empty {get_attr {"routeOut"}}
on_true = parse_var_to_var {
from_var_name = "routeOut"
to_var_names = table {
name = "GatewayMap"
col_names = "DefGateway"
}
parsing_strategy = delimited_parsing {
include_lines_pattern = "G"
exclude_lines_pattern = "Destination"
delimiters = " "
selected_positions = 2
}
if_not_found_do = nop {}
}
on_false = nop {}
}
}
step {
name = "Failover: Get the routes and gateway"
set_attr {
"tmp"
eval {"javascript: var rtn = \\"\\";
var command = \\"ip r\\";
var resp = CTX.getCommandManager().shellCommand(command, false, null, null, CTX);
var spl = resp.split(\\"\\\\r\\\\n\\");
var new_table = new Packages.java.util.ArrayList();
var destination= \\"\\";
var gateway = \\"\\";
var mask = \\"\\";
var flag = \\"\\";
var ifName = \\"\\";
var new_table = new Packages.java.util.ArrayList();
var gateway_table = new Packages.java.util.ArrayList();
function calcFlag(data) {
var res = \\"\\";
if(data.contains(\\"via\\")) {
res = \\"UG\\";
} else {
res = \\"U\\";
}
return res;
}
function findIp(data) {
var ipPattern =/(\\\\d+.\\\\d+.\\\\d+.\\\\d+).*/gi;
var match = ipPattern.exec(data);
if(match) {
return match[1];
} else {
return '';
}
}
function createNetmaskAddr(bitCount) {
var mask=[];
for(var j=0;j<4;j++) {
var n = Math.min(bitCount, 8);
mask.push(256 - Math.pow(2, 8-n));
bitCount -= n;
}
return mask.join('.');
}
function findIfName(data) {
var ifNamePattern =/^.*dev\\\\s+([^\\\\s]+).*/gi;
var match = ifNamePattern.exec(data);
if(match) {
return match[1];
} else {
return '';
}
}
function findmask(data) {
var maskPattern =/\\\\d+.\\\\d+.\\\\d+.\\\\d+\\\\/(\\\\d+)\\\\s+/gi;
var match = maskPattern.exec(data);
if(match) {
return match[1];
} else {
return '';
}
}
for(var i=0;i<spl.length;i++) {
if(spl[i] != null && spl[i] != undefined ) {
if(spl[i].startsWith(\\"default\\")){
destination = \\"0.0.0.0\\";
gateway = findIp(spl[i]);
mask = \\"0.0.0.0\\";
ifName = findIfName(spl[i]);
flag = calcFlag(spl[i]);
} else {
try {
gateway = \\"0.0.0.0\\";
flag = calcFlag(spl[i]);
destination = findIp(spl[i]);
ifName = findIfName(spl[i]);
mask = createNetmaskAddr(findmask(spl[i]));
} catch (e) {
ms.log(\\"error Failover get routes and gateways: \\" + e);
}
}
var row = new Packages.java.util.HashMap();
row.put('destination',destination);
row.put('gateway',gateway);
row.put('flag',flag);
row.put('ifName',ifName);
row.put('mask',mask);
new_table.add(row);
if(flag.contains('G')) {
var gatewayrow = new Packages.java.util.HashMap();
gatewayrow.put('DefGateway',gateway);
gateway_table.add(gatewayrow);
}
}
}
CTX.setAttribute('route_table_ss', new_table);
CTX.setAttribute('GatewayMap_ss', gateway_table);
"}
}
}
step {
name = "merge gateway and gateway_ss"
union {
table1_name = "GatewayMap"
table2_name = "GatewayMap_ss"
result_table_name = "GatewayMap"
}
}
step {
name = " remove duplicates from gateway"
set_attr {
"tmp"
eval {"javascript: var tableWithoutDuplicates = '';
tableWithoutDuplicates = DuplicateRemover.removeDuplicates(\${GatewayMap},[\\"DefGateway\\",]);
CTX.setAttribute(\\"GatewayMap\\", tableWithoutDuplicates);"}
}
}
step {
name = "Update gateway in NIC CI"
transform {
src_table_name = "cmdb_ci_network_adapter"
target_table_name = "cmdb_ci_network_adapter"
operation {set_field {
field_name = "ip_default_gateway"
value = get_attr {"GatewayMap[1].DefGateway"}
}}
}
}
step {
name = "Update gateway in NIC CI - for kernel 3 and above"
if {
condition = any {
eq {
get_attr {"kernel"}
"3"
}
eq {
get_attr {"kernel"}
"4"
}
}
on_true = transform {
src_table_name = "cmdb_ci_network_adapter"
target_table_name = "cmdb_ci_network_adapter"
operation {set_field {
field_name = "ip_default_gateway"
value = get_attr {"gateway_kernel3[1].DefGateway"}
}}
}
on_false = nop {}
}
}
step {
name = "Update gateway in Linux CI"
set_attr {
"cmdb_ci_linux_server[*].default_gateway"
get_attr {"GatewayMap[1].DefGateway"}
}
}
step {
name = "Update gateway in Linux CI - for kernel 3 and above"
if {
condition = any {
eq {
get_attr {"kernel"}
"3"
}
eq {
get_attr {"kernel"}
"4"
}
}
on_true = set_attr {
"cmdb_ci_linux_server[*].default_gateway"
get_attr {"gateway_kernel3[1].DefGateway"}
}
on_false = nop {}
}
}
step {
name = "Update dscy_router_interface"
transform {
src_table_name = "cmdb_ci_network_adapter"
target_table_name = "dscy_router_interface"
operation {
set_field {
field_name = "name"
value = get_attr {"cmdb_ci_network_adapter[].name"}
}
set_field {
field_name = "ip_address"
value = get_attr {"cmdb_ci_network_adapter[].ip_address"}
}
set_field {
field_name = "mac_address"
value = get_attr {"cmdb_ci_network_adapter[].mac_address"}
}
}
}
}
step {
name = "Ref/Rel between dscy_router_interface and CI"
relation_reference {
table1_name = "cmdb_ci_linux_server"
table2_name = "dscy_router_interface"
result_table_name = "li_to_ri"
unmatched_lines = remove
condition = eq {
"1"
"1"
}
relation_type = "Uses::Used by"
ref_direction = childToParent
ref_field_name = "cmdb_ci"
}
}
step {
name = "Extract routes"
if {
condition = is_not_empty {get_attr {"routeOut"}}
on_true = parse_var_to_var {
from_var_name = "routeOut"
to_var_names = table {
name = "route_table"
col_names = "destination","gateway","mask","flag","ifName"
}
parsing_strategy = delimited_parsing {
exclude_lines_pattern = "Destination"," Kernel"
delimiters = " "
selected_positions = 1,2,3,4,8
}
if_not_found_do = nop {}
}
on_false = nop {}
}
}
step {
name = "merge route_table and route_table_ss"
union {
table1_name = "route_table"
table2_name = "route_table_ss"
result_table_name = "route_table"
}
}
step {
name = "remove duplicates from route_table"
set_attr {
"tmp"
eval {"javascript: var tableWithoutDuplicates = '';
tableWithoutDuplicates = DuplicateRemover.removeDuplicates(\${route_table},[\\"ifName\\",\\"destination\\",\\"gateway\\"]);
CTX.setAttribute(\\"route_table\\", tableWithoutDuplicates);"}
}
}
step {
name = "Set dest_ip_network for each route"
transform {
src_table_name = "route_table"
target_table_name = "route_table"
operation {set_field {
field_name = "dest_ip_network"
value = eval {"javascript: rtrn = \\"\\";
var dest = \${route_table[].destination};
var mask = \${route_table[].mask};
var cidr = 0;
var parts = mask.split('.');
for (var i=0; i < parts.length; i++) {
part = Number(parts[i]);
while (0x80 == (part & 0x80)) {
++cidr;
part = part << 1 & 0xff;
}
}
rtrn= dest + \\"/\\" + cidr.toString();
"}
}}
}
}
step {
name = "Filter route interfaces"
filter {
src_table_name = "route_table"
target_table_name = "route_tableNG"
condition = all {
not_contains {
get_attr {"route_table[].flag"}
"G"
}
not_starts_with {
"127"
get_attr {"route_table[].destination"}
}
}
}
}
step {
name = "Update dscy_route_interface"
transform {
src_table_name = "route_tableNG"
target_table_name = "dscy_route_interface"
operation {
set_field {
field_name = "dest_ip_network"
value = get_attr {"route_tableNG[].dest_ip_network"}
}
set_field {
field_name = "name"
value = get_attr {"route_tableNG[].ifName"}
}
}
}
}
step {
name = "Update dscy_route_interface - for kernel 3 and above"
if {
condition = any {
eq {
get_attr {"kernel"}
"3"
}
eq {
get_attr {"kernel"}
"4"
}
}
on_true = transform {
src_table_name = "routeTable_kernel_3"
target_table_name = "dscy_route_interface"
operation {
set_field {
field_name = "dest_ip_network"
value = get_attr {"routeTable_kernel_3[].destination"}
}
set_field {
field_name = "name"
value = get_attr {"routeTable_kernel_3[].ifName"}
}
}
}
on_false = nop {}
}
}
step {
name = "Remove duplicate exit interfaces"
set_attr {
"dump_var"
eval {"javascript:
var tableWithoutDuplicates = '';
tableWithoutDuplicates = DuplicateRemover.removeDuplicates(\${dscy_route_interface},\\"dest_ip_network\\");
CTX.setAttribute(\\"dscy_route_interface\\", tableWithoutDuplicates);
"}
}
}
step {
name = "Ref/Rel between dscy_route_interface and CI"
relation_reference {
table1_name = "cmdb_ci_linux_server"
table2_name = "dscy_route_interface"
result_table_name = "ri_to_li"
unmatched_lines = remove
condition = eq {
"1"
"1"
}
relation_type = "Uses::Used by"
ref_direction = childToParent
ref_field_name = "cmdb_ci"
}
}
step {
name = "Ref/Rel between dscy_route_interface and dscy_router_interface"
relation_reference {
table1_name = "dscy_route_interface"
key1_name = "ifName"
table2_name = "dscy_router_interface"
key2_name = "name"
result_table_name = "rr_to_rr"
unmatched_lines = remove
ref_direction = parentToChild
ref_field_name = "router_interface"
}
}
step {
name = "Filter gateways"
filter {
src_table_name = "route_table"
target_table_name = "route_tableG"
condition = all {
contains {
get_attr {"route_table[].flag"}
"G"
}
not_starts_with {
"127"
get_attr {"route_table[].destination"}
}
}
}
}
step {
name = "Update dscy_route_next_hop"
transform {
src_table_name = "route_tableG"
target_table_name = "dscy_route_next_hop"
operation {
set_field {
field_name = "dest_ip_network"
value = get_attr {"route_tableG[].dest_ip_network"}
}
set_field {
field_name = "name"
value = get_attr {"route_tableG[].ifName"}
}
set_field {
field_name = "next_hop_ip_address"
value = get_attr {"route_tableG[].gateway"}
}
}
}
}
step {
name = "Update dscy_route_next_hop - for kernel 3 and above"
if {
condition = any {
eq {
get_attr {"kernel"}
"3"
}
eq {
get_attr {"kernel"}
"4"
}
}
on_true = transform {
src_table_name = "routeTable_kernel_3G"
target_table_name = "dscy_route_next_hop"
operation {
set_field {
field_name = "dest_ip_network"
value = get_attr {"routeTable_kernel_3G[].destination"}
}
set_field {
field_name = "name"
value = get_attr {"routeTable_kernel_3G[].ifName"}
}
set_field {
field_name = "next_hop_ip_address"
value = get_attr {"routeTable_kernel_3G[].gateway"}
}
}
}
on_false = nop {}
}
}
step {
name = "Remove duplicate from dscy_route_next_hop"
set_attr {
"dump_var"
eval {"javascript: var tableWithoutDuplicates = '';
tableWithoutDuplicates = DuplicateRemover.removeDuplicates(\${dscy_route_next_hop},[\\"dest_ip_network\\",\\"next_hop_ip_address\\"]);
CTX.setAttribute(\\"dscy_route_next_hop\\", tableWithoutDuplicates);
"}
}
}
step {
name = "Ref/Rel between dscy_route_interface and dscy_route_next_hop"
relation_reference {
table1_name = "dscy_route_next_hop"
key1_name = "ifName"
table2_name = "dscy_route_interface"
key2_name = "ifName"
result_table_name = "hop_to_route"
unmatched_lines = remove
ref_direction = parentToChild
ref_field_name = "route_interface"
}
}
step {
name = "Ref/Rel between dscy_route_next_hop and Linux CI"
relation_reference {
table1_name = "cmdb_ci_linux_server"
table2_name = "dscy_route_next_hop"
result_table_name = "hop_to_ci"
unmatched_lines = remove
condition = eq {
"1"
"1"
}
relation_type = "Uses::Used by"
ref_direction = childToParent
ref_field_name = "cmdb_ci"
}
}
}
</ndl>
<parent display_value=""/>
<serverless>false</serverless>
<source/>
<sync_to_mid>true</sync_to_mid>
<sys_class_name>sa_pattern</sys_class_name>
<sys_created_by>admin</sys_created_by>
<sys_created_on>2017-02-01 13:40:01</sys_created_on>
<sys_customer_update>false</sys_customer_update>
<sys_domain>global</sys_domain>
<sys_domain_path>/</sys_domain_path>
<sys_id>0ae107e39f2032001d753758442e70ec</sys_id>
<sys_mod_count>120</sys_mod_count>
<sys_name>Linux - Network</sys_name>
<sys_overrides display_value=""/>
<sys_package display_value="Pattern Designer" source="com.snc.pattern.designer">79c934314f310300261de57d0210c70c</sys_package>
<sys_policy/>
<sys_replace display_value=""/>
<sys_replace_on_upgrade>false</sys_replace_on_upgrade>
<sys_scope display_value="Global">global</sys_scope>
<sys_update_name>sa_pattern_0ae107e39f2032001d753758442e70ec</sys_update_name>
<sys_updated_by>admin</sys_updated_by>
<sys_updated_on>2020-10-13 12:57:18</sys_updated_on>
<version/>
</sa_pattern>
<sa_pattern action="INSERT_OR_UPDATE">
<active>true</active>
<ci_type>cmdb_ci_linux_server</ci_type>
<cpattern_type>3</cpattern_type>
<description/>
<directory>false</directory>
<enforce_proc_classy>false</enforce_proc_classy>
<has_draft>false</has_draft>
<invoke_per_account>false</invoke_per_account>
<metadata_id>1d2810b14fa12200609b92918110c7a7</metadata_id>
<name>Linux Server</name>
<ndl>pattern {
metadata {
id = "1d2810b14fa12200609b92918110c7a7"
name = "Linux Server"
description = ""
citype = "cmdb_ci_linux_server"
}
identification {
name = "discovery"
entry_point {type = "*"}
find_process_strategy {strategy = NONE}
step {
name = "Unix\\\\Linux Name Formatting"
ref {refid = "46d81a979f10320055063758442e707f"}
}
step {
name = "Insert OS name, version and name to cmdb_ci_linux_server"
transform {
src_table_name = "cmdb_ci_linux_server"
target_table_name = "cmdb_ci_linux_server"
operation {
set_field {
field_name = "os_version"
value = get_attr {"osVersion"}
}
set_field {
field_name = "os_name"
value = get_attr {"osName"}
}
set_field {
field_name = "name"
value = get_attr {"formattedHostname"}
}
}
}
}
step {
name = "Linux - Identity"
ref {refid = "a273cfe39f2032001d753758442e70b7"}
}
step {
name = "DNS"
ref {refid = "ede27fe5db652200868a7c841f961984"}
}
step {
name = "Get DNS Names for IPs"
ref {refid = "4bc39226db968010b0fa5635dc96190e"}
}
step {
name = "Get DNS name for ManagementIP"
if {
condition = all {
eq {
get_attr {"shouldIncludeDomain"}
"true"
}
is_not_empty {get_attr {"cmdb_ci_dns_name[1].name"}}
}
on_true = set_attr {
"DNSName"
eval {"javascript: var rtrn ='';
var table =\${cmdb_ci_dns_name};
var ip=\${computer_system.managementIP};
for(var i=0;i < table.size();i++){
var map=table.get(i);
if(map.get('ip_address') == ip){
rtrn =map.get('name');
break;
}
}
rtrn =rtrn;"}
}
on_false = nop {}
}
}
step {
name = "Set DNS name to name for Linux Server"
if {
condition = is_not_empty {get_attr {"DNSName"}}
on_true = set_attr {
"cmdb_ci_linux_server[*].name"
get_attr {"DNSName"}
}
on_false = nop {}
}
}
step {
name = "Linux - Find FQDN"
ref {refid = "5e1243e39f2032001d753758442e7041"}
}
step {
name = "Linux - Distribution"
ref {refid = "fe32c7e39f2032001d753758442e7065"}
}
step {
name = "UNIX - OS Uptime"
ref {refid = "80d2cbe39f2032001d753758442e7092"}
}
step {
name = "Update start date on Linux CI"
set_attr {
"cmdb_ci_linux_server[*].start_date"
get_attr {"start_date"}
}
}
step {
name = "Linux - Memory"
ref {refid = "4103cbe39f2032001d753758442e709a"}
}
step {
name = "Linux - Memory Modules"
ref {refid = "dc334fe39f2032001d753758442e70b7"}
}
step {
name = "Linux - Network ARP Tables"
ref {refid = "84538fe39f2032001d753758442e7086"}
}
step {
name = "Linux - CPU"
ref {refid = "e69343279f2032001d753758442e7067"}
}
step {
name = "Linux - Storage"
ref {refid = "303407279f2032001d753758442e708c"}
}
step {
name = "Linux - Cloud"
ref {refid = "4660f86edb057200c12ef9361d96190c"}
}
}
}
</ndl>
<parent display_value=""/>
<serverless>false</serverless>
<source/>
<sync_to_mid>true</sync_to_mid>
<sys_class_name>sa_pattern</sys_class_name>
<sys_created_by>bogdan.tomov</sys_created_by>
<sys_created_on>2016-08-30 11:40:35</sys_created_on>
<sys_customer_update>false</sys_customer_update>
<sys_domain>global</sys_domain>
<sys_domain_path>/</sys_domain_path>
<sys_id>1d2810b14fa12200609b92918110c7a7</sys_id>
<sys_mod_count>439</sys_mod_count>
<sys_name>Linux Server</sys_name>
<sys_overrides display_value=""/>
<sys_package display_value="Pattern Designer" source="com.snc.pattern.designer">79c934314f310300261de57d0210c70c</sys_package>
<sys_policy/>
<sys_replace display_value=""/>
<sys_replace_on_upgrade>false</sys_replace_on_upgrade>
<sys_scope display_value="Global">global</sys_scope>
<sys_update_name>sa_pattern_1d2810b14fa12200609b92918110c7a7</sys_update_name>
<sys_updated_by>admin</sys_updated_by>
<sys_updated_on>2020-08-31 13:23:52</sys_updated_on>
<version/>
</sa_pattern>
<sa_pattern action="INSERT_OR_UPDATE">
<active>true</active>
<ci_type>cmdb_ci_appl_generic</ci_type>
<cpattern_type>2</cpattern_type>
<description/>
<directory>false</directory>
<enforce_proc_classy>false</enforce_proc_classy>
<has_draft>false</has_draft>
<invoke_per_account>false</invoke_per_account>
<metadata_id>303407279f2032001d753758442e708c</metadata_id>
<name>Linux - Storage</name>
<ndl>library {
name = "Linux - Storage"
id = "303407279f2032001d753758442e708c"
description = "null"
step {
name = "Run storage script file"
custom_operation {
attributes {attribute {
name = "fileName"
value = "storage.bash"
}}
sys_id_op = "68367a239fc13200e9123758442e7083"
to_var_names = "stOut"
parsing_strategy = delimited_parsing {
selected_positions = 1
line_seperator = "NonExistingSeparator"
}
if_not_found_do = nop {}
is_paginated = 0
}
}
step {
name = "Remove new lines from storage output"
if {
condition = is_not_empty {get_attr {"stOut"}}
on_true = set_attr {
"stOut"
eval {"javascript:
var rtrn = '';
var stOut = \${stOut};
var strStOut = new Packages.java.lang.String(stOut);
rtrn = strStOut.replaceAll(\\"\\\\n\\",\\" \\");"}
}
on_false = nop {}
}
}
step {
name = "Map output to collection"
if {
condition = is_not_empty {get_attr {"stOut"}}
on_true = set_attr {
"sd_out"
eval {"javascript: rtrn = \\"\\";
var output = \${stOut};
var sectionParser = new DiscoveryProbeOutputSectionParser({indentedMarkupSections: [ 'sys_block', 'proc_mounts', 'sys_iscsi', 'fc' ]});
var results = sectionParser.parse(output);
var initiator = ''+results.sys_iscsi_initiator;
if (initiator)
{
initiator = initiator.split('=')[1] || '';
results.sys_iscsi_initiator = initiator.trim();
}
rtrn = JSON.stringify(results);
"}
}
on_false = nop {}
}
}
step {
name = "Get vxvm"
runcmd_to_var {
cmd = "command -v vxprint"
var_names = "vxvm"
parsing_strategy = delimited_parsing {
selected_positions = 1
}
if_not_found_do = nop {}
cache_flag = 0
}
}
step {
name = "________Proc_Ide________"
if {
condition = eq {
"1"
"2"
}
on_true = set_attr {
"blq"
"1"
}
on_false = nop {}
}
}
step {
name = "Get proc_ide data"
if {
condition = is_not_empty {get_attr {"sd_out"}}
on_true = set_attr {
"sd_proc_ide"
eval {"javascript: rtrn = \\"\\";
var results = JSON.parse(\${sd_out});
rtrn = JSON.stringify(results.proc_ide);"}
}
on_false = nop {}
}
}
step {
name = "Create empty proc_ide table"
union {
table1_name = "ProcIDE"
table2_name = "ProcIDE"
result_table_name = "ProcIDE"
}
}
step {
name = "Insert data to proc_ide"
if {
condition = is_not_empty {get_attr {"sd_proc_ide"}}
on_true = set_attr {
"dump_var"
concat {eval {"javascript: rtrn = \\"\\";
var ide = \${sd_proc_ide};
ide = ide.substring(0,ide.length-2);
var block = ide.split(\\"ide:\\");
var row = new Packages.java.util.HashMap();
if(block){
for (var i = 1; i < block.length; i++)
{
var blockSp = block[i].split(',');
var clrow = row.clone();
clrow.put(\\"deviceID\\", blockSp[0]);
var MkMod = blockSp[1].split(\\" \\");
clrow.put(\\"vendorName\\", MkMod[0]);
var modelName = \\"\\";
for (var j = 1; j < MkMod.length; j++)
{
modelName +=MkMod[j] + \\" \\";
}
clrow.put(\\"modelName\\", modelName);
clrow.put(\\"size\\", blockSp[2]);
clrow.put(\\"deviceType\\", blockSp[3]);
\${ProcIDE}.add(clrow);
}
CTX.setAttribute('ProcIDE',\${ProcIDE});
rtrn = ide;
}
"}}
}
on_false = nop {}
}
}
step {
name = "Normalize proc_ide columns names"
transform {
src_table_name = "ProcIDE"
target_table_name = "ProcIDE"
operation {
set_field {
field_name = "name"
value = get_attr {"ProcIDE[].deviceID"}
}
set_field {
field_name = "vendor"
value = get_attr {"ProcIDE[].vendorName"}
}
set_field {
field_name = "model"
value = get_attr {"ProcIDE[].modelName"}
}
set_field {
field_name = "storage_type"
value = eval {"javascript:rtrn = \\"\\";var type = \${ProcIDE[].deviceType};switch (type){ case \\"cdrom\\": rtrn = \\"cd\\"; break; case \\"CD-ROM\\": rtrn = \\"cd\\"; break; case \\"Direct-Access\\": rtrn = \\"disk\\"; break; default: rtrn = \\"logical\\";}"}
}
}
}
}
step {
name = "________Proc_Ide________"
if {
condition = eq {
"1"
"2"
}
on_true = set_attr {
"blq"
"1"
}
on_false = nop {}
}
}
step {
name = "________Proc_SysBlock________"
if {
condition = eq {
"1"
"2"
}
on_true = set_attr {
"blq"
"1"
}
on_false = nop {}
}
}
step {
name = "Get sys_block data"
if {
condition = is_not_empty {get_attr {"sd_out"}}
on_true = set_attr {
"sd_sysblock"
eval {"javascript: rtrn = \\"\\";
var results = JSON.parse(\${sd_out});
rtrn = JSON.stringify(results.sys_block.sysBlock);"}
}
on_false = nop {}
}
}
step {
name = "Create empty sys_block table"
union {
table1_name = "SysBlock"
table2_name = "SysBlock"
result_table_name = "SysBlock"
}
}
step {
name = "Insert data to sys_block table"
if {
condition = is_not_empty {get_attr {"sd_sysblock"}}
on_true = set_attr {
"dump_var"
concat {eval {"javascript:
var rtrn = \\"\\";
var row = new Packages.java.util.HashMap();
var data = \${sd_sysblock};
data = data.substring(2,data.length-2);
var datasp = data.split(\\"sysBlock:\\");
var count = 0;
if(datasp){
var sectorSize = 512;
var ParentDisk = \\"\\";
var nameHolder =\\"\\";
for (var i = 0; i < datasp.length; i++)
{
var block = datasp[i].split(\\" \\");
for (var j = 0; j < block.length; j++)
{
if (block[j] == \\"name:\\" || block[j] == \\"[\\\\\\"name:\\")
{
if (count == 0 )
{
var clrow = row.clone();
clrow.put(\\"name\\",block[j+1]); nameHolder = block[j+1]; count = 1;
}
else
{
\${SysBlock}.add(clrow);
var clrow = row.clone();
clrow.put(\\"name\\",block[j+1]); nameHolder = block[j+1];
}
}
if (block[j] == \\"deviceMajorMinor:\\")
{
clrow.put(\\"deviceMajorMinor\\",block[j+1]);
}
if (block[j] == \\"sectors:\\")
{
clrow.put(\\"sectors\\",block[j+1]);
}
if (block[j] == \\"sectorSize:\\")
{
sectorSize = block[j+1];
if (block[j+1] == \\"0\\")
{sectorSize = \\"512\\";}
}
if (block[j] == \\"dmName:\\")
{
clrow.put(\\"dmName\\",block[j+1]);
}
if (block[j] == \\"dmId:\\")
{
clrow.put(\\"dmId\\",block[j+1]);
}
if (block[j] == \\"host:\\")
{
clrow.put(\\"host\\",block[j+1]);
}
if (block[j] == \\"vendor:\\")
{
clrow.put(\\"vendor\\",block[j+1]);
}
if (block[j] == \\"model:\\")
{
clrow.put(\\"model\\",block[j+1]);
}
if (block[j] == \\"devType:\\")
{
clrow.put(\\"devType\\",block[j+1]); ParentDisk = nameHolder;
}
if (block[j] == \\"number:\\")
{
clrow.put(\\"number\\",block[j+1]); clrow.put(\\"parentDisk\\",ParentDisk);
}
if (block[j] == \\"beginOffset:\\")
{
clrow.put(\\"beginOffset\\",block[j+1]);
}
clrow.put(\\"sectorSize\\",sectorSize);
}
if (i == (datasp.length - 1) )
{
\${SysBlock}.add(clrow);
}
}
CTX.setAttribute('SysBlock',\${SysBlock});
rtrn = \\"test\\";
}
"}}
}
on_false = nop {}
}
}
step {
name = "________Proc_SysBlock________"
if {
condition = eq {
"1"
"2"
}
on_true = set_attr {
"blq"
"1"
}
on_false = nop {}
}
}
step {
name = "________Proc_Partition________"
if {
condition = eq {
"1"
"2"
}
on_true = set_attr {
"blq"
"1"
}
on_false = nop {}
}
}
step {
name = "Create partitions table"
filter {
src_table_name = "SysBlock"
target_table_name = "partition_table"
condition = is_not_empty {get_attr {"SysBlock[].number"}}
}
}
step {
name = "Update cmdb_ci_disk_partition"
transform {
src_table_name = "partition_table"
target_table_name = "cmdb_ci_disk_partition"
operation {
set_field {
field_name = "name"
value = concat {
"/dev/"
get_attr {"partition_table[].name"}
}
}
set_field {
field_name = "start_offset"
value = concat {eval {"javascript:rtrn=\\"\\";
var begin = parseInt(\${partition_table[].beginOffset});
var size = parseInt(\${partition_table[].sectorSize});
rtrn = ((begin * size) || 0) + '';
"}}
}
set_field {
field_name = "end_offset"
value = concat {eval {"javascript:rtrn=\\"\\";
var begin = parseInt(\${partition_table[].beginOffset});
var sectors = parseInt(\${partition_table[].sectors});
var size = parseInt(\${partition_table[].sectorSize});
var dataSize = size*sectors;
rtrn = (begin + dataSize) + '';
"}}
}
set_field {
field_name = "partition_number"
value = get_attr {"partition_table[].number"}
}
set_field {
field_name = "device_major_minor"
value = get_attr {"partition_table[].deviceMajorMinor"}
}
set_field {
field_name = "size_bytes"
value = concat {eval {"javascript:rtrn=\\"\\";
var sectors = parseInt(\${partition_table[].sectors});
var size = parseInt(\${partition_table[].sectorSize});
rtrn = (size*sectors) + '';"}}
}
set_field {
field_name = "major"
value = eval {"javascript: rtrn=\\"\\";
var MajMin = \${partition_table[].deviceMajorMinor};
if (MajMin != null)
{
var Maj = MajMin.split(':');
rtrn = Maj[0];
}"}
}
set_field {
field_name = "parent"
value = concat {
"/dev/"
get_attr {"partition_table[].parentDisk"}
}
}
}
}
}
step {
name = "Ref/Rel between cmdb_ci_disk_partition and Linux CI"
relation_reference {
table1_name = "cmdb_ci_linux_server"
table2_name = "cmdb_ci_disk_partition"
result_table_name = "lin_to_partition"
unmatched_lines = remove
condition = eq {
"1"
"1"
}
relation_type = "Contains::Contained by"
ref_direction = childToParent
ref_field_name = "computer"
}
}
step {
name = "________Proc_Partition________"
if {
condition = eq {
"1"
"2"
}
on_true = set_attr {
"blq"
"1"
}
on_false = nop {}
}
}
step {
name = "Get scsi_path_map"
if {
condition = is_not_empty {get_attr {"sd_out"}}
on_true = set_attr {
"sd_scsi_path"
eval {"javascript: rtrn = \\"\\";
var results = JSON.parse(\${sd_out});
rtrn = JSON.stringify(results.scsi_path_map);"}
}
on_false = nop {}
}
}
step {
name = "Create empty scsi_path_map"
if {
condition = all {
is_not_empty {get_attr {"sd_scsi_path"}}
neq {
get_attr {"sd_scsi_path"}
"null"
}
}
on_true = union {
table1_name = "SysBusMap"
table2_name = "SysBusMap"
result_table_name = "SysBusMap"
}
on_false = nop {}
}
}
step {
name = "Insert data to scsi_path_map table"
if {
condition = all {
is_not_empty {get_attr {"sd_scsi_path"}}
neq {
get_attr {"sd_scsi_path"}
"null"
}
}
on_true = set_attr {
"dump_var"
concat {eval {"javascript:rtrn = \\"\\";
var row = new Packages.java.util.HashMap();
var data = JSON.parse(\${sd_scsi_path});
if(data){
for (var i = 0; i < data.length; i++)
{
var line = data[i];
var matches = line.match(\\"/^(\\\\d+):(\\\\d+):(\\\\d+):(\\\\d+),(\\\\w+)\$/\\");
if (matches == null)
{
continue;
}
var data =
{
host: matches[1],
bus: matches[2],
target: matches[3],
lun: matches[4],
deviceId: matches[5],
deviceMajorMinor: null,
};
var rowed = row.clone();
rowed.put(\\"host\\",data.host);
rowed.put(\\"bus\\",data.bus);
rowed.put(\\"target\\",data.target);
rowed.put(\\"lun\\",data.lun);
rowed.put(\\"deviceId\\",data.deviceId);
\${SCSI_path}.add(rowed);
}
CTX.setAttribute('SCSI_path',\${SCSI_path})
rtrn =\\"tooMuch\\";
}
"}}
}
on_false = nop {}
}
}
step {
name = "Get proc_mounts"
if {
condition = is_not_empty {get_attr {"sd_out"}}
on_true = set_attr {
"sd_proc_mounts"
eval {"javascript: rtrn = \\"\\";
var results = JSON.parse(\${sd_out});
rtrn = JSON.stringify(results.proc_mounts.procMount);"}
}
on_false = nop {}
}
}
step {
name = "Create empty proc_mounts table"
union {
table1_name = "procMounts"
table2_name = "procMounts"
result_table_name = "procMounts"
}
}
step {
name = "Update proc_mounts table"
if {
condition = is_not_empty {get_attr {"sd_proc_mounts"}}
on_true = set_attr {
"dump_var"
concat {eval {"javascript:rtrn = \\"\\";
var row = new Packages.java.util.HashMap();
var data = \${sd_proc_mounts};
var datasp = data.split(\\"procMount:\\");
var count = 0;
if(datasp){
for (var i = 0; i < datasp.length; i++)
{
var block = datasp[i].split(\\" \\");
for (var j = 0; j < block.length; j++)
{
if (block[j] == \\"name:\\" || block[j] == \\"[\\\\\\"name:\\")
{
if (count == 0 )
{
var clrow = row.clone();
clrow.put(\\"name\\",block[j+1]);
count = 1;
}
else
{
\${procMounts}.add(clrow);
var clrow = row.clone();
clrow.remove(\\"cpu_data\\");
clrow.put(\\"name\\",block[j+1]);
}
}
if (block[j] == \\"mountPoint:\\")
{
clrow.put(\\"mountPoint\\",block[j+1]);
}
if (block[j] == \\"filesystem:\\")
{
clrow.put(\\"filesystem\\",block[j+1]);
}
if (block[j] == \\"options:\\")
{
clrow.put(\\"options\\",block[j+1]);
}
}
if (i == (datasp.length - 1) )
{
\${procMounts}.add(clrow);
}
}
CTX.setAttribute('procMounts',\${procMounts})
rtrn =\\"tooMuch\\";
}
"}}
}
on_false = nop {}
}
}
step {
name = "Filter rootfs and tmpfs from proc_mounts"
filter {
src_table_name = "procMounts"
target_table_name = "procMounts"
condition = all {
neq {
get_attr {"procMounts[].filesystem"}
"rootfs"
}
neq {
get_attr {"procMounts[].filesystem"}
"tmpfs"
}
}
}
}
step {
name = "Get fdisk"
runcmd_to_var {
cmd = "sudo fdisk -l | grep 'Disk /'"
var_names = table {
name = "sg_scsi_path_map"
col_names = "deviceId","size"
}
parsing_strategy = delimited_parsing {
include_lines_pattern = "Disk"
delimiters = " ",":"
selected_positions = 2,5
}
if_not_found_do = nop {}
cache_flag = 0
}
}
step {
name = "________Proc_SCSI_iSCSI______"
if {
condition = eq {
"1"
"2"
}
on_true = set_attr {
"blq"
"1"
}
on_false = nop {}
}
}
step {
name = "Get iscsi_sessions"
if {
condition = is_not_empty {get_attr {"sd_out"}}
on_true = set_attr {
"iscsi_sessions"
eval {"javascript: rtrn = \\"\\";
var results = JSON.parse(\${sd_out});
rtrn = JSON.stringify(results.sys_iscsi);"}
}
on_false = nop {}
}
}
step {
name = "Create empty iscsi_sessions table"
if {
condition = all {
is_not_empty {get_attr {"iscsi_sessions"}}
neq {
get_attr {"iscsi_sessions"}
"null"
}
}
on_true = union {
table1_name = "iScsiSession"
table2_name = "iScsiSession"
result_table_name = "iScsiSession"
}
on_false = nop {}
}
}
step {
name = "Update iscsi_sessions table"
if {
condition = is_not_empty {get_attr {"iscsi_sessions"}}
on_true = set_attr {
"dump_var"
concat {eval {"javascript:
var rtrn = \\"\\";
var row = new Packages.java.util.HashMap();
var data = \${iscsi_sessions};
data = data.substring(2,data.length-1);
var datasp = data.split(\\"iscsiSession\\\\\\":\\");
var count = 0;
var targetIqn;
var iscsiDisk;
var iscsiLun;
if(datasp){
for (var i = 1; i < datasp.length; i++)
{
datasp[i] = datasp[i].substring(2,datasp[i].length-2);
var block = datasp[i].split(/\\\\s+/);
for (var j = 0; j < block.length; j++)
{
if (block[j] == \\"targetIqn:\\" || block[j] == \\"[\\\\\\"targetIqn:\\")
{
targetIqn = block[j+1];
}
else if (block[j] == \\"id:\\")
{
var clrow = row.clone();
clrow.put(\\"deviceId\\",block[j+1]);
clrow.put(\\"targetIqn\\",targetIqn);
}
else if (block[j] == \\"lun:\\")
{
clrow.put(\\"iscsiLun\\",block[j+1]);
\${iScsiSession}.add(clrow);
}
}
}
CTX.setAttribute('iScsiSession',\${iScsiSession})
rtrn = '';
}
"}}
}
on_false = nop {}
}
}
step {
name = "Get sys_iscsi_initiator"
if {
condition = is_not_empty {get_attr {"sd_out"}}
on_true = set_attr {
"sd_sys_iscsi_initiator"
eval {"javascript: rtrn = \\"\\";
var results = JSON.parse(\${sd_out});
rtrn = JSON.stringify(results.sys_iscsi_initiator);"}
}
on_false = nop {}
}
}
step {
name = "Add initiator to iSCSI sessions"
if {
condition = is_not_empty {get_attr {"sd_sys_iscsi_initiator"}}
on_true = transform {
src_table_name = "iScsiSession"
target_table_name = "iScsiSession"
operation {set_field {
field_name = "iscsiInitiator"
value = eval {"javascript:
var rtrn = '';
var initiator = \${sd_sys_iscsi_initiator};
rtrn = initiator.substring(1,initiator.length-1);
"}
}}
}
on_false = nop {}
}
}
step {
name = "Get proc_scsi"
runcmd_to_var {
cmd = "cat /proc/scsi/scsi | tr '\\\\n' ' '"
var_names = "proc_scsi"
parsing_strategy = delimited_parsing {
selected_positions = 1
line_seperator = "nonExistingLineSeparator"
}
if_not_found_do = nop {}
cache_flag = 0
}
}
step {
name = "Process the proc_scsi"
if {
condition = is_not_empty {get_attr {"proc_scsi"}}
on_true = set_attr {
"proc_tab"
eval {"javascript: rtrn=\\"\\";
var scsi = \${proc_scsi};
var block = scsi.split(\\"Host:\\");
for (var i = 1; i < block.length; i++)
{
rtrn += block[i] + \\"\\\\n\\";
}
"}
}
on_false = nop {}
}
}
step {
name = "Parse proc_scsi"
if {
condition = is_not_empty {get_attr {"proc_tab"}}
on_true = parse_var_to_var {
from_var_name = "proc_tab"
to_var_names = table {
name = "proc_scsi_table"
col_names = "hostId","channel","id","lun","vendor","model","rev","type"
}
parsing_strategy = regex_parsing {regex = "\\\\D*(\\\\d+).*Channel: (\\\\d+).*Id: (\\\\d+).*Lun: (\\\\d+).*Vendor: (.*)Model:(.*)Rev:(.*)Type:(.*)A"}
if_not_found_do = nop {}
}
on_false = nop {}
}
}
step {
name = "Create proc_scsi key"
if {
condition = is_not_empty {get_attr {"proc_scsi_table"}}
on_true = transform {
src_table_name = "proc_scsi_table"
target_table_name = "proc_scsi_table"
operation {set_field {
field_name = "key"
value = eval {"javascript: rtrn=\\"\\";
var hostid = parseInt(\${proc_scsi_table[].hostId});
var channel = parseInt(\${proc_scsi_table[].channel});
var id = parseInt(\${proc_scsi_table[].id});
var lun = parseInt(\${proc_scsi_table[].lun});
rtrn = hostid + \\":\\" + channel + \\":\\" + id + \\":\\" + lun;
"}
}}
}
on_false = nop {}
}
}
step {
name = "Merge sys block and disks"
merge {
table1_name = "proc_scsi_table"
table2_name = "SysBlock"
result_table_name = "proc_scsi_table"
unmatched_lines = remove
condition = eq {
get_attr {"proc_scsi_table[].key"}
get_attr {"SysBlock[].host"}
}
}
}
step {
name = "Filter scsi disk"
filter {
src_table_name = "proc_scsi_table"
target_table_name = "proc_scsi_table_disk"
condition = eq {
get_attr {"proc_scsi_table[].type"}
"Direct-Access"
}
}
}
step {
name = "Update proc_scsi_table_disk"
transform {
src_table_name = "proc_scsi_table_disk"
target_table_name = "proc_scsi_table_disk"
operation {
set_field {
field_name = "name"
value = concat {
"/dev/"
get_attr {"proc_scsi_table_disk[].name"}
}
}
set_field {
field_name = "storage_type"
value = eval {"javascript:rtrn = \\"\\";var type = \${proc_scsi_table_disk[].type};switch (type){ case \\"cdrom\\": rtrn = \\"cd\\"; break; case \\"CD-ROM\\": rtrn = \\"cd\\"; break; case \\"Direct-Access\\": rtrn = \\"disk\\"; break; default: rtrn = \\"logical\\";}"}
}
set_field {
field_name = "device_interface"
value = "scsi"
}
}
}
}
step {
name = "Union proc_scsi_table_disk and proc_ide tables"
union {
table1_name = "ProcIDE"
table2_name = "proc_scsi_table_disk"
result_table_name = "ProcIDE"
}
}
step {
name = "Add iSCSI data to disks"
merge {
table1_name = "ProcIDE"
table2_name = "iScsiSession"
result_table_name = "ProcIDE"
unmatched_lines = keep
condition = contains {
get_attr {"ProcIDE[].name"}
get_attr {"iScsiSession[].deviceId"}
}
}
}
step {
name = "Extract iSCSI disks to different table"
filter {
src_table_name = "ProcIDE"
target_table_name = "iSCSIDisks"
condition = is_not_empty {get_attr {"ProcIDE[].targetIqn"}}
}
}
step {
name = "Remove iSCSI disks from SCSI table"
filter {
src_table_name = "ProcIDE"
target_table_name = "ProcIDE"
condition = is_empty {get_attr {"ProcIDE[].targetIqn"}}
}
}
step {
name = "Update cmdb_ci_disk Table"
transform {
src_table_name = "ProcIDE"
target_table_name = "cmdb_ci_disk"
operation {
set_field {
field_name = "name"
value = get_attr {"ProcIDE[].name"}
}
set_field {
field_name = "device_id"
value = get_attr {"ProcIDE[].name"}
}
set_field {
field_name = "device_host_id"
value = get_attr {"ProcIDE[].hostId"}
}
set_field {
field_name = "device_bus_id"
value = get_attr {"ProcIDE[].channel"}
}
set_field {
field_name = "device_target_id"
value = get_attr {"ProcIDE[].id"}
}
set_field {
field_name = "device_lun"
value = get_attr {"ProcIDE[].lun"}
}
set_field {
field_name = "size_bytes"
value = concat {eval {"javascript: rtrn = \\"\\";
var ide_size = parseInt(\${ProcIDE[].size});
var sect = parseInt(\${ProcIDE[].sectors});
var sectSize = parseInt(\${ProcIDE[].sectorSize});
if(isNaN(ide_size))
{
rtrn = (sect*sectSize)+'';
}
else
{
rtrn = ide_size + '';
}
"}}
}
set_field {
field_name = "disk_space"
value = concat {eval {"javascript:var rtrn='';
var ide_size = parseInt(\${ProcIDE[].size});
var sect = parseInt(\${ProcIDE[].sectors});
var sectSize = parseInt(\${ProcIDE[].sectorSize});
var spac = 0;
if(isNaN(ide_size))
{
spac = sect*sectSize;
}
else
{
spac = ide_size;
}
rtrn = (spac/1073741824) + '';
"}}
}
set_field {
field_name = "device_major_minor"
value = get_attr {"ProcIDE[].deviceMajorMinor"}
}
set_field {
field_name = "storage_type"
value = get_attr {"ProcIDE[].storage_type"}
}
set_field {
field_name = "device_interface"
value = eval {"javascript: var rtrn = \\"\\";
var devInter = \${ProcIDE[].device_interface};
if (devInter == \\"\\")
{
rtrn = \\"ide\\";
}
else
{
rtrn = devInter;
}
"}
}
set_field {
field_name = "manufacturer"
value = get_attr {"ProcIDE[].vendor"}
}
set_field {
field_name = "model_id"
value = get_attr {"ProcIDE[].model"}
}
set_field {
field_name = "major"
value = eval {"javascript: rtrn=\\"\\";
var MajMin = \${ProcIDE[].deviceMajorMinor};
if (MajMin != null)
{
var Maj = MajMin.split(':');
rtrn = Maj[0];
}"}
}
}
}
}
step {
name = "Update cmdb_ci_iscsi_disk Table"
transform {
src_table_name = "iSCSIDisks"
target_table_name = "cmdb_ci_iscsi_disk"
operation {
set_field {
field_name = "name"
value = get_attr {"iSCSIDisks[].name"}
}
set_field {
field_name = "device_id"
value = get_attr {"iSCSIDisks[].name"}
}
set_field {
field_name = "device_host_id"
value = get_attr {"iSCSIDisks[].hostId"}
}
set_field {
field_name = "device_bus_id"
value = get_attr {"iSCSIDisks[].channel"}
}
set_field {
field_name = "device_target_id"
value = get_attr {"iSCSIDisks[].id"}
}
set_field {
field_name = "device_lun"
value = get_attr {"iSCSIDisks[].lun"}
}
set_field {
field_name = "size_bytes"
value = concat {eval {"javascript: rtrn = \\"\\";
var ide_size = parseInt(\${iSCSIDisks[].size});
var sect = parseInt(\${iSCSIDisks[].sectors});
var sectSize = parseInt(\${iSCSIDisks[].sectorSize});
if(isNaN(ide_size))
{
rtrn = (sect*sectSize) + '';
}
else
{
rtrn = ide_size + '';
}
"}}
}
set_field {
field_name = "disk_space"
value = concat {eval {"javascript:var rtrn='';
var ide_size = parseInt(\${iSCSIDisks[].size});
var sect = parseInt(\${iSCSIDisks[].sectors});
var sectSize = parseInt(\${iSCSIDisks[].sectorSize});
var spac = 0;
if(isNaN(ide_size))
{
spac = sect*sectSize;
}
else
{
spac = ide_size;
}
rtrn = (spac/1073741824) + '';
"}}
}
set_field {
field_name = "device_major_minor"
value = get_attr {"iSCSIDisks[].deviceMajorMinor"}
}
set_field {
field_name = "storage_type"
value = "network"
}
set_field {
field_name = "device_interface"
value = "iscsi"
}
set_field {
field_name = "manufacturer"
value = get_attr {"iSCSIDisks[].vendor"}
}
set_field {
field_name = "model_id"
value = get_attr {"iSCSIDisks[].model"}
}
set_field {
field_name = "major"
value = eval {"javascript: rtrn=\\"\\";
var MajMin = \${iSCSIDisks[].deviceMajorMinor};
if (MajMin != null)
{
var Maj = MajMin.split(':');
rtrn = Maj[0];
}"}
}
set_field {
field_name = "iqn"
value = get_attr {"iSCSIDisks[].targetIqn"}
}
set_field {
field_name = "initiator_iqn"
value = get_attr {"iSCSIDisks[].iscsiInitiator"}
}
set_field {
field_name = "device_lun"
value = get_attr {"iSCSIDisks[].iscsiLun"}
}
}
}
}
step {
name = "Ref/Rel between cmdb_ci_disk table and Linux CI"
relation_reference {
table1_name = "cmdb_ci_linux_server"
table2_name = "cmdb_ci_disk"
result_table_name = "disk_to_linux"
unmatched_lines = remove
condition = eq {
"1"
"1"
}
relation_type = "Contains::Contained by"
ref_direction = childToParent
ref_field_name = "computer"
}
}
step {
name = "Ref/Rel between cmdb_ci_iscsi_disk table and Linux CI"
relation_reference {
table1_name = "cmdb_ci_linux_server"
table2_name = "cmdb_ci_iscsi_disk"
result_table_name = "iscsi_disk_to_linux"
unmatched_lines = remove
condition = eq {
"1"
"1"
}
relation_type = "Contains::Contained by"
ref_direction = childToParent
ref_field_name = "computer"
}
}
step {
name = "Filter proc_scsi_table"
filter {
src_table_name = "proc_scsi_table"
target_table_name = "proc_scsi_table_storage"
condition = neq {
get_attr {"proc_scsi_table[].type"}
"Direct-Access"
}
}
}
step {
name = "Update proc_scsi_table_storage"
transform {
src_table_name = "proc_scsi_table_storage"
target_table_name = "proc_scsi_table_storage"
operation {
set_field {
field_name = "name"
value = concat {
"/dev/"
get_attr {"proc_scsi_table_storage[].name"}
}
}
set_field {
field_name = "storage_type"
value = eval {"javascript:rtrn = \\"\\";var type = \${proc_scsi_table_storage[].type};switch (type){ case \\"cdrom\\": rtrn = \\"cd\\"; break; case \\"CD-ROM\\": rtrn = \\"cd\\"; break; case \\"Direct-Access\\": rtrn = \\"disk\\"; break; default: rtrn = \\"logical\\";}"}
}
set_field {
field_name = "device_interface"
value = "scsi"
}
}
}
}
step {
name = "Get dmesg_scsi"
runcmd_to_var {
cmd = "grep -i 'attached scsi' /var/log/dmesg ; grep 'SCSI device' /var/log/dmesg"
var_names = "dmesg_scsi"
parsing_strategy = delimited_parsing {
selected_positions = 1
}
if_not_found_do = nop {}
cache_flag = 0
}
}
step {
name = "Parse dmsetup"
if {
condition = is_not_empty {get_attr {"sd_out"}}
on_true = set_attr {
"sd_dmsetup"
eval {"javascript: rtrn = \\"\\";
var results = JSON.parse(\${sd_out});
rtrn = JSON.stringify(results.dmsetup);"}
}
on_false = nop {}
}
}
step {
name = "________Proc_scsi________"
if {
condition = eq {
"1"
"2"
}
on_true = set_attr {
"blq"
"1"
}
on_false = nop {}
}
}
step {
name = "________Proc_LVM________"
if {
condition = eq {
"1"
"2"
}
on_true = set_attr {
"blq"
"1"
}
on_false = nop {}
}
}
step {
name = "Create empty device map table"
union {
table1_name = "dmMap"
table2_name = "dmMap"
result_table_name = "dmMap"
}
}
step {
name = "Update device map table"
if {
condition = is_not_empty {get_attr {"sd_dmsetup"}}
on_true = set_attr {
"dump_var"
concat {eval {"javascript:rtrn = \\"\\";
var row = new Packages.java.util.HashMap();
var data = \${sd_dmsetup};
data = data.substring(2,(data.length)-2);
var datasp = data.split(\\"mappedDevice:\\");
var count = 0;
if(datasp){
for (var i = 1; i < datasp.length; i++)
{
var block = datasp[i].split(\\" \\");
var clrow = row.clone();
clrow.put(\\"alias\\", block[1]);
clrow.put(\\"deviceMajorMinor\\", block[2]);
rtrn += \\"i am\\" + block[4];
if (block[4])
{
for (var j=4; j < block.length; j++)
{
if (block[j] === \\"extends\\")
{
\${dmMap}.add(clrow);
var clrow = row.clone();
clrow.put(\\"extends\\", block[1]);
clrow.put(\\"startSector\\", block[j+1]);
clrow.put(\\"endSector\\", block[j+2]);
clrow.put(\\"type\\", block[j+3]);
if (block[j+3] === \\"linear\\")
{
clrow.put(\\"deviceMajorMinor\\", block[j+4]);
clrow.put(\\"sourceStartSector\\", block[j+5]);
\${dmMap}.add(clrow);
}
else
{
\${dmMap}.add(clrow);
}
}
}
}
else
{
\${dmMap}.add(clrow);
}
}
CTX.setAttribute('dmMap',\${dmMap});
rtrn += \\"Test\\";
}
"}}
}
on_false = nop {}
}
}
step {
name = "Map device maps to sys blocks"
merge {
table1_name = "dmMap"
table2_name = "SysBlock"
result_table_name = "dmMap"
unmatched_lines = remove
condition = eq {
get_attr {"dmMap[].deviceMajorMinor"}
get_attr {"SysBlock[].deviceMajorMinor"}
}
}
}
step {
name = "Filter device maps by alias"
filter {
src_table_name = "dmMap"
target_table_name = "dmMapNoExtends"
condition = is_not_empty {get_attr {"dmMap[].alias"}}
}
}
step {
name = "Change device map table column names"
transform {
src_table_name = "dmMapNoExtends"
target_table_name = "dmMapNoExtends"
operation {
set_field {
field_name = "device_id"
value = concat {
"/dev/mapper/"
get_attr {"dmMapNoExtends[].alias"}
}
}
set_field {
field_name = "storage_type"
value = "logical"
}
set_field {
field_name = "device_interface"
value = "lvm"
}
set_field {
field_name = "name"
value = concat {
"/dev/mapper/"
get_attr {"dmMapNoExtends[].alias"}
}
}
set_field {
field_name = "interface"
value = "lvm"
}
set_field {
field_name = "drive_type"
value = "logical"
}
}
}
}
step {
name = "Union proc_scsi_table_storage to device maps"
union {
table1_name = "proc_scsi_table_storage"
table2_name = "dmMapNoExtends"
result_table_name = "proc_scsi_table_storage"
}
}
step {
name = "Update cmdb_ci_storage_device"
transform {
src_table_name = "proc_scsi_table_storage"
target_table_name = "cmdb_ci_storage_device"
operation {
set_field {
field_name = "name"
value = get_attr {"proc_scsi_table_storage[].name"}
}
set_field {
field_name = "device_id"
value = get_attr {"proc_scsi_table_storage[].name"}
}
set_field {
field_name = "device_host_id"
value = get_attr {"proc_scsi_table_storage[].hostId"}
}
set_field {
field_name = "device_bus_id"
value = get_attr {"proc_scsi_table_storage[].channel"}
}
set_field {
field_name = "device_target_id"
value = get_attr {"proc_scsi_table_storage[].id"}
}
set_field {
field_name = "device_lun"
value = get_attr {"proc_scsi_table_storage[].lun"}
}
set_field {
field_name = "size_bytes"
value = concat {eval {"javascript: rtrn=\\"\\";
var sectors = parseInt(\${proc_scsi_table_storage[].sectors});
var sectorSize = parseInt(\${proc_scsi_table_storage[].sectorSize});
rtrn = (sectors * sectorSize) + '';
"}}
}
set_field {
field_name = "disk_space"
value = concat {eval {"javascript:var rtrn='';
var sectors = parseInt(\${proc_scsi_table_storage[].sectors});
var sectorSize = parseInt(\${proc_scsi_table_storage[].sectorSize});
var spec = sectors * sectorSize;
rtrn = (spec / 1073741824) + '';
"}}
}
set_field {
field_name = "device_major_minor"
value = get_attr {"proc_scsi_table_storage[].deviceMajorMinor"}
}
set_field {
field_name = "device_interface"
value = get_attr {"proc_scsi_table_storage[].device_interface"}
}
set_field {
field_name = "model_id"
value = get_attr {"proc_scsi_table_storage[].model"}
}
set_field {
field_name = "manufacturer"
value = get_attr {"proc_scsi_table_storage[].vendor"}
}
set_field {
field_name = "storage_type"
value = get_attr {"proc_scsi_table_storage[].storage_type"}
}
set_field {
field_name = "major"
value = eval {"javascript: rtrn=\\"\\";
var MajMin = \${proc_scsi_table_storage[].deviceMajorMinor};
if (MajMin != null)
{
var Maj = MajMin.split(':');
rtrn = Maj[0];
}"}
}
}
}
}
step {
name = "Ref/Rel between cmdb_ci_storage_device and Linux CI"
relation_reference {
table1_name = "cmdb_ci_linux_server"
table2_name = "cmdb_ci_storage_device"
result_table_name = "storage_to_linux"
unmatched_lines = remove
condition = eq {
"1"
"1"
}
relation_type = "Contains::Contained by"
ref_direction = childToParent
ref_field_name = "computer"
}
}
step {
name = "Update cmdb_ci_lvm_pool"
transform {
src_table_name = "dmMapNoExtends"
target_table_name = "cmdb_ci_lvm_pool"
operation {
set_field {
field_name = "pool_id"
value = concat {
"/dev/mapper/"
get_attr {"dmMapNoExtends[].alias"}
}
}
set_field {
field_name = "name"
value = concat {
"/dev/mapper/"
get_attr {"dmMapNoExtends[].alias"}
}
}
set_field {
field_name = "size_bytes"
value = concat {eval {"javascript: rtrn = \\"\\";
var size = parseInt(\${dmMapNoExtends[].sectorSize});
var sect = parseInt(\${dmMapNoExtends[].sectors});
rtrn = (size * sect) + '';"}}
}
set_field {
field_name = "disk_space"
value = concat {eval {"javascript: rtrn = \\"\\";
var size = parseInt(\${dmMapNoExtends[].sectorSize});
var sect = parseInt(\${dmMapNoExtends[].sectors});
rtrn = ((size * sect)/1073741824) + '';"}}
}
set_field {
field_name = "major"
value = eval {"javascript: rtrn=\\"\\";
var MajMin = \${dmMapNoExtends[].deviceMajorMinor};
if (MajMin != null)
{
var Maj = MajMin.split(':');
rtrn = Maj[0];
}"}
}
}
}
}
step {
name = "Rel/Ref between cmdb_ci_lvm_pool and Linux CI"
relation_reference {
table1_name = "cmdb_ci_linux_server"
table2_name = "cmdb_ci_lvm_pool"
result_table_name = "pool_to_ci"
unmatched_lines = remove
condition = eq {
"1"
"1"
}
relation_type = "Contains::Contained by"
ref_direction = childToParent
ref_field_name = "hosted_by"
}
}
step {
name = "Filter device maps by extends column"
filter {
src_table_name = "dmMap"
target_table_name = "dmMapExtend"
condition = is_not_empty {get_attr {"dmMap[].extends"}}
}
}
step {
name = "Keep multipaths from device maps"
filter {
src_table_name = "dmMapExtend"
target_table_name = "dmMapExtendMulti"
condition = eq {
get_attr {"dmMapExtend[].type"}
"multipath"
}
}
}
step {
name = "Keep non-multipaths device maps"
filter {
src_table_name = "dmMapExtend"
target_table_name = "dmMapExtend"
condition = neq {
get_attr {"dmMapExtend[].type"}
"multipath"
}
}
}
step {
name = "Update cmdb_ci_lvm_pool_member"
transform {
src_table_name = "dmMapExtend"
target_table_name = "cmdb_ci_lvm_pool_member"
operation {
set_field {
field_name = "extent_type"
value = get_attr {"dmMapExtend[].type"}
}
set_field {
field_name = "start_offset"
value = concat {eval {"javascript:rtrn = \\"\\";
var startSec = parseInt(\${dmMapExtend[].startSector}) || 0;
var size = parseInt(\${dmMapExtend[].sectorSize});
rtrn = (startSec * size) + '';
"}}
}
set_field {
field_name = "end_offset"
value = concat {eval {"javascript:rtrn = \\"\\";
var endSec = parseInt(\${dmMapExtend[].endSector});
var size = parseInt(\${dmMapExtend[].sectorSize});
rtrn = ((endSec || 0)*size) + '';
"}}
}
set_field {
field_name = "name"
value = eval {"javascript:rtrn=\\"\\";
var name = \${dmMapExtend[].name};
var dmName = \${dmMapExtend[].dmName};
rtrn = ( ( name === null ? dmName : name ) || 'LVM Pool Member' );
"}
}
set_field {
field_name = "device_major_minor"
value = get_attr {"dmMapExtend[].deviceMajorMinor"}
}
set_field {
field_name = "source_start_offset"
value = concat {eval {"javascript:rtrn = \\"\\";
var sourSec = parseInt(\${dmMapExtend[].sourceStartSector});
var size = parseInt(\${dmMapExtend[].sectorSize});
rtrn = (sourSec * size) + ''; "}}
}
set_field {
field_name = "source_end_offset"
value = concat {eval {"javascript:rtrn = \\"\\";
var sourSec = parseInt(\${dmMapExtend[].sourceStartSector});
var endSec = parseInt(\${dmMapExtend[].endSector});
var startSec = parseInt(\${dmMapExtend[].startSector});
var size = parseInt(\${dmMapExtend[].sectorSize});
var sourStart = (sourSec * size);
var endOfc = (endSec || 0)*size;
var startOfcet = (startSec || 0)*size;
rtrn = (sourStart + (endOfc - startOfcet)) + ''; "}}
}
set_field {
field_name = "comments"
value = get_attr {"dmMapExtend[].extends"}
}
}
}
}
step {
name = "Ref/Rel between cmdb_ci_lvm_pool and cmdb_ci_lvm_pool_member"
relation_reference {
table1_name = "cmdb_ci_lvm_pool"
key1_name = "alias"
table2_name = "cmdb_ci_lvm_pool_member"
key2_name = "extends"
result_table_name = "pool_to_poolMem"
unmatched_lines = remove
relation_type = "Members::Member of"
ref_direction = childToParent
ref_field_name = "pool"
}
}
step {
name = "________Proc_LVM________"
if {
condition = eq {
"1"
"2"
}
on_true = set_attr {
"blq"
"1"
}
on_false = nop {}
}
}
step {
name = "Get sd_multipath"
if {
condition = is_not_empty {get_attr {"sd_out"}}
on_true = set_attr {
"sd_multipath"
eval {"javascript: rtrn = \\"\\";
var results = JSON.parse(\${sd_out});
rtrn = JSON.stringify(results.multipath_ll);"}
}
on_false = nop {}
}
}
step {
name = "________Proc_FileSystem________"
if {
condition = eq {
"1"
"2"
}
on_true = set_attr {
"blq"
"1"
}
on_false = nop {}
}
}
step {
name = "Get df"
runcmd_to_var {
cmd = "df -kP ; echo ''"
var_names = "DF"
parsing_strategy = delimited_parsing {
selected_positions = 1
line_seperator = "nonExistingDelimeter"
}
if_not_found_do = nop {}
cache_flag = 0
}
}
step {
name = "Merge lines splitted because of length"
if {
condition = is_not_empty {get_attr {"DF"}}
on_true = set_attr {
"DF"
concat {eval {"javascript:
var rtrn = '';
var fileSystems = \${DF};
fileSystems = fileSystems.split('\\\\n');
var line;
for (var i = 0; i < fileSystems.length; ++i) {
line = fileSystems[i];
if (line.indexOf(' ') == -1 && (i + 1) < fileSystems.length) {
fileSystems[i] = line + ' ' + fileSystems[(i+1)].trim();
++i;
}
}
rtrn = fileSystems+'';
"}}
}
on_false = nop {}
}
}
step {
name = "Create updated file systems list without headers, and lines start with numbers"
if {
condition = is_not_empty {get_attr {"DF"}}
on_true = parse_var_to_var {
from_var_name = "DF"
to_var_names = table {
name = "DF"
col_names = "file_system_data"
}
parsing_strategy = delimited_parsing {
exclude_lines_pattern = "Filesystem 1024-blocks Used Available Capacity Mounted on"
selected_positions = 1
line_seperator = ","
}
if_not_found_do = nop {}
}
on_false = nop {}
}
}
step {
name = "Filter file systems that had errors"
filter {
src_table_name = "DF"
target_table_name = "DF"
condition = not_starts_with {
"df:"
get_attr {"DF[].file_system_data"}
}
}
}
step {
name = "Filter cifs/nfs file systems"
comment = "OR & ANDconditions can't be at the same step"
filter {
src_table_name = "DF"
target_table_name = "DF"
condition = any {
starts_with {
"/dev/"
get_attr {"DF[].file_system_data"}
}
starts_with {
"/"
get_attr {"DF[].file_system_data"}
}
contains {
get_attr {"DF[].file_system_data"}
":"
}
}
}
}
step {
name = "Remove new lines form file system names"
comment = "Even though \\"df\\" output was split using \\"\\\\n\\", some lines still have new lines characters in them"
if {
condition = is_not_empty {get_attr {"DF"}}
on_true = transform {
src_table_name = "DF"
target_table_name = "DF"
operation {set_field {
field_name = "file_system_data"
value = eval {"javascript:
var rtrn = '';
var fileSystem = \${DF[].file_system_data};
fileSystem = fileSystem.replace(/\\\\n/g,' ' );
rtrn = fileSystem;
"}
}}
}
on_false = nop {}
}
}
step {
name = "Insert file systems into a table"
if {
condition = is_not_empty {get_attr {"DF"}}
on_true = parse_var_to_var {
from_var_name = "DF[*].file_system_data"
to_var_names = table {
name = "DF"
col_names = "name","size","blocks","freeSpace","capacity","mountPoint"
}
parsing_strategy = regex_parsing {regex = "(.*?)\\\\s+(.*?)\\\\s+(.*?)\\\\s+(.*?)\\\\s+(.*?)\\\\s+(.*)"}
if_not_found_do = nop {}
}
on_false = nop {}
}
}
step {
name = "Copy the DF to backup table"
union {
table1_name = "DF"
table2_name = "DF_orig"
result_table_name = "DF_orig"
}
}
step {
name = "Merge proc_mount and file systems"
comment = "We set it to \\"Keep\\" since not all the file system exist in the procMount table and we need to keep it in the list."
if {
condition = is_not_empty {get_attr {"procMounts"}}
on_true = merge {
table1_name = "DF"
table2_name = "procMounts"
result_table_name = "DF"
unmatched_lines = keep
condition = eq {
get_attr {"DF[].name"}
get_attr {"procMounts[].name"}
}
}
on_false = nop {}
}
}
step {
name = "Filter the DF table to include relevant file system"
filter {
src_table_name = "DF"
target_table_name = "DF"
condition = contains {
get_attr {"DF_orig[*].name"}
get_attr {"DF[].name"}
}
}
}
step {
name = "Find NAS"
transform {
src_table_name = "DF"
target_table_name = "DF"
operation {set_field {
field_name = "type"
value = eval {"javascript: rtrn = \\"\\";
var fullPath = \${DF[].name};
if (fullPath.startsWith('//'))
{ // cifs
rtrn = \\"cifs\\";
} else if (fullPath.startsWith('\\\\\\\\\\\\\\\\'))
{ // cifs
rtrn = \\"cifs\\";
} else if (fullPath.indexOf(':') !== -1)
{ // nfs
rtrn = \\"nfs\\";
} else
{ // local
rtrn = \\"local\\";
}"}
}}
}
}
step {
name = "Find partition"
merge {
table1_name = "DF"
table2_name = "partition_table"
result_table_name = "DF"
unmatched_lines = keep
condition = contains {
get_attr {"DF[].name"}
get_attr {"partition_table[].name"}
}
}
}
step {
name = "Filter local file systems"
filter {
src_table_name = "DF"
target_table_name = "DFlocal"
condition = eq {
get_attr {"DF[].type"}
"local"
}
}
}
step {
name = "Update cmdb_ci_file system"
transform {
src_table_name = "DFlocal"
target_table_name = "cmdb_ci_file_system"
operation {
set_field {
field_name = "name"
value = get_attr {"DFlocal[].name"}
}
set_field {
field_name = "volume_id"
value = get_attr {"DFlocal[].name"}
}
set_field {
field_name = "mount_point"
value = get_attr {"DFlocal[].mountPoint"}
}
set_field {
field_name = "file_system"
value = get_attr {"DFlocal[].filesystem"}
}
set_field {
field_name = "media_type"
value = "fixed"
}
set_field {
field_name = "size_bytes"
value = eval {"javascript:
var rtrn = '';
rtrn = (\${DFlocal[].size}*1024) + '';
"}
}
set_field {
field_name = "free_space_bytes"
value = eval {"javascript:
var rtrn = '';
rtrn = (\${DFlocal[].freeSpace}*1024) + '';
"}
}
}
}
}
step {
name = "Remove duplicate file systems"
set_attr {
"dump_var"
eval {"javascript:
var tableWithoutDuplicates = '';
tableWithoutDuplicates = DuplicateRemover.removeDuplicates(\${cmdb_ci_file_system},\\"name\\");
CTX.setAttribute(\\"cmdb_ci_file_system\\", tableWithoutDuplicates);
"}
}
}
step {
name = "Ref/Rel cmdb_ci_file_system and Linux CI"
relation_reference {
table1_name = "cmdb_ci_linux_server"
table2_name = "cmdb_ci_file_system"
result_table_name = "file_to_linux"
unmatched_lines = remove
condition = eq {
"1"
"1"
}
relation_type = "Contains::Contained by"
ref_direction = childToParent
ref_field_name = "computer"
}
}
step {
name = "Filter NAS"
filter {
src_table_name = "DF"
target_table_name = "DFNAS"
condition = all {
neq {
get_attr {"DF[].type"}
"local"
}
is_not_empty {get_attr {"DF[].type"}}
}
}
}
step {
name = "Update temporary NAS table"
if {
condition = is_not_empty {get_attr {"DFNAS"}}
on_true = transform {
src_table_name = "DFNAS"
target_table_name = "DFNAS"
operation {
set_field {
field_name = "nas_hostname"
value = eval {"javascript: rtrn = \\"\\";
var fullPath = \${DFNAS[].name};
if (fullPath.startsWith('//'))
{ // cifs
var pathStartPos = fullPath.indexOf('/', 2);
rtrn = fullPath.substr(2, pathStartPos - 2);
} else if (fullPath.startsWith('\\\\\\\\\\\\\\\\'))
{ // cifs
var pathStartPos = fullPath.indexOf('\\\\\\\\', 2);
rtrn = fullPath.substr(2, pathStartPos - 2);
} else if (fullPath.indexOf(':') !== -1)
{ // nfs
var parts = fullPath.split(':');
rtrn = parts[0];
} else { rtrn = \\"\\";}"}
}
set_field {
field_name = "nas_path"
value = eval {"javascript: rtrn = \\"\\";
var fullPath = \${DFNAS[].name};
if (fullPath.startsWith('//'))
{ // cifs
var pathStartPos = fullPath.indexOf('/', 2);
rtrn = fullPath.substr(pathStartPos);
} else if (fullPath.startsWith('\\\\\\\\\\\\\\\\'))
{ // cifs
var pathStartPos = fullPath.indexOf('\\\\\\\\', 2);
var path = fullPath.substr(pathStartPos);
rtrn = path.replace(/\\\\\\\\/g, '/');
} else if (fullPath.indexOf(':') !== -1)
{ // nfs
var parts = fullPath.split(':');
rtrn = parts[1];
} else { rtrn = \\"\\";}"}
}
set_field {
field_name = "nas_ip_address"
value = eval {"javascript: rtrn = \\"\\";
var fullPath = \${DFNAS[].name};
var hostname = '';
if (fullPath.startsWith('//'))
{ /* cifs */
var pathStartPos = fullPath.indexOf('/', 2);
hostname = fullPath.substr(2, pathStartPos - 2);
} else if (fullPath.startsWith('\\\\\\\\\\\\\\\\'))
{ /* cifs */
var pathStartPos = fullPath.indexOf('\\\\\\\\', 2);
hostname = fullPath.substr(2, pathStartPos - 2);
} else if (fullPath.indexOf(':') !== -1)
{ /* nfs */
var parts = fullPath.split(':');
hostname = parts[0];
} else { hostname = \\"\\";}
if(/^\\\\d{1,3}.\\\\d{1,3}.\\\\d{1,3}.\\\\d{1,3}\$/.test(hostname))
rtrn = hostname;"}
}
}
}
on_false = nop {}
}
}
step {
name = "Update cmdb_ci_nas_file_system"
transform {
src_table_name = "DFNAS"
target_table_name = "cmdb_ci_nas_file_system"
operation {
set_field {
field_name = "name"
value = get_attr {"DFNAS[].name"}
}
set_field {
field_name = "volume_id"
value = get_attr {"DFNAS[].name"}
}
set_field {
field_name = "mount_point"
value = get_attr {"DFNAS[].mountPoint"}
}
set_field {
field_name = "file_system"
value = get_attr {"DFNAS[].filesystem"}
}
set_field {
field_name = "media_type"
value = "network"
}
set_field {
field_name = "size_bytes"
value = eval {"javascript:
var rtrn = '';
rtrn = (\${DFNAS[].size}*1024) + '';
"}
}
set_field {
field_name = "free_space_bytes"
value = eval {"javascript:
var rtrn = '';
rtrn = (\${DFNAS[].freeSpace}*1024) + '';
"}
}
set_field {
field_name = "nas_hostname"
value = get_attr {"DFNAS[].nas_hostname"}
}
set_field {
field_name = "nas_path"
value = get_attr {"DFNAS[].nas_path"}
}
set_field {
field_name = "nas_protocol"
value = get_attr {"DFNAS[].filesystem"}
}
}
}
}
step {
name = "Remove duplicate NAS file systems"
set_attr {
"dump_var"
eval {"javascript:
var tableWithoutDuplicates = '';
tableWithoutDuplicates = DuplicateRemover.removeDuplicates(\${cmdb_ci_nas_file_system},\\"name\\");
CTX.setAttribute(\\"cmdb_ci_nas_file_system\\", tableWithoutDuplicates);
"}
}
}
step {
name = "Ref/Rel between cmdb_ci_nas_file_system and Linux CI"
relation_reference {
table1_name = "cmdb_ci_linux_server"
table2_name = "cmdb_ci_nas_file_system"
result_table_name = "fileNAS_to_linux"
unmatched_lines = remove
condition = eq {
"1"
"1"
}
relation_type = "Contains::Contained by"
ref_direction = childToParent
ref_field_name = "computer"
}
}
step {
name = "________Proc_FC________"
if {
condition = eq {
"1"
"2"
}
on_true = set_attr {
"blq"
"1"
}
on_false = nop {}
}
}
step {
name = "Get sd_fc"
if {
condition = is_not_empty {get_attr {"sd_out"}}
on_true = set_attr {
"sd_fc"
eval {"javascript: rtrn = \\"\\";
var results = JSON.parse(\${sd_out});
rtrn = JSON.stringify(results.fc.fcHba);"}
}
on_false = nop {}
}
}
step {
name = "Create empty HBA table"
union {
table1_name = "FcHBA"
table2_name = "FcHBA"
result_table_name = "FcHBA"
}
}
step {
name = "Create empty FC ports"
union {
table1_name = "FcPorts"
table2_name = "FcPorts"
result_table_name = "FcPorts"
}
}
step {
name = "Create empty FC targets table"
union {
table1_name = "FCTargetPorts"
table2_name = "FCTargetPorts"
result_table_name = "FCTargetPorts"
}
}
step {
name = "Insert data to HBA table"
if {
condition = is_not_empty {get_attr {"sd_fc"}}
on_true = set_attr {
"dump_var"
concat {eval {"javascript: rtrn = \\"\\";
var fcHba = \${sd_fc};
var row = new Packages.java.util.HashMap();
var fc = fcHba.substring(2,fcHba.length-2);
var block = fc.split(\\"fcPort:\\");
var hbaFc =block[0].split(\\"fcHba:\\");
if(hbaFc){
var flagidy = [hbaFc.length];
for (var j = 0; j < hbaFc.length; j++ ){
var flag = 0;
var clrow = row.clone();
var fcHbaBlock = hbaFc[j].split(\\" \\");
for (var i = 0; i < fcHbaBlock.length; i++) {
var parts = fcHbaBlock[i].split(':');
var name = parts[0].trim();
var value = parts[1].trim();
if (name == \\"serialNumber\\") {
clrow.put(\\"serial\\", value);
}
if (name == \\"model\\") {
clrow.put(\\"model\\", value);
}
if (name == \\"modelDescription\\") {
clrow.put(\\"descr\\", value);
}
}
for (var z = 0; z < flagidy.length; z++) {
if (flagidy[z] == clrow.get(\\"serial\\")) {
flag = 1;
}
}
if(flag == 0) {
\${FcHBA}.add(clrow);
flagidy[j] = clrow.get(\\"serial\\");
}
}
CTX.setAttribute('FcHBA',\${FcHBA});
}
"}}
}
on_false = nop {}
}
}
step {
name = "Insert data to FC ports and targets tables"
if {
condition = is_not_empty {get_attr {"sd_fc"}}
on_true = set_attr {
"dump_var"
concat {eval {"javascript: rtrn = \\"\\";
var fcHba = \${sd_fc};
var row = new Packages.java.util.HashMap();
var fc = fcHba.substring(2,fcHba.length-2);
var block = fc.split(\\"fcHba:\\");
var end = block.length;
var hbaFc =block[end-1].split(\\"fcPort:\\");
var fcPortwwpn = \\"\\";
if(hbaFc){
for (var j = 1; j < hbaFc.length; j++ ){
var fcHbaBlock = hbaFc[j].split(\\"targetPort\\");
for (var i = 0; i < fcHbaBlock.length; i++) {
var fcPortTarget = fcHbaBlock[i].split(\\" \\");
var clrow = row.clone();
for ( var z = 0; z < fcPortTarget.length; z++ ) {
var parts = fcPortTarget[z].split(':');
var name = parts[0].trim();
var value = parts[1].trim();
if (i == 0) {
if (name == \\"wwpn\\") {
clrow.put(\\"wwpn\\", value);
fcPortwwpn = value;
}
if (name == \\"wwnn\\") {
clrow.put(\\"wwnn\\", value);
}
if (name == \\"speed\\") {
clrow.put(\\"speed\\", value);
}
if (name == \\"port_type\\") {
clrow.put(\\"port_type\\", value);
}
if (name == \\"hbaSerialNumber\\") {
clrow.put(\\"hbaSerialNumber\\", value);
}
}
else {
if (name == \\"wwpn\\") {
clrow.put(\\"wwpn\\", value);
clrow.put(\\"fcPortWWPN\\",fcPortwwpn);
}
if (name == \\"wwnn\\") {
clrow.put(\\"wwnn\\", value);
}
if (name == \\"blockDeviceNames\\") {
clrow.put(\\"blockDeviceNames\\", value);
}
}
}
if (i == 0){
\${FcPorts}.add(clrow);
}
else {
\${FCTargetPorts}.add(clrow);
}
}
}
CTX.setAttribute('FCTargetPorts',\${FCTargetPorts});
}"}}
}
on_false = nop {}
}
}
step {
name = "Update cmdb_ci_storage_hba"
transform {
src_table_name = "FcHBA"
target_table_name = "cmdb_ci_storage_hba"
operation {
set_field {
field_name = "device_id"
value = get_attr {"FcHBA[].serial"}
}
set_field {
field_name = "serial_number"
value = get_attr {"FcHBA[].serial"}
}
set_field {
field_name = "model_id"
value = get_attr {"FcHBA[].model"}
}
set_field {
field_name = "name"
value = concat {
get_attr {"FcHBA[].model"}
" "
get_attr {"FcHBA[].serial"}
}
}
}
}
}
step {
name = "Remove HBA without serial"
filter {
src_table_name = "cmdb_ci_storage_hba"
target_table_name = "cmdb_ci_storage_hba"
condition = is_not_empty {get_attr {"cmdb_ci_storage_hba[].serial_number"}}
}
}
step {
name = "Ref/Rel between cmdb_ci_storage_hba and Linux CI"
relation_reference {
table1_name = "cmdb_ci_linux_server"
table2_name = "cmdb_ci_storage_hba"
result_table_name = "hba_to_ci"
unmatched_lines = remove
condition = eq {
"1"
"1"
}
relation_type = "Owns::Owned by"
ref_direction = childToParent
ref_field_name = "computer"
}
}
step {
name = "Update cmdb_ci_fc_port"
transform {
src_table_name = "FcPorts"
target_table_name = "cmdb_ci_fc_port"
operation {
set_field {
field_name = "wwpn"
value = concat {eval {"javascript: rtrn = \\"\\";var wwnp = \${FcPorts[].wwpn};var middle = wwnp.split('x');var ww = middle[1];for (var i = 0; i < ww.length; i++){ if (i%2 != 0 && i != ww.length-1 ) { rtrn +=ww[i]+\\":\\"; } else { rtrn += ww[i]; }}"}}
}
set_field {
field_name = "wwnn"
value = concat {eval {"javascript: rtrn = \\"\\";var wwnn = \${FcPorts[].wwnn};var middle = wwnn.split('x');var ww = middle[1];for (var i = 0; i < ww.length; i++){ if (i%2 != 0 && i != ww.length-1 ) { rtrn +=ww[i]+\\":\\"; } else { rtrn += ww[i]; }}"}}
}
set_field {
field_name = "speed"
value = concat {
get_attr {"FcPorts[].speed"}
" GFC"
}
}
set_field {
field_name = "port_type"
value = get_attr {"FcPorts[].port_type"}
}
set_field {
field_name = "name"
value = concat {
"FC Port "
get_attr {"FcPorts[].wwpn"}
}
}
}
}
}
step {
name = "Ref/Rel between cmdb_ci_fc_port and Linux CI"
relation_reference {
table1_name = "cmdb_ci_linux_server"
table2_name = "cmdb_ci_fc_port"
result_table_name = "FcPort_to_CI"
unmatched_lines = remove
condition = eq {
"1"
"1"
}
relation_type = "Owns::Owned by"
ref_direction = childToParent
ref_field_name = "computer"
}
}
step {
name = "Ref/Rel between cmdb_ci_fc_port and cmdb_ci_storage_hba"
relation_reference {
table1_name = "cmdb_ci_fc_port"
key1_name = "hbaSerialNumber"
table2_name = "cmdb_ci_storage_hba"
key2_name = "serial"
result_table_name = "port_to_hba"
unmatched_lines = remove
ref_direction = parentToChild
ref_field_name = "controller"
}
}
step {
name = "Merge FC targets and sys blocks"
merge {
table1_name = "FCTargetPorts"
key1_name = "blockDeviceNames"
table2_name = "SysBlock"
key2_name = "name"
result_table_name = "FCTargetPorts"
unmatched_lines = remove
}
}
step {
name = "Update cmdb_ci_fc_disk"
transform {
src_table_name = "FCTargetPorts"
target_table_name = "cmdb_ci_fc_disk"
operation {
set_field {
field_name = "name"
value = concat {
"/dev/"
get_attr {"FCTargetPorts[].blockDeviceNames"}
}
}
set_field {
field_name = "device_id"
value = concat {
"/dev/"
get_attr {"FCTargetPorts[].blockDeviceNames"}
}
}
set_field {
field_name = "device_host_id"
value = eval {"javascript: rtrn =\\"\\";var ports = \${FCTargetPorts[].host};var blocks = ports.split(':');rtrn = blocks[0];"}
}
set_field {
field_name = "device_bus_id"
value = eval {"javascript: rtrn =\\"\\";var ports = \${FCTargetPorts[].host};var blocks = ports.split(':');rtrn = blocks[1];"}
}
set_field {
field_name = "device_target_id"
value = eval {"javascript: rtrn =\\"\\";var ports = \${FCTargetPorts[].host};var blocks = ports.split(':');rtrn = blocks[2];"}
}
set_field {
field_name = "device_lun"
value = eval {"javascript: rtrn =\\"\\";var ports = \${FCTargetPorts[].host};var blocks = ports.split(':');rtrn = blocks[3];"}
}
set_field {
field_name = "size_bytes"
value = eval {"javascript: rtrn=\\"\\";
var sectors = parseInt(\${FCTargetPorts[].sectors});
var sectorSize = parseInt(\${FCTargetPorts[].sectorSize});
rtrn = (sectors * sectorSize) + '';
"}
}
set_field {
field_name = "disk_space"
value = eval {"javascript:var rtrn='';
var sectors = parseInt(\${FCTargetPorts[].sectors});
var sectorSize = parseInt(\${FCTargetPorts[].sectorSize});
var spec = sectors * sectorSize;
rtrn = (spec / 1073741824) + '';"}
}
set_field {
field_name = "device_major_minor"
value = get_attr {"FCTargetPorts[].deviceMajorMinor"}
}
set_field {
field_name = "device_interface"
value = "fc"
}
set_field {
field_name = "model_id"
value = get_attr {"FCTargetPorts[].model"}
}
set_field {
field_name = "manufacturer"
value = get_attr {"FCTargetPorts[].vendor"}
}
set_field {
field_name = "storage_type"
value = "network"
}
set_field {
field_name = "major"
value = eval {"javascript: rtrn=\\"\\";
var MajMin = \${FCTargetPorts[].deviceMajorMinor};
if (MajMin != null)
{
var Maj = MajMin.split(':');
rtrn = Maj[0];
}"}
}
set_field {
field_name = "fcPortWWPN"
value = eval {"javascript: rtrn = \\"\\";var wwnn = \${FCTargetPorts[].fcPortWWPN};var middle = wwnn.split('x');var ww = middle[1];for (var i = 0; i < ww.length; i++){ if (i%2 != 0 && i != ww.length-1 ) { rtrn +=ww[i]+\\":\\"; } else { rtrn += ww[i]; }}"}
}
}
}
}
step {
name = "Update cmdb_fc_initiator"
transform {
src_table_name = "cmdb_ci_fc_disk"
target_table_name = "cmdb_fc_initiator"
operation {
set_field {
field_name = "wwnn"
value = get_attr {"cmdb_ci_fc_disk[].fcPortWWPN"}
}
set_field {
field_name = "wwpn"
value = get_attr {"cmdb_ci_fc_disk[].fcPortWWPN"}
}
}
}
}
step {
name = "Update cmdb_fc_target"
transform {
src_table_name = "cmdb_ci_fc_disk"
target_table_name = "cmdb_fc_target"
operation {
set_field {
field_name = "wwnn"
value = concat {eval {"javascript: rtrn = \\"\\";var wwnn = \${cmdb_ci_fc_disk[].wwnn};var middle = wwnn.split('x');var ww = middle[1];for (var i = 0; i < ww.length; i++){ if (i%2 != 0 && i != ww.length-1 ) { rtrn +=ww[i]+\\":\\"; } else { rtrn += ww[i]; }}"}}
}
set_field {
field_name = "wwpn"
value = concat {eval {"javascript: rtrn = \\"\\";var wwpn = \${cmdb_ci_fc_disk[].wwpn};var middle = wwpn.split('x');var ww = middle[1];for (var i = 0; i < ww.length; i++){ if (i%2 != 0 && i != ww.length-1 ) { rtrn +=ww[i]+\\":\\"; } else { rtrn += ww[i]; }}"}}
}
}
}
}
step {
name = "Ref/Rel between cmdb_ci_fc_disk and Linux CI"
relation_reference {
table1_name = "cmdb_ci_linux_server"
table2_name = "cmdb_ci_fc_disk"
result_table_name = "fcdisk_to_linux"
unmatched_lines = remove
condition = eq {
"1"
"1"
}
relation_type = "Contains::Contained by"
ref_direction = childToParent
ref_field_name = "computer"
}
}
step {
name = "Ref/Rel between cmdb_ci_fc_disk and cmdb_ci_fc_port"
relation_reference {
table1_name = "cmdb_ci_fc_disk"
key1_name = "fcPortWWPN"
table2_name = "cmdb_ci_fc_port"
key2_name = "wwpn"
result_table_name = "fc_disk_to_port"
unmatched_lines = remove
ref_direction = parentToChild
ref_field_name = "provided_by"
}
}
step {
name = "Ref/Rel between cmdb_ci_fc_disk and cmdb_fc_initiator"
relation_reference {
table1_name = "cmdb_fc_initiator"
key1_name = "blockDeviceNames"
table2_name = "cmdb_ci_fc_disk"
key2_name = "blockDeviceNames"
result_table_name = "fcdisk_to_initiator"
unmatched_lines = remove
ref_direction = parentToChild
ref_field_name = "non_ci"
}
}
step {
name = "Ref/Rel between cmdb_ci_fc_disk and cmdb_fc_target"
relation_reference {
table1_name = "cmdb_fc_target"
key1_name = "blockDeviceNames"
table2_name = "cmdb_ci_fc_disk"
key2_name = "blockDeviceNames"
result_table_name = "fcdisk_to_target"
unmatched_lines = remove
ref_direction = parentToChild
ref_field_name = "non_ci"
}
}
step {
name = "Merge disks and fc disks"
merge {
table1_name = "cmdb_ci_disk"
table2_name = "cmdb_ci_fc_disk"
result_table_name = "cmdb_ci_disk"
unmatched_lines = keep
condition = eq {
get_attr {"cmdb_ci_disk[].device_id"}
get_attr {"cmdb_ci_fc_disk[].device_id"}
}
}
}
step {
name = "Filter out FC disks"
filter {
src_table_name = "cmdb_ci_disk"
target_table_name = "cmdb_ci_disk"
condition = is_empty {get_attr {"cmdb_ci_disk[].wwnn"}}
}
}
step {
name = "________Proc_FC________"
if {
condition = eq {
"1"
"2"
}
on_true = set_attr {
"blq"
"1"
}
on_false = nop {}
}
}
step {
name = "Update total disk space on Linux CI"
set_attr {
"cmdb_ci_linux_server[*].disk_space"
eval {"javascript: var diskUsage;
var rtrn ;
var storageDevices = \${cmdb_ci_storage_device};
var disks = \${cmdb_ci_disk};
var fcDisks = \${cmdb_ci_fc_disk};
var iscsiDisk = \${cmdb_ci_iscsi_disk};
var fileSystem = \${cmdb_ci_file_system};
var excludedTypes = ['cd', 'cdrom', 'ram', 'removable', 'logical'];
var getTotalDiskSpaceByTable = function(disksTable){
var totalDiskSpace = 0;
var currentDisk;
for(var i = 0; i < disksTable.size(); i++){
currentDisk = disksTable.get(i);
var current_disk_storage_type = String(currentDisk.get(\\"storage_type\\"));
var current_disk_space = currentDisk.get(\\"disk_space\\");
if( current_disk_space && (excludedTypes.indexOf(current_disk_storage_type) == -1)){
totalDiskSpace =parseFloat(totalDiskSpace) + parseFloat(current_disk_space);
}
}
return totalDiskSpace;
};
var getTotalDiskSpaceFromFileSystem = function(disksTable){
var totalDiskSpace = 0;
for(var i = 0; i < disksTable.size(); i++){
var currentDisk = disksTable.get(i);
var mediaType = currentDisk.get(\\"media_type\\");
if(mediaType == 'fixed'){
var current_disk_space =currentDisk.get(\\"size_bytes\\");
totalDiskSpace =parseFloat(totalDiskSpace) + parseFloat(current_disk_space);
}
}
return totalDiskSpace;
};
var size = getTotalDiskSpaceFromFileSystem(fileSystem)/(1024*1024*1024)
diskUsage = parseFloat(getTotalDiskSpaceByTable(storageDevices) + getTotalDiskSpaceByTable(disks) + getTotalDiskSpaceByTable(fcDisks) + getTotalDiskSpaceByTable(iscsiDisk) + parseInt(size)) ;
rtrn=diskUsage.toFixed(2);"}
}
}
step {
name = "Ref/Rel between cmdb_ci_disk_partition and cmdb_ci_disk"
relation_reference {
table1_name = "cmdb_ci_disk_partition"
table2_name = "cmdb_ci_disk"
result_table_name = "part_to_disk"
unmatched_lines = remove
condition = contains {
get_attr {"cmdb_ci_disk[].name"}
get_attr {"cmdb_ci_disk_partition[].parentDisk"}
}
ref_direction = parentToChild
ref_field_name = "disk"
}
}
step {
name = "Ref/Rel between cmdb_ci_disk_partition and cmdb_ci_storage_device"
relation_reference {
table1_name = "cmdb_ci_disk_partition"
table2_name = "cmdb_ci_storage_device"
result_table_name = "part_to_storage"
unmatched_lines = remove
condition = contains {
get_attr {"cmdb_ci_storage_device[].name"}
get_attr {"cmdb_ci_disk_partition[].parentDisk"}
}
ref_direction = parentToChild
ref_field_name = "disk"
}
}
step {
name = "Ref/Rel between cmdb_ci_disk_partition and cmdb_ci_fc_disk"
relation_reference {
table1_name = "cmdb_ci_disk_partition"
table2_name = "cmdb_ci_fc_disk"
result_table_name = "part_to_fc_disk"
unmatched_lines = remove
condition = contains {
get_attr {"cmdb_ci_fc_disk[].name"}
get_attr {"cmdb_ci_disk_partition[].parentDisk"}
}
ref_direction = parentToChild
ref_field_name = "disk"
}
}
step {
name = "Ref/Rel between cmdb_ci_disk_partition and cmdb_ci_iscsi_disk"
relation_reference {
table1_name = "cmdb_ci_disk_partition"
table2_name = "cmdb_ci_iscsi_disk"
result_table_name = "part_to_iscsi_disk"
unmatched_lines = remove
condition = contains {
get_attr {"cmdb_ci_iscsi_disk[].name"}
get_attr {"cmdb_ci_disk_partition[].parentDisk"}
}
ref_direction = parentToChild
ref_field_name = "disk"
}
}
step {
name = "Ref/Rel between cmdb_ci_lvm_pool and cmdb_ci_disk"
relation_reference {
table1_name = "cmdb_ci_lvm_pool"
key1_name = "deviceMajorMinor"
table2_name = "cmdb_ci_disk"
key2_name = "deviceMajorMinor"
result_table_name = "lvm_to_disk"
unmatched_lines = remove
ref_direction = childToParent
ref_field_name = "provided_by"
}
}
step {
name = "Ref/Rel between cmdb_ci_lvm_pool and cmdb_ci_storage_device"
relation_reference {
table1_name = "cmdb_ci_lvm_pool"
key1_name = "deviceMajorMinor"
table2_name = "cmdb_ci_storage_device"
key2_name = "deviceMajorMinor"
result_table_name = "lvm_to_storage"
unmatched_lines = remove
ref_direction = childToParent
ref_field_name = "provided_by"
}
}
step {
name = "Ref/Rel between cmdb_ci_lvm_pool and cmdb_ci_fc_disk"
relation_reference {
table1_name = "cmdb_ci_lvm_pool"
key1_name = "deviceMajorMinor"
table2_name = "cmdb_ci_fc_disk"
key2_name = "deviceMajorMinor"
result_table_name = "lvm_to_fc_disk"
unmatched_lines = remove
ref_direction = childToParent
ref_field_name = "provided_by"
}
}
step {
name = "Ref/Rel between cmdb_ci_lvm_pool and cmdb_ci_iscsi_disk"
relation_reference {
table1_name = "cmdb_ci_lvm_pool"
key1_name = "deviceMajorMinor"
table2_name = "cmdb_ci_iscsi_disk"
key2_name = "deviceMajorMinor"
result_table_name = "lvm_to_iscsi_disk"
unmatched_lines = remove
ref_direction = childToParent
ref_field_name = "provided_by"
}
}
step {
name = "Ref/Rel between cmdb_ci_lvm_pool_member and cmdb_ci_disk_partition"
relation_reference {
table1_name = "cmdb_ci_lvm_pool_member"
table2_name = "cmdb_ci_disk_partition"
result_table_name = "pool_member_to_partition"
unmatched_lines = remove
condition = all {
neq {
get_attr {"cmdb_ci_lvm_pool_member[].type"}
"multipath"
}
eq {
get_attr {"cmdb_ci_lvm_pool_member[].deviceMajorMinor"}
get_attr {"cmdb_ci_disk_partition[].deviceMajorMinor"}
}
}
ref_direction = parentToChild
ref_field_name = "storage"
}
}
step {
name = "Ref/Rel between cmdb_ci_lvm_pool_member and cmdb_ci_disk"
relation_reference {
table1_name = "cmdb_ci_lvm_pool_member"
table2_name = "cmdb_ci_disk"
result_table_name = "pool_member_to_disk"
unmatched_lines = remove
condition = all {
neq {
get_attr {"cmdb_ci_lvm_pool_member[].type"}
"multipath"
}
eq {
get_attr {"cmdb_ci_lvm_pool_member[].deviceMajorMinor"}
get_attr {"cmdb_ci_disk[].deviceMajorMinor"}
}
}
ref_direction = parentToChild
ref_field_name = "storage"
}
}
step {
name = "Ref/Rel between cmdb_ci_lvm_pool_member and cmdb_ci_storage_device"
relation_reference {
table1_name = "cmdb_ci_lvm_pool_member"
table2_name = "cmdb_ci_storage_device"
result_table_name = "pool_member_to_storage"
unmatched_lines = remove
condition = all {
neq {
get_attr {"cmdb_ci_lvm_pool_member[].type"}
"multipath"
}
eq {
get_attr {"cmdb_ci_lvm_pool_member[].deviceMajorMinor"}
get_attr {"cmdb_ci_storage_device[].deviceMajorMinor"}
}
}
ref_direction = parentToChild
ref_field_name = "storage"
}
}
step {
name = "Ref/Rel between cmdb_ci_file_system and cmdb_ci_storage_device"
relation_reference {
table1_name = "cmdb_ci_storage_device"
table2_name = "cmdb_ci_file_system"
result_table_name = "fs_to_stor"
unmatched_lines = remove
condition = eq {
get_attr {"cmdb_ci_file_system[].name"}
get_attr {"cmdb_ci_storage_device[].name"}
}
relation_type = "Provides::Provided by"
ref_direction = childToParent
ref_field_name = "provided_by"
}
}
step {
name = "Ref/Rel between cmdb_ci_file_system and cmdb_ci_disk"
relation_reference {
table1_name = "cmdb_ci_disk"
table2_name = "cmdb_ci_file_system"
result_table_name = "fs_to_disk"
unmatched_lines = remove
condition = eq {
get_attr {"cmdb_ci_file_system[].name"}
get_attr {"cmdb_ci_disk[].name"}
}
relation_type = "Provides::Provided by"
ref_direction = childToParent
ref_field_name = "provided_by"
}
}
step {
name = "Ref/Rel between cmdb_ci_file_system and cmdb_ci_disk_partition"
relation_reference {
table1_name = "cmdb_ci_disk_partition"
table2_name = "cmdb_ci_file_system"
result_table_name = "fs_to_part"
unmatched_lines = remove
condition = eq {
get_attr {"cmdb_ci_file_system[].name"}
get_attr {"cmdb_ci_disk_partition[].name"}
}
relation_type = "Provides::Provided by"
ref_direction = childToParent
ref_field_name = "provided_by"
}
}
}
</ndl>
<parent display_value=""/>
<serverless>false</serverless>
<source/>
<sync_to_mid>true</sync_to_mid>
<sys_class_name>sa_pattern</sys_class_name>
<sys_created_by>admin</sys_created_by>
<sys_created_on>2017-02-01 13:50:01</sys_created_on>
<sys_customer_update>false</sys_customer_update>
<sys_domain>global</sys_domain>
<sys_domain_path>/</sys_domain_path>
<sys_id>303407279f2032001d753758442e708c</sys_id>
<sys_mod_count>49</sys_mod_count>
<sys_name>Linux - Storage</sys_name>
<sys_overrides display_value=""/>
<sys_package display_value="Pattern Designer" source="com.snc.pattern.designer">79c934314f310300261de57d0210c70c</sys_package>
<sys_policy/>
<sys_replace display_value=""/>
<sys_replace_on_upgrade>false</sys_replace_on_upgrade>
<sys_scope display_value="Global">global</sys_scope>
<sys_update_name>sa_pattern_303407279f2032001d753758442e708c</sys_update_name>
<sys_updated_by>blah</sys_updated_by>
<sys_updated_on>2021-08-30 20:38:11</sys_updated_on>
<version/>
</sa_pattern>
<sa_pattern action="INSERT_OR_UPDATE">
<active>true</active>
<ci_type>cmdb_ci_appl_generic</ci_type>
<cpattern_type>2</cpattern_type>
<description/>
<directory>false</directory>
<enforce_proc_classy>false</enforce_proc_classy>
<has_draft>false</has_draft>
<invoke_per_account>false</invoke_per_account>
<metadata_id>3a088d0af3b0130005d9423423612b15</metadata_id>
<name>UNIX Cluster - Linux Red Hat Cluster</name>
<ndl>library {
name = "UNIX Cluster - Linux Red Hat Cluster"
id = "3a088d0af3b0130005d9423423612b15"
description = "UNIX Cluster - Linux Red Hat Cluster"
step {
name = "UNIX Cluster - Linux Red Hat Cluster"
ref {refid = "c4eabd514fe3c3c0a9f9011f0310c730"}
}
}
</ndl>
<parent display_value=""/>
<serverless>false</serverless>
<source/>
<sync_to_mid>true</sync_to_mid>
<sys_class_name>sa_pattern</sys_class_name>
<sys_created_by>admin</sys_created_by>
<sys_created_on>2018-03-13 15:34:42</sys_created_on>
<sys_customer_update>false</sys_customer_update>
<sys_domain>global</sys_domain>
<sys_domain_path>/</sys_domain_path>
<sys_id>3a088d0af3b0130005d9423423612b15</sys_id>
<sys_mod_count>4</sys_mod_count>
<sys_name>UNIX Cluster - Linux Red Hat Cluster</sys_name>
<sys_overrides display_value=""/>
<sys_package display_value="Pattern Designer" source="com.snc.pattern.designer">79c934314f310300261de57d0210c70c</sys_package>
<sys_policy/>
<sys_replace display_value=""/>
<sys_replace_on_upgrade>false</sys_replace_on_upgrade>
<sys_scope display_value="Global">global</sys_scope>
<sys_update_name>sa_pattern_3a088d0af3b0130005d9423423612b15</sys_update_name>
<sys_updated_by>admin</sys_updated_by>
<sys_updated_on>2018-03-13 15:51:43</sys_updated_on>
<version/>
</sa_pattern>
<sa_pattern action="INSERT_OR_UPDATE">
<active>true</active>
<ci_type>cmdb_ci_appl_generic</ci_type>
<cpattern_type>2</cpattern_type>
<description/>
<directory>false</directory>
<enforce_proc_classy>false</enforce_proc_classy>
<has_draft>false</has_draft>
<invoke_per_account>false</invoke_per_account>
<metadata_id>3ceb033c13e23200d4013192e144b0f9</metadata_id>
<name>get service name for Linux server</name>
<ndl>library {
name = "get service name for Linux server"
id = "3ceb033c13e23200d4013192e144b0f9"
description = "null"
step {
name = "get list of services - Ubuntu - Linux"
comment = "Run command to get all the list of the active services.
We are parsing the output to have only the service name."
if {
condition = eq {
get_attr {"computer_system.osFamily"}
"UNIX"
}
on_true = runcmd_to_var {
cmd = "systemctl list-units --type service 2>/dev/null |grep .service | awk '{print \$1}' | sed -e 's/.service//' "
var_names = table {
name = "linux_service_name_table"
col_names = "linux_service_name_list"
}
parsing_strategy = delimited_parsing {
exclude_lines_pattern = "systemctl|\\u00E2\\u0097\\u008F"
selected_positions = 1
}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "script to get the service status by the process ID"
comment = "Script which will run the command: service <service_name> status command and insert the output to the table.
We are filtering the output only to the relevant pid_info.pid, so the only row with the status data will be the one that related to process pid that we are checking."
if {
condition = all {
eq {
get_attr {"computer_system.osFamily"}
"UNIX"
}
is_not_empty {get_attr {"linux_service_name_table"}}
}
on_true = transform {
src_table_name = "linux_service_name_table"
target_table_name = "linux_service_name_table"
operation {set_field {
field_name = "status"
value = eval {"javascript:
try{
var service_name = CTX.getAttribute(\\"linux_service_name_table[].linux_service_name_list\\");
//var command=\\"sudo service \\"+service_name+\\" status |grep \\"+\${pid_info.pid};
var command=\\"/bin/systemctl status \\"+service_name+\\".service 2>/dev/null | grep \\"+\${pid_info.pid};
var rtrn=CTX.getCommandManager().shellCommand(command, false, null, null, CTX);
rtrn;
}
catch(e){
var rtrn =e;
rtrn;
}"}
}}
}
on_false = nop {}
}
}
step {
name = "filter the linux_service_name_table table"
comment = "Filter the \$linux_service_name_table table, so we will have a table with one line that include the service name and it's status."
if {
condition = all {
is_not_empty {get_attr {"linux_service_name_table[*].status"}}
eq {
get_attr {"computer_system.osFamily"}
"UNIX"
}
}
on_true = filter {
src_table_name = "linux_service_name_table"
target_table_name = "linux_service_name_table"
condition = is_not_empty {get_attr {"linux_service_name_table[].status"}}
}
on_false = nop {}
}
}
step {
name = "parse service_name"
comment = "We are saving the service_name in \$linux_service_name variable."
if {
condition = all {
not_contains {
get_attr {"linux_service_name_table[1].status"}
"Redirecting"
}
eq {
get_attr {"computer_system.osFamily"}
"UNIX"
}
}
on_true = set_attr {
"linux_service_name"
get_attr {"linux_service_name_table[1].linux_service_name_list"}
}
on_false = nop {}
}
}
step {
name = "set service name - CentOs - Linux start with Running"
comment = "set service name - CentOs - Linux"
if {
condition = all {
eq {
get_attr {"computer_system.osFamily"}
"UNIX"
}
is_empty {get_attr {"linux_service_name"}}
}
on_true = runcmd_to_var {
cmd = concat {
"service --status-all 2>/dev/null |grep -w "
get_attr {"pid_info[1].pid"}
}
var_names = "linux_service_name"
parsing_strategy = regex_parsing {regex = "^Running.*\\\\s+\\\\(([^\\\\)]*)"}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "set service name - CentOs - Linux"
comment = "set service name - CentOs - Linux"
if {
condition = all {
eq {
get_attr {"computer_system.osFamily"}
"UNIX"
}
is_empty {get_attr {"linux_service_name"}}
}
on_true = runcmd_to_var {
cmd = concat {
"service --status-all 2>/dev/null |grep "
get_attr {"pid_info[1].pid"}
"|awk '{print \$1}'"
}
var_names = "linux_service_name"
parsing_strategy = delimited_parsing {
selected_positions = 1
}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "set service name - RedHat - Linux"
comment = "set service name - RedHat - Linux"
if {
condition = all {
eq {
get_attr {"computer_system.osFamily"}
"UNIX"
}
is_empty {get_attr {"linux_service_name"}}
}
on_true = runcmd_to_var {
cmd = concat {
"service --status-all 2>/dev/null|grep '"
get_attr {"pid_info[1].pid"}
")' |awk '{print \$1}'"
}
var_names = "linux_service_name"
parsing_strategy = delimited_parsing {
selected_positions = 1
}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
}
</ndl>
<parent display_value=""/>
<serverless>false</serverless>
<source/>
<sync_to_mid>true</sync_to_mid>
<sys_class_name>sa_pattern</sys_class_name>
<sys_created_by>bary.solomon</sys_created_by>
<sys_created_on>2017-05-03 11:25:54</sys_created_on>
<sys_customer_update>false</sys_customer_update>
<sys_domain>global</sys_domain>
<sys_domain_path>/</sys_domain_path>
<sys_id>3ceb033c13e23200d4013192e144b0f9</sys_id>
<sys_mod_count>36</sys_mod_count>
<sys_name>get service name for Linux server</sys_name>
<sys_overrides display_value=""/>
<sys_package display_value="Pattern Designer" source="com.snc.pattern.designer">79c934314f310300261de57d0210c70c</sys_package>
<sys_policy/>
<sys_replace display_value=""/>
<sys_replace_on_upgrade>false</sys_replace_on_upgrade>
<sys_scope display_value="Global">global</sys_scope>
<sys_update_name>sa_pattern_3ceb033c13e23200d4013192e144b0f9</sys_update_name>
<sys_updated_by>bary.solomon</sys_updated_by>
<sys_updated_on>2017-06-28 11:09:38</sys_updated_on>
<version/>
</sa_pattern>
<sa_pattern action="INSERT_OR_UPDATE">
<active>true</active>
<ci_type>cmdb_ci_appl_generic</ci_type>
<cpattern_type>2</cpattern_type>
<description/>
<directory>false</directory>
<enforce_proc_classy>false</enforce_proc_classy>
<has_draft>false</has_draft>
<invoke_per_account>false</invoke_per_account>
<metadata_id>4103cbe39f2032001d753758442e709a</metadata_id>
<name>Linux - Memory</name>
<ndl>
library {
name = "Linux - Memory"
id = "4103cbe39f2032001d753758442e709a"
description = ""
step {
name = "Get memory"
runcmd_to_var {
cmd = "grep MemTotal /proc/meminfo"
var_names = "Ram"
parsing_strategy = delimited_parsing {
include_lines_pattern = "MemTotal"
delimiters = " "
selected_positions = 2
}
if_not_found_do = nop {}
cache_flag = 0
}
}
step {
name = "Update RAM on Linux CI"
set_attr {
"cmdb_ci_linux_server[*].ram"
eval {"javascript:rtrn = \\"\\";
var ram = \${Ram} / 1024;
rtrn = Math.ceil(ram);
"}
}
}
}
</ndl>
<parent display_value=""/>
<serverless>false</serverless>
<source/>
<sync_to_mid>true</sync_to_mid>
<sys_class_name>sa_pattern</sys_class_name>
<sys_created_by>oron.subayi</sys_created_by>
<sys_created_on>2017-02-01 13:44:52</sys_created_on>
<sys_customer_update>false</sys_customer_update>
<sys_domain>global</sys_domain>
<sys_domain_path>/</sys_domain_path>
<sys_id>4103cbe39f2032001d753758442e709a</sys_id>
<sys_mod_count>0</sys_mod_count>
<sys_name>Linux - Memory</sys_name>
<sys_overrides display_value=""/>
<sys_package display_value="Pattern Designer" source="com.snc.pattern.designer">79c934314f310300261de57d0210c70c</sys_package>
<sys_policy/>
<sys_replace display_value=""/>
<sys_replace_on_upgrade>false</sys_replace_on_upgrade>
<sys_scope display_value="Global">global</sys_scope>
<sys_update_name>sa_pattern_4103cbe39f2032001d753758442e709a</sys_update_name>
<sys_updated_by>oron.subayi</sys_updated_by>
<sys_updated_on>2017-02-01 13:44:52</sys_updated_on>
<version/>
</sa_pattern>
<sa_pattern action="INSERT_OR_UPDATE">
<active>true</active>
<ci_type>cmdb_ci_appl_generic</ci_type>
<cpattern_type>2</cpattern_type>
<description/>
<directory>false</directory>
<enforce_proc_classy>false</enforce_proc_classy>
<has_draft>false</has_draft>
<invoke_per_account>false</invoke_per_account>
<metadata_id>4660f86edb057200c12ef9361d96190c</metadata_id>
<name>Linux - Cloud</name>
<ndl>library {
name = "Linux - Cloud"
id = "4660f86edb057200c12ef9361d96190c"
description = ""
step {
name = "Linux - AWS"
ref {refid = "5540b86edb057200c12ef9361d9619f6"}
}
step {
name = "Linux - Azure"
ref {refid = "3f7e3e18db5932003398f1351d9619e5"}
}
}
</ndl>
<parent display_value=""/>
<serverless>false</serverless>
<source/>
<sync_to_mid>true</sync_to_mid>
<sys_class_name>sa_pattern</sys_class_name>
<sys_created_by>oron.subayi</sys_created_by>
<sys_created_on>2017-02-22 21:01:46</sys_created_on>
<sys_customer_update>false</sys_customer_update>
<sys_domain>global</sys_domain>
<sys_domain_path>/</sys_domain_path>
<sys_id>4660f86edb057200c12ef9361d96190c</sys_id>
<sys_mod_count>1</sys_mod_count>
<sys_name>Linux - Cloud</sys_name>
<sys_overrides display_value=""/>
<sys_package display_value="Pattern Designer" source="com.snc.pattern.designer">79c934314f310300261de57d0210c70c</sys_package>
<sys_policy/>
<sys_replace display_value=""/>
<sys_replace_on_upgrade>false</sys_replace_on_upgrade>
<sys_scope display_value="Global">global</sys_scope>
<sys_update_name>sa_pattern_4660f86edb057200c12ef9361d96190c</sys_update_name>
<sys_updated_by>oron.subayi</sys_updated_by>
<sys_updated_on>2017-03-08 17:46:00</sys_updated_on>
<version/>
</sa_pattern>
<sa_pattern action="INSERT_OR_UPDATE">
<active>true</active>
<ci_type>cmdb_ci_appl_generic</ci_type>
<cpattern_type>2</cpattern_type>
<description/>
<directory>false</directory>
<enforce_proc_classy>false</enforce_proc_classy>
<has_draft>false</has_draft>
<invoke_per_account>false</invoke_per_account>
<metadata_id>46631de51bdc901409c1a64fad4bcb34</metadata_id>
<name>UNIX Cluster - Linux Pacemaker Cluster</name>
<ndl>library {
name = "UNIX Cluster - Linux Pacemaker Cluster"
id = "46631de51bdc901409c1a64fad4bcb34"
description = "UNIX Cluster - Linux Pacemaker Cluster"
step {
name = "UNIX Cluster - Linux Pacemaker Cluster"
ref {refid = "1068bcf41bf3cc584762dd3fbd4bcb61"}
}
}
</ndl>
<parent display_value=""/>
<serverless>false</serverless>
<source/>
<sync_to_mid>true</sync_to_mid>
<sys_class_name>sa_pattern</sys_class_name>
<sys_created_by>admin</sys_created_by>
<sys_created_on>2020-04-20 15:20:35</sys_created_on>
<sys_customer_update>false</sys_customer_update>
<sys_domain>global</sys_domain>
<sys_domain_path>/</sys_domain_path>
<sys_id>46631de51bdc901409c1a64fad4bcb34</sys_id>
<sys_mod_count>13</sys_mod_count>
<sys_name>UNIX Cluster - Linux Pacemaker Cluster</sys_name>
<sys_overrides display_value=""/>
<sys_package display_value="Discovery and Service Mapping Patterns" source="sn_itom_pattern">06a71b1367e4130051c9027e2685ef1e</sys_package>
<sys_policy/>
<sys_replace display_value=""/>
<sys_replace_on_upgrade>false</sys_replace_on_upgrade>
<sys_scope display_value="Discovery and Service Mapping Patterns">06a71b1367e4130051c9027e2685ef1e</sys_scope>
<sys_update_name>sa_pattern_46631de51bdc901409c1a64fad4bcb34</sys_update_name>
<sys_updated_by>admin</sys_updated_by>
<sys_updated_on>2020-04-20 17:23:10</sys_updated_on>
<version/>
</sa_pattern>
<sa_pattern action="INSERT_OR_UPDATE">
<active>true</active>
<ci_type>cmdb_ci_appl_generic</ci_type>
<cpattern_type>2</cpattern_type>
<description/>
<directory>false</directory>
<enforce_proc_classy>false</enforce_proc_classy>
<has_draft>false</has_draft>
<invoke_per_account>false</invoke_per_account>
<metadata_id>46d81a979f10320055063758442e707f</metadata_id>
<name>Unix-Linux Name Formatting</name>
<ndl>library {
name = "Unix-Linux Name Formatting"
id = "46d81a979f10320055063758442e707f"
description = "null"
step {
name = "Get system info"
runcmd_to_var {
cmd = "uname -a"
var_names = "uname"
parsing_strategy = delimited_parsing {
selected_positions = 1
}
if_not_found_do = nop {}
cache_flag = 0
}
}
step {
name = "Extract OS name from uname"
comment = "S"
set_attr {
"osName"
eval {"javascript: var rtrn = '';
try{
var uname = \${uname};
rtrn = uname.split(/ /)[0];
}
catch(e){
Packages.com.snc.sw.log.DiscoLog.getLogger(\\"Step Failed - Extract OS Name From Uname\\").error(e.message);
}"}
}
}
step {
name = "Extract hostname from uname"
set_attr {
"osHostname"
eval {"javascript: var rtrn = '';
try{
var uname = \${uname};
rtrn = uname.split(/ /)[1]?uname.split(/ /)[1]:\\"unknown.host\\";
}
catch(e){
Packages.com.snc.sw.log.DiscoLog.getLogger(\\"Step Failed - Extract Hostname From Uname\\").error(e.message);
}"}
}
}
step {
name = "Extract OS version from uname"
if {
condition = neq {
get_attr {"computer_system.osType"}
"AIX"
}
on_true = set_attr {
"osVersion"
eval {"javascript: var rtrn = '';
try{
var uname = \${uname};
rtrn = uname.split(/ /)[2]?uname.split(/ /)[2]:'';
}
catch(e){
Packages.com.snc.sw.log.DiscoLog.getLogger(\\"Step Failed - Extract OS Version From Uname\\").error(e.message);
}
"}
}
on_false = nop {}
}
}
step {
name = "Create formattedHostname variable"
set_attr {
"formattedHostname"
get_attr {"osHostname"}
}
}
step {
name = "Decide whether to use the new name or the old one for formatting"
if {
condition = any {
is_empty {get_attr {"osHostname"}}
eq {
"false"
eval {"javascript: var rtrn = ''
try{
rtrn = \${computer_system.primaryHostname} && \${isSshTrusted}==\\"false\\";
}
catch(e){
Packages.com.snc.sw.log.DiscoLog.getLogger(\\"Step Failed - Decide Old Or New For Formatting \\").error(e.message);
}"}
}
}
on_true = set_attr {
"osHostname"
get_attr {"computer_system.primaryHostname"}
}
on_false = nop {}
}
}
step {
name = "Format hostname"
set_attr {
"formattedHostname"
eval {"javascript: var rtrn = '';
try{
var hostnameFormatter = new Packages.com.glide.util.HostnameFormatter(\${fqdnRegex});
var source = (\${computer_system.managementIP})?\${computer_system.managementIP}:null;
hostnameFormatter.setCase(\${hostnameCase});
hostnameFormatter.setIncludeDomain(\${shouldIncludeDomain}==\\"true\\");
hostnameFormatter.setSource(source);
var formattedHostname = hostnameFormatter.format(\${formattedHostname});
rtrn = (formattedHostname)?formattedHostname.fFormattedName:\${osHostname};
}
catch(e){
Packages.com.snc.sw.log.DiscoLog.getLogger(\\"Step Failed - Formatted Hostname \\").error(e.message);
}"}
}
}
}
</ndl>
<parent display_value=""/>
<serverless>false</serverless>
<source/>
<sync_to_mid>true</sync_to_mid>
<sys_class_name>sa_pattern</sys_class_name>
<sys_created_by>oron.subayi</sys_created_by>
<sys_created_on>2017-01-19 05:46:27</sys_created_on>
<sys_customer_update>false</sys_customer_update>
<sys_domain>global</sys_domain>
<sys_domain_path>/</sys_domain_path>
<sys_id>46d81a979f10320055063758442e707f</sys_id>
<sys_mod_count>5</sys_mod_count>
<sys_name>Unix-Linux Name Formatting</sys_name>
<sys_overrides display_value=""/>
<sys_package display_value="Pattern Designer" source="com.snc.pattern.designer">79c934314f310300261de57d0210c70c</sys_package>
<sys_policy/>
<sys_replace display_value=""/>
<sys_replace_on_upgrade>false</sys_replace_on_upgrade>
<sys_scope display_value="Global">global</sys_scope>
<sys_update_name>sa_pattern_46d81a979f10320055063758442e707f</sys_update_name>
<sys_updated_by>admin</sys_updated_by>
<sys_updated_on>2019-12-09 12:12:56</sys_updated_on>
<version/>
</sa_pattern>
<sa_pattern action="INSERT_OR_UPDATE">
<active>true</active>
<ci_type>cmdb_ci_appl_generic</ci_type>
<cpattern_type>2</cpattern_type>
<description/>
<directory>false</directory>
<enforce_proc_classy>false</enforce_proc_classy>
<has_draft>false</has_draft>
<invoke_per_account>false</invoke_per_account>
<metadata_id>5e1243e39f2032001d753758442e7041</metadata_id>
<name>Linux - Find FQDN</name>
<ndl>library {
name = "Linux - Find FQDN"
id = "5e1243e39f2032001d753758442e7041"
description = "null"
step {
name = "Run FQDN script file"
custom_operation {
attributes {attribute {
name = "fileName"
value = "linux_fqdn.sh"
}}
sys_id_op = "68367a239fc13200e9123758442e7083"
to_var_names = "FQDN"
parsing_strategy = delimited_parsing {
exclude_lines_pattern = "Unable"
selected_positions = 1
}
if_not_found_do = nop {}
}
}
step {
name = "Update the Linux CI FQDN"
if {
condition = is_not_empty {get_attr {"FQDN"}}
on_true = set_attr {
"cmdb_ci_linux_server[*].fqdn"
get_attr {"FQDN"}
}
on_false = nop {}
}
}
}
</ndl>
<parent display_value=""/>
<serverless>false</serverless>
<source/>
<sync_to_mid>true</sync_to_mid>
<sys_class_name>sa_pattern</sys_class_name>
<sys_created_by>oron.subayi</sys_created_by>
<sys_created_on>2017-02-01 13:40:51</sys_created_on>
<sys_customer_update>false</sys_customer_update>
<sys_domain>global</sys_domain>
<sys_domain_path>/</sys_domain_path>
<sys_id>5e1243e39f2032001d753758442e7041</sys_id>
<sys_mod_count>4</sys_mod_count>
<sys_name>Linux - Find FQDN</sys_name>
<sys_overrides display_value=""/>
<sys_package display_value="Pattern Designer" source="com.snc.pattern.designer">79c934314f310300261de57d0210c70c</sys_package>
<sys_policy/>
<sys_replace display_value=""/>
<sys_replace_on_upgrade>false</sys_replace_on_upgrade>
<sys_scope display_value="Global">global</sys_scope>
<sys_update_name>sa_pattern_5e1243e39f2032001d753758442e7041</sys_update_name>
<sys_updated_by>admin</sys_updated_by>
<sys_updated_on>2017-09-07 09:20:00</sys_updated_on>
<version/>
</sa_pattern>
<sa_pattern action="INSERT_OR_UPDATE">
<active>true</active>
<ci_type>cmdb_ci_appl_generic</ci_type>
<cpattern_type>2</cpattern_type>
<description/>
<directory>false</directory>
<enforce_proc_classy>false</enforce_proc_classy>
<has_draft>false</has_draft>
<invoke_per_account>false</invoke_per_account>
<metadata_id>656487279f2032001d753758442e705c</metadata_id>
<name>Linux - Installed Software</name>
<ndl>library {
name = "Linux - Installed Software"
id = "656487279f2032001d753758442e705c"
description = ""
step {
name = "Run LinuxPKG script file"
if {
condition = eq {
get_attr {"shouldDiscoverSoftware"}
"true"
}
on_true = custom_operation {
attributes {attribute {
name = "fileName"
value = "pkg_munger.bash"
}}
sys_id_op = "68367a239fc13200e9123758442e7083"
to_var_names = "pkgMan"
parsing_strategy = delimited_parsing {
selected_positions = 1
line_seperator = "NonExistingSeparator"
}
if_not_found_do = nop {}
}
on_false = nop {}
}
}
step {
name = "Remove new lines from LinuxPKG output"
if {
condition = all {
eq {
get_attr {"shouldDiscoverSoftware"}
"true"
}
is_not_empty {get_attr {"pkgMan"}}
}
on_true = set_attr {
"pkgMan"
eval {"javascript:
var rtrn = '';
var pkgMan = \${pkgMan};
var strPkgMan = new Packages.java.lang.String(pkgMan);
rtrn = strPkgMan.replaceAll(\\"\\\\n\\",\\"\$\\");"}
}
on_false = nop {}
}
}
step {
name = "Crate empty package table"
if {
condition = eq {
get_attr {"shouldDiscoverSoftware"}
"true"
}
on_true = union {
table1_name = "PKG"
table2_name = "PKG"
result_table_name = "PKG"
}
on_false = nop {}
}
}
step {
name = "Insert data to package table"
if {
condition = eq {
get_attr {"shouldDiscoverSoftware"}
"true"
}
on_true = set_attr {
"dump_var"
eval {"javascript: rtrn = \\"\\";
var extractFirstMatchWithRegex = function(stringToMatch,regex) {
var regexObject = new RegExp(regex);
var match = stringToMatch.match(regexObject);
return match ? match[1] : null;
};
var output = \${pkgMan};
var outSp = output.split('\$');
var row = new Packages.java.util.HashMap();
var count = 0;
for (var i = 0; i < outSp.length; i++)
{
var block = outSp[i].split(':');
if (block[0] == \\"Package\\")
{
if (count > 0)
{
\${PKG}.add(clrow);
}
var clrow = row.clone();
clrow.put(\\"name\\",block[1]);
count++;
}
if (block[0] == \\"Status\\")
{
clrow.put(\\"status\\",block[1]);
}
if (block[0] == \\"Maintainer\\")
{
var vendor = extractFirstMatchWithRegex(block[1], /^(?:.*?)<.+@(?:(?:.+)\\\\.)*(.+)\\\\.(?:(?:org)|(?:com)|(?:net))>\$/);
if (vendor){
clrow.put(\\"maintainer\\",vendor);
}
else{
clrow.put(\\"maintainer\\",block[1]);
}
}
if (block[0] == \\"Version\\")
{
clrow.put(\\"version\\",block[1]);
}
if (block[0] == \\"Release\\")
{
clrow.put(\\"version\\",block[1]);
}
if (i == (outSp.length - 1) )
{
\${PKG}.add(clrow);
}
}
rtrn = \\"test\\";
"}
}
on_false = nop {}
}
}
step {
name = "Filter packages"
if {
condition = eq {
get_attr {"shouldDiscoverSoftware"}
"true"
}
on_true = filter {
src_table_name = "PKG"
target_table_name = "PKG"
condition = contains {
get_attr {"PKG[].status"}
"installed"
}
}
on_false = nop {}
}
}
step {
name = "Remove duplicate packages"
if {
condition = eq {
get_attr {"shouldDiscoverSoftware"}
"true"
}
on_true = set_attr {
"dump_var"
eval {"javascript:
var tableWithoutDuplicates = '';
tableWithoutDuplicates = DuplicateRemover.removeDuplicates(\${PKG},[\\"name\\",\\"version\\"]);
CTX.setAttribute(\\"PKG\\", tableWithoutDuplicates);
"}
}
on_false = nop {}
}
}
step {
name = "Mark all packages that we should keep according to filter configuration"
if {
condition = eq {
get_attr {"shouldDiscoverSoftware"}
"true"
}
on_true = transform {
src_table_name = "PKG"
target_table_name = "PKG"
operation {set_field {
field_name = "shouldKeep"
value = eval {"javascript:
var rtrn = '';
var isIncludeMethod = \${isSoftwareFilterMethodIsInclude};
var appName = \${PKG[].name};
var regex = \${softwareKeywordsRegex};
var extractFirstMatchWithRegex = function(stringToMatch,regex){
var regexObject = new RegExp(regex);
var match = stringToMatch.match(regexObject);
return match ? match[1] : null;
};
var match = extractFirstMatchWithRegex(appName,regex);
var isMatchFound = (match != null) && (match != \\"\\");
if((isIncludeMethod==\\"true\\" && isMatchFound) || (isIncludeMethod==\\"false\\" && !isMatchFound)){rtrn = \\"true\\";}else{rtrn = \\"false\\";}
"}
}}
}
on_false = nop {}
}
}
step {
name = "Retain only packages chosen by user's filter"
if {
condition = eq {
get_attr {"shouldDiscoverSoftware"}
"true"
}
on_true = filter {
src_table_name = "PKG"
target_table_name = "PKG"
condition = eq {
get_attr {"PKG[].shouldKeep"}
"true"
}
}
on_false = nop {}
}
}
step {
name = "Trim software data"
comment = ""
if {
condition = eq {
get_attr {"shouldDiscoverSoftware"}
"true"
}
on_true = transform {
src_table_name = "PKG"
target_table_name = "PKG"
operation {
set_field {
field_name = "name"
value = eval {"javascript:
var rtrn = '';
rtrn = \${PKG[].name}.trim();
"}
}
set_field {
field_name = "version"
value = eval {"javascript:
var rtrn = '';
if(\${PKG[].version}){
rtrn = \${PKG[].version}.trim();
}
"}
}
set_field {
field_name = "maintainer"
value = eval {"javascript:
var rtrn = '';
if(\${PKG[].maintainer}){
rtrn = \${PKG[].maintainer}.trim();
}
"}
}
set_field {
field_name = "status"
value = eval {"javascript:
var rtrn = '';
if(\${PKG[].status}){
rtrn = \${PKG[].status}.trim();
}
"}
}
}
}
on_false = nop {}
}
}
step {
name = "Update cmdb_sam_sw_install"
if {
condition = all {
eq {
get_attr {"shouldDiscoverSoftware"}
"true"
}
eq {
get_attr {"shouldPopulateOldSoftwareTables"}
"false"
}
}
on_true = transform {
src_table_name = "PKG"
target_table_name = "cmdb_sam_sw_install"
operation {
set_field {
field_name = "display_name"
value = get_attr {"PKG[].name"}
}
set_field {
field_name = "publisher"
value = get_attr {"PKG[].maintainer"}
}
}
}
on_false = nop {}
}
}
step {
name = "Update cmdb_ci_spkg"
if {
condition = all {
eq {
get_attr {"shouldDiscoverSoftware"}
"true"
}
eq {
get_attr {"shouldPopulateOldSoftwareTables"}
"true"
}
}
on_true = transform {
src_table_name = "PKG"
target_table_name = "cmdb_ci_spkg"
operation {
set_field {
field_name = "name"
value = get_attr {"PKG[].name"}
}
set_field {
field_name = "version"
value = get_attr {"PKG[].version"}
}
set_field {
field_name = "vendor"
value = get_attr {"PKG[].maintainer"}
}
set_field {
field_name = "key"
value = eval {"javascript: rtrn = \\"\\";rtrn = \${PKG[].name} + \\"_:::_\\" + (\${PKG[].version}||\\"NULL\\");"}
}
set_field {
field_name = "package_name"
value = concat {
get_attr {"PKG[].name"}
" "
get_attr {"PKG[].version"}
}
}
}
}
on_false = nop {}
}
}
step {
name = "Update cmdb_software_instance"
if {
condition = all {
eq {
get_attr {"shouldDiscoverSoftware"}
"true"
}
eq {
get_attr {"shouldPopulateOldSoftwareTables"}
"true"
}
}
on_true = transform {
src_table_name = "cmdb_ci_spkg"
target_table_name = "cmdb_software_instance"
operation {
set_field {
field_name = "name"
value = get_attr {"cmdb_ci_spkg[].name"}
}
set_field {
field_name = "vendor"
value = get_attr {"cmdb_ci_spkg[].maintainer"}
}
}
}
on_false = nop {}
}
}
step {
name = "Ref/Rel between cmdb_software_instance and cmdb_ci_spkg"
if {
condition = all {
eq {
get_attr {"shouldDiscoverSoftware"}
"true"
}
eq {
get_attr {"shouldPopulateOldSoftwareTables"}
"true"
}
}
on_true = relation_reference {
table1_name = "cmdb_software_instance"
table2_name = "cmdb_ci_spkg"
result_table_name = "software_instance_spkg"
unmatched_lines = remove
condition = all {
eq {
get_attr {"cmdb_software_instance[].name"}
get_attr {"cmdb_ci_spkg[].name"}
}
eq {
get_attr {"cmdb_software_instance[].version"}
get_attr {"cmdb_ci_spkg[].version"}
}
}
ref_direction = parentToChild
ref_field_name = "software"
}
on_false = nop {}
}
}
step {
name = "Ref/Rel between cmdb_sam_sw_install and Linux CI"
if {
condition = all {
eq {
get_attr {"shouldDiscoverSoftware"}
"true"
}
eq {
get_attr {"shouldPopulateOldSoftwareTables"}
"false"
}
}
on_true = relation_reference {
table1_name = "cmdb_sam_sw_install"
table2_name = "cmdb_ci_linux_server"
result_table_name = "sam_to_linux"
unmatched_lines = remove
condition = eq {
"1"
"1"
}
ref_direction = parentToChild
ref_field_name = "non_ci"
}
on_false = nop {}
}
}
}
</ndl>
<parent display_value=""/>
<serverless>false</serverless>
<source/>
<sync_to_mid>true</sync_to_mid>
<sys_class_name>sa_pattern</sys_class_name>
<sys_created_by>oron.subayi</sys_created_by>
<sys_created_on>2017-02-01 13:50:54</sys_created_on>
<sys_customer_update>false</sys_customer_update>
<sys_domain>global</sys_domain>
<sys_domain_path>/</sys_domain_path>
<sys_id>656487279f2032001d753758442e705c</sys_id>
<sys_mod_count>14</sys_mod_count>
<sys_name>Linux - Installed Software</sys_name>
<sys_overrides display_value=""/>
<sys_package display_value="Pattern Designer" source="com.snc.pattern.designer">79c934314f310300261de57d0210c70c</sys_package>
<sys_policy/>
<sys_replace display_value=""/>
<sys_replace_on_upgrade>false</sys_replace_on_upgrade>
<sys_scope display_value="Global">global</sys_scope>
<sys_update_name>sa_pattern_656487279f2032001d753758442e705c</sys_update_name>
<sys_updated_by>admin</sys_updated_by>
<sys_updated_on>2020-03-09 09:18:46</sys_updated_on>
<version/>
</sa_pattern>
<sa_pattern action="INSERT_OR_UPDATE">
<active>true</active>
<ci_type>cmdb_ci_appl_generic</ci_type>
<cpattern_type>2</cpattern_type>
<description/>
<directory>false</directory>
<enforce_proc_classy>false</enforce_proc_classy>
<has_draft>false</has_draft>
<invoke_per_account>false</invoke_per_account>
<metadata_id>84538fe39f2032001d753758442e7086</metadata_id>
<name>Linux - Network ARP Tables</name>
<ndl>library {
name = "Linux - Network ARP Tables"
id = "84538fe39f2032001d753758442e7086"
description = "null"
step {
name = "Get ARP"
if {
condition = neq {
get_attr {"use_net_tools"}
"false"
}
on_true = runcmd_to_var {
cmd = "arp -n"
var_names = table {
name = "ARP_table"
col_names = "ip","mac","ifName"
}
parsing_strategy = delimited_parsing {
exclude_lines_pattern = "address"
delimiters = " "
selected_positions = 1,3,5
}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "Get ARP details using iproute2"
if {
condition = is_empty {get_attr {"ARP_table"}}
on_true = runcmd_to_var {
cmd = "ip n"
var_names = table {
name = "ARP_table"
col_names = "ip","ifName","mac"
}
parsing_strategy = regex_parsing {regex = "^(\\\\d+.\\\\d+.\\\\d+.\\\\d+)\\\\s+(?:[^\\\\s]+)\\\\s+([^\\\\s]+)\\\\s+(?:[^\\\\s]+)\\\\s+([^\\\\s]+)\\\\s+"}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "Update discovery_net_arp_table"
transform {
src_table_name = "ARP_table"
target_table_name = "discovery_net_arp_table"
operation {
set_field {
field_name = "mac_address"
value = get_attr {"ARP_table[].mac"}
}
set_field {
field_name = "ip_address"
value = get_attr {"ARP_table[].ip"}
}
}
}
}
step {
name = "Remove duplicate Network ARP Tables"
set_attr {
"dump_var"
eval {"javascript:
var tableWithoutDuplicates = '';
tableWithoutDuplicates = DuplicateRemover.removeDuplicates(\${discovery_net_arp_table},[\\"ip_address\\",\\"mac_address\\"]);
CTX.setAttribute(\\"discovery_net_arp_table\\", tableWithoutDuplicates);
"}
}
}
step {
name = "Ref/Rel between discovery_net_arp_table and Linux CI"
relation_reference {
table1_name = "discovery_net_arp_table"
table2_name = "cmdb_ci_linux_server"
result_table_name = "ci_ti_arp"
unmatched_lines = remove
condition = eq {
"1"
"1"
}
ref_direction = parentToChild
ref_field_name = "non_ci"
}
}
}
</ndl>
<parent display_value=""/>
<serverless>false</serverless>
<source/>
<sync_to_mid>true</sync_to_mid>
<sys_class_name>sa_pattern</sys_class_name>
<sys_created_by>oron.subayi</sys_created_by>
<sys_created_on>2017-02-01 13:46:09</sys_created_on>
<sys_customer_update>false</sys_customer_update>
<sys_domain>global</sys_domain>
<sys_domain_path>/</sys_domain_path>
<sys_id>84538fe39f2032001d753758442e7086</sys_id>
<sys_mod_count>9</sys_mod_count>
<sys_name>Linux - Network ARP Tables</sys_name>
<sys_overrides display_value=""/>
<sys_package display_value="Pattern Designer" source="com.snc.pattern.designer">79c934314f310300261de57d0210c70c</sys_package>
<sys_policy/>
<sys_replace display_value=""/>
<sys_replace_on_upgrade>false</sys_replace_on_upgrade>
<sys_scope display_value="Global">global</sys_scope>
<sys_update_name>sa_pattern_84538fe39f2032001d753758442e7086</sys_update_name>
<sys_updated_by>admin</sys_updated_by>
<sys_updated_on>2020-09-21 08:13:08</sys_updated_on>
<version/>
</sa_pattern>
<sa_pattern action="INSERT_OR_UPDATE">
<active>true</active>
<ci_type>cmdb_ci_appl_generic</ci_type>
<cpattern_type>2</cpattern_type>
<description/>
<directory>false</directory>
<enforce_proc_classy>false</enforce_proc_classy>
<has_draft>false</has_draft>
<invoke_per_account>false</invoke_per_account>
<metadata_id>98ab8ecf4f7a0b40a9f9011f0310c78d</metadata_id>
<name>Linux - Cluster</name>
<ndl>library {
name = "Linux - Cluster"
id = "98ab8ecf4f7a0b40a9f9011f0310c78d"
description = "null"
step {
name = "Linux - Red Hat Cluster"
ref {refid = "c4eabd514fe3c3c0a9f9011f0310c730"}
}
}
</ndl>
<parent display_value=""/>
<serverless>false</serverless>
<source/>
<sync_to_mid>true</sync_to_mid>
<sys_class_name>sa_pattern</sys_class_name>
<sys_created_by>bary.solomon</sys_created_by>
<sys_created_on>2017-12-07 12:58:20</sys_created_on>
<sys_customer_update>false</sys_customer_update>
<sys_domain>global</sys_domain>
<sys_domain_path>/</sys_domain_path>
<sys_id>98ab8ecf4f7a0b40a9f9011f0310c78d</sys_id>
<sys_mod_count>51</sys_mod_count>
<sys_name>Linux - Cluster</sys_name>
<sys_overrides display_value=""/>
<sys_package display_value="Pattern Designer" source="com.snc.pattern.designer">79c934314f310300261de57d0210c70c</sys_package>
<sys_policy/>
<sys_replace display_value=""/>
<sys_replace_on_upgrade>false</sys_replace_on_upgrade>
<sys_scope display_value="Global">global</sys_scope>
<sys_update_name>sa_pattern_98ab8ecf4f7a0b40a9f9011f0310c78d</sys_update_name>
<sys_updated_by>bary.solomon</sys_updated_by>
<sys_updated_on>2018-01-08 09:18:24</sys_updated_on>
<version/>
</sa_pattern>
<sa_pattern action="INSERT_OR_UPDATE">
<active>true</active>
<ci_type>cmdb_ci_appl_generic</ci_type>
<cpattern_type>2</cpattern_type>
<description/>
<directory>false</directory>
<enforce_proc_classy>false</enforce_proc_classy>
<has_draft>false</has_draft>
<invoke_per_account>false</invoke_per_account>
<metadata_id>9d38c8b313d7fa00d4013192e144b0ed</metadata_id>
<name>Initial Linux and Windows env flags</name>
<ndl>library {
name = "Initial Linux and Windows env flags"
id = "9d38c8b313d7fa00d4013192e144b0ed"
description = "null"
step {
name = "set linux_system_process to \\"no\\""
comment = "set linux_system_process flag to \\"no\\"."
if {
condition = eq {
get_attr {"computer_system.osFamily"}
"UNIX"
}
on_true = set_attr {
"linux_system_process"
"no"
}
on_false = nop {}
}
}
step {
name = "set windows_system_process to \\"no\\""
comment = "set windows_system_process to \\"no\\""
if {
condition = eq {
get_attr {"computer_system.osFamily"}
"WINDOWS"
}
on_true = set_attr {
"windows_system_process"
"no"
}
on_false = nop {}
}
}
step {
name = "set windows_system.exe process to \\"no\\""
comment = "set windows_system.exe process to \\"no\\""
if {
condition = eq {
get_attr {"computer_system.osFamily"}
"WINDOWS"
}
on_true = set_attr {
"windows_system_exe_process"
"no"
}
on_false = nop {}
}
}
step {
name = "check if it is system.exe process on Windows"
comment = "check if it is system.exe process on Windows"
if {
condition = all {
eq {
get_attr {"computer_system.osFamily"}
"WINDOWS"
}
eq {
get_attr {"process.executable"}
"System"
}
eq {
get_attr {"process.pid"}
"4"
}
}
on_true = set_attr {
"windows_system_exe_process"
"yes"
}
on_false = nop {}
}
}
step {
name = "check if it is system.exe process from pre_cmdb - on Windows"
comment = "check if it is system.exe process on Windows"
if {
condition = all {
eq {
get_attr {"computer_system.osFamily"}
"WINDOWS"
}
eq {
get_attr {"process.executable"}
"System"
}
eq {
get_attr {"pre_cmdb_running_process[1].pid"}
"4"
}
is_empty {get_attr {"windows_system_exe_process"}}
}
on_true = set_attr {
"windows_system_exe_process"
"yes"
}
on_false = nop {}
}
}
}
</ndl>
<parent display_value=""/>
<serverless>false</serverless>
<source/>
<sync_to_mid>true</sync_to_mid>
<sys_class_name>sa_pattern</sys_class_name>
<sys_created_by>bary.solomon</sys_created_by>
<sys_created_on>2017-06-18 11:39:50</sys_created_on>
<sys_customer_update>false</sys_customer_update>
<sys_domain>global</sys_domain>
<sys_domain_path>/</sys_domain_path>
<sys_id>9d38c8b313d7fa00d4013192e144b0ed</sys_id>
<sys_mod_count>8</sys_mod_count>
<sys_name>Initial Linux and Windows env flags</sys_name>
<sys_overrides display_value=""/>
<sys_package display_value="Pattern Designer" source="com.snc.pattern.designer">79c934314f310300261de57d0210c70c</sys_package>
<sys_policy/>
<sys_replace display_value=""/>
<sys_replace_on_upgrade>false</sys_replace_on_upgrade>
<sys_scope display_value="Global">global</sys_scope>
<sys_update_name>sa_pattern_9d38c8b313d7fa00d4013192e144b0ed</sys_update_name>
<sys_updated_by>bary.solomon</sys_updated_by>
<sys_updated_on>2017-06-28 11:05:32</sys_updated_on>
<version/>
</sa_pattern>
<sa_pattern action="INSERT_OR_UPDATE">
<active>true</active>
<ci_type>cmdb_ci_appl_generic</ci_type>
<cpattern_type>2</cpattern_type>
<description/>
<directory>false</directory>
<enforce_proc_classy>false</enforce_proc_classy>
<has_draft>false</has_draft>
<invoke_per_account>false</invoke_per_account>
<metadata_id>a273cfe39f2032001d753758442e70b7</metadata_id>
<name>Linux - Identity</name>
<ndl>library {
name = "Linux - Identity"
id = "a273cfe39f2032001d753758442e70b7"
description = ""
step {
name = "Linux - Hardware Information"
ref {refid = "c161cfa39f2032001d753758442e70f9"}
}
step {
name = "Linux - Network"
ref {refid = "0ae107e39f2032001d753758442e70ec"}
}
}
</ndl>
<parent display_value=""/>
<serverless>false</serverless>
<source/>
<sync_to_mid>true</sync_to_mid>
<sys_class_name>sa_pattern</sys_class_name>
<sys_created_by>oron.subayi</sys_created_by>
<sys_created_on>2017-02-01 13:46:52</sys_created_on>
<sys_customer_update>false</sys_customer_update>
<sys_domain>global</sys_domain>
<sys_domain_path>/</sys_domain_path>
<sys_id>a273cfe39f2032001d753758442e70b7</sys_id>
<sys_mod_count>0</sys_mod_count>
<sys_name>Linux - Identity</sys_name>
<sys_overrides display_value=""/>
<sys_package display_value="Pattern Designer" source="com.snc.pattern.designer">79c934314f310300261de57d0210c70c</sys_package>
<sys_policy/>
<sys_replace display_value=""/>
<sys_replace_on_upgrade>false</sys_replace_on_upgrade>
<sys_scope display_value="Global">global</sys_scope>
<sys_update_name>sa_pattern_a273cfe39f2032001d753758442e70b7</sys_update_name>
<sys_updated_by>oron.subayi</sys_updated_by>
<sys_updated_on>2017-02-01 13:46:52</sys_updated_on>
<version/>
</sa_pattern>
<sa_pattern action="INSERT_OR_UPDATE">
<active>true</active>
<ci_type>cmdb_ci_appl_generic</ci_type>
<cpattern_type>2</cpattern_type>
<description/>
<directory>false</directory>
<enforce_proc_classy>false</enforce_proc_classy>
<has_draft>false</has_draft>
<invoke_per_account>false</invoke_per_account>
<metadata_id>c161cfa39f2032001d753758442e70f9</metadata_id>
<name>Linux - Hardware Information</name>
<ndl>library {
name = "Linux - Hardware Information"
id = "c161cfa39f2032001d753758442e70f9"
description = ""
step {
name = "Set the privileged command to use"
set_attr {
"sudo"
eval {"return \${ctx}.getDiscoveryProvider(com.snc.sw.dto.ProviderType.SSH).getPrivilegedCommand();"}
}
}
step {
name = "Get DMI type 1"
runcmd_to_var {
cmd = concat {
get_attr {"sudo"}
" dmidecode -t 1 | cat"
}
var_names = table {
name = "dmiType1"
col_names = "manufacturer","model_number","system_serial_number","uuid_serial","model_id"
}
parsing_strategy = properties_parsing_strategy {fields {
field {
col_name = "manufacturer"
xpath = "/Manufacturer/text()"
delimiters = ":"
position = 1
}
field {
col_name = "model_number"
xpath = "/Version/text()"
delimiters = ":"
position = 1
}
field {
col_name = "system_serial_number"
xpath = "/Serial/text()"
delimiters = ":"
position = 2
}
field {
col_name = "uuid_serial"
xpath = "/UUID/text()"
delimiters = ":"
position = 1
}
field {
col_name = "model_id"
xpath = "/Product/text()"
delimiters = ":"
position = 2
}
field {
col_name = "forEach"
for_each = "forEach"
delimiters = ""
position = 1
}
}}
if_not_found_do = nop {}
cache_flag = 0
}
}
step {
name = "Failover Get DMI type 1 "
if {
condition = is_empty {get_attr {"dmiType1"}}
on_true = runcmd_to_var {
cmd = concat {
get_attr {"sudo"}
" dmidecode -t 1 | cat"
}
execution_mode = "DEFAULT"
var_names = "output_dmi"
parsing_strategy = delimited_parsing {
include_lines_pattern = ":"
exclude_lines_pattern = "readonly"
selected_positions = 1
}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "Convert output to JSON"
if {
condition = is_empty {get_attr {"dmiType1"}}
on_true = set_attr {
"output_dmi_json"
eval {"arr = \${output_dmi};
length = arr.size();
res = \\"{\\";
for( i = 0;i < length;i++){
str = arr[i].split(\\":\\");
if(arr[i].contains(\\"Manufacturer\\")){
res = res + '\\"Manufacturer\\"' +\\":\\" + '\\"'+str[1].trim()+'\\"';
}
else if(arr[i].contains('Version')){
res = res + '\\"Version\\"' +\\":\\" + '\\"'+str[1].trim()+'\\"';
}
else if(arr[i].contains('Serial')){
res = res + '\\"Serial\\"' +\\":\\" + '\\"'+str[1].trim()+'\\"';
}
else if(arr[i].contains('UUID')){
res = res + '\\"UUID\\"' +\\":\\" + '\\"'+str[1].trim()+'\\"';
}
else if(arr[i].contains('Product')){
res = res + '\\"Product\\"' +\\":\\" + '\\"'+str[1].trim()+'\\"';
}else{
res = res + '\\"na\\"' +\\":\\" + '\\"na\\"';
}
if(i != length -1){
res = res + \\",\\";
}
}
res = res +\\"}\\";
return res;"}
}
on_false = nop {}
}
}
step {
name = "Parse DMI type 1"
if {
condition = all {
is_empty {get_attr {"dmiType1"}}
is_not_empty {get_attr {"output_dmi_json"}}
}
on_true = parse_var_to_var {
from_var_name = "output_dmi_json"
to_var_names = table {
name = "dmiType1"
col_names = "manufacturer","model_id","model_number","system_serial_number","uuid_serial"
}
parsing_strategy = custom_parsing_strategy {
sys_id = "512a3d5a9f3312003cb191aec32e708a"
rootXpath = "/root"
fields {
field {
col_name = "manufacturer"
xpath = "/root/Manufacturer/text()"
delimiters = ""
position = 1
}
field {
col_name = "model_id"
xpath = "/root/Product/text()"
delimiters = ""
position = 1
}
field {
col_name = "model_number"
xpath = "/root/Version/text()"
delimiters = ""
position = 1
}
field {
col_name = "system_serial_number"
xpath = "/root/Serial/text()"
delimiters = ""
position = 1
}
field {
col_name = "uuid_serial"
xpath = "/root/UUID/text()"
delimiters = ""
position = 1
}
field {
col_name = "forEach"
for_each = "forEach"
delimiters = ""
position = 1
}
}
}
if_not_found_do = nop {}
}
on_false = nop {}
}
}
step {
name = "Get DMI type 2"
runcmd_to_var {
cmd = concat {
get_attr {"sudo"}
" dmidecode -t 2 | cat"
}
var_names = table {
name = "dmiType2"
col_names = "baseboard_serial"
}
parsing_strategy = properties_parsing_strategy {fields {
field {
col_name = "baseboard_serial"
xpath = "/Serial/text()"
delimiters = ":"
position = 2
}
field {
col_name = "forEach"
for_each = "forEach"
delimiters = ""
position = 1
}
}}
if_not_found_do = nop {}
cache_flag = 0
}
}
step {
name = "Failover Get DMI type 2"
if {
condition = is_empty {get_attr {"dmiType2"}}
on_true = runcmd_to_var {
cmd = concat {
get_attr {"sudo"}
" dmidecode -t 2 | cat"
}
execution_mode = "DEFAULT"
var_names = "output_dmi"
parsing_strategy = delimited_parsing {
include_lines_pattern = ":"
exclude_lines_pattern = "readonly"
selected_positions = 1
}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "Convert output to JSON"
if {
condition = is_empty {get_attr {"dmiType2"}}
on_true = set_attr {
"output_dmi_json"
eval {"
arr = \${output_dmi};
length = arr.size();
res = \\"{\\";
for( i = 0;i < length;i++){
str = arr[i].split(\\":\\");
if(arr[i].contains(\\"Serial\\")){
res = res + '\\"Serial\\"' +\\":\\" + '\\"'+str[1].trim()+'\\"';
}else{
res = res + '\\"na\\"' +\\":\\" + '\\"na\\"';
}
if(i != length -1){
res = res + \\",\\";
}
}
res = res +\\"}\\";
return res;"}
}
on_false = nop {}
}
}
step {
name = "Parse DMI type 2"
if {
condition = all {
is_empty {get_attr {"dmiType2"}}
is_not_empty {get_attr {"output_dmi_json"}}
}
on_true = parse_var_to_var {
from_var_name = "output_dmi_json"
to_var_names = table {
name = "dmiType2"
col_names = "baseboard_serial"
}
parsing_strategy = custom_parsing_strategy {
sys_id = "512a3d5a9f3312003cb191aec32e708a"
rootXpath = "/root"
fields {
field {
col_name = "baseboard_serial"
xpath = "/root/Serial/text()"
delimiters = ""
position = 1
}
field {
col_name = "forEach"
for_each = "forEach"
delimiters = ""
position = 1
}
}
}
if_not_found_do = nop {}
}
on_false = nop {}
}
}
step {
name = "Get DMI type 3"
runcmd_to_var {
cmd = concat {
get_attr {"sudo"}
" dmidecode -t 3 | cat"
}
var_names = table {
name = "dmiType3"
col_names = "chassis_serial"
}
parsing_strategy = properties_parsing_strategy {fields {
field {
col_name = "chassis_serial"
xpath = "/Serial/text()"
delimiters = " "
position = 2
}
field {
col_name = "forEach"
for_each = "forEach"
delimiters = ""
position = 1
}
}}
if_not_found_do = nop {}
cache_flag = 0
}
}
step {
name = "Failover Get DMI type 3"
if {
condition = is_empty {get_attr {"dmiType3"}}
on_true = runcmd_to_var {
cmd = concat {
get_attr {"sudo"}
" dmidecode -t 3 | cat"
}
execution_mode = "DEFAULT"
var_names = "output_dmi"
parsing_strategy = delimited_parsing {
include_lines_pattern = ":"
exclude_lines_pattern = "readonly"
selected_positions = 1
}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "Convert output to JSON"
if {
condition = is_empty {get_attr {"dmiType3"}}
on_true = set_attr {
"output_dmi_json"
eval {"arr = \${output_dmi};
length = arr.size();
res = \\"{\\";
for( i = 0;i < length;i++){
str = arr[i].split(\\":\\");
if(arr[i].contains(\\"Serial\\")){
res = res + '\\"Serial\\"' +\\":\\" + '\\"'+str[1].trim()+'\\"';
}else{
res = res + '\\"na\\"' +\\":\\" + '\\"na\\"';
}
if(i != length -1){
res = res + \\",\\";
}
}
res = res +\\"}\\";
return res;"}
}
on_false = nop {}
}
}
step {
name = "Parse DMI type 3"
if {
condition = all {
is_empty {get_attr {"dmiType3"}}
is_not_empty {get_attr {"output_dmi_json"}}
}
on_true = parse_var_to_var {
from_var_name = "output_dmi_json"
to_var_names = table {
name = "dmiType3"
col_names = "chassis_serial"
}
parsing_strategy = custom_parsing_strategy {
sys_id = "512a3d5a9f3312003cb191aec32e708a"
rootXpath = "/root"
fields {
field {
col_name = "chassis_serial"
xpath = "/root/Serial/text()"
delimiters = ""
position = 1
}
field {
col_name = "forEach"
for_each = "forEach"
delimiters = ""
position = 1
}
}
}
if_not_found_do = nop {}
}
on_false = nop {}
}
}
step {
name = "Update system serial number"
transform {
src_table_name = "dmiType1"
target_table_name = "serial_system"
operation {
set_field {
field_name = "serial_number"
value = eval {"javascript:var rtrn = \\"\\";var tri = \${dmiType1[].system_serial_number};rtrn = tri.trim();"}
}
set_field {
field_name = "serial_number_type"
value = "system"
}
set_field {
field_name = "valid"
value = "true"
}
}
}
}
step {
name = "Update UUID serial number"
transform {
src_table_name = "dmiType1"
target_table_name = "serial_uuid"
operation {
set_field {
field_name = "serial_number"
value = eval {"javascript:var rtrn = \\"\\";var tri = \${dmiType1[].uuid_serial};rtrn = tri.trim();"}
}
set_field {
field_name = "serial_number_type"
value = "uuid"
}
set_field {
field_name = "valid"
value = "true"
}
}
}
}
step {
name = "Update baseboard serial number"
transform {
src_table_name = "dmiType2"
target_table_name = "serial_baseboard"
operation {
set_field {
field_name = "serial_number"
value = eval {"javascript:var rtrn = \\"\\";var tri = \${dmiType2[].baseboard_serial};rtrn = tri.trim();"}
}
set_field {
field_name = "serial_number_type"
value = "baseboard"
}
set_field {
field_name = "valid"
value = "true"
}
}
}
}
step {
name = "Update chassis serial number"
transform {
src_table_name = "dmiType3"
target_table_name = "serial_chassis"
operation {
set_field {
field_name = "serial_number"
value = eval {"javascript:var rtrn = \\"\\";var tri = \${dmiType3[].chassis_serial};rtrn = tri.trim();"}
}
set_field {
field_name = "serial_number_type"
value = "chassis"
}
set_field {
field_name = "valid"
value = "true"
}
}
}
}
step {
name = "Combine serial_system and serial_baseboard"
union {
table1_name = "serial_system"
table2_name = "serial_baseboard"
result_table_name = "serial_system"
}
}
step {
name = "Combine serial_system and serial_uuid"
union {
table1_name = "serial_system"
table2_name = "serial_uuid"
result_table_name = "serial_system"
}
}
step {
name = "Combine serial_system and serial_chassis"
union {
table1_name = "serial_system"
table2_name = "serial_chassis"
result_table_name = "serial_system"
}
}
step {
name = "Update cmdb_serial_number table"
transform {
src_table_name = "serial_system"
target_table_name = "cmdb_serial_number"
operation {
set_field {
field_name = "serial_number"
value = get_attr {"serial_system[].serial_number"}
}
set_field {
field_name = "serial_number_type"
value = get_attr {"serial_system[].serial_number_type"}
}
set_field {
field_name = "valid"
value = get_attr {"serial_system[].valid"}
}
}
}
}
step {
name = "Remove \\"None\\" serials"
filter {
src_table_name = "cmdb_serial_number"
target_table_name = "cmdb_serial_number"
condition = all {
not_contains {
get_attr {"cmdb_serial_number[].serial_number"}
"None"
}
neq {
get_attr {"cmdb_serial_number[].serial_number"}
"Not"
}
not_contains {
get_attr {"cmdb_serial_number[].serial_number"}
"Not"
}
not_contains {
get_attr {"cmdb_serial_number[].serial_number"}
"Number:"
}
}
}
}
step {
name = "Remove duplicate serials"
set_attr {
"dump_var"
eval {"javascript:
var tableWithoutDuplicates = '';
tableWithoutDuplicates = DuplicateRemover.removeDuplicates(\${cmdb_serial_number},['serial_number','serial_number_type','valid']);
CTX.setAttribute(\\"cmdb_serial_number\\", tableWithoutDuplicates);
"}
}
}
step {
name = "Keep rows in dmiType1 that contain manufacturer"
filter {
src_table_name = "dmiType1"
target_table_name = "potentialManufacturers"
condition = is_not_empty {get_attr {"dmiType1[].manufacturer"}}
}
}
step {
name = "Update manufacturer in cmdb_ci_linux_server"
if {
condition = is_not_empty {get_attr {"potentialManufacturers"}}
on_true = set_attr {
"cmdb_ci_linux_server[*].manufacturer"
get_attr {"potentialManufacturers[1].manufacturer"}
}
on_false = nop {}
}
}
step {
name = "Keep rows in dmiType1 that contain model number"
filter {
src_table_name = "dmiType1"
target_table_name = "potentialModelNumbers"
condition = is_not_empty {get_attr {"dmiType1[].model_number"}}
}
}
step {
name = "Update model number in cmdb_ci_linux_server"
if {
condition = is_not_empty {get_attr {"potentialModelNumbers"}}
on_true = set_attr {
"cmdb_ci_linux_server[*].model_number"
get_attr {"potentialModelNumbers[1].model_number"}
}
on_false = nop {}
}
}
step {
name = "Keep rows in dmiType1 that contain model id"
filter {
src_table_name = "dmiType1"
target_table_name = "potentialModelIds"
condition = is_not_empty {get_attr {"dmiType1[].model_id"}}
}
}
step {
name = "Update model id cmdb_ci_linux_server"
if {
condition = is_not_empty {get_attr {"potentialModelIds"}}
on_true = set_attr {
"cmdb_ci_linux_server[*].model_id"
get_attr {"potentialModelIds[1].model_id"}
}
on_false = nop {}
}
}
step {
name = "Ref/Rel Linux Serial"
relation_reference {
table1_name = "cmdb_serial_number"
table2_name = "cmdb_ci_linux_server"
result_table_name = "linx_to_serial"
unmatched_lines = remove
condition = eq {
"1"
"1"
}
ref_direction = parentToChild
ref_field_name = "non_ci"
}
}
}
</ndl>
<parent display_value=""/>
<serverless>false</serverless>
<source/>
<sync_to_mid>true</sync_to_mid>
<sys_class_name>sa_pattern</sys_class_name>
<sys_created_by>admin</sys_created_by>
<sys_created_on>2017-02-01 13:37:46</sys_created_on>
<sys_customer_update>false</sys_customer_update>
<sys_domain>global</sys_domain>
<sys_domain_path>/</sys_domain_path>
<sys_id>c161cfa39f2032001d753758442e70f9</sys_id>
<sys_mod_count>16</sys_mod_count>
<sys_name>Linux - Hardware Information</sys_name>
<sys_overrides display_value=""/>
<sys_package display_value="Pattern Designer" source="com.snc.pattern.designer">79c934314f310300261de57d0210c70c</sys_package>
<sys_policy/>
<sys_replace display_value=""/>
<sys_replace_on_upgrade>false</sys_replace_on_upgrade>
<sys_scope display_value="Global">global</sys_scope>
<sys_update_name>sa_pattern_c161cfa39f2032001d753758442e70f9</sys_update_name>
<sys_updated_by>admin</sys_updated_by>
<sys_updated_on>2021-04-16 13:26:36</sys_updated_on>
<version/>
</sa_pattern>
<sa_pattern action="INSERT_OR_UPDATE">
<active>true</active>
<ci_type>cmdb_ci_appl_generic</ci_type>
<cpattern_type>2</cpattern_type>
<description/>
<directory>false</directory>
<enforce_proc_classy>false</enforce_proc_classy>
<has_draft>false</has_draft>
<invoke_per_account>false</invoke_per_account>
<metadata_id>c4eabd514fe3c3c0a9f9011f0310c730</metadata_id>
<name>Linux - Red Hat Cluster</name>
<ndl>library {
name = "Linux - Red Hat Cluster"
id = "c4eabd514fe3c3c0a9f9011f0310c730"
description = "null"
step {
name = " ________Linux Red Hat Cluster________"
comment = "This step is for label only to mention that we starting the Linux Red Hat Cluster library."
if {
condition = eq {
"1"
"2"
}
on_true = set_attr {
"blq"
"1"
}
on_false = nop {}
}
}
step {
name = "Determine sudo"
comment = "Run script to find the privileged command to use."
set_attr {
"sudo"
eval {"return \${ctx}.getDiscoveryProvider(com.snc.sw.dto.ProviderType.SSH).getPrivilegedCommand();"}
}
}
step {
name = "Create isCluster variable"
comment = "Indicates whether the server we are trying to discover is running in Unix cluster env. Default is \\u201Cfalse\\u201D."
set_attr {
"isCluster"
"false"
}
}
step {
name = "Verify if corosync process is running"
comment = "We are checking if corosync process is running.
In case that corosync process is running we understand that the system is running in Red Hat Cluster env.
This condition will be check during all the Red Hat cluster discovery."
runcmd_to_var {
cmd = "ps -ef | grep corosync | grep -v grep"
var_names = "cluster_process"
parsing_strategy = regex_parsing {regex = ".*(corosync).*"}
if_not_found_do = nop {}
cache_flag = 0
}
}
step {
name = "Set isCluster variable"
comment = "In case that the corosync is running we are setting the \\"isCluster\\" variable to \\"true\\"."
if {
condition = is_not_empty {get_attr {"cluster_process"}}
on_true = set_attr {
"isCluster"
"true"
}
on_false = nop {}
}
}
step {
name = "Create isVIP variable"
comment = "Indicates whether the IP we are trying to discover is Unix cluster\\u2019s VIP. Default is \\u201Cfalse\\u201D."
if {
condition = eq {
get_attr {"isCluster"}
"true"
}
on_true = set_attr {
"isVIP"
"false"
}
on_false = nop {}
}
}
step {
name = "Populate cluster.conf file"
comment = "The \\"/etc/cluster/cluster.conf\\" file contains the cluster configuration and setup.
From \\"/etc/cluster/cluster.conf\\" we can analyze all the cluster settings."
if {
condition = eq {
get_attr {"isCluster"}
"true"
}
on_true = parse_text_file_to_var {
file_path = get_files_by_filter {
expression = "/etc/cluster/cluster.conf"
foreach_attribute_name = "forEach"
}
var_names = "cluster_conf"
parsing_strategy = delimited_parsing {
selected_positions = 1
line_seperator = "XXXXXXXXXXXXX"
}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "Set Red Hat Cluster Version"
if {
condition = eq {
get_attr {"isCluster"}
"true"
}
on_true = runcmd_to_var {
cmd = concat {
get_attr {"sudo"}
" clustat -v"
}
var_names = "red_hat_cluster_version"
parsing_strategy = delimited_parsing {
delimiters = " "
selected_positions = 3
}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "Collect cluster name and cluster nodes name"
comment = "Collect cluster name and cluster nodes name from \\"/etc/cluster/cluster.conf\\"."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
}
on_true = parse_var_to_var {
from_var_name = "cluster_conf"
to_var_names = table {
name = "cluster_name_nodes_multicast"
col_names = "cluster_name","cluster_node","multicast_addr"
}
parsing_strategy = xml_parsing_strategy {
rootXpath = "/cluster"
fields {
field {
col_name = "cluster_name"
xpath = "/cluster/@name"
delimiters = ""
position = 1
}
field {
col_name = "cluster_node"
xpath = "/cluster/clusternodes/clusternode/@name"
delimiters = ""
position = 1
}
field {
col_name = "multicast_addr"
xpath = "/cluster/cman/multicast/@addr"
delimiters = ""
position = 1
}
field {
col_name = "forEach"
for_each = "forEach"
delimiters = ""
position = 1
}
}
}
if_not_found_do = nop {}
}
on_false = nop {}
}
}
step {
name = "Populate VIP service information from cluster.conf"
comment = "Populate VIP service information from cluster.conf"
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
}
on_true = parse_var_to_var {
from_var_name = "cluster_conf"
to_var_names = table {
name = "redhat_cluster_services_ip_info"
col_names = "service_name","ip_ip_address","ip_monitor_link"
}
parsing_strategy = xml_parsing_strategy {
rootXpath = "/cluster"
fields {
field {
col_name = "service_name"
xpath = "/cluster/rm/service/@name"
delimiters = ""
position = 1
}
field {
col_name = "ip_ip_address"
xpath = "/cluster/rm/service/ip/@address"
delimiters = ""
position = 1
}
field {
col_name = "ip_monitor_link"
xpath = "/cluster/rm/service/ip/@monitor_link"
delimiters = ""
position = 1
}
field {
col_name = "forEach"
for_each = "forEach"
delimiters = ""
position = 1
}
}
}
if_not_found_do = nop {}
}
on_false = nop {}
}
}
step {
name = "Parse services from cluster.conf"
comment = "Parse services from cluster.conf.
We are splitting the services to lines every \\"<service\\" section to cluster_conf_all_services table."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
}
on_true = parse_var_to_var {
from_var_name = "cluster_conf"
to_var_names = table {
name = "cluster_conf_all_services"
col_names = "service"
}
parsing_strategy = delimited_parsing {
selected_positions = 1
line_seperator = "<service"
}
if_not_found_do = nop {}
}
on_false = nop {}
}
}
step {
name = "Filter non service from the cluster_conf_all_services table"
comment = "Filter non service from the cluster_conf_all_services table.
This step is removing the first line from the cluster_conf_all_services table which includes not a service information."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
}
on_true = filter {
src_table_name = "cluster_conf_all_services"
target_table_name = "cluster_conf_all_services"
condition = not_contains {
get_attr {"cluster_conf_all_services[].service"}
"xml version="
}
}
on_false = nop {}
}
}
step {
name = "Parse services from \$cluster_conf_all_services table"
comment = "Parse services from \$cluster_conf_all_services table.
We are splitting every resource from the services to separate line in order to create a table that includes only the resources."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
}
on_true = parse_var_to_var {
from_var_name = "cluster_conf_all_services[*].service"
to_var_names = table {
name = "resources"
col_names = "resource"
}
parsing_strategy = delimited_parsing {
exclude_lines_pattern = "autostart"," nfsexport"," /nfsexport"," nfsclient"," <service"," /service"," /fs"
delimiters = ">"
selected_positions = 1
line_seperator = "<"
}
if_not_found_do = nop {}
}
on_false = nop {}
}
}
step {
name = "Filter non resource content from resources table"
comment = "Filter non resource content from resources table.
Lines that doesn't include \\"=\\" or start with \\"/\\", doesn't include resource relevant information."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
}
on_true = filter {
src_table_name = "resources"
target_table_name = "resources"
condition = all {
contains {
get_attr {"resources[].resource"}
"="
}
not_starts_with {
"/"
get_attr {"resources[].resource"}
}
}
}
on_false = nop {}
}
}
step {
name = "Split resources to type and properties"
comment = "Split resources to type and properties.
The first word of every resource line represent its type, the other information is it's properties information."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
}
on_true = parse_var_to_var {
from_var_name = "resources[*].resource"
to_var_names = table {
name = "resource_table"
col_names = "resource_type","resource_properties"
}
parsing_strategy = regex_parsing {regex = "^([^ \\\\s]+)\\\\s+(.*=.*)"}
if_not_found_do = nop {}
}
on_false = nop {}
}
}
step {
name = "Filter lines from resources table which start with autostart"
comment = "Filter lines from resources table which start with autostart"
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
}
on_true = filter {
src_table_name = "resource_table"
target_table_name = "resource_table"
condition = not_starts_with {
"autostart"
get_attr {"resource_table[].resource_type"}
}
}
on_false = nop {}
}
}
step {
name = "Populate resources name from resources table"
comment = "Populate resources name from resources table.
Create a table that include all the resources name - resource_name_table."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
}
on_true = parse_var_to_var {
from_var_name = "resources[*].resource"
to_var_names = table {
name = "resource_name_table"
col_names = "resource_name"
}
parsing_strategy = regex_parsing {regex = "\\\\sname=\\\\\\"(.*?)\\\\\\""}
if_not_found_do = nop {}
}
on_false = nop {}
}
}
step {
name = "Populate resources ip from resources table"
comment = "Populate resources ip from resources table.
Create a table that include all the resources name - resource_ip_table."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
}
on_true = parse_var_to_var {
from_var_name = "resources[*].resource"
to_var_names = table {
name = "resource_ip_table"
col_names = "resource_ip_address"
}
parsing_strategy = regex_parsing {regex = "^ip\\\\s+.*address=\\\\\\"(\\\\d+.\\\\d+.\\\\d+.\\\\d+)\\\\\\""}
if_not_found_do = nop {}
}
on_false = nop {}
}
}
step {
name = "Populate resources sap_database from resources table"
comment = "Populate resources sap_database from resources table.
Create a table that include all the resources name - resource_sap_database_table.
Since this resource doesn't contains a name attribute, we are using the SID as the SAP Database Name."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
}
on_true = parse_var_to_var {
from_var_name = "resources[*].resource"
to_var_names = table {
name = "resource_sap_database_table"
col_names = "resource_sap_database"
}
parsing_strategy = regex_parsing {regex = "^SAPDatabase\\\\s+.*SID=\\\\\\"(.*?)\\\\\\""}
if_not_found_do = nop {}
}
on_false = nop {}
}
}
step {
name = "Populate resources sap_instance from resources table"
comment = "Populate resources sap_instance from resources table.
Create a table that include all the SAP Instances name - resource_sap_instance_table.
Since this resource doesn't contains a name attribute, we are using the Instance name as the SAP instance name."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
}
on_true = parse_var_to_var {
from_var_name = "resources[*].resource"
to_var_names = table {
name = "resource_sap_instance_table"
col_names = "resource_sap_instance"
}
parsing_strategy = regex_parsing {regex = "^SAPInstance\\\\s+.*InstanceName =\\\\\\"(.*?)\\\\\\""}
if_not_found_do = nop {}
}
on_false = nop {}
}
}
step {
name = "Transform resource type to readable name"
comment = "The step contains a script which transform the resource type to readable name."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
}
on_true = transform {
src_table_name = "resource_table"
target_table_name = "resource_table"
operation {set_field {
field_name = "type"
value = eval {"javascript:
rtrn = '';
var type = \${resource_table[].resource_type};
switch (type)
{
case \\"lvm\\": rtrn = \\"HA LVM\\";
break;
case \\"fs\\": rtrn = \\"Filesystem\\";
break;
case \\"ip\\": rtrn = \\"IP Address\\";
break;
case \\"apache\\": rtrn = \\"Apache\\";
break;
case \\"bind-mount\\": rtrn = \\"Bind Mount\\";
break;
case \\"condor\\": rtrn = \\"Condor Instance\\";
break;
case \\"clusterfs\\": rtrn = \\"GFS2\\";
break;
case \\"bind-mount\\": rtrn = \\"Bind Mount\\";
break;
case \\"mysql\\": rtrn = \\"MySQL\\";
break;
case \\"named\\": rtrn = \\"Named Resource\\";
break;
case \\"netfs\\": rtrn = \\"NFS/CIFS Mount\\";
break;
case \\"nfsclient\\": rtrn = \\"NFS Client\\";
break;
case \\"nfsexport\\": rtrn = \\"NFS v3 Export\\";
break;
case \\"nfsserver\\": rtrn = \\"NFS Server\\";
break;
case \\"oracledb\\": rtrn = \\"Oracle 10g/11g Failover Instance\\";
break;
case \\"orainstance\\": rtrn = \\"Oracle 10g/11g Instance\\";
break;
case \\"oralistener\\": rtrn = \\"Oracle 10g/11g Listener\\";
break;
case \\"openldap\\": rtrn = \\"Open LDAP\\";
break;
case \\"SAPDatabase\\": rtrn = \\"SAP Database\\";
break;
case \\"SAPInstance\\": rtrn = \\"SAP Instance\\";
break;
case \\"samba\\": rtrn = \\"Samba Server\\";
break;
case \\"script\\": rtrn = \\"Script\\";
break;
case \\"ASEHAagent\\": rtrn = \\"Sybase ASE Failover Instance\\";
break;
case \\"tomcat\\": rtrn = \\"Tomcat 6\\";
break;
case \\"vm\\": rtrn = \\"Virtual Machine\\";
break;
default: rtrn = \\"logical\\";
}
"}
}}
}
on_false = nop {}
}
}
step {
name = "Merge resource_table and resource_name_table"
comment = "Merge resource_table and resource_name_table, so we will have the resource details and its name in the same table.
The merge created with \\"Keep\\" since there are resources without a name like the \\"ip_address\\" that we wants to keep them in the table."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
}
on_true = merge {
table1_name = "resource_table"
table2_name = "resource_name_table"
result_table_name = "resource_table"
unmatched_lines = keep
condition = contains {
get_attr {"resource_table[].resource_properties"}
concat {
"name=\\""
get_attr {"resource_name_table[].resource_name"}
"\\""
}
}
}
on_false = nop {}
}
}
step {
name = "Merge resource_table and resource_ip_table"
comment = "Merge resource_table and resource_ip_table, so we will have the resource details and its ip address in the same table.
The merge created with \\"Keep\\" since there are resources without a \\"ip_address\\" like the \\"File System\\" that we wants to keep them in the table."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
}
on_true = merge {
table1_name = "resource_table"
table2_name = "resource_ip_table"
result_table_name = "resource_table"
unmatched_lines = keep
condition = contains {
get_attr {"resource_table[].resource_properties"}
concat {
"address=\\""
get_attr {"resource_ip_table[].resource_ip_address"}
"\\""
}
}
}
on_false = nop {}
}
}
step {
name = "Merge resource_table and resource_sap_database_table"
comment = "Merge resource_table and resource_sap_database_table.
The merge created with \\"Keep\\" since there are resources without a \\"SAP database\\" like the \\"File System\\" that we wants to keep them in the table."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
}
on_true = merge {
table1_name = "resource_table"
table2_name = "resource_sap_database_table"
result_table_name = "resource_table"
unmatched_lines = keep
condition = contains {
get_attr {"resource_table[].resource_properties"}
concat {
"SID =\\""
get_attr {"resource_sap_database_table[].resource_sap_database"}
"\\""
}
}
}
on_false = nop {}
}
}
step {
name = "Merge resource_table and resource_sap_instance_table"
comment = "Merge resource_table and resource_sap_instance_table.
The merge created with \\"Keep\\" since there are resources without a \\"SAP instance\\" like the \\"File System\\" that we wants to keep them in the table."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
}
on_true = merge {
table1_name = "resource_table"
table2_name = "resource_sap_instance_table"
result_table_name = "resource_table"
unmatched_lines = keep
condition = contains {
get_attr {"resource_table[].resource_properties"}
concat {
"SID =\\""
get_attr {"resource_sap_instance_table[].resource_sap_instance"}
"\\""
}
}
}
on_false = nop {}
}
}
step {
name = "Script to initial the resource name for IP and SAP "
comment = "The script is initializing the resource name for \\"IP address\\" and \\"SAP Database\\" and \\"SAP Instance\\" since there is no \\"name\\" tag for them in the cluster.conf file.
The script also is initializing the file system resource name for type nfsclient and nfsexport.
The script will return for IP address:
\\"Virtual IP Address\\" +\\"_\\"+ip
The script will return for SAP Database:
\\"SAP Database\\" +\\"_\\"+sapdatabase
The script will return for SAP Instance:
\\"SAP Instance\\" +\\"_\\"+sapinstance
For nfsclient and nfsexport, it will initial the name with the value of the type + ref attribute."
if {
condition = eq {
get_attr {"isCluster"}
"true"
}
on_true = transform {
src_table_name = "resource_table"
target_table_name = "resource_table"
operation {set_field {
field_name = "resource_name"
value = eval {"javascript:
var resource = \${resource_table[].resource_name};
var ip = \${resource_table[].resource_ip_address};
var type = \${resource_table[].resource_type};
var sapdatabase = \${resource_table[].resource_sap_database};
var sapinstance = \${resource_table[].resource_sap_instance};
var resource_properties = \${resource_table[].resource_properties};
var rtrn='';
if (!resource || resource == \\"null\\")
{
if (type == \\"ip\\")
{
rtrn=\\"Virtual IP address\\" +\\"_\\"+ip;
}
if (type == \\"SAPDatabase\\")
{
rtrn=\\"SAP Database\\" +\\"_\\"+sapdatabase;
}
if (type == \\"SAPInstance\\")
{
rtrn=\\"SAP Instance\\" +\\"_\\"+sapinstance;
}
if (type == \\"nfsclient\\" || type==\\"nfsexport\\")
{
regexp = /ref=\\\\\\"(.*)\\\\\\"/g;
var code = regexp.exec(resource_properties);
if ( code != null && code[1] != null )
rtrn=type+\\"_\\"+code[1];
}
}
else
{
rtrn=resource;
}"}
}}
}
on_false = nop {}
}
}
step {
name = "Set isVIP variable"
comment = "Are we trying to discover a VIP address?Check if our management ip is a VIP"
if {
condition = all {
contains {
get_attr {"redhat_cluster_services_ip_info[*].ip_ip_address"}
get_attr {"computer_system.managementIP"}
}
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
}
on_true = set_attr {
"isVIP"
"yes"
}
on_false = nop {}
}
}
step {
name = "Fail Pattern If VIP Address Is Discovered"
comment = "We are not discovering a VIPs of the services.
In case the discovered server is a VIP, we will stop the discovery."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
}
on_true = match {
eq {
get_attr {"isVIP"}
"false"
}
terminate_op = terminate
}
on_false = nop {}
}
}
step {
name = "Collect nodes information from clustat -x command output"
comment = "Collect nodes information from clustat -x command output.
Running the command \\"sudo clustat -x\\" to collect the current cluster nodes information and status.
We are collecting the following data from the node:
node_name, node_state, node_local, node_estranged, node_rgmanager, node_rgmanager_master, node_qdisk, node_nodeid, cluster_name, cluster_id, cluster_generation"
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
}
on_true = runcmd_to_var {
cmd = concat {
get_attr {"sudo"}
" clustat -x"
}
var_names = table {
name = "clustat_nodes_info_table"
col_names = "node_name","node_state","node_local","node_estranged","node_rgmanager","node_rgmanager_master","node_qdisk","node_nodeid","cluster_name","cluster_id","cluster_generation"
}
parsing_strategy = xml_parsing_strategy {
rootXpath = "/clustat"
fields {
field {
col_name = "node_name"
xpath = "/clustat/nodes/node/@name"
delimiters = ""
position = 1
}
field {
col_name = "node_state"
xpath = "/clustat/nodes/node/@state"
delimiters = ""
position = 1
}
field {
col_name = "node_local"
xpath = "/clustat/nodes/node/@local"
delimiters = ""
position = 1
}
field {
col_name = "node_estranged"
xpath = "/clustat/nodes/node/@estranged"
delimiters = ""
position = 1
}
field {
col_name = "node_rgmanager"
xpath = "/clustat/nodes/node/@rgmanager"
delimiters = ""
position = 1
}
field {
col_name = "node_rgmanager_master"
xpath = "/clustat/nodes/node/@rgmanager_master"
delimiters = ""
position = 1
}
field {
col_name = "node_qdisk"
xpath = "/clustat/nodes/node/@qdisk"
delimiters = ""
position = 1
}
field {
col_name = "node_nodeid"
xpath = "/clustat/nodes/node/@nodeid"
delimiters = ""
position = 1
}
field {
col_name = "cluster_name"
xpath = "/clustat/cluster/@name"
delimiters = ""
position = 1
}
field {
col_name = "cluster_id"
xpath = "/clustat/cluster/@id"
delimiters = ""
position = 1
}
field {
col_name = "cluster_generation"
xpath = "/clustat/cluster/@generation"
delimiters = ""
position = 1
}
field {
col_name = "forEach"
for_each = "forEach"
delimiters = ""
position = 1
}
}
}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "Set cluster_id in clustat_nodes_info_table table"
comment = "Set cluster_id in clustat_nodes_info_table table"
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
}
on_true = transform {
src_table_name = "clustat_nodes_info_table"
target_table_name = "clustat_nodes_info_table"
operation {set_field {
field_name = "cluster_id"
value = concat {
get_attr {"clustat_nodes_info_table[1].cluster_name"}
"_"
get_attr {"clustat_nodes_info_table[1].cluster_id"}
}
}}
}
on_false = nop {}
}
}
step {
name = "Collect services information from clustat -x command output"
comment = "Collect services information from clustat -x command output
Running the command \\"sudo clustat -x\\" to collect the current cluster services information and status."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = runcmd_to_var {
cmd = concat {
get_attr {"sudo"}
" clustat -x"
}
var_names = table {
name = "clustat_services_info_table"
col_names = "service_name","service_state","service_state_str","service_flags","service_owner","service_last_owner","service_restarts","service_last_transition","service_last_transition_str"
}
parsing_strategy = xml_parsing_strategy {
rootXpath = "/clustat"
fields {
field {
col_name = "service_name"
xpath = "/clustat/groups/group/@name"
delimiters = ":"
position = 2
}
field {
col_name = "service_state"
xpath = "/clustat/groups/group/@state"
delimiters = ""
position = 1
}
field {
col_name = "service_state_str"
xpath = "/clustat/groups/group/@state_str"
delimiters = ""
position = 1
}
field {
col_name = "service_flags"
xpath = "/clustat/groups/group/@flags"
delimiters = ""
position = 1
}
field {
col_name = "service_owner"
xpath = "/clustat/groups/group/@owner"
delimiters = ""
position = 1
}
field {
col_name = "service_last_owner"
xpath = "/clustat/groups/group/@last_owner"
delimiters = ""
position = 1
}
field {
col_name = "service_restarts"
xpath = "/clustat/groups/group/@restarts"
delimiters = ""
position = 1
}
field {
col_name = "service_last_transition"
xpath = "/clustat/groups/group/@last_transition"
delimiters = ""
position = 1
}
field {
col_name = "service_last_transition_str"
xpath = "/clustat/groups/group/@last_transition_str"
delimiters = ""
position = 1
}
field {
col_name = "forEach"
for_each = "forEach"
delimiters = ""
position = 1
}
}
}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "Merge cluster_conf_all_services and clustat_services_info_table tables"
comment = "Merge tables \$clustat_services_info_table and \$cluster_conf_all_services to cluster_conf_all_services in order to have a table that include the service name and the related resources to the service."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = merge {
table1_name = "cluster_conf_all_services"
table2_name = "clustat_services_info_table"
result_table_name = "cluster_conf_all_services"
unmatched_lines = remove
condition = contains {
get_attr {"cluster_conf_all_services[].service"}
concat {
"name=\\""
get_attr {"clustat_services_info_table[].service_name"}
"\\""
}
}
}
on_false = nop {}
}
}
step {
name = "Merge cluster_conf_all_services and resource_table tables"
comment = "Merge tables \$resource_table and \$cluster_conf_all_services to cluster_conf_all_services in order to have a table that includes the service name + resource details + on which host they are running."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = merge {
table1_name = "cluster_conf_all_services"
table2_name = "resource_table"
result_table_name = "cluster_conf_all_services"
unmatched_lines = remove
condition = contains {
get_attr {"cluster_conf_all_services[].service"}
concat {
get_attr {"resource_table[].resource_type"}
" "
get_attr {"resource_table[].resource_properties"}
}
}
}
on_false = nop {}
}
}
step {
name = "Adding the service address to every resource"
comment = "Script for adding the service ip address to every resource line."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = transform {
src_table_name = "cluster_conf_all_services"
target_table_name = "cluster_conf_all_services"
operation {set_field {
field_name = "ip_address_service"
value = eval {"javascript: var service = \${cluster_conf_all_services[].service};
var regexp = /ip[\\\\s+]?addr[ess]?=.\\\\b(\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3})\\\\b/g;
var ip_address = regexp.exec(service);
var rtrn ='';
rtrn = ip_address[1];
"}
}}
}
on_false = nop {}
}
}
step {
name = "Transform hostname to IP address"
comment = "Transform hostname to IP address.
The script is searching for the node_name record in the /etc/hosts file of the server and save the ip address of this server to the node_ip_address table attribute."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = transform {
src_table_name = "clustat_nodes_info_table"
target_table_name = "clustat_nodes_info_table"
operation {set_field {
field_name = "node_ip_address"
value = eval {"if (\${clustat_nodes_info_table[].node_qdisk} == \\"0\\") {
def full_line= com.snc.sw.commands.SshCommand.getSSHProvider(ctx).execCommand(\\"cat /etc/hosts |grep \\"+\${clustat_nodes_info_table[].node_name} );
return full_line.split()[0];
} else {
return \\"\\";
}
"}
}}
}
on_false = nop {}
}
}
step {
name = "Adding cluster name to the cluster_conf_all_services table"
comment = "Adding cluster name to the cluster_conf_all_services table.
In the resouce_name we are converting the VIP IP address to it's FQDN."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = transform {
src_table_name = "cluster_conf_all_services"
target_table_name = "cluster_conf_all_services"
operation {
set_field {
field_name = "resource_name"
value = eval {"javascript:
try{
var rtrn='';
var str='';
var ip = CTX.getAttribute(\\"cluster_conf_all_services[].ip_address_service\\");
var resource_type=CTX.getAttribute(\\"cluster_conf_all_services[].resource_type\\");
var name=CTX.getAttribute(\\"cluster_conf_all_services[].resource_name\\");
if (resource_type == \\"ip\\")
{
var run_command =\\"nslookup \\"+ip+\\"| egrep 'name' | awk '{print \$4}' | sort | head -1\\";
str=CTX.getCommandManager().shellCommand(run_command, false, null, null, CTX);
str=str.slice(0, -1);
rtrn = str;
rtrn;
}
else
{
rtrn=name;
}
}
catch(e){
var rtrn =e;
rtrn;
}"}
}
set_field {
field_name = "cluster_name"
value = get_attr {"cluster_name_nodes_multicast[1].cluster_name"}
}
}
}
on_false = nop {}
}
}
step {
name = "Parse /etc/hosts"
comment = "Steps 7.1.33-7.1.41 are created in order to be able to do step
\\"Reference and relation between cmdb_ci_unix_cluster_node to cmdb_ci_unix_server\\".
Since we are discovering a cluster node and the IP address that we are running the discovery can be different from the cluster node, we want to make sure that the cluster node and the current server that we are discovering are the same server for creating the \\"Reference and relation between cmdb_ci_unix_cluster_node to cmdb_ci_unix_server\\" step."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = parse_text_file_to_var {
file_path = get_files_by_filter {
expression = "/etc/hosts"
foreach_attribute_name = "forEach"
}
var_names = table {
name = "etc_hosts"
col_names = "ip_etc","hostname_etc"
}
parsing_strategy = regex_parsing {regex = "(\\\\d+\\\\.\\\\d+\\\\.\\\\d+\\\\.\\\\d+).*\\\\s+(.*)"}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "Get ifconfig command to string"
comment = "Steps 7.1.33-7.1.41 are created in order to be able to do step
\\"Reference and relation between cmdb_ci_unix_cluster_node to cmdb_ci_unix_server\\".
Since we are discovering a cluster node and the IP address that we are running the discovery can be different from the cluster node, we want to make sure that the cluster node and the current server that we are discovering are the same server for creating the \\"Reference and relation between cmdb_ci_unix_cluster_node to cmdb_ci_unix_server\\" step."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
neq {
get_attr {"use_net_tools"}
"false"
}
}
on_true = runcmd_to_var {
cmd = "ifconfig | grep 'inet addr:' |awk '{print \$1, \$2 }'"
var_names = table {
name = "ifconfig_res"
col_names = "string"
}
parsing_strategy = delimited_parsing {
selected_positions = 1
line_seperator = "xxxxxxxxxxxx"
}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "Failover Get ifconfig command to string"
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
neq {
get_attr {"use_net_tools"}
"false"
}
is_empty {get_attr {"ifconfig_res"}}
}
on_true = runcmd_to_var {
cmd = "ifconfig | grep 'inet ' |awk '{print \$1, \$2 }'"
var_names = table {
name = "ifconfig_res"
col_names = "string"
}
parsing_strategy = delimited_parsing {
selected_positions = 1
line_seperator = "xxxxxxxxxxxx"
}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "Get ip addr command to string"
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
eq {
get_attr {"computer_system.osType"}
"LINUX"
}
is_empty {get_attr {"ifconfig_res"}}
}
on_true = runcmd_to_var {
cmd = "ip addr | grep 'inet ' |awk '{print \$1, \$2 }'"
var_names = table {
name = "ifconfig_res"
col_names = "string"
}
parsing_strategy = delimited_parsing {
delimiters = "/"
selected_positions = 1
}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "Parse hostname -s command"
comment = "Steps 7.1.33-7.1.41 are created in order to be able to do step
\\"Reference and relation between cmdb_ci_unix_cluster_node to cmdb_ci_unix_server\\".
Since we are discovering a cluster node and the IP address that we are running the discovery can be different from the cluster node, we want to make sure that the cluster node and the current server that we are discovering are the same server for creating the \\"Reference and relation between cmdb_ci_unix_cluster_node to cmdb_ci_unix_server\\" step."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = runcmd_to_var {
cmd = "hostname -s"
var_names = "short_hostname"
parsing_strategy = delimited_parsing {
selected_positions = 1
}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "Parse hostname -f command"
comment = "Steps 7.1.33-7.1.41 are created in order to be able to do step
\\"Reference and relation between cmdb_ci_unix_cluster_node to cmdb_ci_unix_server\\".
Since we are discovering a cluster node and the IP address that we are running the discovery can be different from the cluster node, we want to make sure that the cluster node and the current server that we are discovering are the same server for creating the \\"Reference and relation between cmdb_ci_unix_cluster_node to cmdb_ci_unix_server\\" step."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = runcmd_to_var {
cmd = "hostname -f"
var_names = "long_hostname"
parsing_strategy = delimited_parsing {
selected_positions = 1
}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "Filter etc_host table to current hostname"
comment = "Steps 7.1.33-7.1.41 are created in order to be able to do step
\\"Reference and relation between cmdb_ci_unix_cluster_node to cmdb_ci_unix_server\\".
Since we are discovering a cluster node and the IP address that we are running the discovery can be different from the cluster node, we want to make sure that the cluster node and the current server that we are discovering are the same server for creating the \\"Reference and relation between cmdb_ci_unix_cluster_node to cmdb_ci_unix_server\\" step."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = filter {
src_table_name = "etc_hosts"
target_table_name = "local_hosts"
condition = starts_with {
get_attr {"short_hostname"}
get_attr {"etc_hosts[].hostname_etc"}
}
}
on_false = nop {}
}
}
step {
name = "Merge local_hosts and ifconfig_res tables"
comment = "Steps 7.1.33-7.1.41 are created in order to be able to do step
\\"Reference and relation between cmdb_ci_unix_cluster_node to cmdb_ci_unix_server\\".
Since we are discovering a cluster node and the IP address that we are running the discovery can be different from the cluster node, we want to make sure that the cluster node and the current server that we are discovering are the same server for creating the \\"Reference and relation between cmdb_ci_unix_cluster_node to cmdb_ci_unix_server\\" step."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = merge {
table1_name = "local_hosts"
table2_name = "ifconfig_res"
result_table_name = "local_hosts"
unmatched_lines = remove
condition = any {
contains {
get_attr {"ifconfig_res[].string"}
concat {
"inet addr:"
get_attr {"local_hosts[].ip_etc"}
}
}
contains {
get_attr {"ifconfig_res[].string"}
concat {
"inet "
get_attr {"local_hosts[].ip_etc"}
}
}
}
}
on_false = nop {}
}
}
step {
name = "Filter etc_hosts table to local_hosts"
comment = "Steps 7.1.33-7.1.41 are created in order to be able to do step
\\"Reference and relation between cmdb_ci_unix_cluster_node to cmdb_ci_unix_server\\".
Since we are discovering a cluster node and the IP address that we are running the discovery can be different from the cluster node, we want to make sure that the cluster node and the current server that we are discovering are the same server for creating the \\"Reference and relation between cmdb_ci_unix_cluster_node to cmdb_ci_unix_server\\" step."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = filter {
src_table_name = "etc_hosts"
target_table_name = "etc_hosts"
condition = neq {
get_attr {"etc_hosts[].ip_etc"}
get_attr {"local_hosts[1].ip_etc"}
}
}
on_false = nop {}
}
}
step {
name = "Adding the long name format to the local_host table"
comment = "Steps 7.1.33-7.1.41 are created in order to be able to do step
\\"Reference and relation between cmdb_ci_unix_cluster_node to cmdb_ci_unix_server\\".
Since we are discovering a cluster node and the IP address that we are running the discovery can be different from the cluster node, we want to make sure that the cluster node and the current server that we are discovering are the same server for creating the \\"Reference and relation between cmdb_ci_unix_cluster_node to cmdb_ci_unix_server\\" step."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = transform {
src_table_name = "local_hosts"
target_table_name = "local_hosts"
operation {set_field {
field_name = "long_hostname"
value = get_attr {"long_hostname"}
}}
}
on_false = nop {}
}
}
step {
name = "Merge local_hosts and clustat_nodes_info_table tables"
comment = "Merge clustat_nodes_info_table and local_hosts table, so we will know if the ip exist in the table.
We are using Condition with \\"Keep\\" in order to keep all the cluster
nodes in the table even if they are not in the same host that we are running the discovery.
Steps 7.1.33-7.1.41 are created in order to be able to do step
\\"Reference and relation between cmdb_ci_unix_cluster_node to cmdb_ci_unix_server\\".
Since we are discovering a cluster node and the IP address that we are running the discovery can be different from the cluster node, we want to make sure that the cluster node and the current server that we are discovering are the same server for creating the \\"Reference and relation between cmdb_ci_unix_cluster_node to cmdb_ci_unix_server\\" step."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = merge {
table1_name = "local_hosts"
table2_name = "clustat_nodes_info_table"
result_table_name = "clustat_nodes_info_table"
unmatched_lines = keep
condition = contains {
get_attr {"local_hosts[].string"}
get_attr {"clustat_nodes_info_table[].node_ip_address"}
}
}
on_false = nop {}
}
}
step {
name = "Insert clusters nodes data to cmdb_ci_unix_cluster_node"
comment = "Insert clusters nodes data to cmdb_ci_unix_cluster_node"
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = transform {
src_table_name = "clustat_nodes_info_table"
target_table_name = "cmdb_ci_unix_cluster_node"
operation {
set_field {
field_name = "name"
value = get_attr {"clustat_nodes_info_table[].node_name"}
}
set_field {
field_name = "node_state"
value = get_attr {"clustat_nodes_info_table[].node_state"}
}
set_field {
field_name = "ip_address"
value = get_attr {"clustat_nodes_info_table[].node_ip_address"}
}
set_field {
field_name = "node_status"
value = eval {"javascript:
var state = \${clustat_nodes_info_table[*].node_state};
state = state.toArray();
var rtrn='';
var node_status=\\"Offline\\";
for (var i = 0; i < state.length; i++)
{
if (state[i] == \\"1\\")
{
node_status=\\"Online\\";
}
}
rtrn=node_status;"}
}
}
}
on_false = nop {}
}
}
step {
name = "Remove duplicate cmdb_ci_unix_cluster_node"
comment = "Remove duplicate cmdb_ci_unix_cluster_node"
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = set_attr {
"dump_var"
eval {"javascript: var tableWithoutDuplicates = '';
tableWithoutDuplicates = DuplicateRemover.removeDuplicates(\${cmdb_ci_unix_cluster_node},\\"name\\");
CTX.setAttribute(\\"cmdb_ci_unix_cluster_node\\", tableWithoutDuplicates);
"}
}
on_false = nop {}
}
}
step {
name = "Insert clusters vips data to cmdb_ci_cluster_vip"
comment = "Insert clusters vips data to cmdb_ci_cluster_vip"
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = transform {
src_table_name = "cluster_conf_all_services"
target_table_name = "cmdb_ci_cluster_vip"
operation {
set_field {
field_name = "name"
value = get_attr {"cluster_conf_all_services[].resource_name"}
}
set_field {
field_name = "ip_address"
value = get_attr {"cluster_conf_all_services[].resource_ip_address"}
}
set_field {
field_name = "cluster_id"
value = get_attr {"clustat_nodes_info_table[1].cluster_id"}
}
}
}
on_false = nop {}
}
}
step {
name = "Filter cmdb_ci_cluster_vip to include ip_address only"
comment = "Filter cmdb_ci_cluster_vip to include ip_address only."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = filter {
src_table_name = "cmdb_ci_cluster_vip"
target_table_name = "cmdb_ci_cluster_vip"
condition = is_not_empty {get_attr {"cmdb_ci_cluster_vip[].ip_address"}}
}
on_false = nop {}
}
}
step {
name = "Remove duplicate cmdb_ci_cluster_vip"
comment = "Remove duplicate cmdb_ci_cluster_vip"
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = set_attr {
"dump_var"
eval {"javascript:
var tableWithoutDuplicates = '';
tableWithoutDuplicates = DuplicateRemover.removeDuplicates(\${cmdb_ci_cluster_vip},\\"ip_address\\");
CTX.setAttribute(\\"cmdb_ci_cluster_vip\\", tableWithoutDuplicates);
"}
}
on_false = nop {}
}
}
step {
name = "Insert cluster data to cmdb_ci_unix_cluster"
comment = "Insert cluster data to cmdb_ci_unix_cluster"
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = transform {
src_table_name = "cluster_name_nodes_multicast"
target_table_name = "cmdb_ci_unix_cluster"
operation {
set_field {
field_name = "name"
value = get_attr {"cluster_name_nodes_multicast[1].cluster_name"}
}
set_field {
field_name = "cluster_status"
value = eval {"javascript:
var state = \${clustat_nodes_info_table[*].node_state};
state = state.toArray();
var rtrn='';
var cluster_status=\\"Offline\\";
for (var i = 0; i < state.length; i++)
{
if (state[i] == \\"1\\")
{
cluster_status=\\"Online\\";
}
}
rtrn=cluster_status;"}
}
set_field {
field_name = "ip_address"
value = get_attr {"cluster_name_nodes_multicast[1].multicast_addr"}
}
set_field {
field_name = "short_description"
value = "Linux Red Hat Cluster"
}
set_field {
field_name = "cluster_type"
value = "Linux Red Hat Cluster"
}
set_field {
field_name = "cluster_version"
value = get_attr {"red_hat_cluster_version"}
}
set_field {
field_name = "cluster_id"
value = get_attr {"clustat_nodes_info_table[1].cluster_id"}
}
}
}
on_false = nop {}
}
}
step {
name = "Remove duplicate cmdb_ci_unix_cluster"
comment = "Remove duplicate cmdb_ci_unix_cluster"
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = set_attr {
"dump_var"
eval {"javascript:
var tableWithoutDuplicates = '';
tableWithoutDuplicates = DuplicateRemover.removeDuplicates(\${cmdb_ci_unix_cluster},\\"name\\");
CTX.setAttribute(\\"cmdb_ci_unix_cluster\\", tableWithoutDuplicates);
"}
}
on_false = nop {}
}
}
step {
name = "Insert clusters resources data to cmdb_ci_unix_cluster_resource"
comment = "Insert clusters resources data to cmdb_ci_unix_cluster_resource
The properties attribute is manipulate to remove \\"/\\" from the end of the line if exist.
The resource_status attribute is manipulate to transform the resource state from number to string \\"Online\\" or \\"Offline\\"."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = transform {
src_table_name = "cluster_conf_all_services"
target_table_name = "cmdb_ci_unix_cluster_resource"
operation {
set_field {
field_name = "name"
value = get_attr {"cluster_conf_all_services[].resource_name"}
}
set_field {
field_name = "resource_type"
value = get_attr {"cluster_conf_all_services[].type"}
}
set_field {
field_name = "properties"
value = eval {"javascript:
var prop = \${cluster_conf_all_services[].resource_properties};
var rtrn='';
if (prop.charAt(prop.length - 1) == '/') {
rtrn = prop.substr(0, prop.length - 1);
}
else
{
rtrn=prop;
}
"}
}
set_field {
field_name = "resource_status"
value = eval {"javascript:
var state = \${cluster_conf_all_services[*].service_state};
state = state.toArray();
var rtrn='';
var resource_status=\\"Offline\\";
for (var i = 0; i < state.length; i++)
{
if (state[i] == \\"112\\")
{
resource_status=\\"Online\\";
}
}
rtrn=resource_status;"}
}
set_field {
field_name = "ip_address"
value = get_attr {"cluster_conf_all_services[].ip_address_service"}
}
set_field {
field_name = "cluster_id"
value = get_attr {"clustat_nodes_info_table[1].cluster_id"}
}
}
}
on_false = nop {}
}
}
step {
name = "Remove duplicate cmdb_ci_unix_cluster_resource"
comment = "Remove duplicate cmdb_ci_unix_cluster_resource"
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = set_attr {
"dump_var"
eval {"javascript: var tableWithoutDuplicates = '';
tableWithoutDuplicates = DuplicateRemover.removeDuplicates(\${cmdb_ci_unix_cluster_resource},\\"name\\");
CTX.setAttribute(\\"cmdb_ci_unix_cluster_resource\\", tableWithoutDuplicates);
"}
}
on_false = nop {}
}
}
step {
name = "Reference and relation between cmdb_ci_cluster_vip to cmdb_ci_unix_cluster"
comment = "Creating Reference and relation between cmdb_ci_cluster_vip to cmdb_ci_unix_cluster"
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = relation_reference {
table1_name = "cmdb_ci_unix_cluster"
table2_name = "cmdb_ci_cluster_vip"
result_table_name = "cluster_vip_unix_cluster"
unmatched_lines = remove
condition = all {
eq {
get_attr {"cmdb_ci_cluster_vip[].cluster_name"}
get_attr {"cmdb_ci_unix_cluster[].cluster_name"}
}
eq {
get_attr {"cmdb_ci_cluster_vip[].cluster_id"}
get_attr {"cmdb_ci_unix_cluster[].cluster_id"}
}
}
relation_type = "Virtualized by::Virtualizes"
ref_direction = childToParent
ref_field_name = "cluster"
}
on_false = nop {}
}
}
step {
name = "Reference and relation between cmdb_ci_cluster_vip to cmdb_ci_unix_cluster_node"
comment = "Creating Reference and relation between cmdb_ci_cluster_vip to cmdb_ci_unix_cluster_node."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = relation_reference {
table1_name = "cmdb_ci_cluster_vip"
table2_name = "cmdb_ci_unix_cluster_node"
result_table_name = "cluster_vip_cluster_node"
unmatched_lines = remove
condition = all {
eq {
get_attr {"cmdb_ci_cluster_vip[].cluster_name"}
get_attr {"cmdb_ci_unix_cluster_node[].cluster_name"}
}
eq {
get_attr {"cmdb_ci_cluster_vip[].cluster_id"}
get_attr {"cmdb_ci_unix_cluster_node[].cluster_id"}
}
}
relation_type = "Uses::Used by"
ref_direction = parentToChild
ref_field_name = "node"
}
on_false = nop {}
}
}
step {
name = "Reference and relation between cmdb_ci_unix_cluster_node to cmdb_ci_unix_cluster"
comment = "Creating Reference and relation between cmdb_ci_unix_cluster_node to cmdb_ci_unix_cluster."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = relation_reference {
table1_name = "cmdb_ci_unix_cluster_node"
key1_name = "cluster_id"
table2_name = "cmdb_ci_unix_cluster"
key2_name = "cluster_id"
result_table_name = "cluster_node_unix_cluster"
unmatched_lines = remove
relation_type = "Cluster of::Cluster"
ref_direction = parentToChild
ref_field_name = "cluster"
}
on_false = nop {}
}
}
step {
name = "Reference and relation between cmdb_ci_unix_cluster_resource to cmdb_ci_unix_cluster"
comment = "Creating Reference and relation between cmdb_ci_unix_cluster_resource to cmdb_ci_unix_cluster."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = relation_reference {
table1_name = "cmdb_ci_unix_cluster_resource"
table2_name = "cmdb_ci_unix_cluster"
result_table_name = "cluster_resource_unix_cluster"
unmatched_lines = remove
condition = all {
eq {
get_attr {"cmdb_ci_unix_cluster_resource[].cluster_name"}
get_attr {"cmdb_ci_unix_cluster[].cluster_name"}
}
eq {
get_attr {"cmdb_ci_unix_cluster_resource[].cluster_id"}
get_attr {"cmdb_ci_unix_cluster[].cluster_id"}
}
}
relation_type = "Defines resources for::Gets resources from"
ref_direction = parentToChild
ref_field_name = "cluster"
}
on_false = nop {}
}
}
step {
name = "Relation between cmdb_ci_unix_cluster_resource to cmdb_ci_unix_cluster_node"
comment = "Creating Relation between cmdb_ci_unix_cluster_resource to cmdb_ci_unix_cluster_node."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = relation_reference {
table1_name = "cmdb_ci_unix_cluster_resource"
table2_name = "cmdb_ci_unix_cluster_node"
result_table_name = "cluster_resource_unix_cluster_node"
unmatched_lines = remove
condition = all {
eq {
get_attr {"cmdb_ci_unix_cluster_resource[].service_owner"}
get_attr {"cmdb_ci_unix_cluster_node[].node_name"}
}
eq {
get_attr {"cmdb_ci_unix_cluster_resource[].cluster_id"}
get_attr {"cmdb_ci_unix_cluster_node[].cluster_id"}
}
eq {
get_attr {"cmdb_ci_unix_cluster_resource[].cluster_name"}
get_attr {"cmdb_ci_unix_cluster_node[].cluster_name"}
}
}
relation_type = "Defines resources for::Gets resources from"
ref_direction = parentToChild
ref_field_name = ""
}
on_false = nop {}
}
}
step {
name = "Reference and relation between cmdb_ci_unix_cluster_node to cmdb_ci_linux_server"
comment = "Creating Reference and relation between cmdb_ci_unix_cluster_node to cmdb_ci_unix_server."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
is_not_empty {get_attr {"cmdb_ci_unix_cluster_node"}}
is_not_empty {get_attr {"cmdb_ci_linux_server"}}
}
on_true = relation_reference {
table1_name = "cmdb_ci_unix_cluster_node"
table2_name = "cmdb_ci_linux_server"
result_table_name = "cluster_node_unix_server"
unmatched_lines = remove
condition = any {
eq {
get_attr {"cmdb_ci_unix_cluster_node[].long_hostname"}
get_attr {"cmdb_ci_linux_server[].name"}
}
eq {
get_attr {"cmdb_ci_unix_cluster_node[].hostname_etc"}
get_attr {"cmdb_ci_linux_server[].name"}
}
eq {
get_attr {"cmdb_ci_unix_cluster_node[].node_name"}
get_attr {"cmdb_ci_linux_server[].name"}
}
}
relation_type = "Hosted on::Hosts"
ref_direction = parentToChild
ref_field_name = "server"
}
on_false = nop {}
}
}
step {
name = "Relation between cmdb_ci_unix_cluster to cmdb_ci_linux_server"
comment = "Creating Relation between cmdb_ci_unix_cluster to cmdb_ci_linux_server."
if {
condition = all {
eq {
get_attr {"isCluster"}
"true"
}
is_not_empty {get_attr {"cluster_conf"}}
is_not_empty {get_attr {"clustat_nodes_info_table"}}
}
on_true = relation_reference {
table1_name = "cmdb_ci_unix_cluster"
table2_name = "cmdb_ci_linux_server"
result_table_name = "cluster_unix_server"
unmatched_lines = remove
condition = is_not_empty {get_attr {"cmdb_ci_unix_cluster[].cluster_name"}}
relation_type = "Hosted on::Hosts"
ref_direction = parentToChild
ref_field_name = ""
}
on_false = nop {}
}
}
step {
name = " ________End of Linux Red Hat Cluster________"
comment = "This step is for label only to mention that we finished the Linux Red Hat Cluster library."
if {
condition = eq {
"1"
"2"
}
on_true = set_attr {
"blq"
"1"
}
on_false = nop {}
}
}
}
</ndl>
<parent display_value=""/>
<serverless>false</serverless>
<source/>
<sync_to_mid>true</sync_to_mid>
<sys_class_name>sa_pattern</sys_class_name>
<sys_created_by>admin</sys_created_by>
<sys_created_on>2018-01-08 08:02:52</sys_created_on>
<sys_customer_update>false</sys_customer_update>
<sys_domain>global</sys_domain>
<sys_domain_path>/</sys_domain_path>
<sys_id>c4eabd514fe3c3c0a9f9011f0310c730</sys_id>
<sys_mod_count>52</sys_mod_count>
<sys_name>Linux - Red Hat Cluster</sys_name>
<sys_overrides display_value=""/>
<sys_package display_value="Pattern Designer" source="com.snc.pattern.designer">79c934314f310300261de57d0210c70c</sys_package>
<sys_policy/>
<sys_replace display_value=""/>
<sys_replace_on_upgrade>false</sys_replace_on_upgrade>
<sys_scope display_value="Global">global</sys_scope>
<sys_update_name>sa_pattern_c4eabd514fe3c3c0a9f9011f0310c730</sys_update_name>
<sys_updated_by>admin</sys_updated_by>
<sys_updated_on>2020-10-09 05:36:19</sys_updated_on>
<version/>
</sa_pattern>
<sa_pattern action="INSERT_OR_UPDATE">
<active>true</active>
<ci_type>cmdb_ci_appl_generic</ci_type>
<cpattern_type>2</cpattern_type>
<description/>
<directory>false</directory>
<enforce_proc_classy>false</enforce_proc_classy>
<has_draft>false</has_draft>
<invoke_per_account>false</invoke_per_account>
<metadata_id>dbd4fd0813677e00d4013192e144b0b8</metadata_id>
<name>populate label from service name - Windows and Linux</name>
<ndl>library {
name = "populate label from service name - Windows and Linux"
id = "dbd4fd0813677e00d4013192e144b0b8"
description = "null"
step {
name = "get windows service name by tasklist command"
comment = "get windows service name by tasklist command."
if {
condition = eq {
get_attr {"computer_system.osFamily"}
"WINDOWS"
}
on_true = runcmd_to_var {
cmd = concat {
"tasklist /svc /fi \\" pid eq "
get_attr {"pid_info[1].pid"}
"\\" | findstr "
get_attr {"pid_info[1].pid"}
}
var_names = table {
name = "services"
col_names = "service_name"
}
parsing_strategy = regex_parsing {regex = "\\\\S+\\\\s+\\\\S*(.*\\\\S)"}
if_not_found_do = nop {}
cache_flag = 0
}
on_false = nop {}
}
}
step {
name = "populate label from service name - Windows"
comment = "populate label from service name - Windows"
if {
condition = all {
is_not_empty {get_attr {"services[1].service_name"}}
neq {
get_attr {"services[1].service_name"}
"N/A"
}
eq {
get_attr {"computer_system.osFamily"}
"Windows"
}
}
on_true = set_attr {
"name"
get_attr {"services[1].service_name"}
}
on_false = nop {}
}
}
step {
name = "populate label from request queue name - Windows"
comment = "populate label from request queue name - Windows"
if {
condition = all {
eq {
get_attr {"computer_system.osFamily"}
"Windows"
}
eq {
get_attr {"services[1].service_name"}
"N/A"
}
is_not_empty {get_attr {"request_queue_name"}}
}
on_true = set_attr {
"name"
get_attr {"request_queue_name"}
}
on_false = nop {}
}
}
step {
name = "populate label from service name - Linux"
comment = "populate label from service name - Linux"
if {
condition = all {
is_not_empty {get_attr {"linux_service_name"}}
eq {
get_attr {"computer_system.osFamily"}
"UNIX"
}
}
on_true = set_attr {
"name"
get_attr {"linux_service_name"}
}
on_false = nop {}
}
}
}
</ndl>
<parent display_value=""/>
<serverless>false</serverless>
<source/>
<sync_to_mid>true</sync_to_mid>
<sys_class_name>sa_pattern</sys_class_name>
<sys_created_by>bary.solomon</sys_created_by>
<sys_created_on>2017-06-19 14:13:02</sys_created_on>
<sys_customer_update>false</sys_customer_update>
<sys_domain>global</sys_domain>
<sys_domain_path>/</sys_domain_path>
<sys_id>dbd4fd0813677e00d4013192e144b0b8</sys_id>
<sys_mod_count>7</sys_mod_count>
<sys_name>populate label from service name - Windows and Linux</sys_name>
<sys_overrides display_value=""/>
<sys_package display_value="Pattern Designer" source="com.snc.pattern.designer">79c934314f310300261de57d0210c70c</sys_package>
<sys_policy/>
<sys_replace display_value=""/>
<sys_replace_on_upgrade>false</sys_replace_on_upgrade>
<sys_scope display_value="Global">global</sys_scope>
<sys_update_name>sa_pattern_dbd4fd0813677e00d4013192e144b0b8</sys_update_name>
<sys_updated_by>bary.solomon</sys_updated_by>
<sys_updated_on>2017-06-28 11:09:39</sys_updated_on>
<version/>
</sa_pattern>
<sa_pattern action="INSERT_OR_UPDATE">
<active>true</active>
<ci_type>cmdb_ci_appl_generic</ci_type>
<cpattern_type>2</cpattern_type>
<description/>
<directory>false</directory>
<enforce_proc_classy>false</enforce_proc_classy>
<has_draft>false</has_draft>
<invoke_per_account>false</invoke_per_account>
<metadata_id>dc334fe39f2032001d753758442e70b7</metadata_id>
<name>Linux - Memory Modules</name>
<ndl>library {
name = "Linux - Memory Modules"
id = "dc334fe39f2032001d753758442e70b7"
description = "null"
step {
name = "Get memory modules"
runcmd_to_var {
cmd = "sudo dmidecode -t 17 | cat"
var_names = table {
name = "mem_mod"
col_names = "Mod"
}
parsing_strategy = regex_parsing {regex = "^(.*)"}
if_not_found_do = nop {}
cache_flag = 0
}
}
step {
name = "translate GB to MB"
transform {
src_table_name = "mem_mod"
target_table_name = "mem_mod"
operation {set_field {
field_name = "Mod"
value = eval {"str = \\"\\"
if (\${mem_mod[].Mod}.startsWith('Size:') && \${mem_mod[].Mod}.endsWith('GB'))
{
str = \${mem_mod[].Mod}.split(' ')[1]
str = str.toInteger()
str = str * 1024
return \\"Size: \\"+str+\\" MB\\"
}
else
{return \${mem_mod[].Mod}}"}
}}
}
}
step {
name = "Filter modules"
filter {
src_table_name = "mem_mod"
target_table_name = "mem_mod"
condition = any {
contains {
get_attr {"mem_mod[].Mod"}
"Total Width"
}
contains {
get_attr {"mem_mod[].Mod"}
"Data Width"
}
contains {
get_attr {"mem_mod[].Mod"}
"Size"
}
contains {
get_attr {"mem_mod[].Mod"}
"Form Factor"
}
contains {
get_attr {"mem_mod[].Mod"}
"Locator"
}
contains {
get_attr {"mem_mod[].Mod"}
"Bank Locator"
}
contains {
get_attr {"mem_mod[].Mod"}
"Type"
}
contains {
get_attr {"mem_mod[].Mod"}
"Speed"
}
contains {
get_attr {"mem_mod[].Mod"}
"Serial Number"
}
contains {
get_attr {"mem_mod[].Mod"}
"Part Number"
}
}
}
}
step {
name = "Filter DMI"
filter {
src_table_name = "mem_mod"
target_table_name = "mem_mod"
condition = not_contains {
get_attr {"mem_mod[].Mod"}
"DMI"
}
}
}
step {
name = "Create new modules table"
union {
table1_name = "MModules"
table2_name = "MModules"
result_table_name = "MModules"
}
}
step {
name = "Fill modules table"
if {
condition = is_not_empty {get_attr {"mem_mod"}}
on_true = set_attr {
"dump_var"
eval {"javascript: rtrun = function() {
rtrn = \\"\\";
var table = \${mem_mod};
if (table.size() == 0 )
return;
var rowed = table.get(0);
var row = rowed.clone();
for (var i = 0; i < table.size(); i++)
{
var map = table.get(i);
var str = map.get(\\"Mod\\");
var parts = str.split(\\":\\");
var name = parts[0].trim();
var value = parts[1].trim();
if (name == \\"Total Width\\")
{
row.remove(\\"Mod\\");
row.put(\\"total_width\\",value.split(\\" \\")[0]);
}
if (name == \\"Data Width\\")
{
row.put(\\"data_width\\",value.split(\\" \\")[0]);
}
if (name == \\"Size\\")
{
row.put(\\"capacity\\",((value == \\"No Module Installed\\") ? null : value.split(\\" \\")[0]));
}
if (name == \\"Form Factor\\")
{
row.put(\\"form_factor\\",(value.startsWith(\\"FB-\\")) ? value.split(\\"-\\")[1] : value);
}
if (name == \\"Locator\\")
{
row.put(\\"device_locator\\",value);
row.put(\\"name\\",value);
}
if (name == \\"Bank Locator\\")
{
row.put(\\"bank_label\\",((value == \\"Not Specified\\") ? null : value));
}
if (name == \\"Type\\")
{
row.put(\\"type\\",value.split(\\" \\")[0]);
}
if (name == \\"Type Detail\\")
{
row.put(\\"type_detail\\",value);
}
if (name == \\"Speed\\")
{
row.put(\\"speed\\",((value == \\"Unknown\\") ? null : value.split(\\" \\")[0]));
}
if (name == \\"Serial Number\\")
{
row.put(\\"serial_number\\",value);
}
if (name == \\"Part Number\\")
{
row.put(\\"part_number\\",value);
\${MModules}.add(row);
row = rowed.clone();
}
}
rtrn = row;
return rtrn;
}();"}
}
on_false = nop {}
}
}
step {
name = "Filter modules"
filter {
src_table_name = "MModules"
target_table_name = "MModules"
condition = is_not_empty {get_attr {"MModules[].capacity"}}
}
}
step {
name = "Update cmdb_ci_memory_module"
transform {
src_table_name = "MModules"
target_table_name = "cmdb_ci_memory_module"
operation {set_field {
field_name = "total_width"
value = get_attr {"MModules[].total_width"}
}}
}
}
step {
name = "Ref/Rel between cmdb_ci_memory_module and Linux CI"
relation_reference {
table1_name = "cmdb_ci_linux_server"
table2_name = "cmdb_ci_memory_module"
result_table_name = "mem_to_linux"
unmatched_lines = remove
condition = eq {
"1"
"1"
}
relation_type = "Contains::Contained by"
ref_direction = childToParent
ref_field_name = "cmdb_ci"
}
}
}
</ndl>
<parent display_value=""/>
<serverless>false</serverless>
<source/>
<sync_to_mid>true</sync_to_mid>
<sys_class_name>sa_pattern</sys_class_name>
<sys_created_by>admin</sys_created_by>
<sys_created_on>2017-02-01 13:45:37</sys_created_on>
<sys_customer_update>false</sys_customer_update>
<sys_domain>global</sys_domain>
<sys_domain_path>/</sys_domain_path>
<sys_id>dc334fe39f2032001d753758442e70b7</sys_id>
<sys_mod_count>5</sys_mod_count>
<sys_name>Linux - Memory Modules</sys_name>
<sys_overrides display_value=""/>
<sys_package display_value="Pattern Designer" source="com.snc.pattern.designer">79c934314f310300261de57d0210c70c</sys_package>
<sys_policy/>
<sys_replace display_value=""/>
<sys_replace_on_upgrade>false</sys_replace_on_upgrade>
<sys_scope display_value="Global">global</sys_scope>
<sys_update_name>sa_pattern_dc334fe39f2032001d753758442e70b7</sys_update_name>
<sys_updated_by>admin</sys_updated_by>
<sys_updated_on>2019-11-06 12:21:26</sys_updated_on>
<version/>
</sa_pattern>
<sa_pattern action="INSERT_OR_UPDATE">
<active>true</active>
<ci_type>cmdb_ci_appl_generic</ci_type>
<cpattern_type>2</cpattern_type>
<description/>
<directory>false</directory>
<enforce_proc_classy>false</enforce_proc_classy>
<has_draft>false</has_draft>
<invoke_per_account>false</invoke_per_account>
<metadata_id>e69343279f2032001d753758442e7067</metadata_id>
<name>Linux - CPU</name>
<ndl>library {
name = "Linux - CPU"
id = "e69343279f2032001d753758442e7067"
description = "null"
step {
name = "Get CPU info"
runcmd_to_var {
cmd = "cat /proc/cpuinfo"
var_names = table {
name = "cpu_info"
col_names = "cpu_data"
}
parsing_strategy = regex_parsing {regex = "^(.*)"}
if_not_found_do = nop {}
cache_flag = 0
}
}
step {
name = "Get flags data"
runcmd_to_var {
cmd = "grep hypervisor /proc/cpuinfo "
var_names = "hasHyper"
parsing_strategy = regex_parsing {regex = ".*(hypervisor)"}
if_not_found_do = nop {}
cache_flag = 0
}
}
step {
name = "Check if is virtual"
set_attr {
"isVirtual"
eval {"javascript: rtrn =\\"\\";
var isReal = \${hasHyper};
if (isReal)
{
rtrn = true;
}
else
{
rtrn = false;
}
"}
}
}
step {
name = "Filter CPU data"
filter {
src_table_name = "cpu_info"
target_table_name = "cpu_info"
condition = any {
contains {
get_attr {"cpu_info[].cpu_data"}
"processor"
}
contains {
get_attr {"cpu_info[].cpu_data"}
"cpu MHz"
}
contains {
get_attr {"cpu_info[].cpu_data"}
"physical id"
}
contains {
get_attr {"cpu_info[].cpu_data"}
"core id"
}
contains {
get_attr {"cpu_info[].cpu_data"}
"cpu cores"
}
contains {
get_attr {"cpu_info[].cpu_data"}
"model name"
}
contains {
get_attr {"cpu_info[].cpu_data"}
"vendor_id"
}
}
}
}
step {
name = "Get thread core"
runcmd_to_var {
cmd = "lscpu"
var_names = "thread_core"
parsing_strategy = delimited_parsing {
include_lines_pattern = "Thread"
delimiters = " "
selected_positions = 4
}
if_not_found_do = nop {}
cache_flag = 0
}
}
step {
name = "Parse CPU data"
set_attr {
"cpu_data"
eval {"javascript: rtrn = \\"\\";
var table = \${cpu_info};
var physicalIds = {};
physicalIds.count = 0;
var coreIds = {};
coreIds.count = 0;
var cpu_cores = 0;
var physical_id_in_curr_block = '';
var result = {};
var processors = 0;
var threadCore = \${thread_core};
for (var i = 0; i < table.size(); i++)
{
var map = table.get(i);
var str = map.get(\\"cpu_data\\");
var parts = str.split(\\":\\");
if (parts.length < 2)
{
continue;
}
var name = parts[0].trim();
var value = parts[1].trim();
if (name == \\"processor\\")
{
processors++;
}
if (name == \\"cpu MHz\\")
{
var cpu_speed = parseInt(value);
result.cpu_speed = (cpu_speed != Number.NaN ? cpu_speed : \\"\\");
}
if (name == \\"physical id\\")
{
physical_id_in_curr_block = value;
if (!physicalIds[value])
{
physicalIds[value] = true;
physicalIds.count++;
}
}
if (name == \\"core id\\" && !coreIds[physical_id_in_curr_block + '.' + value])
{
coreIds[physical_id_in_curr_block + '.' + value] = true;
coreIds.count++;
}
if (name == \\"cpu cores\\")
{
cpu_cores = parseInt(value);
}
if (name == \\"model name\\")
{
result.cpu_name = value;
}
if (name == \\"vendor_id\\")
{
result.cpu_vendor = value;
}
}
var cpuCount = 1;
if (physicalIds.count > 0)
{
cpuCount = physicalIds.count;
result.hasPhysicalId = true;
}
else{
cpuCount = processors;
result.hasPhysicalId = false;
}
result.cpu_count = cpuCount;
var cpuCoreCount = 1;
if (coreIds.count > 0 || cpu_cores > 0)
{
if (cpu_cores > coreIds.count)
{
cpuCoreCount = cpu_cores;
}
else
{
cpuCoreCount = coreIds.count / cpuCount;
}
}
result.cpu_core_count = cpuCoreCount;
if (\${isVirtual} == true && !JSUtil.toBoolean(result.hasPhysicalId))
{
result.cpu_core_count = result.cpu_count;
result.cpu_count = 1;
}
if(threadCore != null){
result.cpu_core_thread = parseInt(threadCore);
}
result.processors = processors;
rtrn = JSON.stringify(result);"}
}
}
step {
name = "Extract CPU data"
parse_var_to_var {
from_var_name = "cpu_data"
to_var_names = table {
name = "cpu_parsed"
col_names = "cpu_vendor","cpu_name","cpu_speed","hasPhysical","cpu_count","cpu_core_count","cpu_core_thread","processors"
}
parsing_strategy = regex_parsing {regex = "\\"cpu_vendor\\":\\"(.*?)\\",\\"cpu_name\\":\\"(.*?)\\",\\"cpu_speed\\":(.*?),\\"hasPhysicalId\\":(.*?),\\"cpu_count\\":(\\\\d+),\\"cpu_core_count\\":(\\\\d+),\\"cpu_core_thread\\":(\\\\d+),\\"processors\\":(\\\\d+)"}
if_not_found_do = nop {}
}
}
step {
name = "Insert CPU data to cmdb_ci_linux_server"
transform {
src_table_name = "cmdb_ci_linux_server"
target_table_name = "cmdb_ci_linux_server"
operation {
set_field {
field_name = "cpu_speed"
value = get_attr {"cpu_parsed[1].cpu_speed"}
}
set_field {
field_name = "cpu_name"
value = get_attr {"cpu_parsed[1].cpu_name"}
}
set_field {
field_name = "cpu_count"
value = get_attr {"cpu_parsed[1].cpu_count"}
}
set_field {
field_name = "cpu_core_count"
value = get_attr {"cpu_parsed[1].cpu_core_count"}
}
set_field {
field_name = "cpu_core_thread"
value = get_attr {"cpu_parsed[1].cpu_core_thread"}
}
set_field {
field_name = "cpu_manufacturer"
value = get_attr {"cpu_parsed[1].cpu_vendor"}
}
set_field {
field_name = "cpu_type"
value = get_attr {"cpu_parsed[1].cpu_vendor"}
}
}
}
}
}
</ndl>
<parent display_value=""/>
<serverless>false</serverless>
<source/>
<sync_to_mid>true</sync_to_mid>
<sys_class_name>sa_pattern</sys_class_name>
<sys_created_by>oron.subayi</sys_created_by>
<sys_created_on>2017-02-01 13:47:25</sys_created_on>
<sys_customer_update>false</sys_customer_update>
<sys_domain>global</sys_domain>
<sys_domain_path>/</sys_domain_path>
<sys_id>e69343279f2032001d753758442e7067</sys_id>
<sys_mod_count>2</sys_mod_count>
<sys_name>Linux - CPU</sys_name>
<sys_overrides display_value=""/>
<sys_package display_value="Pattern Designer" source="com.snc.pattern.designer">79c934314f310300261de57d0210c70c</sys_package>
<sys_policy/>
<sys_replace display_value=""/>
<sys_replace_on_upgrade>false</sys_replace_on_upgrade>
<sys_scope display_value="Global">global</sys_scope>
<sys_update_name>sa_pattern_e69343279f2032001d753758442e7067</sys_update_name>
<sys_updated_by>admin</sys_updated_by>
<sys_updated_on>2020-06-21 20:41:03</sys_updated_on>
<version/>
</sa_pattern>
<sa_pattern action="INSERT_OR_UPDATE">
<active>true</active>
<ci_type>cmdb_ci_appl_generic</ci_type>
<cpattern_type>2</cpattern_type>
<description/>
<directory>false</directory>
<enforce_proc_classy>false</enforce_proc_classy>
<has_draft>false</has_draft>
<invoke_per_account>false</invoke_per_account>
<metadata_id>fe32c7e39f2032001d753758442e7065</metadata_id>
<name>Linux - Distribution</name>
<ndl>library {
name = "Linux - Distribution"
id = "fe32c7e39f2032001d753758442e7065"
description = "null"
step {
name = "Get distribution"
runcmd_to_var {
cmd = "cat /etc/*release | grep -v ID_LIKE"
var_names = "release_output"
parsing_strategy = delimited_parsing {
selected_positions = 1
}
if_not_found_do = nop {}
cache_flag = 0
}
}
step {
name = "Extract OS distribution"
set_attr {
"os_distribution"
eval {"javascript: var rtrn = \\"\\";
var rel = \${release_output};
var relStr = rel.toString();
var lowercaseOutput = relStr.toLowerCase();
if (lowercaseOutput.indexOf('oracle linux server') != -1)
{
rtrn = \\"Oracle Linux 4/5/6 (64-bit)\\";
}
else if (lowercaseOutput.indexOf('red hat') != -1)
{
rtrn = \\"Linux Red Hat\\";
}
else if (lowercaseOutput.indexOf('fedora') != -1)
{
rtrn = \\"Linux Fedora\\";
}
else if (lowercaseOutput.indexOf('suse') != -1)
{
rtrn = \\"Linux SuSE\\";
}
else if (lowercaseOutput.indexOf('centos') != -1)
{
rtrn = \\"Linux CentOS\\";
}
else if (lowercaseOutput.indexOf('ubuntu') != -1)
{
rtrn = \\"Linux Ubuntu\\";
}
else
{
rtrn = \\"GNU/Linux\\";
}"}
}
}
step {
name = "Extract distribution version"
set_attr {
"os_version"
eval {"javascript: var rtrn = \\"\\";
var rel = \${release_output};
var relStr = rel.toString();
var lowercaseOutput = relStr.toLowerCase();
var versionMatch = null;
if (lowercaseOutput.indexOf('red hat') != -1) {
versionMatch = /release ([0-9\\\\.]+)/.exec(lowercaseOutput.substring(lowercaseOutput.indexOf('red hat')));
}
else if (lowercaseOutput.indexOf('fedora') != -1) {
versionMatch = /release ([0-9\\\\.]+)/.exec(lowercaseOutput.substring(lowercaseOutput.indexOf('fedora')));
}
else if (lowercaseOutput.indexOf('suse') != -1) {
versionMatch = /version ?= ?([0-9\\\\.]+)/.exec(lowercaseOutput.substring(lowercaseOutput.indexOf('suse')));
}
else if (lowercaseOutput.indexOf('centos') != -1) {
versionMatch = /release ([0-9\\\\.]+)/.exec(lowercaseOutput.substring(lowercaseOutput.indexOf('centos')));
}
else if (lowercaseOutput.indexOf('ubuntu') != -1) {
versionMatch = /version=\\"([0-9\\\\.]+)/.exec(lowercaseOutput.substring(lowercaseOutput.indexOf('ubuntu')));
}
if (versionMatch != null)
rtrn = versionMatch[1];"}
}
}
step {
name = "Update OS on Linux CI"
set_attr {
"cmdb_ci_linux_server[*].os"
get_attr {"os_distribution"}
}
}
step {
name = "Update OS version on Linux CI"
if {
condition = all {
is_not_empty {get_attr {"os_version"}}
is_not_empty {get_attr {"cmdb_ci_linux_server[1].os_version"}}
}
on_true = set_attr {
"cmdb_ci_linux_server[*].os_version"
get_attr {"os_version"}
}
on_false = nop {}
}
}
}
</ndl>
<parent display_value=""/>
<serverless>false</serverless>
<source/>
<sync_to_mid>true</sync_to_mid>
<sys_class_name>sa_pattern</sys_class_name>
<sys_created_by>oron.subayi</sys_created_by>
<sys_created_on>2017-02-01 13:41:25</sys_created_on>
<sys_customer_update>false</sys_customer_update>
<sys_domain>global</sys_domain>
<sys_domain_path>/</sys_domain_path>
<sys_id>fe32c7e39f2032001d753758442e7065</sys_id>
<sys_mod_count>5</sys_mod_count>
<sys_name>Linux - Distribution</sys_name>
<sys_overrides display_value=""/>
<sys_package display_value="Pattern Designer" source="com.snc.pattern.designer">79c934314f310300261de57d0210c70c</sys_package>
<sys_policy/>
<sys_replace display_value=""/>
<sys_replace_on_upgrade>false</sys_replace_on_upgrade>
<sys_scope display_value="Global">global</sys_scope>
<sys_update_name>sa_pattern_fe32c7e39f2032001d753758442e7065</sys_update_name>
<sys_updated_by>admin</sys_updated_by>
<sys_updated_on>2020-04-09 07:36:54</sys_updated_on>
<version/>
</sa_pattern>
</unload>
`;
// Reset `lastIndex` if this regex is defined globally
// regex.lastIndex = 0;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for JavaScript, please visit: https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions