From ab41bf0c26d1f332be47a2e84c6614dcaa89d79c Mon Sep 17 00:00:00 2001
From: Giorgos Korfiatis <gkorf@grnet.gr>
Date: Sun, 8 Nov 2015 15:48:27 +0200
Subject: [PATCH] Decouple auth, init and start

Use new statuses 'SETTINGS READY' and 'READY'.
---
 agkyra/cli.py                           |  9 ++++---
 agkyra/protocol.py                      | 31 +++++++++++--------------
 agkyra/protocol_client.py               | 11 +++++++++
 agkyra/resources/nwgui/menu.html        |  6 +++++
 agkyra/resources/nwgui/protocol.js      |  6 +++++
 agkyra/resources/ui_data/common_el.json |  4 ++++
 agkyra/resources/ui_data/common_en.json |  4 ++++
 7 files changed, 50 insertions(+), 21 deletions(-)

diff --git a/agkyra/cli.py b/agkyra/cli.py
index d411198..54b1b7d 100644
--- a/agkyra/cli.py
+++ b/agkyra/cli.py
@@ -434,7 +434,10 @@ class AgkyraCLI(cmd.Cmd):
         self.make_server_if_needed()
         client = self.client
         status = client.get_status()
-        if status['code'] == STATUS['PAUSED']:
+        if status['code'] == STATUS['SETTINGS READY']:
+            client.init()
+        status = client.get_status()
+        if status['code'] in [STATUS['PAUSED'], STATUS['READY']]:
             client.start()
             sys.stderr.write('Starting syncer ... ')
             try:
@@ -442,7 +445,7 @@ class AgkyraCLI(cmd.Cmd):
                 sys.stderr.write('OK\n')
             except protocol_client.UIClientError as uice:
                 sys.stderr.write('%s\n' % uice)
-        else:
+        elif status['code'] == STATUS['SYNCING']:
             sys.stderr.write('Already ')
         sys.stderr.flush()
         self.do_status(line)
@@ -501,7 +504,7 @@ class AgkyraCLI(cmd.Cmd):
             return
         session = self.helper.load_active_session()
         if not session:
-            self._start('')
+            self.make_server_if_needed()
             session = self.helper.wait_session_to_load()
         if session:
             LOGGER.info('Start new GUI')
diff --git a/agkyra/protocol.py b/agkyra/protocol.py
index 505a862..16da13f 100644
--- a/agkyra/protocol.py
+++ b/agkyra/protocol.py
@@ -477,7 +477,7 @@ class WebSocketProtocol(WebSocket):
         """Check if settings are enough to setup a syncing proccess"""
         return all([self.settings[e] for e in self.essentials])
 
-    def init_sync(self):
+    def init_sync(self, leave_paused=False):
         """Initialize syncer"""
         self.set_status(code=STATUS['INITIALIZING'])
         sync = self._get_default_sync()
@@ -531,7 +531,8 @@ class WebSocketProtocol(WebSocket):
                     break
             if local_ok and remote_ok:
                 syncer_.initiate_probe()
-                self.set_status(code=STATUS['PAUSED'])
+                new_status = 'PAUSED' if leave_paused else 'READY'
+                self.set_status(code=STATUS[new_status])
         except pithos_client.ClientError as ce:
             LOGGER.debug('backend init failed: %s %s' % (ce, ce.status))
             try:
@@ -556,7 +557,8 @@ class WebSocketProtocol(WebSocket):
         # Prepare setting save
         could_sync = self.syncer and self.can_sync()
         old_status = self.get_status('code')
-        active = (STATUS['SYNCING'], STATUS['PAUSING'], STATUS['PAUSED'])
+        ok_not_syncing = [STATUS['READY'], STATUS['PAUSING'], STATUS['PAUSED']]
+        active = ok_not_syncing + [STATUS['SYNCING']]
 
         must_reset_syncing = self._essentials_changed(new_settings)
         if must_reset_syncing and old_status in active:
