Skip to content

Commit

Permalink
Fix save_to_file to be indentation independent
Browse files Browse the repository at this point in the history
  • Loading branch information
ShimShtein committed Aug 22, 2024
1 parent 44160c0 commit 100eece
Show file tree
Hide file tree
Showing 15 changed files with 175 additions and 158 deletions.
14 changes: 10 additions & 4 deletions app/services/foreman/renderer/scope/macros/base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -117,15 +117,21 @@ def pxe_kernel_options
example "save_to_file(shell_escape('/tmp/a file with spaces'), nil) # => 'cp /dev/null /tmp/a\ file\ with\ spaces'"
end
def save_to_file(filename, content, verbatim: false)
delimiter = 'EOF-' + Digest::SHA512.hexdigest(filename)[0..7]
if content.empty?
"cp /dev/null #{filename}"
elsif verbatim
content = Base64.encode64(content)
"cat << #{delimiter} | base64 -d > #{filename}\n#{content}#{delimiter}"
# since content is a base64 string we don't need to escape it
"echo #{content} | base64 -d > #{filename}"
else
content += "\n" unless content.end_with?("\n")
"cat << #{delimiter} > #{filename}\n#{content}#{delimiter}"
content_echos = content.split("\n").map do |content_line|
# to make sure there the substitutions are working, have the bash script
# handle all special characters except double quotes.
"echo \"#{content_line.gsub('"', '\"')}\" >> #{filename}"
end.join("\n")

# prefix the append commands with a cleanup command
"> #{filename}\n#{content_echos}"
end
end

Expand Down
5 changes: 5 additions & 0 deletions test/static_fixtures/script.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#!/bin/sh

echo "Calling Ansible AWX/Tower provisioning callback..."
/usr/bin/curl -v -k -s --data "host_config_key=" https:///api/v2/job_templates//callback/
echo "DONE"
18 changes: 18 additions & 0 deletions test/unit/foreman/renderer/scope/macros/base_test.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
require 'test_helper'
require 'tempfile'

class BaseMacrosTest < ActiveSupport::TestCase
setup do
Expand Down Expand Up @@ -265,5 +266,22 @@ class BaseMacrosTest < ActiveSupport::TestCase
command = @scope.save_to_file('/tmp/ifcfg-$sanitized_real', nil)
assert_equal command, 'cp /dev/null /tmp/ifcfg-$sanitized_real'
end

test "Should create a correct script even when indented" do
tmp_file = Tempfile.new('save_to_file')
tmp_file.close

file_content = File.read(Rails.root.join('test', 'static_fixtures', 'script.txt'))

command = @scope.indent(2) { @scope.save_to_file(tmp_file.path, file_content) }

exec(command)

actual = exec("cat #{tmp_file.path}")

assert_equal file_content, actual
ensure
tmp_file.unlink
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -186,13 +186,12 @@ echo "Performing initial puppet run for --tags no_such_tag"



cat << EOF-9f037ba1 > /root/ansible_provisioning_call.sh
#!/bin/sh

echo "Calling Ansible AWX/Tower provisioning callback..."
/usr/bin/curl -v -k -s --data "host_config_key=" https:///api/v2/job_templates//callback/
echo "DONE"
EOF-9f037ba1
> /root/ansible_provisioning_call.sh
echo "#!/bin/sh" >> /root/ansible_provisioning_call.sh
echo "" >> /root/ansible_provisioning_call.sh
echo "echo \"Calling Ansible AWX/Tower provisioning callback...\"" >> /root/ansible_provisioning_call.sh
echo "/usr/bin/curl -v -k -s --data \"host_config_key=\" https:///api/v2/job_templates//callback/" >> /root/ansible_provisioning_call.sh
echo "echo \"DONE\"" >> /root/ansible_provisioning_call.sh
chmod +x /root/ansible_provisioning_call.sh
/root/ansible_provisioning_call.sh

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,20 +56,19 @@ allow-hotplug $real
iface $real inet dhcp
EOF

cat << EOF-2929810d > /etc/systemd/system/ansible-callback.service
[Unit]
Description=Provisioning callback to Ansible Tower
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/bin/curl -k -s --data "host_config_key=" https:///api/v2/job_templates//callback/
ExecStartPost=/usr/bin/systemctl disable ansible-callback

