Search code examples
powershellsvnpuppetpowershell-5.0

Unable to checkout SVN repo using Puppet


I am trying to checkout code from SVN repo for which I am accepting the URL as argument. I have quoted the URL as shown below because it contains spaces. I also checked the parameter by redirecting the $svn_url in file (shown below). If I pick the URL from the file and pass it as is on the command line to the given script, it works fine but somehow when invoked from Puppet, it's not working.

Puppet manifests:

repo_checkout.pp:

define infra::svn::repo_checkout ($svn_url_params) {
    $svn_url = $svn_url_params[svn_url]

    include infra::params
    $repo_checkout_ps = $infra::params::repo_checkout_ps

    file { $repo_checkout_ps:
        ensure => file,
        source => 'puppet:///modules/infra/repo_checkout.ps1',
    }

    util::executeps { 'Checking out repo':
        pspath   => $repo_checkout_ps,
        argument => "\'\"$svn_url\"\'",
    }
}

params.pp:

$repo_checkout_ps = 'c:/scripts/infra/repo_checkout.ps1',

site.pp:

$svn_url_ad = {
    svn_url => 'https:\\\\some_repo.abc.com\svn\dir  with  space\util',
}

infra::svn::repo_checkout { "Checking out code in C:\build":
    svn_url_params => $svn_url_ad
}

executeps.pp:

define util::executeps ($pspath, $argument) {
    $powershell = 'C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -NoProfile -NoLogo -NonInteractive'
    exec { "Executing PS file \"$pspath\" with argument \"$argument\"":
        command => "$powershell -file $pspath $argument",
        timeout => 900,
    }
}

PowerShell code:

$svn_url = $args[0]
Set-Location C:\build
echo "svn co --username user --password xxx --non-interactive '$svn_url'" | Out-File c:\svn_url
svn co --username user --password xxx --non-interactive '$svn_url'

Puppet output on agent node:

Util::Executeps[Checking out repo]/Exec[Executing PS file "c:/scripts/infra/repo_checkout.ps1" with argument "'"https:\\some_repo.abc.com\svn\dir  with  space\util"'"]/returns: executed successfully
Notice: Applied catalog in 1.83 seconds

Content of c:\svn_url:

'https:\\\\some_repo.abc.com\svn\dir  with  space\util'

UPDATE: Sorry for the confusion but i was trying out several permutations and combinations and in doing that, i forgot to mention that when the $svn_url contains backslash (\), it does NOT work on the command line too if i copy the SVN URL from the text file where i am redirecting the echo output.

Based on @Ansgar's suggestion, i changed '$svn_url' to "$svn_url" in powershell code but the output in text file then contained ' quote twice around the URL. So i changed the argument parameter from "\'\"$svn_url\"\'" to "\"$svn_url\"". Now the output file had only single quote present around the URL. I copied only the URL (along with single quotes around it) from the output file and tried passing it to the powershell script. I now get the following error:

svn: E020024: Error resolving case of 'https:\\some_repo.abc.com\svn\dir  with  space\util'

Another thing to note is that if i change the back slashes in URL to forward slashes, it works fine on the command line. Invoking from Puppet still doesn't work.


Solution

  • Posting the final configuration that worked out for me based on @AnsgarWiechers' suggestion.

    [tom@pe-server] cat repo_checkout.pp
    define infra::svn::repo_checkout ($svn_url_params) {
        $svn_url = $svn_url_params[svn_url]
        ...
        ...
        util::executeps { 'Checking out repo':
            pspath   => $repo_checkout_ps,
            argument => "\"$svn_url\"",
        }
    }
    

    [tom@pe-server] cat repo_checkout.ps1
    $svn_url = $args[0]
    Set-Location C:\build
    svn co --username user --password xxx --non-interactive "$svn_url"
    

    [tom@pe-server] cat params.pp
    $repo_checkout_ps = 'c:/scripts/infra/repo_checkout.ps1',
    

    [tom@pe-server] cat site.pp
    $svn_url_ad = {
        svn_url => 'https://some_repo.abc.com/svn/dir  with  space/util',
    }
    

    infra::svn::repo_checkout { "Checking out code in C:\build":
        svn_url_params => $svn_url_ad
    }
    

    Thanks a lot @AnsgarWiechers! :)

    Note:

    • In site.pp: Used forwardslashes (/) when specifying svn_url
    • In repo_checkout.ps1: Changed '$svn_url' to "$svn_url"
    • In repo_checkout.pp: Changed double-nested (' and ") quoting in argument to single (") nested i.e., from "\'\"$svn_url\"\'" to "\"$svn_url\""