@@ -572,14 +574,10 @@ class WebSocketProtocol(WebSocket):
         self._load_settings()
         can_sync = must_reset_syncing and self.can_sync()
         if can_sync:
+            leave_paused = old_status in ok_not_syncing or \
+                           not self.settings.get('sync_on_start', False)
             LOGGER.debug('Restart backend')
-            self.init_sync()
-            new_status = self.get_status('code')
-            if new_status in active:
-                must_sync = old_status == STATUS['SYNCING'] or (
-                    old_status not in active and (
-                        self.settings.get('sync_on_start', False)))
-                (self.start_sync if must_sync else self.pause_sync)()
+            self.init_sync(leave_paused=leave_paused)
 
     def _pause_syncer(self):
         syncer_ = self.syncer
@@ -604,8 +602,7 @@ class WebSocketProtocol(WebSocket):
         self.set_status(code=STATUS['INITIALIZING'])
         self.syncer.settings.purge_db_archives_and_enable()
         self.syncer.initiate_probe()
-        self.syncer.start_decide()
-        self.set_status(code=STATUS['SYNCING'])
+        self.set_status(code=STATUS['READY'])
 
     def send_json(self, msg):
         LOGGER.debug('send: %s' % msg)
@@ -623,6 +620,7 @@ class WebSocketProtocol(WebSocket):
                 self.clean_db()
                 return
             {
+                'init': self.init_sync,
                 'start': self.start_sync,
                 'pause': self.pause_sync,
                 'force': self.force_sync
@@ -632,12 +630,9 @@ class WebSocketProtocol(WebSocket):
             self.accepted = True
             self.send_json({'ACCEPTED': 202, 'action': 'post ui_id'})
             self._load_settings()
-            if (not self.syncer) and self.can_sync():
-                self.init_sync()
-                status = self.get_status('code')
-                if self.syncer and self.settings['sync_on_start'] and \
-                   status == STATUS["PAUSED"]:
-                    self.start_sync()
+            status = self.get_status('code')
+            if self.can_sync() and status == STATUS['UNINITIALIZED']:
+                self.set_status(code=STATUS['SETTINGS READY'])
         else:
             action = r.get('path', 'ui_id')
             self.send_json({'REJECTED': 401, 'action': 'post %s' % action})
diff --git a/agkyra/protocol_client.py b/agkyra/protocol_client.py
index 8d544a4..27c2aba 100644
--- a/agkyra/protocol_client.py
+++ b/agkyra/protocol_client.py
@@ -93,6 +93,7 @@ class UIClient(WebSocketClient):
         msg = json.loads('%s' % m)
         {
             'post ui_id': self.recv_authenticate,
+            'post init': self.recv_init,
             'post start': self.recv_start,
             'post pause': self.recv_pause,
             'get status': self.recv_get_status,
@@ -111,6 +112,11 @@ class UIClient(WebSocketClient):
                 'Client authentication failed', response=msg)
         self.ready = True
 
+    def recv_init(self, msg):
+        """Receive: init response"""
+        if 'OK' not in msg:
+            raise UnexpectedResponseError('Init failed', response=msg)
+
     def recv_start(self, msg):
         """Receive: start response"""
         if 'OK' not in msg:
@@ -145,6 +151,11 @@ class UIClient(WebSocketClient):
         self.wait_until_ready()
         self._post('shutdown')
 
+    def init(self):
+        """Request: POST INIT"""
+        self.wait_until_ready()
+        self._post('init')
+
     def start(self):
         """Request: POST START"""
         self.wait_until_ready()
diff --git a/agkyra/resources/nwgui/menu.html b/agkyra/resources/nwgui/menu.html
index b8405a6..5feaf57 100644
--- a/agkyra/resources/nwgui/menu.html
+++ b/agkyra/resources/nwgui/menu.html
@@ -239,6 +239,8 @@ window.setInterval(function() {
   var dialogue_msg = null;
   var status_unchanged = (old_status == globals.status.code);
   switch(globals.status.code) {
+    case STATUS['SETTINGS READY']:
+      if (!status_unchanged) post_init(socket);
     case STATUS['UNINITIALIZED']:
     case STATUS['INITIALIZING']:
     case STATUS['SHUTING DOWN']:
@@ -247,6 +249,10 @@ window.setInterval(function() {
       new_pause = COMMON.MENU.INACTIVE;
       tray_icon_off = true;
     break;
+    case STATUS['READY']:
+      if (status_unchanged) break;
+      post_start(socket);
+    break;
     case STATUS['SYNCING']:
       notify('info');
       activate_menu();
diff --git a/agkyra/resources/nwgui/protocol.js b/agkyra/resources/nwgui/protocol.js
index 092ac4f..42f7713 100644
--- a/agkyra/resources/nwgui/protocol.js
+++ b/agkyra/resources/nwgui/protocol.js
@@ -79,6 +79,11 @@ function post_start(socket) {
   send_json(socket, {'method': 'post', 'path': 'start'});
 } // expected response: {"OK": 200}
 
+function post_init(socket) {
+  log_debug('SEND post init');
+  send_json(socket, {'method': 'post', 'path': 'init'});
+} // expected response: {"OK": 200}
+
 function post_force(socket) {
   log_debug('SEND post force');
   send_json(socket, {'method': 'post', 'path': 'force'});
@@ -130,6 +135,7 @@ socket.onmessage = function(e) {
     break;
     case 'post start':
     case 'post pause':
+    case 'post init':
       log_debug('RECV ' + r['OK']);
       if (r['OK'] === 200) {
         get_status(this);
diff --git a/agkyra/resources/ui_data/common_el.json b/agkyra/resources/ui_data/common_el.json
index ada0ac2..e7d0ec7 100644
--- a/agkyra/resources/ui_data/common_el.json
+++ b/agkyra/resources/ui_data/common_el.json
@@ -3,6 +3,8 @@
         "UNINITIALIZED": 0,
         "INITIALIZING": 1,
         "SHUTTING DOWN": 2,
+        "SETTINGS READY": 5,
+        "READY": 10,
         "SYNCING": 100,
         "PAUSING": 101,
         "PAUSED": 102,
@@ -17,6 +19,8 @@
         "0": "Ξ‘Ξ½Ξ΅Ξ½Ξ΅ΟΞ³ΟŒ",
         "1": "Εκκίνηση ...",
         "2": "ΞšΞ»Ξ΅Ξ―ΟƒΞΉΞΌΞΏ",
+        "5": "Ξ‘Ξ½Ξ΅Ξ½Ξ΅ΟΞ³ΟŒ",
+        "10": "ΣΡ παύση",
         "100": "ΣΡ ΟƒΟ…Ξ³Ο‡ΟΞΏΞ½ΞΉΟƒΞΌΟŒ",
         "101": "ΣΡ διαδικασία παύσης",
         "102": "ΣΡ παύση",
diff --git a/agkyra/resources/ui_data/common_en.json b/agkyra/resources/ui_data/common_en.json
index 9f2f602..ff28352 100644
--- a/agkyra/resources/ui_data/common_en.json
+++ b/agkyra/resources/ui_data/common_en.json
@@ -3,6 +3,8 @@
         "UNINITIALIZED": 0,
         "INITIALIZING": 1,
         "SHUTTING DOWN": 2,
+        "SETTINGS READY": 5,
+        "READY": 10,
         "SYNCING": 100,
         "PAUSING": 101,
         "PAUSED": 102,
@@ -17,6 +19,8 @@
         "0": "Not initialized",
         "1": "Initializing ...",
         "2": "Shutting down",
+        "5": "Not initialized",
+        "10": "Paused",
         "100": "Syncing",
         "101": "Pausing",
         "102": "Paused",
-- 
GitLab