예제 #1
0
def get_session():
    SWIFT_USER = get_reg_value('HKLM', APP_STORAGE_REG_KEY, 'account')
    SWIFT_PASS = get_reg_value('HKLM', APP_STORAGE_REG_KEY, 'password')
    SWIFT_KEY = get_reg_value('HKLM', APP_STORAGE_REG_KEY, 'key')
    SWIFT_AUTH_URL = get_reg_value('HKLM', APP_STORAGE_REG_KEY, 'auth_url')
    cnx = Connection(SWIFT_AUTH_URL, '%s:%s' % (SWIFT_USER,SWIFT_PASS), SWIFT_KEY)
    cnx.get_auth()
    return cnx
예제 #2
0
    def run ( self ):

        try:
            port = get_reg_value(key=APP_REG_KEY, name='port')
            host = get_reg_value(key=APP_REG_KEY, name='host')
            bottle_run(__bottle_app__, host=host, port=port,
                        server=WSGIRefHandleOneServer, reloader=False,
                        quiet=True, notifyEvent=self.notifyEvent)
        except:
            log.error('Error in WebServerThread', exc_info=True)
예제 #3
0
    def __init__(self):
        import servicemanager

        dsn = get_reg_value('HKLM', APP_REG_KEY, 'sentry_dsn')
        # Need to do some error catching so that SentryLogging is disabled if,
        # for some reason the dsn is invalid.
        if not dsn:
            servicemanager.LogErrorMsg('Sentry DSN was not specified.  Logging'
                                       ' to sentry will be disabled')
            self.error = self.warning = self.info = self.critical = \
            self.debug = self.nulloutput
        else:
            sitename = get_reg_value('HKLM', APP_REG_KEY, 'sentry_site')
            self.raven = Client(dsn, site=sitename)
예제 #4
0
def clear_upload_in_progress(dir):
    """ Clear the upload in progress flag for the given directory
    """

    data = get_reg_value('HKLM', APP_DIR_REG_KEY, dir)
    data[DIR_UPLOAD_IN_PROGRESS] = 'false'
    set_reg_value('HKLM', APP_DIR_REG_KEY, dir, data)
예제 #5
0
def get_container():
    """ Return the path of the "App folder".

     By default the "App folder" is "Anaogic Backup"

    """
    return get_reg_value('HKLM', APP_STORAGE_REG_KEY, 'container',
                            default=APP_CONTAINER)
예제 #6
0
def save_settings():
    port = get_reg_value('HKLM', APP_REG_KEY, 'port', default=4242)
    hostname = get_reg_value('HKLM', APP_REG_KEY, 'hostname', default='127.0.0.1')
    sentrydsn = get_reg_value('HKLM', APP_REG_KEY, 'sentry_dsn')
    sentrysite = get_reg_value('HKLM', APP_REG_KEY, 'sentry_site')
    restartneeded = 0
    data = request.forms.settings_hostname
    if data:
        parts = data.split(':')
        if hostname <> parts[0].strip():
            log.info("--%s-- | --%s--" % (hostname, parts[0].strip()))
            hostname = parts[0].strip()
            restartneeded = 1
        if len(parts) > 1:
            try:
                if port <> int(parts[1].strip()):
                    port = int(parts[1].strip())
                    log.info("--%d-- | --%d--" % (port, int(parts[1].strip())))
                    restartneeded = 1
            except ValueError:
                log.error('Unable to set port to: %s' % parts[1].strip())

    data = request.forms.sentry_dsn if request.forms.sentry_dsn.lower() <> 'none' else None
    if data and (data <> sentrydsn):
        sentrydsn = data
        restartneeded = 1
    data = request.forms.sentry_site if request.forms.sentry_site.lower() <> 'none' else None
    if data and (data <> sentrysite):
        sentrysite = data
        restartneeded = 1
    swift_key = get_reg_value('HKLM', APP_STORAGE_REG_KEY, 'key')
    if not swift_key:
        swift_key = request.forms.settings_swift_key
    swift_password = get_reg_value('HKLM', APP_STORAGE_REG_KEY, 'password')
    if not swift_password:
        swift_password = request.forms.settings_swift_password
    swift_account = get_reg_value('HKLM', APP_STORAGE_REG_KEY, 'account')
    if not swift_account:
        swift_account = request.forms.settings_swift_account
    swift_auth_url = get_reg_value('HKLM', APP_STORAGE_REG_KEY, 'auth_url')
    if not swift_auth_url:
        swift_auth_url = request.forms.settings_swift_auth_url
    container = request.forms.settings_container
    set_reg_value('HKLM', APP_REG_KEY, 'hostname', hostname)
    set_reg_value('HKLM', APP_REG_KEY, 'port', port)
    set_reg_value('HKLM', APP_REG_KEY, 'restartneeded', restartneeded)
    set_reg_value('HKLM', APP_STORAGE_REG_KEY, 'container', container)
    set_reg_value('HKLM', APP_STORAGE_REG_KEY, 'key', swift_key)
    set_reg_value('HKLM', APP_STORAGE_REG_KEY, 'password', swift_password)
    set_reg_value('HKLM', APP_STORAGE_REG_KEY, 'account', swift_account)
    set_reg_value('HKLM', APP_STORAGE_REG_KEY, 'auth_url', swift_auth_url)
    set_reg_value('HKLM', APP_REG_KEY, 'sentry_dsn', sentrydsn)
    set_reg_value('HKLM', APP_REG_KEY, 'sentry_site', sentrysite)
    redirect('/index.html')
