Source code for ztpserver.repository
# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
#
# Copyright (c) 2013, Arista Networks
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
# Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# Redistributions in binary form must reproduce the above copyright notice, this
# list of conditions and the following disclaimer in the documentation and/or
# other materials provided with the distribution.
#
# Neither the name of the {organization} nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
import os
import mimetypes
import collections
import logging
import ztpserver.config
log = logging.getLogger(__name__)
[docs]def create_node(headers):
""" returns a Node object using HTTP X-Arista headers """
kwargs = dict()
for k,v in headers.items():
if str(k).startswith('X-Arista'):
key = str(k).replace('X-Arista-', '').lower()
kwargs[key] = v
Node = collections.namedtuple('Node', kwargs.keys())
return Node(**kwargs)
[docs]class FileObjectNotFound(Exception):
""" raised if url not found in the file store """
pass
[docs]class FileStoreError(Exception):
""" base exception class for FileStore objects """
pass
[docs]class FileObject(object):
""" represents a file object from the file store """
def __init__(self, name, path=None):
self.name = name
if path is not None:
self.name = os.path.join(path, name)
self.type, self.encoding = mimetypes.guess_type(self.name)
def __repr__(self):
return "FileObject(name=%s, type=%s)" % (self.name, self.type)
[docs]class FileStore(object):
""" represents the file store """
def __init__(self, path):
""" creates a FileStore object at the specified root. """
self.path = path
self._cache = dict()
def __repr__(self):
return "FileStore(path=%s)" % self.path
def _transform(self, filepath):
""" combine the filepath with FileStore path """
if not str(filepath).startswith(self.path):
filepath = filepath[1:] if filepath[0] == '/' else filepath
filepath = os.path.join(self.path, filepath)
return filepath
[docs] def add_file(self, filepath):
raise NotImplementedError
[docs] def exists(self, filepath):
filepath = self._transform(filepath)
return os.path.exists(filepath)
[docs] def get_file(self, filepath):
filepath = self._transform(filepath)
if not self.exists(filepath):
raise FileObjectNotFound(filepath)
if filepath in self._cache:
return self._cache[filepath]
obj = FileObject(filepath)
self._cache[filepath] = obj
return obj
[docs] def delete_file(self, filepath):
raise NotImplementedError
[docs]def create_file_store(name, basepath=None):
""" creates a new FileStore object """
if basepath is None:
basepath = ztpserver.config.runtime.default.data_root
name = name[1:] if str(name[0]).startswith('/') else name
basepath = os.path.join(basepath, name)
log.debug("create_file_store: basepath is %s" % basepath)
if not os.path.exists(basepath):
log.debug('invalid basepath, not creating FileStore instance')
raise FileStoreError('invalid path %s' % basepath)
log.debug('creating FileStore[%s] with basepath=%s' % (name, basepath))
return FileStore(basepath)