[Install]
WantedBy=multi-user.target
EOF-2929810d
> /etc/systemd/system/ansible-callback.service
echo "[Unit]" >> /etc/systemd/system/ansible-callback.service
echo "Description=Provisioning callback to Ansible Tower" >> /etc/systemd/system/ansible-callback.service
echo "Wants=network-online.target" >> /etc/systemd/system/ansible-callback.service
echo "After=network-online.target" >> /etc/systemd/system/ansible-callback.service
echo "" >> /etc/systemd/system/ansible-callback.service
echo "[Service]" >> /etc/systemd/system/ansible-callback.service
echo "Type=oneshot" >> /etc/systemd/system/ansible-callback.service
echo "ExecStart=/usr/bin/curl -k -s --data \"host_config_key=\" https:///api/v2/job_templates//callback/" >> /etc/systemd/system/ansible-callback.service
echo "ExecStartPost=/usr/bin/systemctl disable ansible-callback" >> /etc/systemd/system/ansible-callback.service
echo "" >> /etc/systemd/system/ansible-callback.service
echo "[Install]" >> /etc/systemd/system/ansible-callback.service
echo "WantedBy=multi-user.target" >> /etc/systemd/system/ansible-callback.service
# Runs during first boot, removes itself
systemctl enable ansible-callback
if [ -x /usr/bin/curl ]; then
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,20 +56,19 @@ allow-hotplug $real
iface $real inet dhcp
EOF

cat << EOF-2929810d > /etc/systemd/system/ansible-callback.service
[Unit]
Description=Provisioning callback to Ansible Tower
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/bin/curl -k -s --data "host_config_key=" https:///api/v2/job_templates//callback/
ExecStartPost=/usr/bin/systemctl disable ansible-callback

[Install]
WantedBy=multi-user.target
EOF-2929810d
> /etc/systemd/system/ansible-callback.service
echo "[Unit]" >> /etc/systemd/system/ansible-callback.service
echo "Description=Provisioning callback to Ansible Tower" >> /etc/systemd/system/ansible-callback.service
echo "Wants=network-online.target" >> /etc/systemd/system/ansible-callback.service
echo "After=network-online.target" >> /etc/systemd/system/ansible-callback.service
echo "" >> /etc/systemd/system/ansible-callback.service
echo "[Service]" >> /etc/systemd/system/ansible-callback.service
echo "Type=oneshot" >> /etc/systemd/system/ansible-callback.service
echo "ExecStart=/usr/bin/curl -k -s --data \"host_config_key=\" https:///api/v2/job_templates//callback/" >> /etc/systemd/system/ansible-callback.service
echo "ExecStartPost=/usr/bin/systemctl disable ansible-callback" >> /etc/systemd/system/ansible-callback.service
echo "" >> /etc/systemd/system/ansible-callback.service
echo "[Install]" >> /etc/systemd/system/ansible-callback.service
echo "WantedBy=multi-user.target" >> /etc/systemd/system/ansible-callback.service
# Runs during first boot, removes itself
systemctl enable ansible-callback
if [ -x /usr/bin/curl ]; then
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -249,20 +249,19 @@ echo "Performing initial puppet run for --tags no_such_tag"



cat << EOF-2929810d > /etc/systemd/system/ansible-callback.service
[Unit]
Description=Provisioning callback to Ansible Tower
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/bin/curl -k -s --data "host_config_key=" https:///api/v2/job_templates//callback/
ExecStartPost=/usr/bin/systemctl disable ansible-callback

[Install]
WantedBy=multi-user.target
EOF-2929810d
> /etc/systemd/system/ansible-callback.service
echo "[Unit]" >> /etc/systemd/system/ansible-callback.service
echo "Description=Provisioning callback to Ansible Tower" >> /etc/systemd/system/ansible-callback.service
echo "Wants=network-online.target" >> /etc/systemd/system/ansible-callback.service
echo "After=network-online.target" >> /etc/systemd/system/ansible-callback.service
echo "" >> /etc/systemd/system/ansible-callback.service
echo "[Service]" >> /etc/systemd/system/ansible-callback.service
echo "Type=oneshot" >> /etc/systemd/system/ansible-callback.service
echo "ExecStart=/usr/bin/curl -k -s --data \"host_config_key=\" https:///api/v2/job_templates//callback/" >> /etc/systemd/system/ansible-callback.service
echo "ExecStartPost=/usr/bin/systemctl disable ansible-callback" >> /etc/systemd/system/ansible-callback.service
echo "" >> /etc/systemd/system/ansible-callback.service
echo "[Install]" >> /etc/systemd/system/ansible-callback.service
echo "WantedBy=multi-user.target" >> /etc/systemd/system/ansible-callback.service
# Runs during first boot, removes itself
systemctl enable ansible-callback

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -249,20 +249,19 @@ echo "Performing initial puppet run for --tags no_such_tag"



cat << EOF-2929810d > /etc/systemd/system/ansible-callback.service
[Unit]
Description=Provisioning callback to Ansible Tower
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/bin/curl -k -s --data "host_config_key=" https:///api/v2/job_templates//callback/
ExecStartPost=/usr/bin/systemctl disable ansible-callback

