Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/pyinfra/api/host.py
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,9 @@ def _get_temp_directory(self):

return temp_directory

def get_temp_dir_config(self):
return self.state.config.TEMP_DIR or self.state.config.DEFAULT_TEMP_DIR

def get_temp_filename(
self,
hash_key: Optional[str] = None,
Expand Down
14 changes: 8 additions & 6 deletions src/pyinfra/connectors/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,17 @@


SUDO_ASKPASS_ENV_VAR = "PYINFRA_SUDO_PASSWORD"


SUDO_ASKPASS_COMMAND = r"""
temp=$(mktemp "${{TMPDIR:=/tmp}}/pyinfra-sudo-askpass-XXXXXXXXXXXX")
temp=$(mktemp "${{TMPDIR:={0}}}/pyinfra-sudo-askpass-XXXXXXXXXXXX")
cat >"$temp"<<'__EOF__'
#!/bin/sh
printf '%s\n' "${0}"
printf '%s\n' "${1}"
__EOF__
chmod 755 "$temp"
echo "$temp"
""".format(
SUDO_ASKPASS_ENV_VAR,
)
"""


def run_local_process(
Expand Down Expand Up @@ -264,7 +264,9 @@ def extract_control_arguments(arguments: "ConnectorArguments") -> "ConnectorArgu
def _ensure_sudo_askpass_set_for_host(host: "Host"):
if host.connector_data.get("sudo_askpass_path"):
return
_, output = host.run_shell_command(SUDO_ASKPASS_COMMAND)
_, output = host.run_shell_command(
SUDO_ASKPASS_COMMAND.format(host.get_temp_dir_config(), SUDO_ASKPASS_ENV_VAR)
)
host.connector_data["sudo_askpass_path"] = shlex.quote(output.stdout_lines[0])


Expand Down
4 changes: 3 additions & 1 deletion src/pyinfra/operations/files.py
Original file line number Diff line number Diff line change
Expand Up @@ -1803,6 +1803,8 @@ def block(
current = host.get_fact(Block, path=path, marker=marker, begin=begin, end=end)
cmd = None

tmp_dir = host.get_temp_dir_config()

# standard awk doesn't have an "in-place edit" option so we write to a tempfile and
# if edits were successful move to dest i.e. we do: <out_prep> ... do some work ... <real_out>
q_path = QuoteString(path)
Expand All @@ -1818,7 +1820,7 @@ def block(
)
)
out_prep = StringCommand(
'OUT="$(TMPDIR=/tmp mktemp -t pyinfra.XXXXXX)" && ',
f'OUT="$(TMPDIR={tmp_dir} mktemp -t pyinfra.XXXXXX)" && ',
*mode_get,
'OWNER="$(stat -c "%u:%g"',
q_path,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,24 @@
{
"require_platform": ["Darwin", "Linux"],
"args": ["/home/someone/something"],
"require_platform": [
"Darwin",
"Linux"
],
"args": [
"/home/someone/something"
],
"kwargs": {
"content": "should be this",
"line": "before this",
"before": true
},
"facts": {
"files.Block": {
"begin=None, end=None, marker=None, path=/home/someone/something": ["previously was something else"]
"begin=None, end=None, marker=None, path=/home/someone/something": [
"previously was something else"
]
}
},
"commands": [
"OUT=\"$(TMPDIR=/tmp mktemp -t pyinfra.XXXXXX)\" && MODE=\"$(stat -c %a /home/someone/something 2>/dev/null || stat -f %Lp /home/someone/something 2>/dev/null)\" && OWNER=\"$(stat -c \"%u:%g\" /home/someone/something 2>/dev/null || stat -f \"%u:%g\" /home/someone/something 2>/dev/null || echo $(id -un):$(id -gn))\" && awk 'BEGIN {{f=1; x=ARGV[2]; ARGV[2]=\"\"}}/# BEGIN PYINFRA BLOCK/ {print; print x; f=0} /# END PYINFRA BLOCK/ {print; f=1; next} f' /home/someone/something \"should be this\" > \"$OUT\" && mv \"$OUT\" /home/someone/something && chown \"$OWNER\" /home/someone/something && chmod \"$MODE\" /home/someone/something"
"OUT=\"$(TMPDIR=_tempdir_ mktemp -t pyinfra.XXXXXX)\" && MODE=\"$(stat -c %a /home/someone/something 2>/dev/null || stat -f %Lp /home/someone/something 2>/dev/null)\" && OWNER=\"$(stat -c \"%u:%g\" /home/someone/something 2>/dev/null || stat -f \"%u:%g\" /home/someone/something 2>/dev/null || echo $(id -un):$(id -gn))\" && awk 'BEGIN {{f=1; x=ARGV[2]; ARGV[2]=\"\"}}/# BEGIN PYINFRA BLOCK/ {print; print x; f=0} /# END PYINFRA BLOCK/ {print; f=1; next} f' /home/someone/something \"should be this\" > \"$OUT\" && mv \"$OUT\" /home/someone/something && chown \"$OWNER\" /home/someone/something && chmod \"$MODE\" /home/someone/something"
]
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
{
"require_platform": ["Darwin", "Linux"],
"args": ["/home/someone/something"],
"require_platform": [
"Darwin",
"Linux"
],
"args": [
"/home/someone/something"
],
"kwargs": {
"content": "should be this",
"line": "before this",
Expand All @@ -9,10 +14,12 @@
},
"facts": {
"files.Block": {
"begin=None, end=None, marker=None, path=/home/someone/something": ["previously was something else"]
"begin=None, end=None, marker=None, path=/home/someone/something": [
"previously was something else"
]
}
},
"commands": [
"cp /home/someone/something /home/someone/something.a-timestamp && OUT=\"$(TMPDIR=/tmp mktemp -t pyinfra.XXXXXX)\" && MODE=\"$(stat -c %a /home/someone/something 2>/dev/null || stat -f %Lp /home/someone/something 2>/dev/null)\" && OWNER=\"$(stat -c \"%u:%g\" /home/someone/something 2>/dev/null || stat -f \"%u:%g\" /home/someone/something 2>/dev/null || echo $(id -un):$(id -gn))\" && awk 'BEGIN {{f=1; x=ARGV[2]; ARGV[2]=\"\"}}/# BEGIN PYINFRA BLOCK/ {print; print x; f=0} /# END PYINFRA BLOCK/ {print; f=1; next} f' /home/someone/something \"should be this\" > \"$OUT\" && mv \"$OUT\" /home/someone/something && chown \"$OWNER\" /home/someone/something && chmod \"$MODE\" /home/someone/something"
"cp /home/someone/something /home/someone/something.a-timestamp && OUT=\"$(TMPDIR=_tempdir_ mktemp -t pyinfra.XXXXXX)\" && MODE=\"$(stat -c %a /home/someone/something 2>/dev/null || stat -f %Lp /home/someone/something 2>/dev/null)\" && OWNER=\"$(stat -c \"%u:%g\" /home/someone/something 2>/dev/null || stat -f \"%u:%g\" /home/someone/something 2>/dev/null || echo $(id -un):$(id -gn))\" && awk 'BEGIN {{f=1; x=ARGV[2]; ARGV[2]=\"\"}}/# BEGIN PYINFRA BLOCK/ {print; print x; f=0} /# END PYINFRA BLOCK/ {print; f=1; next} f' /home/someone/something \"should be this\" > \"$OUT\" && mv \"$OUT\" /home/someone/something && chown \"$OWNER\" /home/someone/something && chmod \"$MODE\" /home/someone/something"
]
}
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,28 @@
{
"require_platform": ["Darwin", "Linux"],
"args": ["/home/someone/something"],
"require_platform": [
"Darwin",
"Linux"
],
"args": [
"/home/someone/something"
],
"kwargs": {
"content": ["should be this", "and this", "and even this"],
"content": [
"should be this",
"and this",
"and even this"
],
"line": "before this",
"before": true
},
"facts": {
"files.Block": {
"begin=None, end=None, marker=None, path=/home/someone/something": ["previously was something else"]
"begin=None, end=None, marker=None, path=/home/someone/something": [
"previously was something else"
]
}
},
"commands": [
"OUT=\"$(TMPDIR=/tmp mktemp -t pyinfra.XXXXXX)\" && MODE=\"$(stat -c %a /home/someone/something 2>/dev/null || stat -f %Lp /home/someone/something 2>/dev/null)\" && OWNER=\"$(stat -c \"%u:%g\" /home/someone/something 2>/dev/null || stat -f \"%u:%g\" /home/someone/something 2>/dev/null || echo $(id -un):$(id -gn))\" && awk 'BEGIN {{f=1; x=ARGV[2]; ARGV[2]=\"\"}}/# BEGIN PYINFRA BLOCK/ {print; print x; f=0} /# END PYINFRA BLOCK/ {print; f=1; next} f' /home/someone/something \"should be this\nand this\nand even this\" > \"$OUT\" && mv \"$OUT\" /home/someone/something && chown \"$OWNER\" /home/someone/something && chmod \"$MODE\" /home/someone/something"
"OUT=\"$(TMPDIR=_tempdir_ mktemp -t pyinfra.XXXXXX)\" && MODE=\"$(stat -c %a /home/someone/something 2>/dev/null || stat -f %Lp /home/someone/something 2>/dev/null)\" && OWNER=\"$(stat -c \"%u:%g\" /home/someone/something 2>/dev/null || stat -f \"%u:%g\" /home/someone/something 2>/dev/null || echo $(id -un):$(id -gn))\" && awk 'BEGIN {{f=1; x=ARGV[2]; ARGV[2]=\"\"}}/# BEGIN PYINFRA BLOCK/ {print; print x; f=0} /# END PYINFRA BLOCK/ {print; f=1; next} f' /home/someone/something \"should be this\nand this\nand even this\" > \"$OUT\" && mv \"$OUT\" /home/someone/something && chown \"$OWNER\" /home/someone/something && chmod \"$MODE\" /home/someone/something"
]
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
{
"require_platform": ["Darwin", "Linux"],
"args": ["/home/someone/something"],
"require_platform": [
"Darwin",
"Linux"
],
"args": [
"/home/someone/something"
],
"kwargs": {
"content": "please add this",
"before": true,
Expand All @@ -12,6 +17,6 @@
}
},
"commands": [
"OUT=\"$(TMPDIR=/tmp mktemp -t pyinfra.XXXXXX)\" && OWNER=\"$(stat -c \"%u:%g\" /home/someone/something 2>/dev/null || stat -f \"%u:%g\" /home/someone/something 2>/dev/null || echo $(id -un):$(id -gn))\" && ( awk '{{print}}' - /dev/null > \"$OUT\" <<PYINFRAHERE\n# BEGIN PYINFRA BLOCK\nplease add this\n# END PYINFRA BLOCK\nPYINFRAHERE\n ) && mv \"$OUT\" /home/someone/something && chown \"$OWNER\" /home/someone/something /home/someone/something"
"OUT=\"$(TMPDIR=_tempdir_ mktemp -t pyinfra.XXXXXX)\" && OWNER=\"$(stat -c \"%u:%g\" /home/someone/something 2>/dev/null || stat -f \"%u:%g\" /home/someone/something 2>/dev/null || echo $(id -un):$(id -gn))\" && ( awk '{{print}}' - /dev/null > \"$OUT\" <<PYINFRAHERE\n# BEGIN PYINFRA BLOCK\nplease add this\n# END PYINFRA BLOCK\nPYINFRAHERE\n ) && mv \"$OUT\" /home/someone/something && chown \"$OWNER\" /home/someone/something /home/someone/something"
]
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
{
"require_platform": ["Darwin", "Linux"],
"args": ["/home/someone/something"],
"require_platform": [
"Darwin",
"Linux"
],
"args": [
"/home/someone/something"
],
"kwargs": {
"content": "please add this",
"line": "before this",
Expand All @@ -12,6 +17,6 @@
}
},
"commands": [
"OUT=\"$(TMPDIR=/tmp mktemp -t pyinfra.XXXXXX)\" && MODE=\"$(stat -c %a /home/someone/something 2>/dev/null || stat -f %Lp /home/someone/something 2>/dev/null)\" && OWNER=\"$(stat -c \"%u:%g\" /home/someone/something 2>/dev/null || stat -f \"%u:%g\" /home/someone/something 2>/dev/null || echo $(id -un):$(id -gn))\" && awk 'BEGIN {x=ARGV[2]; ARGV[2]=\"\"} f!=1 && /^.*before this.*$/ { print x; f=1} END {if (f==0) print x } { print }' /home/someone/something \"# BEGIN PYINFRA BLOCK\nplease add this\n# END PYINFRA BLOCK\" > \"$OUT\" && mv \"$OUT\" /home/someone/something && chown \"$OWNER\" /home/someone/something && chmod \"$MODE\" /home/someone/something"
"OUT=\"$(TMPDIR=_tempdir_ mktemp -t pyinfra.XXXXXX)\" && MODE=\"$(stat -c %a /home/someone/something 2>/dev/null || stat -f %Lp /home/someone/something 2>/dev/null)\" && OWNER=\"$(stat -c \"%u:%g\" /home/someone/something 2>/dev/null || stat -f \"%u:%g\" /home/someone/something 2>/dev/null || echo $(id -un):$(id -gn))\" && awk 'BEGIN {x=ARGV[2]; ARGV[2]=\"\"} f!=1 && /^.*before this.*$/ { print x; f=1} END {if (f==0) print x } { print }' /home/someone/something \"# BEGIN PYINFRA BLOCK\nplease add this\n# END PYINFRA BLOCK\" > \"$OUT\" && mv \"$OUT\" /home/someone/something && chown \"$OWNER\" /home/someone/something && chmod \"$MODE\" /home/someone/something"
]
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
{
"require_platform": ["Darwin", "Linux"],
"args": ["/home/someone/something"],
"require_platform": [
"Darwin",
"Linux"
],
"args": [
"/home/someone/something"
],
"kwargs": {
"content": "please add this",
"line": "before this *",
Expand All @@ -13,6 +18,6 @@
}
},
"commands": [
"OUT=\"$(TMPDIR=/tmp mktemp -t pyinfra.XXXXXX)\" && MODE=\"$(stat -c %a /home/someone/something 2>/dev/null || stat -f %Lp /home/someone/something 2>/dev/null)\" && OWNER=\"$(stat -c \"%u:%g\" /home/someone/something 2>/dev/null || stat -f \"%u:%g\" /home/someone/something 2>/dev/null || echo $(id -un):$(id -gn))\" && awk 'BEGIN {x=ARGV[2]; ARGV[2]=\"\"} f!=1 && /^.*before this \\*.*$/ { print x; f=1} END {if (f==0) print x } { print }' /home/someone/something \"# BEGIN PYINFRA BLOCK\nplease add this\n# END PYINFRA BLOCK\" > \"$OUT\" && mv \"$OUT\" /home/someone/something && chown \"$OWNER\" /home/someone/something && chmod \"$MODE\" /home/someone/something"
"OUT=\"$(TMPDIR=_tempdir_ mktemp -t pyinfra.XXXXXX)\" && MODE=\"$(stat -c %a /home/someone/something 2>/dev/null || stat -f %Lp /home/someone/something 2>/dev/null)\" && OWNER=\"$(stat -c \"%u:%g\" /home/someone/something 2>/dev/null || stat -f \"%u:%g\" /home/someone/something 2>/dev/null || echo $(id -un):$(id -gn))\" && awk 'BEGIN {x=ARGV[2]; ARGV[2]=\"\"} f!=1 && /^.*before this \\*.*$/ { print x; f=1} END {if (f==0) print x } { print }' /home/someone/something \"# BEGIN PYINFRA BLOCK\nplease add this\n# END PYINFRA BLOCK\" > \"$OUT\" && mv \"$OUT\" /home/someone/something && chown \"$OWNER\" /home/someone/something && chmod \"$MODE\" /home/someone/something"
]
}
}
13 changes: 9 additions & 4 deletions tests/operations/files.block/add_no_existing_file.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
{
"require_platform": ["Darwin", "Linux"],
"args": ["/home/someone/something"],
"require_platform": [
"Darwin",
"Linux"
],
"args": [
"/home/someone/something"
],
"kwargs": {
"content": "please add this",
"line": "after this",
Expand All @@ -12,6 +17,6 @@
}
},
"commands": [
"OUT=\"$(TMPDIR=/tmp mktemp -t pyinfra.XXXXXX)\" && OWNER=\"$(stat -c \"%u:%g\" /home/someone/something 2>/dev/null || stat -f \"%u:%g\" /home/someone/something 2>/dev/null || echo $(id -un):$(id -gn))\" && ( awk '{{print}}' /dev/null - > \"$OUT\" <<PYINFRAHERE\n# BEGIN PYINFRA BLOCK\nplease add this\n# END PYINFRA BLOCK\nPYINFRAHERE\n ) && mv \"$OUT\" /home/someone/something && chown \"$OWNER\" /home/someone/something /home/someone/something"
"OUT=\"$(TMPDIR=_tempdir_ mktemp -t pyinfra.XXXXXX)\" && OWNER=\"$(stat -c \"%u:%g\" /home/someone/something 2>/dev/null || stat -f \"%u:%g\" /home/someone/something 2>/dev/null || echo $(id -un):$(id -gn))\" && ( awk '{{print}}' /dev/null - > \"$OUT\" <<PYINFRAHERE\n# BEGIN PYINFRA BLOCK\nplease add this\n# END PYINFRA BLOCK\nPYINFRAHERE\n ) && mv \"$OUT\" /home/someone/something && chown \"$OWNER\" /home/someone/something /home/someone/something"
]
}
}
17 changes: 12 additions & 5 deletions tests/operations/files.block/remove_but_content_not_none.json
Original file line number Diff line number Diff line change
@@ -1,16 +1,23 @@
{
"require_platform": ["Darwin", "Linux"],
"args": ["/home/someone/something"],
"require_platform": [
"Darwin",
"Linux"
],
"args": [
"/home/someone/something"
],
"kwargs": {
"content": "please check this",
"present": false
},
"facts": {
"files.Block": {
"begin=None, end=None, marker=None, path=/home/someone/something": ["some existing content"]
"begin=None, end=None, marker=None, path=/home/someone/something": [
"some existing content"
]
}
},
"commands": [
"OUT=\"$(TMPDIR=/tmp mktemp -t pyinfra.XXXXXX)\" && MODE=\"$(stat -c %a /home/someone/something 2>/dev/null || stat -f %Lp /home/someone/something 2>/dev/null)\" && OWNER=\"$(stat -c \"%u:%g\" /home/someone/something 2>/dev/null || stat -f \"%u:%g\" /home/someone/something 2>/dev/null || echo $(id -un):$(id -gn))\" && awk '/# BEGIN PYINFRA BLOCK/,/# END PYINFRA BLOCK/ {next} 1' /home/someone/something > $OUT && mv \"$OUT\" /home/someone/something && chown \"$OWNER\" /home/someone/something && chmod \"$MODE\" /home/someone/something"
"OUT=\"$(TMPDIR=_tempdir_ mktemp -t pyinfra.XXXXXX)\" && MODE=\"$(stat -c %a /home/someone/something 2>/dev/null || stat -f %Lp /home/someone/something 2>/dev/null)\" && OWNER=\"$(stat -c \"%u:%g\" /home/someone/something 2>/dev/null || stat -f \"%u:%g\" /home/someone/something 2>/dev/null || echo $(id -un):$(id -gn))\" && awk '/# BEGIN PYINFRA BLOCK/,/# END PYINFRA BLOCK/ {next} 1' /home/someone/something > $OUT && mv \"$OUT\" /home/someone/something && chown \"$OWNER\" /home/someone/something && chmod \"$MODE\" /home/someone/something"
]
}
}
17 changes: 12 additions & 5 deletions tests/operations/files.block/remove_existing_block.json
Original file line number Diff line number Diff line change
@@ -1,15 +1,22 @@
{
"require_platform": ["Darwin", "Linux"],
"args": ["/home/someone/something"],
"require_platform": [
"Darwin",
"Linux"
],
"args": [
"/home/someone/something"
],
"kwargs": {
"present": false
},
"facts": {
"files.Block": {
"begin=None, end=None, marker=None, path=/home/someone/something": ["existing content"]
"begin=None, end=None, marker=None, path=/home/someone/something": [
"existing content"
]
}
},
"commands": [
"OUT=\"$(TMPDIR=/tmp mktemp -t pyinfra.XXXXXX)\" && MODE=\"$(stat -c %a /home/someone/something 2>/dev/null || stat -f %Lp /home/someone/something 2>/dev/null)\" && OWNER=\"$(stat -c \"%u:%g\" /home/someone/something 2>/dev/null || stat -f \"%u:%g\" /home/someone/something 2>/dev/null || echo $(id -un):$(id -gn))\" && awk '/# BEGIN PYINFRA BLOCK/,/# END PYINFRA BLOCK/ {next} 1' /home/someone/something > $OUT && mv \"$OUT\" /home/someone/something && chown \"$OWNER\" /home/someone/something && chmod \"$MODE\" /home/someone/something"
"OUT=\"$(TMPDIR=_tempdir_ mktemp -t pyinfra.XXXXXX)\" && MODE=\"$(stat -c %a /home/someone/something 2>/dev/null || stat -f %Lp /home/someone/something 2>/dev/null)\" && OWNER=\"$(stat -c \"%u:%g\" /home/someone/something 2>/dev/null || stat -f \"%u:%g\" /home/someone/something 2>/dev/null || echo $(id -un):$(id -gn))\" && awk '/# BEGIN PYINFRA BLOCK/,/# END PYINFRA BLOCK/ {next} 1' /home/someone/something > $OUT && mv \"$OUT\" /home/someone/something && chown \"$OWNER\" /home/someone/something && chmod \"$MODE\" /home/someone/something"
]
}
}
3 changes: 3 additions & 0 deletions tests/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,9 @@ def get_file(
):
return True

def get_temp_dir_config(*args, **kwargs):
return "_tempdir_"

@staticmethod
def _get_fact_key(fact_cls):
return "{0}.{1}".format(fact_cls.__module__.split(".")[-1], fact_cls.__name__)
Expand Down