Jira (FACT-2772) Facter in puppet 6.18.0-1 fails to prevent external facts from calling facter recursively (FACT-1373)

42 views
Skip to first unread message

Boris (Jira)

unread,
Aug 25, 2020, 4:36:04 PM8/25/20
to puppe...@googlegroups.com
Boris created an issue
 
Facter / Bug FACT-2772
Facter in puppet 6.18.0-1 fails to prevent external facts from calling facter recursively (FACT-1373)
Issue Type: Bug Bug
Assignee: Unassigned
Created: 2020/08/25 1:35 PM
Priority: Normal Normal
Reporter: Boris

After updating puppet to verision 6.18.0-1, the following script, located in `opt/puppetlabs/facter/facts.d/` recurses into oblivion

 
#!/usr/bin/env ruby
require 'json'osfamily = %x(/opt/puppetlabs/bin/facter --no-external-facts os.family).strip
@data = {
packages: {}
}def parse_redhat
packagelist = %x(rpm qa --qf '%{NAME};%{VERSION}%{RELEASE}\n').split("\n")
packagelist.each do |package|
pname = package.split(';').first
version = package.split(';').last
@data[:packages][pname] = version.strip
end
end
def parse_debian
packagelist = %x(dpkg-query -W -f='${binary:Package};${Version}\n').split("\n")
packagelist.each do |package|
pname = package.split(';').first
version = package.split(';').last
@data[:packages][pname] = version.strip
end
endif osfamily == 'RedHat'
parse_redhat
end
if osfamily == 'Debian'
parse_debian
endputs @data.to_json
 

