diff options
author | Scott Moser <smoser@ubuntu.com> | 2011-12-19 17:01:07 -0500 |
---|---|---|
committer | Scott Moser <smoser@ubuntu.com> | 2011-12-19 17:01:07 -0500 |
commit | 0bc89a7290453f4a496358e90d807c3616518273 (patch) | |
tree | 87658e955a347cbf9f4537ad1a2ec21d0353b064 | |
parent | 02c2e024a3ae57879faee82218fde7db19831efc (diff) | |
download | vyos-cloud-init-0bc89a7290453f4a496358e90d807c3616518273.tar.gz vyos-cloud-init-0bc89a7290453f4a496358e90d807c3616518273.zip |
make stdin read from /dev/null for all cloud-init programs (LP: #903993)
the cloud-init programs are never intended to run interactively.
Some programs were being run via subprocess, and would notice that their
input was attached to a terminal (/dev/console). As a result, they
they would try to prompt the user for input (apt-add-repository)
This change simply re-opens standard input as /dev/null so any
subprocesses will not end up blocking on input.
-rwxr-xr-x | cloud-init-cfg.py | 2 | ||||
-rwxr-xr-x | cloud-init-run-module.py | 2 | ||||
-rwxr-xr-x | cloud-init.py | 2 | ||||
-rw-r--r-- | cloudinit/util.py | 14 |
4 files changed, 20 insertions, 0 deletions
diff --git a/cloud-init-cfg.py b/cloud-init-cfg.py index 0905eb5e..de221ec7 100755 --- a/cloud-init-cfg.py +++ b/cloud-init-cfg.py @@ -35,6 +35,8 @@ def main(): # read cloud config jobs from config (builtin -> system) # and run all in order + util.close_stdin() + modename = "config" if len(sys.argv) < 2: diff --git a/cloud-init-run-module.py b/cloud-init-run-module.py index 1bb99698..b360d06d 100755 --- a/cloud-init-run-module.py +++ b/cloud-init-run-module.py @@ -25,6 +25,8 @@ def Usage(out = sys.stdout): out.write("Usage: cloud-init-run-module freq sem-name mod-name [args]\n") def main(): + util.close_stdin() + # expect to be called with # <freq> <semaphore-name> <module-name> args if len(sys.argv) < 4: diff --git a/cloud-init.py b/cloud-init.py index c38512fe..bc673265 100755 --- a/cloud-init.py +++ b/cloud-init.py @@ -34,6 +34,8 @@ def warn(wstr): sys.stderr.write("WARN:%s" % wstr) def main(): + util.close_stdin() + cmds = ( "start", "start-local" ) deps = { "start" : ( ds.DEP_FILESYSTEM, ds.DEP_NETWORK ), "start-local" : ( ds.DEP_FILESYSTEM, ) } diff --git a/cloudinit/util.py b/cloudinit/util.py index dc461f6c..de95ec79 100644 --- a/cloudinit/util.py +++ b/cloudinit/util.py @@ -26,6 +26,7 @@ import urllib import logging import re import socket +import sys import time import traceback import urlparse @@ -523,3 +524,16 @@ def search_for_mirror(candidates): raise return None + +def close_stdin(): + """ + reopen stdin as /dev/null so even subprocesses or other os level things get + /dev/null as input. + + if _CLOUD_INIT_SAVE_STDIN is set in environment to a non empty or '0' value + then input will not be closed (only useful potentially for debugging). + """ + if os.environ.get("_CLOUD_INIT_SAVE_STDIN") in ("", "0", False): + return + with open(os.devnull) as fp: + os.dup2(fp.fileno(), sys.stdin.fileno()) |