@@ -6,6 +6,9 @@ use warnings;
6
6
use English qw( -no_match_vars) ;
7
7
8
8
use FusionInventory::Agent::Tools;
9
+ use UNIVERSAL::require ;
10
+ use File::stat ;
11
+
9
12
10
13
sub isEnabled {
11
14
return -r getUuidFile();
@@ -42,19 +45,84 @@ sub doInventory {
42
45
# Get agent capabilities
43
46
my @agentCapabilities = _listAgentCapabilities();
44
47
48
+ my $customProperties = _getCustomProperties(logger => $logger );
49
+
45
50
my $rudder = {
46
51
HOSTNAME => $hostname ,
47
52
UUID => $Uuid ,
48
53
AGENT => \@agents ,
49
54
SERVER_ROLES => { SERVER_ROLE => \@serverRoles },
50
55
AGENT_CAPABILITIES => { AGENT_CAPABILITY => \@agentCapabilities },
56
+ CUSTOM_PROPERTIES => $customProperties ,
51
57
};
52
58
53
59
$inventory -> addEntry(
54
60
section => ' RUDDER' , entry => $rudder
55
61
);
56
62
}
57
63
64
+ sub _getCustomProperties {
65
+ my (%params ) = @_ ;
66
+ my $logger = $params {logger };
67
+
68
+ my $custom_properties_dir = ($OSNAME eq ' MSWin32' ) ? ' C:\Program Files\Rudder\hooks.d' : ' /var/rudder/hooks.d' ;
69
+ my $custom_properties ;
70
+ if (-d " $custom_properties_dir " ) {
71
+ my @custom_properties_list = ();
72
+ my @ordered_script_list = ();
73
+ opendir (DIR, $custom_properties_dir );
74
+ # List each file in the custom_properties directory, each files being a script
75
+ @ordered_script_list = sort readdir (DIR);
76
+ closedir (DIR);
77
+ while (my $file = shift @ordered_script_list ) {
78
+ my $script_file = $custom_properties_dir . " /" . $file ;
79
+ if (-f $script_file ) {
80
+ next if ($file =~ m / ^\. / );
81
+ # Ignore non-executable file, or folders
82
+ next unless -x $script_file ;
83
+
84
+ # Check that the file is not world writable
85
+ my $permissions = stat ($script_file );
86
+ my $retMode = $permissions -> mode;
87
+ $retMode = $retMode & 0777;
88
+ if (($retMode & 002) || ($retMode & 020)) {
89
+ $logger -> error(" Skipping script $script_file as it is world or group writable" ) if $logger ;
90
+ next ;
91
+ }
92
+
93
+ $logger -> debug2(" executiong $script_file " ) if $logger ;
94
+ my $properties = qx( $script_file ) ;
95
+ my $exit_code = $? >> 8;
96
+ if ($exit_code > 0) {
97
+ $logger -> error(" Script $script_file failed to run properly, with exit code $exit_code " ) if $logger ;
98
+ next ;
99
+ }
100
+
101
+ # check that it is valid JSON
102
+ eval {
103
+ my $package = " JSON::PP" ;
104
+ $package -> require();
105
+ if ($EVAL_ERROR ) {
106
+ print STDERR
107
+ " Failed to load JSON module: ($EVAL_ERROR )\n " ;
108
+ next ;
109
+ }
110
+ my $coder = JSON::PP-> new;
111
+ my $propertiesData = $coder -> decode($properties );
112
+ push @custom_properties_list , $coder -> encode($propertiesData );
113
+ };
114
+ if ($@ ) {
115
+ $logger -> error(" Script $script_file didn't return valid JSON entry, error is:$@ " ) if $logger ;
116
+ }
117
+ }
118
+
119
+ }
120
+ $custom_properties = " [" . join (" ," , @custom_properties_list ) . " ]" ;
121
+ }
122
+ return $custom_properties ;
123
+ }
124
+
125
+
58
126
sub _listServerRoles {
59
127
my $server_roles_dir = ($OSNAME eq ' MSWin32' ) ? ' C:\Program Files\Rudder\etc\server-roles.d' : ' /opt/rudder/etc/server-roles.d' ;
60
128
my @server_roles ;
0 commit comments