Example #1
0
def gcodeFileCommand(filename, target):
	if not target in [FileDestinations.LOCAL, FileDestinations.SDCARD]:
		return make_response("Unknown target: %s" % target, 404)

	if not _verifyFileExists(target, filename):
		return make_response("File not found on '%s': %s" % (target, filename), 404)

	# valid file commands, dict mapping command name to mandatory parameters
	valid_commands = {
		"select": []
	}

	command, data, response = util.getJsonCommandFromRequest(request, valid_commands)
	if response is not None:
		return response

	if command == "select":
		# selects/loads a file
		printAfterLoading = False
		if "print" in data.keys() and data["print"]:
			if not printer.isOperational():
				return make_response("Printer is not operational, cannot directly start printing", 409)
			printAfterLoading = True

		sd = False
		if target == FileDestinations.SDCARD:
			filenameToSelect = filename
			sd = True
		else:
			filenameToSelect = gcodeManager.getAbsolutePath(filename)
		printer.selectFile(filenameToSelect, sd, printAfterLoading)

	return NO_CONTENT
Example #2
0
def apiLoad():
    logger = logging.getLogger(__name__)

    if not settings().get(["api", "enabled"]):
        abort(401)

    if not "apikey" in request.values.keys():
        abort(401)

    if request.values["apikey"] != settings().get(["api", "key"]):
        abort(403)

    if not "file" in request.files.keys():
        abort(400)

    # Perform an upload
    file = request.files["file"]
    if not gcodefiles.isGcodeFileName(file.filename):
        abort(400)

    destination = FileDestinations.LOCAL
    filename, done = gcodeManager.addFile(file, destination)
    if filename is None:
        logger.warn("Upload via API failed")
        abort(500)

    # Immediately perform a file select and possibly print too
    printAfterSelect = False
    if "print" in request.values.keys(
    ) and request.values["print"] in valid_boolean_trues:
        printAfterSelect = True
    filepath = gcodeManager.getAbsolutePath(filename)
    if filepath is not None:
        printer.selectFile(filepath, False, printAfterSelect)
    return jsonify(SUCCESS)
Example #3
0
def gcodeFileCommand(filename, target):
    if not target in [FileDestinations.LOCAL, FileDestinations.SDCARD]:
        return make_response("Unknown target: %s" % target, 404)

    if not _verifyFileExists(target, filename):
        return make_response("File not found on '%s': %s" % (target, filename),
                             404)

    # valid file commands, dict mapping command name to mandatory parameters
    valid_commands = {"select": []}

    command, data, response = util.getJsonCommandFromRequest(
        request, valid_commands)
    if response is not None:
        return response

    if command == "select":
        # selects/loads a file
        printAfterLoading = False
        if "print" in data.keys() and data["print"]:
            if not printer.isOperational():
                return make_response(
                    "Printer is not operational, cannot directly start printing",
                    409)
            printAfterLoading = True

        sd = False
        if target == FileDestinations.SDCARD:
            filenameToSelect = filename
            sd = True
        else:
            filenameToSelect = gcodeManager.getAbsolutePath(filename)
        printer.selectFile(filenameToSelect, sd, printAfterLoading)

    return NO_CONTENT
Example #4
0
def apiLoad():
    logger = logging.getLogger(__name__)

    if not settings.get("api", "enabled"):
        abort(401)

    if not "apikey" in request.values.keys():
        abort(401)

    if request.values["apikey"] != settings.get("api", "key"):
        abort(403)

    if not "file" in request.files.keys():
        abort(400)

    # Perform an upload
    file = request.files["file"]
    if not gcodefiles.isGcodeFileName(file.filename):
        abort(400)

    destination = FileDestinations.LOCAL
    filename, done = gcodeManager.addFile(file, destination)
    if filename is None:
        logger.warn("Upload via API failed")
        abort(500)

    # Immediately perform a file select and possibly print too
    printAfterSelect = False
    if "print" in request.values.keys() and request.values["print"] in valid_boolean_trues:
        printAfterSelect = True
    filepath = gcodeManager.getAbsolutePath(filename)
    if filepath is not None:
        printer.selectFile(filepath, False, printAfterSelect)
    return jsonify(SUCCESS)