I created this ticket after I talked to the slack community puppet guy Josh (https://puppetcommunity.slack.com/archives/C0W298S9G/p1598386635326500)

"@kervyn facter 3.x (which is the default in puppet 6) has logic to prevent external facts from calling facter recursively (FACT-1373) but it seems that's not working as expected. Can you file a FACT ticket and link the 1373?"

Add Comment Add Comment
 
This message was sent by Atlassian Jira (v8.5.2#805002-sha1:a66f935)
Atlassian logo

Boris (Jira)

unread,
Aug 25, 2020, 4:38:04 PM8/25/20
to puppe...@googlegroups.com
Boris updated an issue
Change By: Boris
After updating puppet to verision 6.18.0-1, the following script, located in `opt/puppetlabs/facter/facts.d/` recurses into oblivion

 
{code:java}
#!/usr/bin/env ruby
require 'json'osfamily = %x(/opt/puppetlabs/bin/facter --no-
custom-fact --no- external-facts os.family).strip

@data = {
  packages: {}
}def parse_redhat
  packagelist = %x(rpm -qa --qf '% \ {NAME};% \ {VERSION}-% \ {RELEASE}\n').split("\n")

  packagelist.each do |package|
    pname   = package.split(';').first
    version = package.split(';').last
    @data[:packages][pname] = version.strip
  end
end
def parse_debian
  packagelist = %x(dpkg-query -W -f='${binary:Package};${Version}\n').split("\n")
  packagelist.each do |package|
    pname   = package.split(';').first
    version = package.split(';').last
    @data[:packages][pname] = version.strip
  end
endif osfamily == 'RedHat'
  parse_redhat
end
if osfamily == 'Debian'
  parse_debian
endputs @data.to_json
{code}

 

I created this ticket after I talked to the slack community puppet guy Josh ([https://puppetcommunity.slack.com/archives/C0W298S9G/p1598386635326500)]


"@kervyn facter 3.x (which is the default in puppet 6) has logic to prevent external facts from calling facter recursively (FACT-1373) but it seems that's not working as expected. Can you file a FACT ticket and link the 1373?"

Boris (Jira)

unread,
Aug 25, 2020, 4:39:03 PM8/25/20
to puppe...@googlegroups.com
Boris updated an issue
After updating puppet to verision 6.18.0-1, the following script, located in `opt/puppetlabs/facter/facts.d/` recurses into oblivion

 
{code:java}

#!/usr/bin/env ruby
require 'json'osfamily = %x(/opt/puppetlabs/bin/facter --no-custom-fact --no-external-facts os.family).strip
{quote} "@kervyn facter 3.x (which is the default in puppet 6) has logic to prevent external facts from calling facter recursively (FACT-1373) but it seems that's not working as expected. Can you file a FACT ticket and link the 1373?"
{quote}

Mihai Buzgau (Jira)

unread,
Aug 26, 2020, 3:58:03 AM8/26/20
to puppe...@googlegroups.com

Mihai Buzgau (Jira)

unread,
Aug 26, 2020, 3:58:04 AM8/26/20
to puppe...@googlegroups.com

Bogdan Irimie (Jira)

unread,
Nov 5, 2020, 3:51:05 AM11/5/20
to puppe...@googlegroups.com

Bogdan Irimie (Jira)

unread,
Nov 5, 2020, 3:51:06 AM11/5/20
to puppe...@googlegroups.com

Josh Cooper (Jira)

unread,
Jan 4, 2021, 1:23:03 PM1/4/21
to puppe...@googlegroups.com

Josh Cooper (Jira)

unread,
Jan 4, 2021, 1:23:04 PM1/4/21
to puppe...@googlegroups.com

Josh Cooper (Jira)

unread,
Jan 5, 2021, 1:12:02 PM1/5/21
to puppe...@googlegroups.com

Josh Cooper (Jira)

unread,
Jan 5, 2021, 1:12:04 PM1/5/21
to puppe...@googlegroups.com
Josh Cooper commented on Bug FACT-2772
 
Re: Facter in puppet 6.18.0-1 fails to prevent external facts from calling facter recursively (FACT-1373)

I missed that this is an issue in facter 3.x. It would be good to verify that facter 4.x also doesn't have this issue.

Ciprian Badescu (Jira)

unread,
Sep 23, 2021, 4:02:02 AM9/23/21
to puppe...@googlegroups.com
Ciprian Badescu updated an issue
 
Change By: Ciprian Badescu
Sprint: ready for triage
This message was sent by Atlassian Jira (v8.13.2#813002-sha1:c495a97)
Atlassian logo

Ciprian Badescu (Jira)

unread,
Oct 4, 2021, 4:04:02 AM10/4/21
to puppe...@googlegroups.com

Gabriel Nagy (Jira)

unread,
Oct 4, 2021, 6:43:03 AM10/4/21
to puppe...@googlegroups.com
Gabriel Nagy commented on Bug FACT-2772
 
Re: Facter in puppet 6.18.0-1 fails to prevent external facts from calling facter recursively (FACT-1373)

Boris I cannot reproduce this with the latest Facter 3. If I remove --no-external-facts from the facter call it shows a warning but still doesn't recurse:

Warning: Facter: external fact file "/opt/puppetlabs/facter/facts.d/fact.rb" had output on stderr: 2021-10-04 10:38:30.349709 WARN  puppetlabs.facter - external fact file "/opt/puppetlabs/facter/facts.d/fact.rb" had output on stderr: 2021-10-04 10:38:29.918306 WARN  puppetlabs.facter - Facter was called recursively, skipping external facts. Add '--no-external-facts' to silence this warning
Warning: Facter: external fact file "/opt/puppetlabs/facter/facts.d/fact.rb" had output on stderr: 2021-10-04 10:38:31.647756 WARN  puppetlabs.facter - external fact file "/opt/puppetlabs/facter/facts.d/fact.rb" had output on stderr: 2021-10-04 10:38:31.219910 WARN  puppetlabs.facter - Facter was called recursively, skipping external facts. Add '--no-external-facts' to silence this warning

Same with Facter 4. I tested this both with facter -p and puppet facts.

Ciprian Badescu (Jira)

unread,
Oct 7, 2021, 5:26:04 AM10/7/21
to puppe...@googlegroups.com

Josh Cooper (Jira)

unread,
Jan 9, 2023, 12:59:01 PM1/9/23
to puppe...@googlegroups.com
Josh Cooper updated an issue
Change By: Josh Cooper
After updating puppet to verision 6.18.0-1, the following script, located in ` / opt/puppetlabs/facter/facts.d/` recurses into oblivion
This message was sent by Atlassian Jira (v8.20.11#820011-sha1:0629dd8)
Atlassian logo

Josh Cooper (Jira)

unread,
Jan 9, 2023, 1:40:02 PM1/9/23
to puppe...@googlegroups.com
Josh Cooper updated an issue
After updating puppet to verision 6.18.0-1, the following script, located in `/opt/puppetlabs/facter/facts.d/` recurses into oblivion

 
{code:shell}

Josh Cooper (Jira)

unread,
Jan 9, 2023, 1:40:02 PM1/9/23
to puppe...@googlegroups.com
Josh Cooper updated an issue
After updating puppet to verision 6.18.0-1, the following script, located in `/opt/puppetlabs/facter/facts.d/` recurses into oblivion

 
{code: java shell }

Josh Cooper (Jira)

unread,
Jan 9, 2023, 1:42:01 PM1/9/23
to puppe...@googlegroups.com
Josh Cooper updated an issue
After updating puppet to verision 6.18.0-1, the following script, located in `/opt/puppetlabs/facter/facts.d/` recurses into oblivion

 
{ code:shell noformat }
#!/usr/bin/env ruby
require 'json'

osfamily = %x(/opt/puppetlabs/bin/facter --no-custom-fact --no-external-facts os.family).strip
@data = {
  packages: {}
}
def parse_redhat
  packagelist = %x(rpm -qa --qf '%{NAME};%{VERSION}-%{RELEASE}\n').split("\n")
  packagelist.each do |package|
    pname   = package.split(';').first
    version = package.split(';').last
    @data[:packages][pname] = version.strip
  end
end
def parse_debian
  packagelist = %x(dpkg-query -W -f='${binary:Package};${Version}\n').split("\n")
  packagelist.each do |package|
    pname   = package.split(';').first
    version = package.split(';').last
    @data[:packages][pname] = version.strip
  end
endif end
if
osfamily == 'RedHat'

  parse_redhat
end
if osfamily == 'Debian'
  parse_debian
endputs end
puts
@data.to_json
{
code noformat }

 

I created this ticket after I talked to the slack community puppet guy Josh ([https://puppetcommunity.slack.com/archives/C0W298S9G/p1598386635326500)]
{quote}"@kervyn facter 3.x (which is the default in puppet 6) has logic to prevent external facts from calling facter recursively (FACT-1373) but it seems that's not working as expected. Can you file a FACT ticket and link the 1373?"
{quote}

Josh Cooper (Jira)

unread,
Jan 9, 2023, 1:45:02 PM1/9/23
to puppe...@googlegroups.com
Josh Cooper updated an issue
After updating puppet to verision 6.18.0-1, the following script, located in `/opt/puppetlabs/facter/facts.d/` recurses into oblivion

 
{noformat}
#!/usr/bin/env ruby
require 'json'
osfamily = %x(/opt/puppetlabs/bin/facter --no-custom-
fact facts --no-external-facts os.family).strip

@data = {
  packages: {}
}
def parse_redhat
  packagelist = %x(rpm -qa --qf '%{NAME};%{VERSION}-%{RELEASE}\n').split("\n")
  packagelist.each do |package|
    pname   = package.split(';').first
    version = package.split(';').last
    @data[:packages][pname] = version.strip
  end
end
def parse_debian
  packagelist = %x(dpkg-query -W -f='${binary:Package};${Version}\n').split("\n")
  packagelist.each do |package|
    pname   = package.split(';').first
    version = package.split(';').last
    @data[:packages][pname] = version.strip
  end
end
if osfamily == 'RedHat'
  parse_redhat
end
if osfamily == 'Debian'
  parse_debian
end
puts @data.to_json
{noformat}

 

I created this ticket after I talked to the slack community puppet guy Josh ([https://puppetcommunity.slack.com/archives/C0W298S9G/p1598386635326500)]
{quote}"@kervyn facter 3.x (which is the default in puppet 6) has logic to prevent external facts from calling facter recursively (FACT-1373) but it seems that's not working as expected. Can you file a FACT ticket and link the 1373?"
{quote}

Josh Cooper (Jira)

unread,
Jan 9, 2023, 1:57:01 PM1/9/23
to puppe...@googlegroups.com
Josh Cooper commented on Bug FACT-2772
 
Re: Facter in puppet 6.18.0-1 fails to prevent external facts from calling facter recursively (FACT-1373)

Facter 3 correctly detects recursive invocations. It can be triggered by removing --no-custom-facts --no-external-facts from the external fact.

# facter --version
3.14.24 (commit 91ed8a2de5c9d686345859fe12ea2914415758f0)
 
# head -3 /opt/puppetlabs/facter/facts.d/fact.sh
#!/usr/bin/env ruby
require 'json'
osfamily = %x(/opt/puppetlabs/bin/facter os.family).strip
 
# puppet facts show packages
Warning: Facter: external fact file "/opt/puppetlabs/facter/facts.d/fact.sh" had output on stderr: 2023-01-09 18:48:52.300856 WARN  puppetlabs.facter - external fact file "/opt/puppetlabs/facter/facts.d/fact.sh" had output on stderr: 2023-01-09 18:48:51.842723 WARN  puppetlabs.facter - Facter was called recursively, skipping external facts. Add '--no-external-facts' to silence this warning

Facter 4 does not guard against recursion:

# facter --version
4.2.14
 
# head -3 /opt/puppetlabs/facter/facts.d/fact.sh 
#!/usr/bin/env ruby
require 'json'
osfamily = %x(/opt/puppetlabs/bin/facter os.family).strip
 
# strace -zfv -s 80 -e trace=execve -P /opt/puppetlabs/facter/facts.d/fact.sh -P /opt/puppetlabs/puppet/bin/ruby puppet facts show packages
strace: Process 20543 attached
[pid 20543] execve("/opt/puppetlabs/puppet/bin/ruby", ["/opt/puppetlabs/puppet/bin/ruby", "-e", " if ENV['LD_LIBRARY_PATH'];   print ENV['LD_LIBRARY_PATH'].split(':', -1).keep_i"...], ...
...
[pid 20546] execve("/opt/puppetlabs/facter/facts.d/fact.sh", ["/opt/puppetlabs/facter/facts.d/fact.sh"], ...
...
[pid 20552] execve("/opt/puppetlabs/puppet/bin/ruby", ["/opt/puppetlabs/puppet/bin/ruby", "-e", " if ENV['LD_LIBRARY_PATH'];   print ENV['LD_LIBRARY_PATH'].split(':', -1).keep_i"...], ...
...
[pid 20555] execve("/opt/puppetlabs/facter/facts.d/fact.sh", ["/opt/puppetlabs/facter/facts.d/fact.sh"], ...
...
[pid 20561] execve("/opt/puppetlabs/puppet/bin/ruby", ["/opt/puppetlabs/puppet/bin/ruby", "-e", " if ENV['LD_LIBRARY_PATH'];   print ENV['LD_LIBRARY_PATH'].split(':', -1).keep_i"...], ...

Josh Cooper (Jira)

unread,
Jan 9, 2023, 1:57:02 PM1/9/23
to puppe...@googlegroups.com

Josh Cooper (Jira)

unread,
Jan 9, 2023, 1:57:03 PM1/9/23
to puppe...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages