Merge pull request #766 from greenius/feature/cmdargs

Enable arguments on cmdv4 and cmdv6
This commit is contained in:
Richard Hansen 2025-01-09 19:33:11 -05:00 committed by GitHub
commit 6bb80cbdaa
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 55 additions and 4 deletions

View file

@ -5,6 +5,17 @@ repository history](https://github.com/ddclient/ddclient/commits/main).
## v4.0.0-rc.3 (unreleased work-in-progress) ## v4.0.0-rc.3 (unreleased work-in-progress)
### Breaking changes
* The string argument to `--cmdv4` or `--cmdv6` is now executed as-is by the
system's shell, matching the behavior of the deprecated `--cmd` option.
This makes it possible to pass command-line arguments, which reduces the
need for a custom wrapper script. Beware that the string is also subject to
the shell's command substitution, quote handling, variable expansion, field
splitting, etc., so you may need to add extra escaping to ensure that any
special characters are preserved literally.
[#766](https://github.com/ddclient/ddclient/pull/766)
## 2025-01-07 v4.0.0-rc.2 ## 2025-01-07 v4.0.0-rc.2
### Breaking changes ### Breaking changes

View file

@ -77,6 +77,7 @@ handwritten_tests = \
t/skip.pl \ t/skip.pl \
t/ssl-validate.pl \ t/ssl-validate.pl \
t/update_nics.pl \ t/update_nics.pl \
t/use_cmd.pl \
t/use_web.pl \ t/use_web.pl \
t/variable_defaults.pl \ t/variable_defaults.pl \
t/write_recap.pl t/write_recap.pl

View file

@ -3343,8 +3343,7 @@ sub get_ipv4 {
warning("'--cmd-skip' ignored for '--usev4=$p{'usev4'}'") warning("'--cmd-skip' ignored for '--usev4=$p{'usev4'}'")
if opt('verbose') && defined($p{'cmd-skip'}); if opt('verbose') && defined($p{'cmd-skip'});
if ($arg) { if ($arg) {
my $sys_cmd = quotemeta($arg); $reply = qx{$arg};
$reply = qx{$sys_cmd};
$reply = '' if $?; $reply = '' if $?;
} }
} elsif ($p{'usev4'} eq 'webv4') { } elsif ($p{'usev4'} eq 'webv4') {
@ -3457,8 +3456,7 @@ sub get_ipv6 {
warning("'--cmd-skip' ignored for '--usev6=$p{'usev6'}'") warning("'--cmd-skip' ignored for '--usev6=$p{'usev6'}'")
if opt('verbose') && defined($p{'cmd-skip'}); if opt('verbose') && defined($p{'cmd-skip'});
if ($arg) { if ($arg) {
my $sys_cmd = quotemeta($arg); $reply = qx{$arg};
$reply = qx{$sys_cmd};
$reply = '' if $?; $reply = '' if $?;
} }
} elsif ($p{'usev6'} eq 'webv6' || $p{'usev6'} eq 'web') { } elsif ($p{'usev6'} eq 'webv6' || $p{'usev6'} eq 'web') {

41
t/use_cmd.pl Normal file
View file

@ -0,0 +1,41 @@
use Test::More;
BEGIN { SKIP: { eval { require Test::Warnings; 1; } or skip($@, 1); } }
BEGIN { eval { require 'ddclient'; } or BAIL_OUT($@); }
local $ddclient::globals{debug} = 1;
local $ddclient::globals{verbose} = 1;
my @test_cases;
for my $ipv ('4', '6') {
my $ip = $ipv eq '4' ? '192.0.2.1' : '2001:db8::1';
for my $use ('use', "usev$ipv") {
my @cmds = ();
push(@cmds, 'cmd') if $use eq 'use' || $ipv eq '6';
push(@cmds, "cmdv$ipv") if $use ne 'use';
for my $cmd (@cmds) {
my $cmdarg = "echo '$ip'";
push(
@test_cases,
{
desc => "$use=$cmd $cmd=\"$cmdarg\"",
cfg => {$use => $cmd, $cmd => $cmdarg},
want => $ip,
},
);
}
}
}
for my $tc (@test_cases) {
local $ddclient::_l = ddclient::pushlogctx($tc->{desc});
my $h = 'test-host';
local $ddclient::config{$h} = $tc->{cfg};
is(ddclient::get_ip(ddclient::strategy_inputs('use', $h)), $tc->{want}, $tc->{desc})
if $tc->{cfg}{use};
is(ddclient::get_ipv4(ddclient::strategy_inputs('usev4', $h)), $tc->{want}, $tc->{desc})
if $tc->{cfg}{usev4};
is(ddclient::get_ipv6(ddclient::strategy_inputs('usev6', $h)), $tc->{want}, $tc->{desc})
if $tc->{cfg}{usev6};
}
done_testing();