[Install]
WantedBy=multi-user.target
EOF-2929810d
> /etc/systemd/system/ansible-callback.service
echo "[Unit]" >> /etc/systemd/system/ansible-callback.service
echo "Description=Provisioning callback to Ansible Tower" >> /etc/systemd/system/ansible-callback.service
echo "Wants=network-online.target" >> /etc/systemd/system/ansible-callback.service
echo "After=network-online.target" >> /etc/systemd/system/ansible-callback.service
echo "" >> /etc/systemd/system/ansible-callback.service
echo "[Service]" >> /etc/systemd/system/ansible-callback.service
echo "Type=oneshot" >> /etc/systemd/system/ansible-callback.service
echo "ExecStart=/usr/bin/curl -k -s --data \"host_config_key=\" https:///api/v2/job_templates//callback/" >> /etc/systemd/system/ansible-callback.service
echo "ExecStartPost=/usr/bin/systemctl disable ansible-callback" >> /etc/systemd/system/ansible-callback.service
echo "" >> /etc/systemd/system/ansible-callback.service
echo "[Install]" >> /etc/systemd/system/ansible-callback.service
echo "WantedBy=multi-user.target" >> /etc/systemd/system/ansible-callback.service
# Runs during first boot, removes itself
systemctl enable ansible-callback

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -249,20 +249,19 @@ echo "Performing initial puppet run for --tags no_such_tag"



cat << EOF-2929810d > /etc/systemd/system/ansible-callback.service
[Unit]
Description=Provisioning callback to Ansible Tower
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/bin/curl -k -s --data "host_config_key=" https:///api/v2/job_templates//callback/
ExecStartPost=/usr/bin/systemctl disable ansible-callback

[Install]
WantedBy=multi-user.target
EOF-2929810d
> /etc/systemd/system/ansible-callback.service
echo "[Unit]" >> /etc/systemd/system/ansible-callback.service
echo "Description=Provisioning callback to Ansible Tower" >> /etc/systemd/system/ansible-callback.service
echo "Wants=network-online.target" >> /etc/systemd/system/ansible-callback.service
echo "After=network-online.target" >> /etc/systemd/system/ansible-callback.service
echo "" >> /etc/systemd/system/ansible-callback.service
echo "[Service]" >> /etc/systemd/system/ansible-callback.service
echo "Type=oneshot" >> /etc/systemd/system/ansible-callback.service
echo "ExecStart=/usr/bin/curl -k -s --data \"host_config_key=\" https:///api/v2/job_templates//callback/" >> /etc/systemd/system/ansible-callback.service
echo "ExecStartPost=/usr/bin/systemctl disable ansible-callback" >> /etc/systemd/system/ansible-callback.service
echo "" >> /etc/systemd/system/ansible-callback.service
echo "[Install]" >> /etc/systemd/system/ansible-callback.service
echo "WantedBy=multi-user.target" >> /etc/systemd/system/ansible-callback.service
# Runs during first boot, removes itself
systemctl enable ansible-callback

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -249,20 +249,19 @@ echo "Performing initial puppet run for --tags no_such_tag"



cat << EOF-2929810d > /etc/systemd/system/ansible-callback.service
[Unit]
Description=Provisioning callback to Ansible Tower
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/bin/curl -k -s --data "host_config_key=" https:///api/v2/job_templates//callback/
ExecStartPost=/usr/bin/systemctl disable ansible-callback

[Install]
WantedBy=multi-user.target
EOF-2929810d
> /etc/systemd/system/ansible-callback.service
echo "[Unit]" >> /etc/systemd/system/ansible-callback.service
echo "Description=Provisioning callback to Ansible Tower" >> /etc/systemd/system/ansible-callback.service
echo "Wants=network-online.target" >> /etc/systemd/system/ansible-callback.service
echo "After=network-online.target" >> /etc/systemd/system/ansible-callback.service
echo "" >> /etc/systemd/system/ansible-callback.service
echo "[Service]" >> /etc/systemd/system/ansible-callback.service
echo "Type=oneshot" >> /etc/systemd/system/ansible-callback.service
echo "ExecStart=/usr/bin/curl -k -s --data \"host_config_key=\" https:///api/v2/job_templates//callback/" >> /etc/systemd/system/ansible-callback.service
echo "ExecStartPost=/usr/bin/systemctl disable ansible-callback" >> /etc/systemd/system/ansible-callback.service
echo "" >> /etc/systemd/system/ansible-callback.service
echo "[Install]" >> /etc/systemd/system/ansible-callback.service
echo "WantedBy=multi-user.target" >> /etc/systemd/system/ansible-callback.service
# Runs during first boot, removes itself
systemctl enable ansible-callback

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -249,20 +249,19 @@ echo "Performing initial puppet run for --tags no_such_tag"



cat << EOF-2929810d > /etc/systemd/system/ansible-callback.service
[Unit]
Description=Provisioning callback to Ansible Tower
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/bin/curl -k -s --data "host_config_key=" https:///api/v2/job_templates//callback/
ExecStartPost=/usr/bin/systemctl disable ansible-callback

