summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Moser <smoser@ubuntu.com>2011-12-19 17:01:07 -0500
committerScott Moser <smoser@ubuntu.com>2011-12-19 17:01:07 -0500
commit0bc89a7290453f4a496358e90d807c3616518273 (patch)
tree87658e955a347cbf9f4537ad1a2ec21d0353b064
parent02c2e024a3ae57879faee82218fde7db19831efc (diff)
downloadvyos-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-xcloud-init-cfg.py2
-rwxr-xr-xcloud-init-run-module.py2
-rwxr-xr-xcloud-init.py2
-rw-r--r--cloudinit/util.py14
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())