def isAstroprintReachable(self): try: urllib2.urlopen("%s/check" % roConfig('cloud.apiHost'),timeout=1) return True except urllib2.URLError: return False
def isAstroprintReachable(self): try: urllib2.urlopen("%s/check" % roConfig('cloud.apiHost'), timeout=1) return True except urllib2.URLError: return False
def __init__(self): self._settings = settings() self._logger = logging.getLogger(__name__) self._eventManager = eventManager() self._pendingClientRequests = {} self._retries = 0 self._retryTimer = None self._boxId = None self._ws = None self._silentReconnect = False self.status = self.STATUS_DISCONNECTED self.connected = False self.authenticated = False self._logger.info('This box has id %s' % self.boxId) self._eventManager.subscribe(Events.NETWORK_STATUS, self._onNetworkStateChanged) self._eventManager.subscribe(Events.NETWORK_IP_CHANGED, self._onIpChanged) self._address = roConfig('cloud.boxrouter') self._eventSender = EventSender(self) if self._address: self.boxrouter_connect() else: self._logger.error('cloudSlicer.boxrouter not present in config file')
def __init__(self): self._settings = settings() self._logger = logging.getLogger(__name__) self._eventManager = eventManager() self._pendingClientRequests = {} self._retries = 0 self._retryTimer = None self._boxId = None self._ws = None self._silentReconnect = False self.status = self.STATUS_DISCONNECTED self.connected = False self.authenticated = False self._logger.info('This box has id %s' % self.boxId) self._eventManager.subscribe(Events.NETWORK_STATUS, self._onNetworkStateChanged) self._eventManager.subscribe(Events.NETWORK_IP_CHANGED, self._onIpChanged) self._address = roConfig('cloud.boxrouter') self._eventSender = EventSender(self) if self._address: self.boxrouter_connect() else: self._logger.error( 'cloudSlicer.boxrouter not present in config file')
def checkSoftwareVersion(self): apiHost = roConfig('cloud.apiHost') if not apiHost: self._logger.error('cloud.apiHost not present in ro config file.') return None try: data = { 'update_available': False, 'releases': [] } for package in ([self.data] + self.data['additional']): versionData = { 'current': [ package['version']['major'], package['version']['minor'], package['version']['build'] ], 'channel': self._settings.getInt(['software', 'channel']) } if 'variant' in package: versionData['variant'] = package['variant']['id'] versionData['platform'] = package['platform'] versionData['manufacturer_pkg_id'] = self.data['manufacturer_pkg_id'] elif 'package' in package: versionData['variant'] = self.data['variant']['id'] versionData['package'] = package['package']['id'] r = requests.post('%s/astrobox/software/check' % apiHost, data=json.dumps(versionData), auth = self._checkAuth(), headers = self._requestHeaders ) if r.status_code != 200: self._logger.error('Error getting software release info: %d.' % r.status_code) return None else: packageData = r.json() packageData['name'] = package['variant']['name'] if 'variant' in package else package['package']['name'] if packageData['update_available']: #check if it's the same one we have installed packageData['is_current'] = packageData['release']['major'] == int(package['version']['major']) and packageData['release']['minor'] == int(package['version']['minor']) and packageData['release']['build'] == package['version']['build'] if not packageData['is_current']: data['update_available'] = True data['releases'].append(packageData) except Exception as e: self._logger.error('Error getting software release info: %s' % e, exc_info=True) return None return data
def checkSoftwareVersion(self): apiHost = roConfig('cloud.apiHost') if not apiHost: self._logger.error('cloud.apiHost not present in ro config file.') return None try: data = { 'update_available': False, 'releases': [] } for package in ([self.data] + self.data['additional']): versionData = { 'current': [ package['version']['major'], package['version']['minor'], package['version']['build'] ], 'channel': self._settings.getInt(['software', 'channel']) } if 'variant' in package: versionData['variant'] = package['variant']['id'] versionData['platform'] = package['platform'] versionData['manufacturer_pkg_id'] = self.data['manufacturer_pkg_id'] elif 'package' in package: versionData['variant'] = self.data['variant']['id'] versionData['package'] = package['package']['id'] r = requests.post('%s/astrobox/software/check' % apiHost, data=json.dumps(versionData), auth = self._checkAuth(), headers = self._requestHeaders ) if r.status_code != 200: self._logger.error('Error getting software release info: %d.' % r.status_code) return None else: packageData = r.json() packageData['name'] = package['variant']['name'] if 'variant' in package else package['package']['name'] if packageData['update_available']: #check if it's the same one we have installed packageData['is_current'] = packageData['release']['major'] == int(package['version']['major']) and packageData['release']['minor'] == int(package['version']['minor']) and packageData['release']['build'] == package['version']['build'] if not packageData['is_current']: data['update_available'] = True data['releases'].append(packageData) except Exception as e: self._logger.error('Error getting software release info: %s' % e) return None return data
def sendLogs(self, ticketNo=None, message=None): import zipfile from tempfile import gettempdir try: boxId = boxrouterManager().boxId #Create the zip file zipFilename = '%s/%s-logs.zip' % (gettempdir(), boxId) zipf = zipfile.ZipFile(zipFilename, 'w') for root, dirs, files in os.walk( self._settings.getBaseFolder("logs")): for file in files: zipf.write(os.path.join(root, file), file) zipf.close() except Exception as e: self._logger.error('Error while zipping logs: %s' % e) return False zipf = open(zipFilename, 'rb') #send the file to the server r = requests.post('%s/astrobox/software/logs' % roConfig('cloud.apiHost'), data={ 'ticket': ticketNo, 'message': message, 'boxId': boxId }, files={'file': (zipFilename, zipf)}, auth=self._checkAuth(), headers=self._requestHeaders) zipf.close() #remove the file os.remove(zipFilename) if r.status_code == 200: return True else: self._logger.error('Error while sending logs: %d' % r.status_code) return False
def __init__(self): self.settings = settings() self.hmacAuth = None self.tryingLoggingTimes = 0 loggedUser = self.settings.get(['cloudSlicer', 'loggedUser']) if loggedUser: from octoprint.server import userManager user = userManager.findUser(loggedUser) if user and user.publicKey and user.privateKey: self.hmacAuth = HMACAuth(user.publicKey, user.privateKey) self.apiHost = roConfig('cloud.apiHost') self._print_file_store = None self._sm = softwareManager() self._logger = logging.getLogger(__name__)
def sendLogs(self, ticketNo=None, message=None): import zipfile from tempfile import gettempdir try: boxId = boxrouterManager().boxId #Create the zip file zipFilename = '%s/%s-logs.zip' % (gettempdir(), boxId) zipf = zipfile.ZipFile(zipFilename, 'w') for root, dirs, files in os.walk(self._settings.getBaseFolder("logs")): for file in files: zipf.write(os.path.join(root, file), file) zipf.close() except Exception as e: self._logger.error('Error while zipping logs: %s' % e) return False zipf = open(zipFilename, 'rb') #send the file to the server r = requests.post( '%s/astrobox/software/logs' % roConfig('cloud.apiHost'), data = { 'ticket': ticketNo, 'message': message, 'boxId': boxId}, files = {'file': (zipFilename, zipf)}, auth = self._checkAuth(), headers = self._requestHeaders ) zipf.close() #remove the file os.remove(zipFilename) if r.status_code == 200: return True else: self._logger.error('Error while sending logs: %d' % r.status_code) return False
def cloud_enabled(self): return roConfig('cloud.apiHost') and self.hmacAuth
def index(): s = settings() loggedUsername = s.get(["cloudSlicer", "loggedUser"]) publicKey = None if loggedUsername: user = userManager.findUser(loggedUsername) if user: publicKey = user.publicKey if (s.getBoolean(["server", "firstRun"])): swm = swManager() ppm = printerProfileManager() # we need to get the user to sign into their AstroPrint account return render_template( "setup.jinja2", debug= debug, uiApiKey= UI_API_KEY, version= VERSION, commit= swm.commit, astroboxName= networkManager().getHostname(), checkSoftware= swm.shouldCheckForNew, settings= s, wsToken= create_ws_token(publicKey), mfDefinition= manufacturerPkgManager(), printerProfileId= ppm.data['printer_model']['id'] if ppm.data['printer_model'] else None, apApiHost= roConfig('cloud.apiHost') ) elif softwareManager.status != 'idle' or softwareManager.forceUpdateInfo: return render_template( "updating.jinja2", uiApiKey= UI_API_KEY, forceUpdateInfo= softwareManager.forceUpdateInfo, releases= softwareManager.updatingReleases or [softwareManager.forceUpdateInfo['id']], lastCompletionPercent= softwareManager.lastCompletionPercent, lastMessage= softwareManager.lastMessage, astroboxName= networkManager().getHostname(), wsToken= create_ws_token(publicKey), status= softwareManager.status, mfDefinition= manufacturerPkgManager() ) elif loggedUsername and (current_user is None or not current_user.is_authenticated or current_user.get_id() != loggedUsername): if current_user.is_authenticated: logout_user() return render_template( "locked.jinja2", username= loggedUsername, uiApiKey= UI_API_KEY, astroboxName= networkManager().getHostname(), mfDefinition= manufacturerPkgManager() ) else: pm = printerManager() nm = networkManager() swm = swManager() cm = cameraManager() mmm = maintenanceMenuManager() paused = pm.isPaused() printing = pm.isPrinting() online = nm.isOnline() return render_template( "app.jinja2", user_email= loggedUsername, userPublicKey= publicKey, show_bad_shutdown= swm.wasBadShutdown and not swm.badShutdownShown, version= VERSION, commit= swm.commit, printing= printing, paused= paused, online= online, print_capture= cm.timelapseInfo if printing or paused else None, printer_profile= printerProfileManager().data, uiApiKey= UI_API_KEY, astroboxName= nm.getHostname(), checkSoftware= swm.shouldCheckForNew, serialLogActive= s.getBoolean(['serial', 'log']), additionalTasks= True, maintenanceMenu= True, cameraManager= cm.name, wsToken= create_ws_token(publicKey), mfDefinition= manufacturerPkgManager(), apApiHost= roConfig('cloud.apiHost'), apApiClientId= roConfig('cloud.apiClientId'), boxId= boxrouterManager().boxId )
def updateSoftware(self, releases): self._status = 'updating' self._releases = releases releaseInfo = [] platforms = { self.data['variant']['id']: self.data['platform'] } platforms.update({p['variant']['id']: p['platform'] for p in self.data['additional'] if 'platform' in p}) for rel in releases: try: r = requests.get( '%s/astrobox/software/release/%s' % (roConfig('cloud.apiHost'), rel), auth = self._checkAuth(), headers = self._requestHeaders ) if r.status_code == 200: data = r.json() if data and 'download_url' in data and 'platform' in data and 'variant' in data and 'id' in data['variant']: if data['platform'] is None or ( data['variant']['id'] in platforms and data['platform'] == platforms[data['variant']['id']]): releaseInfo.append(data) else: self._logger.error('Invalid Platform: %s' % data['platform']) self._status = 'failed' return False else: self._logger.error('Invalid Server response:') self._logger.error(data) self._status = 'failed' return False else: self._logger.error('Error updating software release info. Server returned: %d' % r.status_code) self._status = 'failed' return False except Exception as e: self._logger.error('Error updating software release info: %s' % e, exc_info = True) self._status = 'failed' return False if releaseInfo: def progressCb(phase, progress, message): eventManager().fire(Events.SOFTWARE_UPDATE, { 'completed': False, 'progress': progress, 'status': self._status, 'message': message }) self.lastCompletionPercent = progress self.lastMessage = message def completionCb(success): if success: self.forceUpdateInfo = None self._status = 'done' else: self._status = 'failed' eventManager().fire(Events.SOFTWARE_UPDATE, { 'completed': True, 'status': self._status, 'success': success }) self.lastCompletionPercent = None self.lastMessage = None self._updater = SoftwareUpdater(self, releaseInfo, progressCb, completionCb) self._updater.start() return True self._status = 'failed' return False
def __init__(self): self._settings = settings() self.sslCertPath = roConfig('network.ssl.certPath')