@@ -30,7 +30,17 @@ def self.get_version_info(exe)
3030 resolved = Facter . which ( 'sensuctl' )
3131 exe_path = resolved unless resolved . nil?
3232 end
33- version_output = Facter ::Core ::Execution . execute ( "#{ exe_path } version" )
33+
34+ # Check if executable exists and is executable
35+ return version_info unless exe_path && File . executable? ( exe_path )
36+
37+ # Add timeout and better error handling
38+ version_output = Facter ::Core ::Execution . execute ( "#{ exe_path } version" , timeout : 10 )
39+
40+ # Debug output for troubleshooting
41+ if version_output . nil? || version_output . empty?
42+ return version_info
43+ end
3444 case exe
3545 when 'sensu-backend' , '/bin/sensu-backend'
3646 if ( m = version_output . match ( /sensu-backend version\s +([0-9]+(?:\. [0-9]+)*)/ ) )
@@ -73,7 +83,37 @@ def self.add_agent_facts
7383 Facter . add ( :sensu_agent_version ) do
7484 setcode do
7585 exe = Facter . which ( 'sensu-agent' ) || 'sensu-agent'
76- Facter . get_version_info ( exe ) [ 'sensu_agent_version' ]
86+ # Retry up to 5 times with 2 second delay
87+ retries = 0
88+ begin
89+ # Check if executable exists first
90+ return '' unless exe && File . executable? ( exe )
91+
92+ result = Facter . get_version_info ( exe ) [ 'sensu_agent_version' ]
93+ if result && !result . empty?
94+ result
95+ else
96+ # Try direct execution as fallback
97+ begin
98+ output = Facter ::Core ::Execution . execute ( "#{ exe } version" , timeout : 10 )
99+ if output && ( m = output . match ( /sensu-agent version\s +([0-9]+(?:\. [0-9]+)*)/ ) )
100+ m [ 1 ]
101+ else
102+ ''
103+ end
104+ rescue StandardError
105+ ''
106+ end
107+ end
108+ rescue StandardError
109+ retries += 1
110+ if retries < 5
111+ sleep ( 2 )
112+ retry
113+ else
114+ ''
115+ end
116+ end
77117 end
78118 end
79119 end
@@ -82,13 +122,81 @@ def self.add_backend_facts
82122 Facter . add ( :sensu_backend_version ) do
83123 setcode do
84124 exe = Facter . which ( 'sensu-backend' )
85- exe . nil? ? nil : Facter . get_version_info ( exe ) [ 'sensu_backend_version' ]
125+ if exe . nil?
126+ ''
127+ else
128+ # Retry up to 5 times with 2 second delay
129+ retries = 0
130+ begin
131+ # Check if executable exists first
132+ return '' unless File . executable? ( exe )
133+
134+ result = Facter . get_version_info ( exe ) [ 'sensu_backend_version' ]
135+ if result && !result . empty?
136+ result
137+ else
138+ # Try direct execution as fallback
139+ begin
140+ output = Facter ::Core ::Execution . execute ( "#{ exe } version" , timeout : 10 )
141+ if output && ( m = output . match ( /sensu-backend version\s +([0-9]+(?:\. [0-9]+)*)/ ) )
142+ m [ 1 ]
143+ else
144+ ''
145+ end
146+ rescue StandardError
147+ ''
148+ end
149+ end
150+ rescue StandardError
151+ retries += 1
152+ if retries < 5
153+ sleep ( 2 )
154+ retry
155+ else
156+ ''
157+ end
158+ end
159+ end
86160 end
87161 end
88162 Facter . add ( :sensu_backend_etcd_version ) do
89163 setcode do
90164 exe = Facter . which ( 'sensu-backend' )
91- exe . nil? ? nil : Facter . get_version_info ( exe ) [ 'sensu_backend_etcd_version' ]
165+ if exe . nil?
166+ ''
167+ else
168+ # Retry up to 5 times with 2 second delay
169+ retries = 0
170+ begin
171+ # Check if executable exists first
172+ return '' unless File . executable? ( exe )
173+
174+ result = Facter . get_version_info ( exe ) [ 'sensu_backend_etcd_version' ]
175+ if result && !result . empty?
176+ result
177+ else
178+ # Try direct execution as fallback
179+ begin
180+ output = Facter ::Core ::Execution . execute ( "#{ exe } version" , timeout : 10 )
181+ if output && ( m = output . match ( /etcd version\s +([0-9]+(?:\. [0-9]+)*)/ ) )
182+ m [ 1 ]
183+ else
184+ ''
185+ end
186+ rescue StandardError
187+ ''
188+ end
189+ end
190+ rescue StandardError
191+ retries += 1
192+ if retries < 5
193+ sleep ( 2 )
194+ retry
195+ else
196+ ''
197+ end
198+ end
199+ end
92200 end
93201 end
94202 end
@@ -97,7 +205,41 @@ def self.add_sensuctl_facts
97205 Facter . add ( :sensuctl_version ) do
98206 setcode do
99207 exe = Facter . which ( 'sensuctl' )
100- exe . nil? ? nil : Facter . get_version_info ( exe ) [ 'sensuctl_version' ]
208+ if exe . nil?
209+ ''
210+ else
211+ # Retry up to 5 times with 2 second delay
212+ retries = 0
213+ begin
214+ # Check if executable exists first
215+ return '' unless File . executable? ( exe )
216+
217+ result = Facter . get_version_info ( exe ) [ 'sensuctl_version' ]
218+ if result && !result . empty?
219+ result
220+ else
221+ # Try direct execution as fallback
222+ begin
223+ output = Facter ::Core ::Execution . execute ( "#{ exe } version" , timeout : 10 )
224+ if output && ( m = output . match ( /sensuctl version\s +([0-9]+(?:\. [0-9]+)*)/ ) )
225+ m [ 1 ]
226+ else
227+ ''
228+ end
229+ rescue StandardError
230+ ''
231+ end
232+ end
233+ rescue StandardError
234+ retries += 1
235+ if retries < 5
236+ sleep ( 2 )
237+ retry
238+ else
239+ ''
240+ end
241+ end
242+ end
101243 end
102244 end
103245 end
0 commit comments