diff options
Diffstat (limited to 'g_sorcery/syncer.py')
-rw-r--r-- | g_sorcery/syncer.py | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/g_sorcery/syncer.py b/g_sorcery/syncer.py new file mode 100644 index 0000000..beeffd4 --- /dev/null +++ b/g_sorcery/syncer.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" + syncer.py + ~~~~~~~~~ + + sync helper + + :copyright: (c) 2013-2015 by Jauhien Piatlicki + :license: GPL-2, see LICENSE for more details. +""" + +import glob +import os + +from .compatibility import TemporaryDirectory + +from .exceptions import SyncError +from .fileutils import wget + + +class SyncedData(object): + """ + Synced data. + + Directory with sync data is guaranted to exist only as long as this + object does. + """ + def __init__(self, directory): + self.directory = os.path.abspath(directory) + + def get_path(self): + return self.directory + + +class TmpSyncedData(SyncedData): + """ + Synced data that lives in a temporary directory. + """ + + def __init__(self, directory, tmpdirobj): + super(TmpSyncedData, self).__init__(directory) + self.tmpdirobj = tmpdirobj + + +class Syncer(object): + """ + Class used to sync data with remote source. + """ + + def __init__(self, persistent_datadir): + self.persistent_datadir = persistent_datadir + + def sync(self, db_uri, repository_config): + """ + Synchronize local directory with remote source. + + Args: + db_uri: URI for synchronization with remote source. + repository_config: repository config. + + Returns: + SyncedData object that gives access to the directory with data. + """ + raise NotImplementedError + + +class TGZSyncer(Syncer): + """ + Class used to download and unpack tarballs. + """ + + def sync(self, db_uri, repository_config): + """ + Synchronize local directory with remote source. + + Args: + db_uri: URI for synchronization with remote source. + repository_config: repository config. + + Returns: + SyncedData object that gives access to the directory with data. + """ + download_dir = TemporaryDirectory() + if wget(db_uri, download_dir.name): + raise SyncError('sync failed: ' + db_uri) + + tmp_dir = TemporaryDirectory() + for f_name in glob.iglob(os.path.join(download_dir.name, '*.tar.gz')): + if os.system("tar -xvzf " + f_name + " -C " + tmp_dir.name): + raise SyncError('sync failed (unpacking)') + + tmp_path = os.path.join(tmp_dir.name, os.listdir(tmp_dir.name)[0]) + del download_dir + return TmpSyncedData(tmp_path, tmp_dir) + + +SUPPORTED_SYNCERS = {"tgz": TGZSyncer} + +# git_syncer module is optional, we should check if it is installed +try: + from .git_syncer.git_syncer import GITSyncer + SUPPORTED_SYNCERS["git"] = GITSyncer + +except ImportError as e: + pass |