Example #5
0
def gcodeFileCommand(filename, target):
	if not target in [FileDestinations.LOCAL, FileDestinations.SDCARD]:
		return make_response("Invalid target: %s" % target, 400)

	# valid file commands, dict mapping command name to mandatory parameters
	valid_commands = {
		"load": []
	}

	command, data, response = util.getJsonCommandFromRequest(request, valid_commands)
	if response is not None:
		return response

	if command == "load":
		# selects/loads a file
		printAfterLoading = False
		if "print" in data.keys() and data["print"] in valid_boolean_trues:
			printAfterLoading = True

		sd = False
		if target == FileDestinations.SDCARD:
			filenameToSelect = filename
			sd = True
		else:
			filenameToSelect = gcodeManager.getAbsolutePath(filename)
		printer.selectFile(filenameToSelect, sd, printAfterLoading)
		return jsonify(SUCCESS)

	return make_response("Command %s is currently not implemented" % command, 400)
Example #6
0
def gcodeFileCommand(filename=None, target=None, request=None):
    if not target in [FileDestinations.LOCAL, FileDestinations.SDCARD]:
        return make_response("Unknown target: %s" % target, 404)

    # not _verifyFileExists(target, filename):
    #return make_response("File not found on '%s': %s" % (target, filename), 404)

    filepath = gcodeManager._uploadFolder
    verifyResult = _verifyFileExists(target, filename)
    if verifyResult and gcodeManager._uploadFolder == gcodeManager._usbpath:
        filename = gcodeManager.startThreadToCopyFile(filename, timeout=3 *
                                                      60)  #wait for 3 mins
        fileTempPath = gcodeManager._usbpath
        gcodeManager._uploadFolder = gcodeManager._localpath
    elif not verifyResult and gcodeManager._uploadFolder == gcodeManager._usbpath:
        fileTempPath = gcodeManager._usbpath
        gcodeManager._uploadFolder = gcodeManager._localpath

        if not _verifyFileExists(target, filename):
            gcodeManager._uploadFolder = filepath
            return make_response(
                "File not found on '%s': %s" % (target, filename), 404)
    elif not verifyResult:
        return make_response("File not found on '%s': %s" % (target, filename),
                             404)

    # valid file commands, dict mapping command name to mandatory parameters
    valid_commands = {"select": []}

    command, data, response = util.getJsonCommandFromRequest(
        request, valid_commands)
    #print "gcodeFileCommand",filename,target,command, data, response,"gcodeFileCommand"
    #if response is not None:
    #3return response

    if response is not None:
        gcodeManager._uploadFolder = filepath
        return response

    if command == "select":
        # selects/loads a file
        printAfterLoading = False
        if "print" in data.keys() and data["print"]:
            if not printer.isOperational():
                gcodeManager._uploadFolder = filepath
                return make_response(
                    "Printer is not operational, cannot directly start printing",
                    409)
            printAfterLoading = True

        sd = False
        if target == FileDestinations.SDCARD:
            filenameToSelect = filename
            sd = True
        else:
            filenameToSelect = gcodeManager.getAbsolutePath(filename)
        printer.selectFile(filenameToSelect, sd, printAfterLoading)
    gcodeManager._uploadFolder = filepath
    return NO_CONTENT
Example #7
0
		def slicing_done(target, gcode_name, select_after_slicing, print_after_slicing):
			if select_after_slicing or print_after_slicing:
				sd = False
				if target == FileDestinations.SDCARD:
					filenameToSelect = gcode_name
					sd = True
				else:
					filenameToSelect = fileManager.get_absolute_path(target, gcode_name)
				printer.selectFile(filenameToSelect, sd, print_after_slicing)
Example #8
0
	def selectAndOrPrint(filename, absFilename, destination):
		"""
		Callback for when the file is ready to be selected and optionally printed. For SD file uploads this is only
		the case after they have finished streaming to the printer, which is why this callback is also used
		for the corresponding call to addSdFile.

		Selects the just uploaded file if either selectAfterUpload or printAfterSelect are True, or if the
		exact file is already selected, such reloading it.
		"""
		if selectAfterUpload or printAfterSelect or (currentFilename == filename and currentOrigin == destination):
			printer.selectFile(absFilename, destination == FileDestinations.SDCARD, printAfterSelect)
