diff --git a/agkyra/agkyra/gui/menu.html b/agkyra/agkyra/gui/menu.html index 193f9edf71f37cdfd492cb310706fd4e1605b05c..383bb74ee2802210f3895d643b7a5b70a7c6861f 100644 --- a/agkyra/agkyra/gui/menu.html +++ b/agkyra/agkyra/gui/menu.html @@ -85,16 +85,24 @@ var settings_menu = new gui.MenuItem({ click: function () { export_settings(globals.settings); if (windows['settings']) windows['settings'].close(); + var old_settings = {}; + $.each(globals.settings, function(key, val) {old_settings[key]=val;}); windows['settings'] = gui.Window.open("settings.html", { toolbar: false, focus: true, width: 841, height: 520 }); windows['settings'].on('closed', function() { - new_settings = import_settings(); - console.log('Settings windows is closed, PUT'); - put_settings(socket, new_settings); - get_status(socket); - get_settings(socket); + console.log('Settings windows is closed'); + var new_settings = import_settings(); + $.each(new_settings, function(key, setting) { + if (old_settings[key] !== setting) { + console.log('Settings have been modified - updating...'); + put_settings(socket, new_settings); + get_status(socket); + get_settings(socket); + return false; + } + }); }); }, }); diff --git a/agkyra/agkyra/protocol.py b/agkyra/agkyra/protocol.py index 9600a3414db6f031dff9475fa57b0dabd1b0d33b..f6cef082551918bf0a2ecdfd54d7985348a0f811 100644 --- a/agkyra/agkyra/protocol.py +++ b/agkyra/agkyra/protocol.py @@ -2,7 +2,7 @@ from ws4py.websocket import WebSocket import json import logging from os.path import abspath -from agkyra.syncer import syncer +from agkyra.syncer import syncer, setup, pithos_client, localfs_client from agkyra.config import AgkyraConfig @@ -71,6 +71,7 @@ class WebSocketProtocol(WebSocket): status = dict(progress=0, paused=True, can_sync=False) file_syncer = None cnf = AgkyraConfig() + essentials = ('url', 'token', 'container', 'directory') def _get_default_sync(self): """Get global.default_sync or pick the first sync as default @@ -154,14 +155,31 @@ class WebSocketProtocol(WebSocket): def can_sync(self): """Check if settings are enough to setup a syncing proccess""" - return all([self.settings.get(key, False) for key in ( - 'url', 'token', 'directory', 'container')]) + return all([self.settings[e] for e in self.essentials]) + + def _essentials_changed(self, new_settings): + """Check if essential settings have changed in new_settings""" + return all([ + self.settings[e] == self.settings[e] for e in self.essentials]) + + def init_sync(self): + """Initialize syncer""" + sync = self._get_default_sync() + syncer_settings = setup.SyncerSettings( + sync, + self.settings['url'], self.settings['token'], + self.settings['container'], self.settings['directory'], + ignore_ssl=True) + master = pithos_client.PithosFileClient(syncer_settings) + slave = localfs_client.LocalfsFileClient(syncer_settings) + self.syncer = syncer.FileSyncer(syncer_settings, master, slave) + self.syncer_settings = syncer_settings + self.syncer.probe_and_sync_all() # Syncer-related methods def get_status(self): - from random import randint - if self.status['progress'] < 100: - self.status['progress'] += 0 if randint(0, 2) else 1 + self.status['paused'] = self.syncer.paused + self.status['progress'] = 50 self.status['can_sync'] = self.can_sync() return self.status @@ -169,17 +187,29 @@ class WebSocketProtocol(WebSocket): return self.settings def set_settings(self, new_settings): + # Prepare setting save + could_sync = self.can_sync() + was_active = not self.syncer.paused + if could_sync and was_active: + self.pause_sync() + must_reset_syncing = self._essentials_changed(new_settings) + + # save settings self.settings = new_settings self._dump_settings() + # Restart + if self.can_sync(): + if must_reset_syncing or not could_sync: + self.init_sync() + elif was_active: + self.start_sync() + def pause_sync(self): - self.status['paused'] = True + self.syncer.pause_decide() def start_sync(self): - if self.can_sync(): - self.status['paused'] = False - else: - self.status['paused'] = True + self.syncer.start_decide() # WebSocket connection methods def opened(self): @@ -207,6 +237,9 @@ class WebSocketProtocol(WebSocket): self.send_json({'OK': 200, 'action': 'post %s' % action}) elif r['gui_id'] == self.gui_id: self._load_settings() + if self.can_sync(): + self.init_sync() + self.pause_sync() self.accepted = True self.send_json({'ACCEPTED': 202, 'action': 'post gui_id'}) else: