Filenames with backslashes causes a fatal error for Rex::Commands::Sync
Nobody has claimed this yet.
- Dominant language
- Perl
- Stars
- 737
- Forks
- 214
- PR merge metrics
- No merged PRs in 30d
Description
Describe the bug
Rex terminates with errors (the error varies based on where it is thrown) if dealing with a filename containing backslashes.
Example:
[2023-09-20 11:16:14] INFO - Running task systemd on host
[2023-09-20 11:17:18] ERROR - Error executing task:
[2023-09-20 11:17:18] ERROR - Error running chmod 0755 /Users/mmusgrove/tmp/host/fs/etc/systemd/system/dev-virtio\x2dports-org.qemu.guest_agent.0.device.wants at /Users/mmusgrove/perl5/perlbrew/perls/perl-5.26.3/lib/site_perl/5.26.3/Rex/Interface/Fs/Base.pm line 149, <> line 145.
[2023-09-20 11:17:18] ERROR - 1 out of 1 task(s) failed:
[2023-09-20 11:17:18] ERROR - systemd failed on host
[2023-09-20 11:17:18] ERROR - Error running chmod 0755 /Users/mmusgrove/tmp/host/fs/etc/systemd/system/dev-virtio\x2dports-org.qemu.guest_agent.0.device.wants at /Users/mmusgrove/perl5/perlbrew/perls/perl-5.26.3/lib/site_perl/5.26.3/Rex/Interface/Fs/Base.pm line 149, <> line 145.
I was attempting to use rsync_down on /etc/systemd and it encountered this file:
[root@host ~]# ls -al /etc/systemd/system/dev-virtio\x2dports-org.qemu.guest_agent.0.device.wants/qemu-guest-agent.service
lrwxrwxrwx. 1 root root 48 Oct 20 2021 '/etc/systemd/system/dev-virtio\x2dports-org.qemu.guest_agent.0.device.wants/qemu-guest-agent.service' -> /usr/lib/systemd/system/qemu-guest-agent.service
The host/fs/etc/systemd/ directory exists with ~/tmp.
The problem seems to be that Rex::Interface::Fs::Base::_quotepath is not handling backslashes. I can fix it if I override that method as follows:
{
# Allow /etc/systemd/system/dev-virtio\x2dports-org.qemu.guest_agent.0.device.wants to be synced
no warnings 'redefine';
*Rex::Interface::Fs::Base::_quotepath = sub {
my ( $self, $p ) = @_;
$p =~ s/([\\\@\$\% ])/\\$1/g; # Note the extra \\ before \@
return $p;
};
}
Expected behavior
I would expect the sync_down to function the same regardless of whether or not the filename contains a backslash character.
How to reproduce it
Modify the following Rexfile to use a valid hostname of a Linux system with qemu installed you can connect to with ssh
mkdir -p ~/tmp/host/fs/etc/systemd # where host is the same hostname
Place the Rexfile into ~/tmp.
cd ~/tmp
rex systemd
Code example
# Rexfile
use Rex -feature => ['1.4'];
group myservers => 'host';
desc 'Get /etc/systemd';
task 'systemd',
group => 'myservers',
sub {
my $server = connection->server;
sync_down "/etc/systemd", "$server/fs/etc/systemd/";
};
Additional context
No response
Rex version
(R)?ex 1.14.3
Perl version
v5.26.3
Operating system running rex
Darwin Kernel Version 22.6.0: Wed Jul 5 22:21:53 PDT 2023; root:xnu-8796.141.3~6/RELEASE_ARM64_T6020 arm64
Operating system managed by rex
AlmaLinux 8.8 (Sapphire Caracal)
How rex was installed?
package manager
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start at Rex::Interface::Fs::Base::_quotepath, referenced from Base.pm line 149, and trace how sync_down handles the backslash-containing path. Reproduce with the provided Rexfile against a host containing the systemd filename, then verify that sync_down completes without a fatal error and preserves the path.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- perl
- Domain
- devops
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 48/100