Example #9
0
 def slicing_done(target, gcode_name, select_after_slicing,
                  print_after_slicing):
     if select_after_slicing or print_after_slicing:
         sd = False
         if target == FileDestinations.SDCARD:
             filenameToSelect = gcode_name
             sd = True
         else:
             filenameToSelect = fileManager.get_absolute_path(
                 target, gcode_name)
         printer.selectFile(filenameToSelect, sd, print_after_slicing)
Example #10
0
def loadGcodeFile():
    if "filename" in request.values.keys():
        printAfterLoading = False
        if "print" in request.values.keys() and request.values["print"] in valid_boolean_trues:
            printAfterLoading = True

        sd = False
        if "target" in request.values.keys() and request.values["target"] == "sd":
            filename = request.values["filename"]
            sd = True
        else:
            filename = gcodeManager.getAbsolutePath(request.values["filename"])
        printer.selectFile(filename, sd, printAfterLoading)
    return jsonify(SUCCESS)
Example #11
0
def loadGcodeFile():
    if "filename" in request.values.keys():
        printAfterLoading = False
        if "print" in request.values.keys(
        ) and request.values["print"] in valid_boolean_trues:
            printAfterLoading = True

        sd = False
        if "target" in request.values.keys(
        ) and request.values["target"] == "sd":
            filename = request.values["filename"]
            sd = True
        else:
            filename = gcodeManager.getAbsolutePath(request.values["filename"])
        printer.selectFile(filename, sd, printAfterLoading)
    return jsonify(SUCCESS)
Example #12
0
def gcodeFileCommand(filename, target):
	if not target in [FileDestinations.LOCAL, FileDestinations.SDCARD]:
		return make_response("Unknown target: %s" % target, 404)

	if not _verifyFileExists(target, filename):
		return make_response("File not found on '%s': %s" % (target, filename), 404)

	# valid file commands, dict mapping command name to mandatory parameters
	valid_commands = {
		"select": []
	}

	command, data, response = util.getJsonCommandFromRequest(request, valid_commands)
	if response is not None:
		return response

	if command == "select":
		# selects/loads a file
		printAfterLoading = False
		if "print" in data.keys() and data["print"]:
			if not printer.isOperational():
				#We try at least once
				printer.connect()

				start = time.time()
				connect_timeout = 5 #5 secs

				while not printer.isOperational() and not printer.isClosedOrError() and time.time() - start < connect_timeout:
					time.sleep(1)

				if not printer.isOperational():
					return make_response("The printer is not responding, can't start printing", 409)

			printAfterLoading = True

		sd = False
		if target == FileDestinations.SDCARD:
			filenameToSelect = filename
			sd = True
		else:
			filenameToSelect = gcodeManager.getAbsolutePath(filename)
		printer.selectFile(filenameToSelect, sd, printAfterLoading)

	return NO_CONTENT