예제 #7
0
def pending_changes(dir):
    """ Return whether there are pending changes to be synced for the given dir

    """

    pending = get_reg_value('HKLM', APP_DIR_REG_KEY, dir)
    if len(pending) > DIR_PENDING_CHANGES:
        return pending[DIR_PENDING_CHANGES] == 'true'
    else:
        return False
예제 #8
0
def browse():
    global htdocs, templates

    cnx = get_session()
    container_info = cnx.get_container(get_container())
    restartneeded = get_reg_value('HKLM', APP_REG_KEY, 'restartneeded')
    internal_error = get_reg_value('HKLM', APP_REG_KEY, 'internal_error', False)
    file_data = {
        'template_lookup': [templates,],
        'restartneeded': restartneeded,
        'internalerror': internal_error,
        'dirs': []
    }
    for files in container_info[1]:
        file_data['dirs'].append(
            {
                'path': files['name'],
                'path_encoded': quote(files['name'], safe='').lstrip('/'),
                'changed': files['last_modified'],
                'size': files['bytes']
            }
        )
        continue
    return file_data
예제 #9
0
def unwatch_directory(directory):
    """ Remove the given directory from those being monitored for changes.

    """
    del_reg_value('HKLM', APP_DIR_REG_KEY, directory)
    log.debug('unwatch_directory(%s)' % directory)
    try:
        pipe = get_reg_value('HKLM', APP_REG_KEY, 'namedpipe')
        handle = CreateFile(pipe, GENERIC_WRITE, FILE_SHARE_READ, None,
            OPEN_EXISTING, 0, None)
        WriteFile(handle, 'refreshdirectories')
        CloseHandle(handle)
    except pywintypes.error:
        log.error('Error when calling the namedpipe with the refreshdirectories '
                  'command', culprit=__culprit__)
        pass
예제 #10
0
def get_watched_directory_info(dir):
    """ Return the added and last change times for the directory

    """

    added = changed = ''
    pending = inprogress = False
    tstamps = get_reg_value('HKLM', APP_DIR_REG_KEY, dir)
    num_entries = len(tstamps)
    if num_entries > DIR_ADDED_TIMESTAMP:
        added = tstamps[DIR_ADDED_TIMESTAMP]
    if num_entries > DIR_LAST_SYNC_TIMESTAMP:
        changed = tstamps[DIR_LAST_SYNC_TIMESTAMP]
        if changed == 'None':
            changed = ''
    if num_entries > DIR_PENDING_CHANGES:
        pending = tstamps[DIR_PENDING_CHANGES].lower() == 'true'
    if num_entries > DIR_UPLOAD_IN_PROGRESS:
        inprogress = tstamps[DIR_UPLOAD_IN_PROGRESS].lower() == 'true'
    return (added.strip(), changed.strip(), pending, inprogress)
예제 #11
0
    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        # Looks like py2exe handles redirecting stdout and stderror for us
        #sys.stdout.close()
        #sys.stderr.close()
        #sys.stdout = NullOutput()
        #sys.stderr = NullOutput()
        # Create an event which we will use to wait on.
        # The "service stop" request will set this event.
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
        # Event for named pipe operation
        self.overlapped = pywintypes.OVERLAPPED()
        self.overlapped.hEvent = win32event.CreateEvent(None, 0, 0, None)
        # Internal timer
        self.timer = win32event.CreateWaitableTimer(None, 0, None)

        set_reg_value('HKLM', APP_REG_KEY, 'restartneeded', 0)
        # Setup Named pip for IPC
        pipename = get_reg_value('HKLM', APP_REG_KEY, 'namedpipe')
        self.pipe_handle = None
        if not pipename:
            log.error('No named pipe was specified in the registry',
                        culprit=__culprit__)
            self.SvcStop()
        else:
            openmode = PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED
            pipmode = PIPE_TYPE_MESSAGE
            sa = pywintypes.SECURITY_ATTRIBUTES()
            sa.SetSecurityDescriptorDacl(1, None, 0)
            self.pipe_handle = CreateNamedPipe(pipename, openmode, pipmode,
                                                PIPE_UNLIMITED_INSTANCES, 0, 0,
                                                0, sa)

        # Initialize a list of watched handles
        self.handles = list()
        self.mgmt_handles = list()
        self.mgmt_callbacks = list()
예제 #12
0
def upload_in_progress(dir):
    """ Returns whether an upload is in progress
    """
    data = get_reg_value('HKLM', APP_DIR_REG_KEY, dir)
    return data[DIR_UPLOAD_IN_PROGRESS].lower() == 'true'
