forked from ungleich-public/cdist
Merge remote-tracking branch 'steven/master'
This commit is contained in:
commit
e89ca8cfc2
3 changed files with 75 additions and 9 deletions
|
@ -8,12 +8,8 @@ Object:
|
|||
|
||||
explorer_out_dir
|
||||
|
||||
|
||||
Type:
|
||||
explorer_dir
|
||||
remote_explorer_dir
|
||||
|
||||
explorer_remote_dir
|
||||
|
||||
type.manifest_path
|
||||
|
||||
|
||||
|
|
|
@ -32,6 +32,8 @@ class FileList(collections.MutableSequence):
|
|||
def __init__(self, path, initial=None):
|
||||
self._path = path
|
||||
if initial:
|
||||
# delete existing file
|
||||
os.unlink(self._path)
|
||||
for i in initial:
|
||||
self.append(i)
|
||||
|
||||
|
@ -40,7 +42,7 @@ class FileList(collections.MutableSequence):
|
|||
try:
|
||||
with open(self._path) as fd:
|
||||
for line in fd:
|
||||
lines.append(line.strip())
|
||||
lines.append(line.rstrip('\n'))
|
||||
except EnvironmentError as e:
|
||||
# error ignored
|
||||
pass
|
||||
|
@ -50,7 +52,7 @@ class FileList(collections.MutableSequence):
|
|||
try:
|
||||
with open(self._path, 'w') as fd:
|
||||
for line in lines:
|
||||
fd.write(line + '\n')
|
||||
fd.write(str(line) + '\n')
|
||||
except EnvironmentError as e:
|
||||
# error ignored
|
||||
raise
|
||||
|
@ -80,6 +82,26 @@ class FileList(collections.MutableSequence):
|
|||
lines.insert(index, value)
|
||||
self.__write(lines)
|
||||
|
||||
def sort(self):
|
||||
lines = sorted(self)
|
||||
self.__write(lines)
|
||||
|
||||
|
||||
class FileListProperty(FileList):
|
||||
# Descriptor Protocol
|
||||
def __get__(self, obj, objtype=None):
|
||||
if obj is None:
|
||||
return self.__class__
|
||||
return self
|
||||
|
||||
def __set__(self, obj, value):
|
||||
os.unlink(self._path)
|
||||
for item in value:
|
||||
self.append(item)
|
||||
|
||||
def __delete__(self, obj):
|
||||
raise AttributeError("can't delete attribute")
|
||||
|
||||
|
||||
class DirectoryDict(collections.MutableMapping):
|
||||
"""A dict that stores it's state in a directory.
|
||||
|
@ -98,13 +120,13 @@ class DirectoryDict(collections.MutableMapping):
|
|||
def __getitem__(self, key):
|
||||
try:
|
||||
with open(os.path.join(self._path, key), "r") as fd:
|
||||
return fd.read()
|
||||
return fd.read().rstrip('\n')
|
||||
except EnvironmentError:
|
||||
raise KeyError(key)
|
||||
|
||||
def __setitem__(self, key, value):
|
||||
with open(os.path.join(self._path, key), "w") as fd:
|
||||
fd.write(value)
|
||||
fd.write(str(value))
|
||||
|
||||
def __delitem__(self, key):
|
||||
os.remove(os.path.join(self._path, key))
|
||||
|
@ -114,3 +136,20 @@ class DirectoryDict(collections.MutableMapping):
|
|||
|
||||
def __len__(self):
|
||||
return len(os.listdir(self._path))
|
||||
|
||||
|
||||
class DirectoryDictProperty(DirectoryDict):
|
||||
# Descriptor Protocol
|
||||
def __get__(self, obj, objtype=None):
|
||||
if obj is None:
|
||||
return self.__class__
|
||||
return self
|
||||
|
||||
def __set__(self, obj, value):
|
||||
for name in self.keys():
|
||||
del self[name]
|
||||
if value is not None:
|
||||
self.update(value)
|
||||
|
||||
def __delete__(self, obj):
|
||||
raise AttributeError("can't delete attribute")
|
||||
|
|
|
@ -25,6 +25,8 @@ import os
|
|||
import cdist
|
||||
|
||||
|
||||
# FIXME: i should not have to care about prefix directory, local, remote and such.
|
||||
# I know what my internals look like, the outside is none of my business.
|
||||
class Type(object):
|
||||
"""Represents a cdist type.
|
||||
|
||||
|
@ -51,6 +53,28 @@ class Type(object):
|
|||
except KeyError as e:
|
||||
raise cdist.MissingEnvironmentVariableError(e.args[0])
|
||||
|
||||
@staticmethod
|
||||
def remote_base_dir():
|
||||
"""Return the absolute path to the top level directory where types
|
||||
are kept on the remote/target host.
|
||||
|
||||
Requires the environment variable '__cdist_remote_base_dir' to be set.
|
||||
|
||||
"""
|
||||
try:
|
||||
return os.path.join(
|
||||
os.environ['__cdist_remote_base_dir'],
|
||||
'conf',
|
||||
'type'
|
||||
)
|
||||
except KeyError as e:
|
||||
raise cdist.MissingEnvironmentVariableError(e.args[0])
|
||||
|
||||
# FIXME: probably wrong place for this
|
||||
@property
|
||||
def remote_explorer_dir(self):
|
||||
return os.path.join(self.remote_path, "explorer")
|
||||
|
||||
@classmethod
|
||||
def list_types(cls):
|
||||
"""Return a list of type instances"""
|
||||
|
@ -80,6 +104,13 @@ class Type(object):
|
|||
self.base_dir(),
|
||||
self.name
|
||||
)
|
||||
# FIXME: prefix directory should not leak into me
|
||||
@property
|
||||
def remote_path(self):
|
||||
return os.path.join(
|
||||
self.remote_base_dir(),
|
||||
self.name
|
||||
)
|
||||
|
||||
@property
|
||||
def is_singleton(self):
|
||||
|
|
Loading…
Reference in a new issue