diff --git a/agkyra/agkyra/gui.py b/agkyra/agkyra/gui.py index b622ab2373014b1005cc32d954ee3f8df5356d20..25c6804ea7a6abfaae53e8df4d936e190f20a6b0 100644 --- a/agkyra/agkyra/gui.py +++ b/agkyra/agkyra/gui.py @@ -20,11 +20,10 @@ LOG = logging.getLogger(__name__) class GUI(WebSocketBaseClient): """Launch the GUI when the helper server is ready""" - def __init__(self, addr, gui_exec_path, gui_id): + def __init__(self, addr, gui_id): """Initialize the GUI Launcher""" super(GUI, self).__init__(addr) self.addr = addr - self.gui_exec_path = gui_exec_path self.gui_id = gui_id self.start = self.connect @@ -39,11 +38,10 @@ class GUI(WebSocketBaseClient): with NamedTemporaryFile(delete=False) as fp: json.dump(dict(gui_id=self.gui_id, address=self.addr), fp) # subprocess.call blocks the execution - LOG.debug('RUN: %s %s' % (self.gui_exec_path, fp.name)) + LOG.debug('RUN: %s' % (fp.name)) subprocess.call([ - '/home/saxtouri/node-webkit-v0.11.6-linux-x64/nw', - # self.gui_exec_path, - abspath('gui/gui.nw'), + abspath('agkyra/nwjs/nw'), + abspath('agkyra/gui.nw'), fp.name, '--data-path', abspath('~/.agkyra')]) LOG.debug('GUI process closed, remove temp file') @@ -85,11 +83,11 @@ class HelperServer(object): t.join() -def run(gui_exec_path): +def run(): """Prepare helper and GUI and run them in the proper order""" server = HelperServer() addr = 'ws://localhost:%s' % server.port - gui = GUI(addr, gui_exec_path, server.gui_id) + gui = GUI(addr, server.gui_id) LOG.info('Start helper server') server.start() diff --git a/agkyra/agkyra/gui/menu.html b/agkyra/agkyra/gui/menu.html index bcba22bbcafb643bebd7e71c2038a9330d92d8dd..194aeb333b22c9a5f204133f34bf5c6745f5f574 100644 --- a/agkyra/agkyra/gui/menu.html +++ b/agkyra/agkyra/gui/menu.html @@ -4,6 +4,7 @@ <body> <script src="protocol.js"></script> <script src="settings.js"></script> + <script src="static/js/jquery.js"></script> <script type="text/javascript"> // Setup GUI @@ -69,9 +70,8 @@ var pithos_page_menu = new gui.MenuItem({ icon: 'images/pithos.png', enabled: false, click: function () { - var pithos_ui = globals['settings']['pithos_ui']; - console.log('Visit ' + pithos_ui); - gui.Shell.openExternal(pithos_ui); + console.log('Visit ' + get_pithos_ui()); + gui.Shell.openExternal(get_pithos_ui()); } }); menu.append(pithos_page_menu); @@ -123,6 +123,7 @@ menu.append(new gui.MenuItem({ // Update progress var client_ready = false; window.setInterval(function() { + var menu_modified = false; if (!client_ready) { if (globals.authenticated) { settings_menu.enabled = true; @@ -132,11 +133,18 @@ window.setInterval(function() { if (client_ready) { if (!pithos_page_menu.enabled) { - // GET pithos page with tokenless operations + if ((get_pithos_ui() == null) && (globals.settings.url)) { + refresh_endpoints(globals.settings.url); + } + if (get_pithos_ui() != null) { + pithos_page_menu.enabled = true; + tray.menu = menu; + } } if (!local_folder_menu.enabled) { if (globals.settings.directory) { local_folder_menu.enabled = true; + tray.menu = menu; } } } @@ -144,7 +152,6 @@ window.setInterval(function() { var status = globals['status']; var new_progress = progress_item.label; var new_pause = pause_item.label; - var menu_modified = false; if (status['paused'] !== null) { switch(pause_item.label) { case pause_syncing: if (status['paused']) { diff --git a/agkyra/agkyra/gui/protocol.js b/agkyra/agkyra/gui/protocol.js index 87b56e8877c023255210ecf6d45d85009fd3e0e1..58bce87961be826dd0af836d6f2eade9ed1ef925 100644 --- a/agkyra/agkyra/gui/protocol.js +++ b/agkyra/agkyra/gui/protocol.js @@ -16,11 +16,10 @@ var globals = { 'url': null, 'container': null, 'directory': null, - 'pithos_ui': null, 'exclude': null }, 'status': {"progress": null, "paused": null}, - 'authenticated': false + 'authenticated': false, } // Protocol: requests ::: responses @@ -66,7 +65,7 @@ socket.onopen = function() { } socket.onmessage = function(e) { var r = JSON.parse(e.data) - //console.log('RECV: ' + r['action']) + console.log('RECV: ' + r['action']) switch(r['action']) { case 'post gui_id': if (r['ACCEPTED'] === 202) { @@ -87,7 +86,7 @@ socket.onmessage = function(e) { } break; case 'get settings': - console.log(r); + // console.log(r); globals['settings'] = r; break; case 'put settings': diff --git a/agkyra/agkyra/gui/settings.html b/agkyra/agkyra/gui/settings.html index 597573468df557b723c91a9fae55d615ae5b298d..9233fac140bd7b450708f644744daa13ba7f99d0 100644 --- a/agkyra/agkyra/gui/settings.html +++ b/agkyra/agkyra/gui/settings.html @@ -23,8 +23,7 @@ $('#exclude').val( fs.readFileSync(exclude, encoding='utf-8')); } catch (err) {console.log(err);} - var pithos_ui = get_setting('pithos_ui'); - if (pithos_ui) { + if (get_pithos_ui()) { $('#get_creds').show(); } else { console.log('No pithos view, remove credential button'); @@ -48,14 +47,15 @@ } var gui = require('nw.gui'); - function extract_cookie(url) { + function get_credentials() { var cookie_name = '_pithos2_a'; - var logout_url = 'https://accounts.okeanos.grnet.gr/ui/logout' - var w = gui.Window.open(logout_url, { + var account_ui = get_account_ui() + var w = gui.Window.open(account_ui + '/logout', { focus: false, width: 20, height: 20 }); w.close(); - var w = gui.Window.open(logout_url, { + var next = get_pithos_ui(); + var w = gui.Window.open(account_ui + '/login?next=' + next, { focus: true, width: 520, height: 920 }); w.cookies.onChanged.addListener(function(info) { @@ -66,11 +66,6 @@ } }); } - - function get_credentials() { - var pithos_ui = get_setting('pithos_ui'); - extract_cookie(pithos_ui); - } </script> </head> <body> @@ -90,7 +85,7 @@ </div> <div class="small-9 columns"> <input type="text" id="cloud-url" placeholder="Authentication URL" - onchange="set_setting('url', $(this).val())"> + onchange="set_setting('url', $(this).val()); refresh_endpoints($(this).val())"> <small class="error" style="visibility: hidden">Invalid entry</small> </div> </div> diff --git a/agkyra/agkyra/gui/settings.js b/agkyra/agkyra/gui/settings.js index 0df6d76633f5de0bff08bf8621ef9166344800f5..a3d1e91b6fe8c1f0acea8a2e056663ffe177d630 100644 --- a/agkyra/agkyra/gui/settings.js +++ b/agkyra/agkyra/gui/settings.js @@ -17,3 +17,33 @@ function get_setting(key) { function set_setting(key, val) { global.settings[key] = val; } + +function refresh_endpoints(identity_url) { + $.post(identity_url + '/tokens', function(data) { + var endpoints = data.access.serviceCatalog + global.pithos_ui = null; + global.account_ui = null; + $.each(endpoints, function(i, endpoint) { + switch(endpoint.type) { + case 'object-store': try { + global.pithos_ui = endpoint['endpoints'][0]['SNF:uiURL']; + } catch(err) { console.log('Failed to get pithos_ui ' + err); } + break; + case 'account': try { + global.account_ui = endpoint['endpoints'][0]['SNF:uiURL']; + } catch(err) { console.log('Failed to get account_ui ' + err); } + break; + } + }); + }); +} + +function get_pithos_ui() { + if (global.pithos_ui) {return global.pithos_ui;} + else {return null;} +} + +function get_account_ui() { + if (global.account_ui) {return global.account_ui;} + else {return null;} +}