예제 #13
0
from swiftclient import ClientException, quote

# Local imports
from anagogic.backup.util import get_reg_value, APP_REG_KEY, set_reg_value
from anagogic.backup.storage import get_session
from anagogic.backup.storage import create_container, get_container
from anagogic.backup.storage import app_container_exists, APP_STORAGE_REG_KEY
from anagogic.backup.watch import get_watched_directories, get_watched_directory_info
from anagogic.backup.watch import unwatch_directory

__all__ = [
    'app',
]

__culprit__ = 'anagogic.backup.web.admin'
htdocs = get_reg_value('HKLM', APP_REG_KEY, 'htdocs')
templates = get_reg_value('HKLM', APP_REG_KEY, 'templates')
TEMPLATE_PATH = [templates]

debug(True)
app = Bottle()

def check_internal_error(fn):
    def wrap_error(*args, **kwargs):
        try:
            set_reg_value('HKLM', APP_REG_KEY, 'internal_error', False)
            fn(*args, **kwargs)
        except rest.ErrorResponse, e:
            log.error('Application auth callback failure', exc_info=True,
                culprit=__culprit__)
            set_reg_value('HKLM', APP_REG_KEY, 'internal_error', True)
예제 #14
0
# Stdlib imports
import sys

# 3rd party imports
import pywintypes
from win32file import CreateFile, GENERIC_WRITE, FILE_SHARE_READ, OPEN_EXISTING
from win32file import WriteFile, CloseHandle

# Local imports
from anagogic.backup.util import get_reg_value, APP_REG_KEY
from anagogic.backup.watch import get_watched_directories, add_watch_directory

if __name__ == '__main__':
    dir_to_watch = sys.argv[1]
    pipe = get_reg_value('HKLM', APP_REG_KEY, 'namedpipe')
    watched_dirs = get_watched_directories()
    if dir_to_watch not in watched_dirs:
        add_watch_directory(dir_to_watch)
    try:
        handle = CreateFile(pipe, GENERIC_WRITE, FILE_SHARE_READ, None,
                            OPEN_EXISTING, 0, None)
        WriteFile(handle, 'refreshdirectories')
        CloseHandle(handle)
    except pywintypes.error:
        # The named pipe wasn't ready which should indicate that the service
        # isn't started.  We can ignore this since the watch list will be
        # loaded when the service starts
        pass

예제 #15
0
    def SvcDoRun(self):
        import servicemanager

        # log a service started message
        servicemanager.LogMsg(
            servicemanager.EVENTLOG_INFORMATION_TYPE,
            servicemanager.PYS_SERVICE_STARTED,
            (self._svc_name_, ' (%s)' % self._svc_display_name_))
        try:
            # Spawn off web server
            self.thread_event = Event()
            self.thread_event.set()
            log.info('Before try block to spawn thread')
            try:
                if self._svc_thread_class:
                    log.info('Thread class specified, instantiating now')
                    self.service_thread = self._svc_thread_class(self.thread_event)
                    log.info('Thread instantiated, starting thread')
                    self.service_thread.start()
                    log.info('Thread started')
                else:
                    log.error("No Service thread was provided", culprit=__culprit__)
                    self.SvcStop()
            except Exception, info:
                log.error('Uncaught error in thread', exc_info=True, culprit=__culprit__)
                errmsg = getTrace()
                servicemanager.LogErrorMsg(errmsg)
                self.SvcStop()

            # Start watching directories
            self.mgmt_handles = []

            self.handles = watch_directories()
            self.add_mgmt_event_handler(self.timer, self.process_timer)
            self.add_mgmt_event_handler(self.overlapped.hEvent,
                                        self.process_named_pipe)
            self.add_mgmt_event_handler(self.hWaitStop,
                                        lambda a, b, c: True)
            self.handles.extend(self.mgmt_handles)

            # Set internal timer
            # default to 2 minute period
            timer_period = get_reg_value('HKLM', APP_REG_KEY, 'timer',
                                          default=120000)
            win32event.SetWaitableTimer(self.timer, 0, timer_period, None, None,
                                        False)

            while 1:
                hr = ConnectNamedPipe(self.pipe_handle, self.overlapped)

                rc = win32event.WaitForMultipleObjects(self.handles, 0,
                    win32event.INFINITE)

                if rc == win32event.WAIT_FAILED:
                    log.error('WAIT_FAILED for unknown reason')
                    self.SvcStop()
                    break
                elif rc == win32event.WAIT_TIMEOUT:
                    log.error('WAIT_TIMEOUT: This should NEVER happen')
                    pass
                elif (rc >= win32event.WAIT_OBJECT_0) and \
                     (rc < (len(self.handles) - len(self.mgmt_handles))):
                    process_directory_changes(self.handles[rc], rc)
                else:
                    offset = rc - len(self.handles) + len(self.mgmt_handles)
                    dobreak = self.mgmt_callbacks[offset](rc, self.handles,
                                                          self.mgmt_handles)
                    if dobreak:
                        break
                continue