[Install]
WantedBy=multi-user.target
EOF-2929810d
> /etc/systemd/system/ansible-callback.service
echo "[Unit]" >> /etc/systemd/system/ansible-callback.service
echo "Description=Provisioning callback to Ansible Tower" >> /etc/systemd/system/ansible-callback.service
echo "Wants=network-online.target" >> /etc/systemd/system/ansible-callback.service
echo "After=network-online.target" >> /etc/systemd/system/ansible-callback.service
echo "" >> /etc/systemd/system/ansible-callback.service
echo "[Service]" >> /etc/systemd/system/ansible-callback.service
echo "Type=oneshot" >> /etc/systemd/system/ansible-callback.service
echo "ExecStart=/usr/bin/curl -k -s --data \"host_config_key=\" https:///api/v2/job_templates//callback/" >> /etc/systemd/system/ansible-callback.service
echo "ExecStartPost=/usr/bin/systemctl disable ansible-callback" >> /etc/systemd/system/ansible-callback.service
echo "" >> /etc/systemd/system/ansible-callback.service
echo "[Install]" >> /etc/systemd/system/ansible-callback.service
echo "WantedBy=multi-user.target" >> /etc/systemd/system/ansible-callback.service
# Runs during first boot, removes itself
systemctl enable ansible-callback

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,20 +130,19 @@ echo "Performing initial puppet run for --tags no_such_tag"



cat << EOF-2929810d > /etc/systemd/system/ansible-callback.service
[Unit]
Description=Provisioning callback to Ansible Tower
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/bin/curl -k -s --data "host_config_key=" https:///api/v2/job_templates//callback/
ExecStartPost=/usr/bin/systemctl disable ansible-callback

[Install]
WantedBy=multi-user.target
EOF-2929810d
> /etc/systemd/system/ansible-callback.service
echo "[Unit]" >> /etc/systemd/system/ansible-callback.service
echo "Description=Provisioning callback to Ansible Tower" >> /etc/systemd/system/ansible-callback.service
echo "Wants=network-online.target" >> /etc/systemd/system/ansible-callback.service
echo "After=network-online.target" >> /etc/systemd/system/ansible-callback.service
echo "" >> /etc/systemd/system/ansible-callback.service
echo "[Service]" >> /etc/systemd/system/ansible-callback.service
echo "Type=oneshot" >> /etc/systemd/system/ansible-callback.service
echo "ExecStart=/usr/bin/curl -k -s --data \"host_config_key=\" https:///api/v2/job_templates//callback/" >> /etc/systemd/system/ansible-callback.service
echo "ExecStartPost=/usr/bin/systemctl disable ansible-callback" >> /etc/systemd/system/ansible-callback.service
echo "" >> /etc/systemd/system/ansible-callback.service
echo "[Install]" >> /etc/systemd/system/ansible-callback.service
echo "WantedBy=multi-user.target" >> /etc/systemd/system/ansible-callback.service
# Runs during first boot, removes itself
systemctl enable ansible-callback

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -247,20 +247,19 @@ echo "Performing initial puppet run for --tags no_such_tag"



cat << EOF-2929810d > /etc/systemd/system/ansible-callback.service
[Unit]
Description=Provisioning callback to Ansible Tower
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/bin/curl -k -s --data "host_config_key=" https:///api/v2/job_templates//callback/
ExecStartPost=/usr/bin/systemctl disable ansible-callback

[Install]
WantedBy=multi-user.target
EOF-2929810d
> /etc/systemd/system/ansible-callback.service
echo "[Unit]" >> /etc/systemd/system/ansible-callback.service
echo "Description=Provisioning callback to Ansible Tower" >> /etc/systemd/system/ansible-callback.service
echo "Wants=network-online.target" >> /etc/systemd/system/ansible-callback.service
echo "After=network-online.target" >> /etc/systemd/system/ansible-callback.service
echo "" >> /etc/systemd/system/ansible-callback.service
echo "[Service]" >> /etc/systemd/system/ansible-callback.service
echo "Type=oneshot" >> /etc/systemd/system/ansible-callback.service
echo "ExecStart=/usr/bin/curl -k -s --data \"host_config_key=\" https:///api/v2/job_templates//callback/" >> /etc/systemd/system/ansible-callback.service
echo "ExecStartPost=/usr/bin/systemctl disable ansible-callback" >> /etc/systemd/system/ansible-callback.service
echo "" >> /etc/systemd/system/ansible-callback.service
echo "[Install]" >> /etc/systemd/system/ansible-callback.service
echo "WantedBy=multi-user.target" >> /etc/systemd/system/ansible-callback.service
# Runs during first boot, removes itself
systemctl enable ansible-callback

Expand Down
Loading

0 comments on commit 100eece

Please sign in to comment.