diff --git a/server-console/src/main.js b/server-console/src/main.js index c47308aed6..358422dff1 100644 --- a/server-console/src/main.js +++ b/server-console/src/main.js @@ -486,6 +486,76 @@ function updateTrayMenu(serverState) { const httpStatusPort = 60332; +function deleteResourceDirectories() { + const dsResourceDirectory = getDomainServerClientResourcesDirectory(); + try { + fs.removeSync(dsResourceDirectory); + console.log("Deleted directory " + dsResourceDirectory); + } catch (e) { + console.log(e); + } + const acResourceDirectory = getAssignmentClientResourcesDirectory(); + try { + fs.removeSync(acResourceDirectory); + console.log("Deleted directory " + acResourceDirectory); + } catch (e) { + console.log(e); + } +} + +function deleteResourceDirectoriesAndRestart() { + homeServer.stop(); + deleteResourceDirectories(); + maybeInstallDefaultContentSet(onContentLoaded); +} + +function checkNewContent() { + // Start downloading content set + var req = request.head({ + url: "http://cachefly.highfidelity.com/home.tgz" + }, function (error, response, body) { + if (error === null) { + var localContent = Date.parse(userConfig.get('homeContentLastModified')); + var remoteContent = Date.parse(response.headers['last-modified']); + + var shouldUpdate = isNaN(localContent) || (!isNaN(remoteContent) && (remoteContent > localContent)); + + var wantDebug = false; + if (wantDebug) { + console.log('Last Modified: ' + response.headers['last-modified']); + console.log(localContent + " " + remoteContent + " " + shouldUpdate + " " + new Date()); + console.log("Remote content is " + (shouldUpdate ? "newer" : "older") + " that local content."); + } + + if (shouldUpdate) { + dialog.showMessageBox({ + type: 'question', + buttons: ['Yes', 'No'], + title: 'New home content', + message: 'A newer version of the home content set is available.\nDo you wish to update?' + }, function(idx) { + if (idx === 0) { + dialog.showMessageBox({ + type: 'question', + buttons: ['Yes', 'No'], + title: 'Are you sure?', + message: 'This action will delete your current sandbox content.\nDo you wish to continue?' + }, function(idx) { + if (idx === 0 && homeServer) { + deleteResourceDirectoriesAndRestart(); + } + }); + } else { + // They don't want to update, mark content set as current + userConfig.set('homeContentLastModified', new Date()); + } + }); + } + } + }); +} + + function maybeInstallDefaultContentSet(onComplete) { // Check for existing data const acResourceDirectory = getAssignmentClientResourcesDirectory(); @@ -517,6 +587,8 @@ function maybeInstallDefaultContentSet(onComplete) { if (userHasExistingACData || userHasExistingDSData) { console.log("User has existing data, suppressing downloader"); onComplete(); + + checkNewContent(); return; } @@ -528,6 +600,7 @@ function maybeInstallDefaultContentSet(onComplete) { return console.error(err) } console.log('Copied home content over to: ' + getRootHifiDataDirectory()); + userConfig.set('homeContentLastModified', new Date()); onComplete(); }); return; @@ -607,6 +680,7 @@ function maybeInstallDefaultContentSet(onComplete) { req.pipe(gunzip).pipe(tar.extract(getRootHifiDataDirectory())).on('error', extractError).on('finish', function(){ // response and decompression complete, return console.log("Finished unarchiving home content set"); + userConfig.set('homeContentLastModified', new Date()); sendStateUpdate('complete'); }); @@ -663,6 +737,62 @@ for (var key in trayIcons) { const notificationIcon = path.join(__dirname, '../resources/console-notification.png'); +function onContentLoaded() { + maybeShowSplash(); + + if (buildInfo.releaseType == 'PRODUCTION') { + var currentVersion = null; + try { + currentVersion = parseInt(buildInfo.buildIdentifier); + } catch (e) { + } + + if (currentVersion !== null) { + const CHECK_FOR_UPDATES_INTERVAL_SECONDS = 60 * 30; + var hasShownUpdateNotification = false; + const updateChecker = new updater.UpdateChecker(currentVersion, CHECK_FOR_UPDATES_INTERVAL_SECONDS); + updateChecker.on('update-available', function(latestVersion, url) { + if (!hasShownUpdateNotification) { + notifier.notify({ + icon: notificationIcon, + title: 'An update is available!', + message: 'High Fidelity version ' + latestVersion + ' is available', + wait: true, + url: url + }); + hasShownUpdateNotification = true; + } + }); + notifier.on('click', function(notifierObject, options) { + console.log("Got click", options.url); + shell.openExternal(options.url); + }); + } + } + + deleteOldFiles(logPath, DELETE_LOG_FILES_OLDER_THAN_X_SECONDS, LOG_FILE_REGEX); + + if (dsPath && acPath) { + domainServer = new Process('domain-server', dsPath, ["--get-temp-name"], logPath); + acMonitor = new ACMonitorProcess('ac-monitor', acPath, ['-n6', + '--log-directory', logPath, + '--http-status-port', httpStatusPort], httpStatusPort, logPath); + homeServer = new ProcessGroup('home', [domainServer, acMonitor]); + logWindow = new LogWindow(acMonitor, domainServer); + + var processes = { + home: homeServer + }; + + // handle process updates + homeServer.on('state-update', function(processGroup) { updateTrayMenu(processGroup.state); }); + + // start the home server + homeServer.start(); + } +} + + // This method will be called when Electron has finished // initialization and is ready to create browser windows. app.on('ready', function() { @@ -682,58 +812,5 @@ app.on('ready', function() { updateTrayMenu(ProcessGroupStates.STOPPED); - maybeInstallDefaultContentSet(function() { - maybeShowSplash(); - - if (buildInfo.releaseType == 'PRODUCTION') { - var currentVersion = null; - try { - currentVersion = parseInt(buildInfo.buildIdentifier); - } catch (e) { - } - - if (currentVersion !== null) { - const CHECK_FOR_UPDATES_INTERVAL_SECONDS = 60 * 30; - var hasShownUpdateNotification = false; - const updateChecker = new updater.UpdateChecker(currentVersion, CHECK_FOR_UPDATES_INTERVAL_SECONDS); - updateChecker.on('update-available', function(latestVersion, url) { - if (!hasShownUpdateNotification) { - notifier.notify({ - icon: notificationIcon, - title: 'An update is available!', - message: 'High Fidelity version ' + latestVersion + ' is available', - wait: true, - url: url - }); - hasShownUpdateNotification = true; - } - }); - notifier.on('click', function(notifierObject, options) { - console.log("Got click", options.url); - shell.openExternal(options.url); - }); - } - } - - deleteOldFiles(logPath, DELETE_LOG_FILES_OLDER_THAN_X_SECONDS, LOG_FILE_REGEX); - - if (dsPath && acPath) { - domainServer = new Process('domain-server', dsPath, ["--get-temp-name"], logPath); - acMonitor = new ACMonitorProcess('ac-monitor', acPath, ['-n6', - '--log-directory', logPath, - '--http-status-port', httpStatusPort], httpStatusPort, logPath); - homeServer = new ProcessGroup('home', [domainServer, acMonitor]); - logWindow = new LogWindow(acMonitor, domainServer); - - var processes = { - home: homeServer - }; - - // handle process updates - homeServer.on('state-update', function(processGroup) { updateTrayMenu(processGroup.state); }); - - // start the home server - homeServer.start(); - } - }); + maybeInstallDefaultContentSet(onContentLoaded); });