Example #13
0
def gcodeFileCommand(filename, target):
	if not target in [FileDestinations.LOCAL, FileDestinations.SDCARD]:
		return make_response("Unknown target: %s" % target, 404)

	if not _verifyFileExists(target, filename):
		return make_response("File not found on '%s': %s" % (target, filename), 404)

	# valid file commands, dict mapping command name to mandatory parameters
	valid_commands = {
		"select": [],
		"slice": []
	}

	command, data, response = util.getJsonCommandFromRequest(request, valid_commands)
	if response is not None:
		return response

	if command == "select":
		# selects/loads a file
		printAfterLoading = False
		if "print" in data.keys() and data["print"] in valid_boolean_trues:
			if not printer.isOperational():
				return make_response("Printer is not operational, cannot directly start printing", 409)
			printAfterLoading = True

		sd = False
		if target == FileDestinations.SDCARD:
			filenameToSelect = filename
			sd = True
		else:
			filenameToSelect = fileManager.get_absolute_path(target, filename)
		printer.selectFile(filenameToSelect, sd, printAfterLoading)

	elif command == "slice":
		if "slicer" in data.keys():
			slicer = data["slicer"]
			del data["slicer"]
			if not slicer in slicingManager.registered_slicers:
				return make_response("Slicer {slicer} is not available".format(**locals()), 400)
			slicer_instance = slicingManager.get_slicer(slicer)
		elif "cura" in slicingManager.registered_slicers:
			slicer = "cura"
			slicer_instance = slicingManager.get_slicer("cura")
		else:
			return make_response("Cannot slice {filename}, no slicer available".format(**locals()), 415)

		if not octoprint.filemanager.valid_file_type(filename, type="stl"):
			return make_response("Cannot slice {filename}, not an STL file".format(**locals()), 415)

		if slicer_instance.get_slicer_properties()["same_device"] and (printer.isPrinting() or printer.isPaused()):
			# slicer runs on same device as OctoPrint, slicing while printing is hence disabled
			return make_response("Cannot slice on {slicer} while printing due to performance reasons".format(**locals()), 409)

		if "gcode" in data.keys() and data["gcode"]:
			gcode_name = data["gcode"]
			del data["gcode"]
		else:
			import os
			name, _ = os.path.splitext(filename)
			gcode_name = name + ".gco"

		# prohibit overwriting the file that is currently being printed
		currentOrigin, currentFilename = _getCurrentFile()
		if currentFilename == gcode_name and currentOrigin == target and (printer.isPrinting() or printer.isPaused()):
			make_response("Trying to slice into file that is currently being printed: %s" % gcode_name, 409)

		if "profile" in data.keys() and data["profile"]:
			profile = data["profile"]
			del data["profile"]
		else:
			profile = None

		if "printerProfile" in data.keys() and data["printerProfile"]:
			printerProfile = data["printerProfile"]
			del data["printerProfile"]
		else:
			printerProfile = None

		if "position" in data.keys() and data["position"] and isinstance(data["position"], dict) and "x" in data["position"] and "y" in data["position"]:
			position = data["position"]
			del data["position"]
		else:
			position = None

		select_after_slicing = False
		if "select" in data.keys() and data["select"] in valid_boolean_trues:
			if not printer.isOperational():
				return make_response("Printer is not operational, cannot directly select for printing", 409)
			select_after_slicing = True

		print_after_slicing = False
		if "print" in data.keys() and data["print"] in valid_boolean_trues:
			if not printer.isOperational():
				return make_response("Printer is not operational, cannot directly start printing", 409)
			select_after_slicing = print_after_slicing = True

		override_keys = [k for k in data if k.startswith("profile.") and data[k] is not None]
		overrides = dict()
		for key in override_keys:
			overrides[key[len("profile."):]] = data[key]

		def slicing_done(target, gcode_name, select_after_slicing, print_after_slicing):
			if select_after_slicing or print_after_slicing:
				sd = False
				if target == FileDestinations.SDCARD:
					filenameToSelect = gcode_name
					sd = True
				else:
					filenameToSelect = fileManager.get_absolute_path(target, gcode_name)
				printer.selectFile(filenameToSelect, sd, print_after_slicing)

		ok, result = fileManager.slice(slicer, target, filename, target, gcode_name,
		                               profile=profile,
		                               printer_profile_id=printerProfile,
		                               position=position,
		                               overrides=overrides,
		                               callback=slicing_done,
		                               callback_args=(target, gcode_name, select_after_slicing, print_after_slicing))

		if ok:
			files = {}
			location = url_for(".readGcodeFile", target=target, filename=gcode_name, _external=True)
			result = {
				"name": gcode_name,
				"origin": FileDestinations.LOCAL,
				"refs": {
					"resource": location,
					"download": url_for("index", _external=True) + "downloads/files/" + target + "/" + gcode_name
				}
			}

			r = make_response(jsonify(result), 202)
			r.headers["Location"] = location
			return r
		else:
			return make_response("Could not slice: {result}".format(result=result), 500)

	return NO_CONTENT
