def parse_form_upload(user_args, client_id, configuration, base_dir): """Parse upload file and chunk entries from user_args. Chunk limits are extracted from content-range http header in environment. Files are considered to be inside uplad tmp dir inside base_dir. """ files, rejected = [], [] logger = configuration.logger cache_dir = os.path.join(base_dir, upload_tmp_dir) + os.sep # TODO: we only support single filename and chunk for now; extend? #for name_index in xrange(max_upload_files): # if user_args.has_key(filename_field) and \ # len(user_args[filename_field]) > name_index: for name_index in [0]: if user_args.has_key(filename_field): if isinstance(user_args[filename_field], basestring): filename = user_args[filename_field] else: filename = user_args[filename_field][name_index] logger.info('found name: %s' % filename) else: # No more files break if not filename.strip(): continue try: filename = strip_dir(filename) valid_path(filename) except Exception, exc: logger.error('invalid filename: %s' % filename) rejected.append((filename, 'invalid filename: %s (%s)' % \ (filename, exc))) continue rel_path = os.path.join(upload_tmp_dir, filename) real_path = os.path.abspath(os.path.join(base_dir, rel_path)) if not valid_user_path(real_path, cache_dir, True): logger.error('%s tried to access restricted path %s ! (%s)' % (client_id, real_path, cache_dir)) rejected.append("Invalid path (%s expands to an illegal path)" \ % filename) continue #for chunk_index in xrange(max_upload_chunks): # if user_args.has_key(files_field) and \ # len(user_args[files_field]) > chunk_index: for chunk_index in [0]: if user_args.has_key(files_field): chunk = user_args[files_field][chunk_index] else: break configuration.logger.debug('find chunk range: %s' % filename) (chunk_first, chunk_last) = extract_chunk_region(configuration) if len(chunk) > upload_block_size: configuration.logger.error('skip bigger than allowed chunk') continue elif chunk_last < 0: chunk_last = len(chunk) - 1 files.append((rel_path, (chunk, chunk_first, chunk_last)))
def parse_form_upload(user_args, client_id, configuration): """Parse upload file entries from user_args""" files, rejected = [], [] i = 0 client_dir = client_id_dir(client_id) for i in xrange(max_freeze_files): if user_args.has_key('freeze_upload_%d' % i): file_item = user_args['freeze_upload_%d' % i] filename = user_args.get('freeze_upload_%dfilename' % i, '') if not filename.strip(): continue filename = strip_dir(filename) try: valid_path(filename) except Exception, exc: rejected.append('invalid filename: %s (%s)' % (filename, exc)) continue files.append((filename, file_item[0]))
def parse_form_upload(user_args, user_id, configuration, base_dir, dst_dir, reject_write=False): """Parse upload file and chunk entries from user_args. Chunk limits are extracted from content-range http header in environment. Existing files are automatically taken from upload_tmp_dir and uploads go into dst_dir inside base_dir. The optional reject_write argument is used for delayed refusal if someone tries to upload to a read-only sharelink. """ files, rejected = [], [] logger = configuration.logger rel_dst_dir = dst_dir.replace(base_dir, '') # TODO: we only support single filename and chunk for now; extend? # for name_index in xrange(max_upload_files): # if user_args.has_key(filename_field) and \ # len(user_args[filename_field]) > name_index: for name_index in [0]: if user_args.has_key(filename_field): if isinstance(user_args[filename_field], basestring): filename = user_args[filename_field] else: filename = user_args[filename_field][name_index] logger.info('found name: %s' % filename) else: # No more files break if not filename.strip(): continue if reject_write: rejected.append((filename, 'read-only share: upload refused!')) continue try: filename = strip_dir(filename) valid_path(filename) except Exception, exc: logger.error('invalid filename: %s' % filename) rejected.append( (filename, 'invalid filename: %s (%s)' % (filename, exc))) continue rel_path = os.path.join(rel_dst_dir, filename) # IMPORTANT: path must be expanded to abs for proper chrooting abs_path = os.path.abspath(os.path.join(base_dir, rel_path)) if not valid_user_path(configuration, abs_path, dst_dir, True): logger.error('%s tried to access restricted path %s ! (%s)' % (user_id, abs_path, dst_dir)) rejected.append("Invalid path (%s expands to an illegal path)" % filename) continue # for chunk_index in xrange(max_upload_chunks): # if user_args.has_key(files_field) and \ # len(user_args[files_field]) > chunk_index: for chunk_index in [0]: if user_args.has_key(files_field): chunk = user_args[files_field][chunk_index] else: break configuration.logger.debug('find chunk range: %s' % filename) (chunk_first, chunk_last) = extract_chunk_region(configuration) if len(chunk) > upload_block_size: configuration.logger.error('skip bigger than allowed chunk') continue elif chunk_last < 0: chunk_last = len(chunk) - 1 files.append((rel_path, (chunk, chunk_first, chunk_last)))
def main(client_id, user_arguments_dict): """Main function used by front end""" (configuration, logger, output_objects, op_name) = \ initialize_main_variables(client_id, op_title=True, op_header=False) client_dir = client_id_dir(client_id) status = returnvalues.OK defaults = signature()[1] # TODO: all non-file fields should be validated!! # Input fields are mostly file stuff so do not validate it validate_args = dict([(key, user_arguments_dict.get(key, val)) for \ (key, val) in defaults.items()]) (validate_status, accepted) = validate_input_and_cert( validate_args, defaults, output_objects, client_id, configuration, allow_rejects=False, ) if not validate_status: return (accepted, returnvalues.CLIENT_ERROR) if not correct_handler('POST'): output_objects.append( {'object_type': 'error_text', 'text' : 'Only accepting POST requests to prevent unintended updates'}) return (output_objects, returnvalues.CLIENT_ERROR) output_objects.append({'object_type': 'header', 'text' : '%s submit job/file' % configuration.short_title}) submitstatuslist = [] fileuploadobjs = [] filenumber = 0 file_fields = int(accepted.get('file_fields', -1)[-1]) save_as_default = (accepted['save_as_default'][-1] != 'False') # Please note that base_dir must end in slash to avoid access to other # user dirs when own name is a prefix of another user name base_dir = os.path.abspath(os.path.join(configuration.user_home, client_dir)) + os.sep mrsl = '' while True: (content, file_type) = handle_form_input(filenumber, user_arguments_dict, configuration) if not content: if filenumber < file_fields: # blank field but file_fields indicates more fields filenumber += 1 continue # no field count and no data for filenumber found break # always append mrsltextarea if available! try: mrsl = user_arguments_dict['mrsltextarea_%s' % filenumber][0] content += mrsl except: pass content += '\n' mrslfiles_to_parse = [] submit_mrslfiles = False submitmrsl_key = 'submitmrsl_%s' % filenumber if user_arguments_dict.has_key(submitmrsl_key): val = str(user_arguments_dict[submitmrsl_key][0]).upper() if val == 'ON' or val == 'TRUE': submit_mrslfiles = True fileuploadobj = {'object_type': 'fileuploadobj', 'submitmrsl': submit_mrslfiles} if file_type == 'plain': # get filename filename_key = 'FILENAME_%s' % filenumber if not user_arguments_dict.has_key(filename_key): output_objects.append( {'object_type': 'error_text','text' : ("The specified file_type is 'plain', but a filename" \ "value was not found. The missing control should be " \ "named %s") % filename_key}) return (output_objects, returnvalues.CLIENT_ERROR) filename_val = convert_control_value_to_line(filename_key, user_arguments_dict) if not filename_val: if filenumber < file_fields: # blank field but file_fields indicates more fields filenumber += 1 continue output_objects.append( {'object_type': 'error_text', 'text' : 'No filename found - please make sure you provide a " \ "file to upload'}) return (output_objects, returnvalues.CLIENT_ERROR) local_filename = base_dir + filename_val valid_status, valid_err = valid_user_path_name(filename_val, local_filename, base_dir) if not valid_status: output_objects.append( {'object_type': 'error_text', 'text': valid_err}) return (output_objects, returnvalues.CLIENT_ERROR) # A new filename was created, write content to file if not write_file(content, local_filename, logger): output_objects.append({'object_type': 'error_text', 'text': 'Could not write: %s' % local_filename}) return (output_objects, returnvalues.SYSTEM_ERROR) fileuploadobj['saved'] = True # msg += "%s created!" % local_filename fileuploadobj['name'] = os.sep\ + convert_control_value_to_line(filename_key, user_arguments_dict) if local_filename.upper().endswith('.MRSL')\ and submit_mrslfiles: mrslfiles_to_parse.append[local_filename] elif file_type == 'fileupload': # An input type=file was found fileupload_key = 'fileupload_%s_0_0' % filenumber # if not fileitem.filename: if not user_arguments_dict.has_key(fileupload_key + 'filename'): output_objects.append({'object_type': 'error_text', 'text': 'NO FILENAME error'}) return (output_objects, returnvalues.CLIENT_ERROR) base_name = strip_dir(user_arguments_dict[fileupload_key + 'filename']) if not base_name: if filenumber < file_fields: # blank field but file_fields indicates more fields # output_objects.append({'object_type': 'text', 'text': # 'skip item %d' % filenumber}) filenumber += 1 continue output_objects.append( {'object_type': 'error_text', 'text' : 'No filename found - please make sure you provide a " \ "file to upload'}) return (output_objects, returnvalues.CLIENT_ERROR) extract_packages = False extract_key = 'extract_%s' % filenumber if user_arguments_dict.has_key(extract_key): val = str(user_arguments_dict[extract_key][0]).upper() if val == 'ON' or val == 'TRUE': extract_packages = True remote_filename = '' default_remotefilename_key = 'default_remotefilename_%s'\ % filenumber if user_arguments_dict.has_key(default_remotefilename_key): remote_filename = \ user_arguments_dict[default_remotefilename_key][0] # remotefilename overwrites default_remotefilename if it exists remotefilename_key = 'remotefilename_%s' % filenumber if user_arguments_dict.has_key(remotefilename_key): remote_filename = \ user_arguments_dict[remotefilename_key][0] if not remote_filename: remote_filename = base_name # if remote_filename is a directory, use client's local filename # for the last part of the filename if remote_filename.strip().endswith(os.sep): remote_filename += base_name if not user_arguments_dict.has_key(fileupload_key): output_objects.append({'object_type': 'error_text', 'text': 'File content not found!'}) return (output_objects, returnvalues.CLIENT_ERROR) local_filename = os.path.abspath(base_dir + remote_filename) valid_status, valid_err = valid_user_path_name(remote_filename, local_filename, base_dir) if not valid_status: output_objects.append( {'object_type': 'error_text', 'text': valid_err}) return (output_objects, returnvalues.CLIENT_ERROR) if not os.path.isdir(os.path.dirname(local_filename)): try: os.makedirs(os.path.dirname(local_filename), 0777) except Exception: fileuploadobj['message'] = \ {'object_type': 'error_text', 'text': 'Exception creating dirs %s'\ % os.path.dirname(local_filename)} fileuploadobj['name'] = remote_filename # reads uploaded file into memory binary = user_arguments_dict.has_key('%s_is_encoded' % fileupload_key) if binary: data = user_arguments_dict[fileupload_key][-1] data = str(base64.decodestring(data)) else: data = user_arguments_dict[fileupload_key][-1] # write file in memory to disk if not write_file(data, local_filename, configuration.logger): output_objects.append( {'object_type': 'error_text', 'text': 'Error writing file in memory to disk'}) return (output_objects, returnvalues.SYSTEM_ERROR) fileuploadobj['saved'] = True # Tell the client about the current settings (extract and submit) # extract_str = "Extract files from packages (.zip, .tar.gz, .tgz, .tar.bz2): " # if extract_packages: # extract_str += "ON" # else: # extract_str += "OFF" # output_objects.append({"object_type":"text", "text":extract_str}) fileuploadobj['extract_packages'] = extract_packages # submit_str = "Submit mRSL files to parser (including .mRSL files in packages!): " # if submit_mrslfiles: # submit_str += "ON" # else: # submit_str += "OFF" # output_objects.append({"object_type":"text", "text":submit_str}) # handle file package if extract_packages\ and (local_filename.upper().endswith('.ZIP') or local_filename.upper().endswith('.TAR.GZ') or local_filename.upper().endswith('.TGZ') or local_filename.upper().endswith('.TAR.BZ2')): (status, msg) = handle_package_upload(local_filename, remote_filename, client_id, configuration, submit_mrslfiles, os.path.dirname(local_filename)) if status: if submit_mrslfiles: if isinstance(msg, basestring): output_objects.append( {'object_type': 'error_text', 'text': 'Error in submit: %s' % msg}) else: submitstatuslist = msg else: output_objects.append({'object_type': 'text', 'text': msg}) else: if submit_mrslfiles: if isinstance(msg, basestring): output_objects.append( {'object_type': 'error_text', 'text': 'Error in unpack: %s' % msg}) else: submitstatuslist = msg else: output_objects.append({'object_type': 'error_text', 'text': 'Problems unpacking: %s' % msg}) else: # output_objects.append({"object_type":"text", "text":msg}) # a "normal" (non-package) file was uploaded try: output_objects.append({'object_type': 'text', 'text' : 'File saved: %s' % remote_filename}) except Exception, err: output_objects.append({'object_type': 'error_text', 'text' : 'File seems to be saved, but could not get file size %s' % err}) return (output_objects, returnvalues.SYSTEM_ERROR) fileuploadobj['size'] = os.path.getsize(local_filename) fileuploadobj['name'] = remote_filename # Check if the extension is .mRSL if local_filename.upper().endswith('.MRSL')\ and submit_mrslfiles: # A .mrsl file was uploaded! # output_objects.append({"object_type":"text", "text": # "File name on MiG server: %s" # % (remote_filename)}) mrslfiles_to_parse.append(local_filename) else: # mrsl file created by html controls. create filename. Loop until # a filename that do not exits is created html_generated_mrsl_dir = base_dir + 'html_generated_mrsl' if os.path.exists(html_generated_mrsl_dir)\ and not os.path.isdir(html_generated_mrsl_dir): # oops, user might have created a file with the same name output_objects.append( {'object_type': 'error_text', 'text' : 'Please make sure %s does not exist or is a directory!' % 'html_generated_mrsl/'}) return (output_objects, returnvalues.CLIENT_ERROR) if not os.path.isdir(html_generated_mrsl_dir): os.mkdir(html_generated_mrsl_dir) while True: time_c = time.gmtime() timestamp = '%s_%s_%s__%s_%s_%s' % ( time_c[1], time_c[2], time_c[0], time_c[3], time_c[4], time_c[5], ) local_filename = html_generated_mrsl_dir\ + '/TextAreaAt_' + timestamp + '.mRSL' if not os.path.isfile(local_filename): break # A new filename was created, write content to file if not write_file(content, local_filename, logger): output_objects.append( {'object_type': 'error_text', 'text': 'Could not write: %s' % local_filename}) return (output_objects, returnvalues.SYSTEM_ERROR) fileuploadobj['name'] = os.sep\ + 'html_generated_mrsl/TextAreaAt_' + timestamp\ + '.mRSL' fileuploadobj['size'] = os.path.getsize(local_filename) mrslfiles_to_parse.append(local_filename) fileuploadobjs.append(fileuploadobj) # Submit selected file(s) for mrslfile in mrslfiles_to_parse: # do not reveal full path of mrsl file to client relative_filename = os.sep + mrslfile.replace(base_dir, '') submitstatus = {'object_type': 'submitstatus', 'name': relative_filename} (status, newmsg, job_id) = new_job(mrslfile, client_id, configuration, False, True) if not status: # output_objects.append({"object_type":"error_text", "text":"%s" # % newmsg}) submitstatus['status'] = False submitstatus['message'] = newmsg else: # return (output_objects, returnvalues.CLIENT_ERROR) submitstatus['status'] = True submitstatus['job_id'] = job_id # output_objects.append({"object_type":"text", "text":"%s" # % newmsg}) submitstatuslist.append(submitstatus) # prepare next loop filenumber += 1
def main(client_id, user_arguments_dict): """Main function used by front end""" (configuration, logger, output_objects, op_name) = \ initialize_main_variables(client_id, op_title=True, op_header=False) client_dir = client_id_dir(client_id) status = returnvalues.OK defaults = signature()[1] # TODO: do we need to cover more non-file fields? # All non-file fields must be validated validate_args = dict([(key, user_arguments_dict.get(key, val)) for \ (key, val) in defaults.items()]) # IMPORTANT: we must explicitly inlude CSRF token validate_args[csrf_field] = user_arguments_dict.get( csrf_field, ['AllowMe']) (validate_status, accepted) = validate_input_and_cert( validate_args, defaults, output_objects, client_id, configuration, allow_rejects=False, ) if not validate_status: return (accepted, returnvalues.CLIENT_ERROR) output_objects.append({ 'object_type': 'header', 'text': '%s file handling' % configuration.short_title }) submitstatuslist = [] fileuploadobjs = [] filenumber = 0 file_fields = int(accepted.get('file_fields', -1)[-1]) save_as_default = (accepted['save_as_default'][-1] != 'False') if not safe_handler(configuration, 'post', op_name, client_id, get_csrf_limit(configuration), accepted): output_objects.append({ 'object_type': 'error_text', 'text': '''Only accepting CSRF-filtered POST requests to prevent unintended updates''' }) return (output_objects, returnvalues.CLIENT_ERROR) # Please note that base_dir must end in slash to avoid access to other # user dirs when own name is a prefix of another user name base_dir = os.path.abspath( os.path.join(configuration.user_home, client_dir)) + os.sep mrsl = '' while True: (content, file_type) = handle_form_input(filenumber, user_arguments_dict, configuration) if not content: if filenumber < file_fields: # blank field but file_fields indicates more fields filenumber += 1 continue # no field count and no data for filenumber found break # always append mrsltextarea if available! try: mrsl = user_arguments_dict['mrsltextarea_%s' % filenumber][0] content += mrsl except: pass content += '\n' mrslfiles_to_parse = [] submit_mrslfiles = False submitmrsl_key = 'submitmrsl_%s' % filenumber if configuration.site_enable_jobs and \ user_arguments_dict.has_key(submitmrsl_key): val = str(user_arguments_dict[submitmrsl_key][0]).upper() if val == 'ON' or val == 'TRUE': submit_mrslfiles = True fileuploadobj = { 'object_type': 'fileuploadobj', 'submitmrsl': submit_mrslfiles } if file_type == 'plain': # get filename filename_key = 'FILENAME_%s' % filenumber if not user_arguments_dict.has_key(filename_key): output_objects.append( {'object_type': 'error_text','text' : ("The specified file_type is 'plain', but a filename" \ "value was not found. The missing control should be " \ "named %s") % filename_key}) return (output_objects, returnvalues.CLIENT_ERROR) filename_val = convert_control_value_to_line( filename_key, user_arguments_dict) if not filename_val: if filenumber < file_fields: # blank field but file_fields indicates more fields filenumber += 1 continue output_objects.append({ 'object_type': 'error_text', 'text': 'No filename found - please make sure you provide a " \ "file to upload' }) return (output_objects, returnvalues.CLIENT_ERROR) local_filename = base_dir + filename_val valid_status, valid_err = valid_user_path_name( filename_val, local_filename, base_dir) if not valid_status: output_objects.append({ 'object_type': 'error_text', 'text': valid_err }) return (output_objects, returnvalues.CLIENT_ERROR) # A new filename was created, write content to file if not write_file(content, local_filename, logger): logger.error("%s failed to write plain file %s" % \ (op_name, local_filename)) output_objects.append({ 'object_type': 'error_text', 'text': 'Could not write: %s' % local_filename }) return (output_objects, returnvalues.SYSTEM_ERROR) logger.info("%s wrote plain file %s" % (op_name, local_filename)) fileuploadobj['saved'] = True # msg += "%s created!" % local_filename fileuploadobj['name'] = os.sep\ + convert_control_value_to_line(filename_key, user_arguments_dict) if local_filename.upper().endswith('.MRSL')\ and submit_mrslfiles: mrslfiles_to_parse.append(local_filename) elif file_type == 'fileupload': # An input type=file was found fileupload_key = 'fileupload_%s_0_0' % filenumber # if not fileitem.filename: if not user_arguments_dict.has_key(fileupload_key + 'filename'): output_objects.append({ 'object_type': 'error_text', 'text': 'NO FILENAME error' }) return (output_objects, returnvalues.CLIENT_ERROR) base_name = strip_dir(user_arguments_dict[fileupload_key + 'filename']) if not base_name: if filenumber < file_fields: # blank field but file_fields indicates more fields # output_objects.append({'object_type': 'text', 'text': # 'skip item %d' % filenumber}) filenumber += 1 continue output_objects.append({ 'object_type': 'error_text', 'text': 'No filename found - please make sure you provide a " \ "file to upload' }) return (output_objects, returnvalues.CLIENT_ERROR) extract_packages = False extract_key = 'extract_%s' % filenumber if user_arguments_dict.has_key(extract_key): val = str(user_arguments_dict[extract_key][0]).upper() if val == 'ON' or val == 'TRUE': extract_packages = True remote_filename = '' default_remotefilename_key = 'default_remotefilename_%s'\ % filenumber if user_arguments_dict.has_key(default_remotefilename_key): remote_filename = \ user_arguments_dict[default_remotefilename_key][0] # remotefilename overwrites default_remotefilename if it exists remotefilename_key = 'remotefilename_%s' % filenumber if user_arguments_dict.has_key(remotefilename_key): remote_filename = \ user_arguments_dict[remotefilename_key][0] if not remote_filename: remote_filename = base_name # if remote_filename is a directory, use client's local filename # for the last part of the filename if remote_filename.strip().endswith(os.sep): remote_filename += base_name if not user_arguments_dict.has_key(fileupload_key): output_objects.append({ 'object_type': 'error_text', 'text': 'File content not found!' }) return (output_objects, returnvalues.CLIENT_ERROR) local_filename = os.path.abspath(base_dir + remote_filename) valid_status, valid_err = valid_user_path_name( remote_filename, local_filename, base_dir) if not valid_status: output_objects.append({ 'object_type': 'error_text', 'text': valid_err }) return (output_objects, returnvalues.CLIENT_ERROR) if not os.path.isdir(os.path.dirname(local_filename)): try: os.makedirs(os.path.dirname(local_filename), 0775) except Exception: fileuploadobj['message'] = \ {'object_type': 'error_text', 'text': 'Exception creating dirs %s'\ % os.path.dirname(local_filename)} fileuploadobj['name'] = remote_filename # reads uploaded file into memory binary = user_arguments_dict.has_key('%s_is_encoded' % fileupload_key) if binary: data = user_arguments_dict[fileupload_key][-1] data = str(base64.decodestring(data)) else: data = user_arguments_dict[fileupload_key][-1] # write file in memory to disk if not write_file(data, local_filename, configuration.logger): logger.error("%s failed to write upload file %s" % \ (op_name, local_filename)) output_objects.append({ 'object_type': 'error_text', 'text': 'Error writing file in memory to disk' }) return (output_objects, returnvalues.SYSTEM_ERROR) logger.info("%s wrote upload file %s" % (op_name, local_filename)) fileuploadobj['saved'] = True # Tell the client about the current settings (extract and submit) # extract_str = "Extract files from packages (.zip, .tar.gz, .tgz, .tar.bz2): " # if extract_packages: # extract_str += "ON" # else: # extract_str += "OFF" # output_objects.append({"object_type":"text", "text":extract_str}) fileuploadobj['extract_packages'] = extract_packages # submit_str = "Submit mRSL files to parser (including .mRSL files in packages!): " # if submit_mrslfiles: # submit_str += "ON" # else: # submit_str += "OFF" # output_objects.append({"object_type":"text", "text":submit_str}) # handle file package if extract_packages\ and (local_filename.upper().endswith('.ZIP') or local_filename.upper().endswith('.TAR.GZ') or local_filename.upper().endswith('.TGZ') or local_filename.upper().endswith('.TAR.BZ2')): (upload_status, msg) = handle_package_upload(local_filename, remote_filename, client_id, configuration, submit_mrslfiles, os.path.dirname(local_filename)) if upload_status: if submit_mrslfiles: if isinstance(msg, basestring): output_objects.append({ 'object_type': 'error_text', 'text': 'Error in submit: %s' % msg }) else: submitstatuslist = msg else: output_objects.append({ 'object_type': 'text', 'text': msg }) else: if submit_mrslfiles: if isinstance(msg, basestring): output_objects.append({ 'object_type': 'error_text', 'text': 'Error in unpack: %s' % msg }) else: submitstatuslist = msg else: output_objects.append({ 'object_type': 'error_text', 'text': 'Problems unpacking: %s' % msg }) else: # output_objects.append({"object_type":"text", "text":msg}) # a "normal" (non-package) file was uploaded try: output_objects.append({ 'object_type': 'text', 'text': 'File saved: %s' % remote_filename }) except Exception, err: output_objects.append({ 'object_type': 'error_text', 'text': 'File seems to be saved, but could not get file size %s' % err }) return (output_objects, returnvalues.SYSTEM_ERROR) fileuploadobj['size'] = os.path.getsize(local_filename) fileuploadobj['name'] = remote_filename # Check if the extension is .mRSL if local_filename.upper().endswith('.MRSL')\ and submit_mrslfiles: # A .mrsl file was uploaded! # output_objects.append({"object_type":"text", "text": # "File name on MiG server: %s" # % (remote_filename)}) mrslfiles_to_parse.append(local_filename) else: # mrsl file created by html controls. create filename. Loop until # a filename that do not exits is created html_generated_mrsl_dir = base_dir + 'html_generated_mrsl' if os.path.exists(html_generated_mrsl_dir)\ and not os.path.isdir(html_generated_mrsl_dir): # oops, user might have created a file with the same name output_objects.append({ 'object_type': 'error_text', 'text': 'Please make sure %s does not exist or is a directory!' % 'html_generated_mrsl/' }) return (output_objects, returnvalues.CLIENT_ERROR) if not os.path.isdir(html_generated_mrsl_dir): os.mkdir(html_generated_mrsl_dir) while True: time_c = time.gmtime() timestamp = '%s_%s_%s__%s_%s_%s' % ( time_c[1], time_c[2], time_c[0], time_c[3], time_c[4], time_c[5], ) local_filename = html_generated_mrsl_dir\ + '/TextAreaAt_' + timestamp + '.mRSL' if not os.path.isfile(local_filename): break # A new filename was created, write content to file if not write_file(content, local_filename, logger): output_objects.append({ 'object_type': 'error_text', 'text': 'Could not write: %s' % local_filename }) return (output_objects, returnvalues.SYSTEM_ERROR) fileuploadobj['name'] = os.sep\ + 'html_generated_mrsl/TextAreaAt_' + timestamp\ + '.mRSL' fileuploadobj['size'] = os.path.getsize(local_filename) mrslfiles_to_parse.append(local_filename) fileuploadobjs.append(fileuploadobj) # Submit selected file(s) for mrslfile in mrslfiles_to_parse: # do not reveal full path of mrsl file to client relative_filename = os.sep + mrslfile.replace(base_dir, '') submitstatus = { 'object_type': 'submitstatus', 'name': relative_filename } (new_status, newmsg, job_id) = new_job(mrslfile, client_id, configuration, False, True) if not new_status: # output_objects.append({"object_type":"error_text", "text":"%s" # % newmsg}) submitstatus['status'] = False submitstatus['message'] = newmsg else: # return (output_objects, returnvalues.CLIENT_ERROR) submitstatus['status'] = True submitstatus['job_id'] = job_id # output_objects.append({"object_type":"text", "text":"%s" # % newmsg}) submitstatuslist.append(submitstatus) # prepare next loop filenumber += 1