Ejemplo n.º 1
0
	def isAstroprintReachable(self):
		try:
			urllib2.urlopen("%s/check" % roConfig('cloud.apiHost'),timeout=1)
			return True

		except urllib2.URLError:
			return False
Ejemplo n.º 2
0
    def isAstroprintReachable(self):
        try:
            urllib2.urlopen("%s/check" % roConfig('cloud.apiHost'), timeout=1)
            return True

        except urllib2.URLError:
            return False
Ejemplo n.º 3
0
	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')
Ejemplo n.º 4
0
    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')
Ejemplo n.º 5
0
	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
Ejemplo n.º 6
0
	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
Ejemplo n.º 7
0
    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
Ejemplo n.º 8
0
	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__)
Ejemplo n.º 9
0
	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__)
Ejemplo n.º 10
0
	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
Ejemplo n.º 11
0
	def cloud_enabled(self):
		return roConfig('cloud.apiHost') and self.hmacAuth
Ejemplo n.º 12
0
	def cloud_enabled(self):
		return roConfig('cloud.apiHost') and self.hmacAuth
Ejemplo n.º 13
0
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
		)
Ejemplo n.º 14
0
	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
Ejemplo n.º 15
0
	def __init__(self):
		self._settings = settings()
		self.sslCertPath = roConfig('network.ssl.certPath')
Ejemplo n.º 16
0
	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