Example #14
0
def gcodeFileCommand(filename, target):

    if not target in [
            FileDestinations.LOCAL, FileDestinations.SDCARD,
            FileDestinations.FastbotSDCARD
    ]:
        return make_response("Unknown target: %s" % target, 404)

    if not _verifyFileExists(target, filename):
        return make_response("File not found on '%s': %s" % (target, filename),
                             404)

    # valid file commands, dict mapping command name to mandatory parameters
    valid_commands = {"select": [], "slice": []}

    command, data, response = util.getJsonCommandFromRequest(
        request, valid_commands)
    if response is not None:
        return response

    if command == "select":
        # selects/loads a file
        printAfterLoading = False
        if "print" in data.keys() and data["print"] in valid_boolean_trues:
            if not printer.isOperational():
                return make_response(
                    "Printer is not operational, cannot directly start printing",
                    409)
            printAfterLoading = True

        if target == FileDestinations.SDCARD:
            filenameToSelect = filename
        else:
            filenameToSelect = fileManager.get_absolute_path(target, filename)
        printer.selectFile(filenameToSelect, target, printAfterLoading)

    elif command == "slice":
        if "slicer" in data.keys():
            slicer = data["slicer"]
            del data["slicer"]
            if not slicer in slicingManager.registered_slicers:
                return make_response(
                    "Slicer {slicer} is not available".format(**locals()), 400)
            slicer_instance = slicingManager.get_slicer(slicer)
        elif "cura" in slicingManager.registered_slicers:
            slicer = "cura"
            slicer_instance = slicingManager.get_slicer("cura")
        else:
            return make_response(
                "Cannot slice {filename}, no slicer available".format(
                    **locals()), 415)

        if not octoprint.filemanager.valid_file_type(filename, type="stl"):
            return make_response(
                "Cannot slice {filename}, not an STL file".format(**locals()),
                415)

        if slicer_instance.get_slicer_properties()["same_device"] and (
                printer.isPrinting() or printer.isPaused()):
            # slicer runs on same device as OctoPrint, slicing while printing is hence disabled
            return make_response(
                "Cannot slice on {slicer} while printing due to performance reasons"
                .format(**locals()), 409)

        if "gcode" in data.keys() and data["gcode"]:
            gcode_name = data["gcode"]
            del data["gcode"]
        else:
            import os
            name, _ = os.path.splitext(filename)
            gcode_name = name + ".gco"

        # prohibit overwriting the file that is currently being printed
        currentOrigin, currentFilename = _getCurrentFile()
        if currentFilename == gcode_name and currentOrigin == target and (
                printer.isPrinting() or printer.isPaused()):
            make_response(
                "Trying to slice into file that is currently being printed: %s"
                % gcode_name, 409)

        if "profile" in data.keys() and data["profile"]:
            profile = data["profile"]
            del data["profile"]
        else:
            profile = None

        if "printerProfile" in data.keys() and data["printerProfile"]:
            printerProfile = data["printerProfile"]
            del data["printerProfile"]
        else:
            printerProfile = None

        if "position" in data.keys() and data["position"] and isinstance(
                data["position"],
                dict) and "x" in data["position"] and "y" in data["position"]:
            position = data["position"]
            del data["position"]
        else:
            position = None

        select_after_slicing = False
        if "select" in data.keys() and data["select"] in valid_boolean_trues:
            if not printer.isOperational():
                return make_response(
                    "Printer is not operational, cannot directly select for printing",
                    409)
            select_after_slicing = True

        print_after_slicing = False
        if "print" in data.keys() and data["print"] in valid_boolean_trues:
            if not printer.isOperational():
                return make_response(
                    "Printer is not operational, cannot directly start printing",
                    409)
            select_after_slicing = print_after_slicing = True

        override_keys = [
            k for k in data if k.startswith("profile.") and data[k] is not None
        ]
        overrides = dict()
        for key in override_keys:
            overrides[key[len("profile."):]] = data[key]

        def slicing_done(target, gcode_name, select_after_slicing,
                         print_after_slicing):
            if select_after_slicing or print_after_slicing:
                sd = False
                if target == FileDestinations.SDCARD:
                    filenameToSelect = gcode_name
                    sd = True
                else:
                    filenameToSelect = fileManager.get_absolute_path(
                        target, gcode_name)
                printer.selectFile(filenameToSelect, sd, print_after_slicing)

        ok, result = fileManager.slice(slicer,
                                       target,
                                       filename,
                                       target,
                                       gcode_name,
                                       profile=profile,
                                       printer_profile_id=printerProfile,
                                       position=position,
                                       overrides=overrides,
                                       callback=slicing_done,
                                       callback_args=(target, gcode_name,
                                                      select_after_slicing,
                                                      print_after_slicing))

        if ok:
            files = {}
            location = url_for(".readGcodeFile",
                               target=target,
                               filename=gcode_name,
                               _external=True)
            result = {
                "name": gcode_name,
                "origin": FileDestinations.LOCAL,
                "refs": {
                    "resource":
                    location,
                    "download":
                    url_for("index", _external=True) + "downloads/files/" +
                    target + "/" + gcode_name
                }
            }

            r = make_response(jsonify(result), 202)
            r.headers["Location"] = location
            return r
        else:
            return make_response(
                "Could not slice: {result}".format(result=result), 500)

    return NO_CONTENT