summaryrefslogtreecommitdiffstats
path: root/src/lib/Bcfg2/Client/Tools/POSIX/Device.py
diff options
context:
space:
mode:
authorChris St. Pierre <chris.a.st.pierre@gmail.com>2012-08-15 09:06:43 -0400
committerChris St. Pierre <chris.a.st.pierre@gmail.com>2012-08-15 09:06:43 -0400
commitb862090945322d5ba4b42e180bba92afb860df21 (patch)
tree1c482adfa9561bad14d82fc442f8f319b33b1d4f /src/lib/Bcfg2/Client/Tools/POSIX/Device.py
parent7890fd0aa5331541c71b893c313553765ca1628e (diff)
downloadbcfg2-b862090945322d5ba4b42e180bba92afb860df21.tar.gz
bcfg2-b862090945322d5ba4b42e180bba92afb860df21.tar.bz2
bcfg2-b862090945322d5ba4b42e180bba92afb860df21.zip
POSIX:
refactored POSIX tool into multiple files to make it more manageable Added unit tests for POSIX tool and sub-tools fixed ACL handling for filesystems mounted noacl
Diffstat (limited to 'src/lib/Bcfg2/Client/Tools/POSIX/Device.py')
-rw-r--r--src/lib/Bcfg2/Client/Tools/POSIX/Device.py62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/lib/Bcfg2/Client/Tools/POSIX/Device.py b/src/lib/Bcfg2/Client/Tools/POSIX/Device.py
new file mode 100644
index 000000000..b8fb0f4d0
--- /dev/null
+++ b/src/lib/Bcfg2/Client/Tools/POSIX/Device.py
@@ -0,0 +1,62 @@
+import os
+import sys
+from base import POSIXTool, device_map
+
+class POSIXDevice(POSIXTool):
+ __req__ = ['name', 'dev_type', 'perms', 'owner', 'group']
+
+ def fully_specified(self, entry):
+ if entry.get('dev_type') in ['block', 'char']:
+ # check if major/minor are properly specified
+ if (entry.get('major') == None or
+ entry.get('minor') == None):
+ return False
+ return True
+
+ def verify(self, entry, modlist):
+ """Verify device entry."""
+ ondisk = self._exists(entry)
+ if not ondisk:
+ return False
+
+ # attempt to verify device properties as specified in config
+ rv = True
+ dev_type = entry.get('dev_type')
+ if dev_type in ['block', 'char']:
+ major = int(entry.get('major'))
+ minor = int(entry.get('minor'))
+ if major != os.major(ondisk.st_rdev):
+ msg = ("Major number for device %s is incorrect. "
+ "Current major is %s but should be %s" %
+ (entry.get("name"), os.major(ondisk.st_rdev), major))
+ self.logger.debug('POSIX: ' + msg)
+ entry.set('qtext', entry.get('qtext', '') + "\n" + msg)
+ rv = False
+
+ if minor != os.minor(ondisk.st_rdev):
+ msg = ("Minor number for device %s is incorrect. "
+ "Current minor is %s but should be %s" %
+ (entry.get("name"), os.minor(ondisk.st_rdev), minor))
+ self.logger.debug('POSIX: ' + msg)
+ entry.set('qtext', entry.get('qtext', '') + "\n" + msg)
+ rv = False
+ return POSIXTool.verify(self, entry, modlist) and rv
+
+ def install(self, entry):
+ if not self._exists(entry, remove=True):
+ try:
+ dev_type = entry.get('dev_type')
+ mode = device_map[dev_type] | int(entry.get('perms'), 8)
+ if dev_type in ['block', 'char']:
+ major = int(entry.get('major'))
+ minor = int(entry.get('minor'))
+ device = os.makedev(major, minor)
+ os.mknod(entry.get('name'), mode, device)
+ else:
+ os.mknod(entry.get('name'), mode)
+ except (KeyError, OSError, ValueError):
+ err = sys.exc_info()[1]
+ self.logger.error('POSIX: Failed to install %s: %s' %
+ (entry.get('name'), err))
+ return False
+ return POSIXTool.install(self, entry)