summaryrefslogtreecommitdiffstats
path: root/src/lib/Bcfg2/Client/Tools
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/Bcfg2/Client/Tools')
-rw-r--r--src/lib/Bcfg2/Client/Tools/Action.py7
-rw-r--r--src/lib/Bcfg2/Client/Tools/POSIX/Directory.py16
-rw-r--r--src/lib/Bcfg2/Client/Tools/POSIX/Nonexistent.py19
-rw-r--r--src/lib/Bcfg2/Client/Tools/POSIX/base.py18
-rw-r--r--src/lib/Bcfg2/Client/Tools/SELinux.py2
-rw-r--r--src/lib/Bcfg2/Client/Tools/__init__.py6
6 files changed, 36 insertions, 32 deletions
diff --git a/src/lib/Bcfg2/Client/Tools/Action.py b/src/lib/Bcfg2/Client/Tools/Action.py
index 7726da94c..b1a897c81 100644
--- a/src/lib/Bcfg2/Client/Tools/Action.py
+++ b/src/lib/Bcfg2/Client/Tools/Action.py
@@ -1,5 +1,8 @@
"""Action driver"""
+import os
+import sys
+import select
import Bcfg2.Client.Tools
from Bcfg2.Client.Frame import matches_white_list, passes_black_list
from Bcfg2.Compat import input # pylint: disable=W0622
@@ -33,6 +36,10 @@ class Action(Bcfg2.Client.Tools.Tool):
if self.setup['interactive']:
prompt = ('Run Action %s, %s: (y/N): ' %
(entry.get('name'), entry.get('command')))
+ # flush input buffer
+ while len(select.select([sys.stdin.fileno()], [], [],
+ 0.0)[0]) > 0:
+ os.read(sys.stdin.fileno(), 4096)
ans = input(prompt)
if ans not in ['y', 'Y']:
return False
diff --git a/src/lib/Bcfg2/Client/Tools/POSIX/Directory.py b/src/lib/Bcfg2/Client/Tools/POSIX/Directory.py
index 9b0b998bb..9d0fe05e0 100644
--- a/src/lib/Bcfg2/Client/Tools/POSIX/Directory.py
+++ b/src/lib/Bcfg2/Client/Tools/POSIX/Directory.py
@@ -3,7 +3,6 @@
import os
import sys
import stat
-import shutil
import Bcfg2.Client.XML
from Bcfg2.Client.Tools.POSIX.base import POSIXTool
@@ -67,25 +66,14 @@ class POSIXDirectory(POSIXTool):
rv &= self._makedirs(entry)
if entry.get('prune', 'false') == 'true':
- ulfailed = False
for pent in entry.findall('Prune'):
pname = pent.get('path')
- ulfailed = False
- if os.path.isdir(pname):
- remove = shutil.rmtree
- else:
- remove = os.unlink
try:
self.logger.debug("POSIX: Removing %s" % pname)
- remove(pname)
+ self._remove(pent)
except OSError:
err = sys.exc_info()[1]
self.logger.error("POSIX: Failed to unlink %s: %s" %
(pname, err))
- ulfailed = True
- if ulfailed:
- # even if prune failed, we still want to install the
- # entry to make sure that we get permissions and
- # whatnot set
- rv = False
+ rv = False
return POSIXTool.install(self, entry) and rv
diff --git a/src/lib/Bcfg2/Client/Tools/POSIX/Nonexistent.py b/src/lib/Bcfg2/Client/Tools/POSIX/Nonexistent.py
index 5f1fbbe7c..f7251ca50 100644
--- a/src/lib/Bcfg2/Client/Tools/POSIX/Nonexistent.py
+++ b/src/lib/Bcfg2/Client/Tools/POSIX/Nonexistent.py
@@ -2,7 +2,6 @@
import os
import sys
-import shutil
from Bcfg2.Client.Tools.POSIX.base import POSIXTool
@@ -19,25 +18,21 @@ class POSIXNonexistent(POSIXTool):
def install(self, entry):
ename = entry.get('name')
- if entry.get('recursive', '').lower() == 'true':
+ recursive = entry.get('recursive', '').lower() == 'true'
+ if recursive:
# ensure that configuration spec is consistent first
for struct in self.config.getchildren():
- for entry in struct.getchildren():
- if (entry.tag == 'Path' and
- entry.get('type') != 'nonexistent' and
- entry.get('name').startswith(ename)):
+ for el in struct.getchildren():
+ if (el.tag == 'Path' and
+ el.get('type') != 'nonexistent' and
+ el.get('name').startswith(ename)):
self.logger.error('POSIX: Not removing %s. One or '
'more files in this directory are '
'specified in your configuration.' %
ename)
return False
- remove = shutil.rmtree
- elif os.path.isdir(ename):
- remove = os.rmdir
- else:
- remove = os.remove
try:
- remove(ename)
+ self._remove(entry, recursive=recursive)
return True
except OSError:
err = sys.exc_info()[1]
diff --git a/src/lib/Bcfg2/Client/Tools/POSIX/base.py b/src/lib/Bcfg2/Client/Tools/POSIX/base.py
index a9566b698..6388f6731 100644
--- a/src/lib/Bcfg2/Client/Tools/POSIX/base.py
+++ b/src/lib/Bcfg2/Client/Tools/POSIX/base.py
@@ -66,18 +66,26 @@ class POSIXTool(Bcfg2.Client.Tools.Tool):
rv &= self._set_perms(entry, path=os.path.join(root, path))
return rv
+ def _remove(self, entry, recursive=True):
+ """ Remove a Path entry, whatever that takes """
+ if os.path.islink(entry.get('name')):
+ os.unlink(entry.get('name'))
+ elif os.path.isdir(entry.get('name')):
+ if recursive:
+ shutil.rmtree(entry.get('name'))
+ else:
+ os.rmdir(entry.get('name'))
+ else:
+ os.unlink(entry.get('name'))
+
def _exists(self, entry, remove=False):
""" check for existing paths and optionally remove them. if
the path exists, return the lstat of it """
try:
ondisk = os.lstat(entry.get('name'))
if remove:
- if os.path.isdir(entry.get('name')):
- remove = shutil.rmtree
- else:
- remove = os.unlink
try:
- remove(entry.get('name'))
+ self._remove(entry)
return None
except OSError:
err = sys.exc_info()[1]
diff --git a/src/lib/Bcfg2/Client/Tools/SELinux.py b/src/lib/Bcfg2/Client/Tools/SELinux.py
index 5ac96f999..fc47883c9 100644
--- a/src/lib/Bcfg2/Client/Tools/SELinux.py
+++ b/src/lib/Bcfg2/Client/Tools/SELinux.py
@@ -41,7 +41,7 @@ def netmask_itoa(netmask, proto="ipv4"):
size = 128
family = socket.AF_INET6
try:
- int(netmask)
+ netmask = int(netmask)
except ValueError:
return netmask
diff --git a/src/lib/Bcfg2/Client/Tools/__init__.py b/src/lib/Bcfg2/Client/Tools/__init__.py
index 4022692be..927b25ba8 100644
--- a/src/lib/Bcfg2/Client/Tools/__init__.py
+++ b/src/lib/Bcfg2/Client/Tools/__init__.py
@@ -1,7 +1,9 @@
"""This contains all Bcfg2 Tool modules"""
import os
+import sys
import stat
+import select
from subprocess import Popen, PIPE
import Bcfg2.Client.XML
from Bcfg2.Compat import input, walk_packages # pylint: disable=W0622
@@ -373,6 +375,10 @@ class SvcTool(Tool):
if self.setup['interactive']:
prompt = ('Restart service %s?: (y/N): ' %
entry.get('name'))
+ # flush input buffer
+ while len(select.select([sys.stdin.fileno()], [], [],
+ 0.0)[0]) > 0:
+ os.read(sys.stdin.fileno(), 4096)
ans = input(prompt)
if ans not in ['y', 'Y']:
continue