def restart_job(self): id: int = request.args.get('id', None) if id is not None: self._device_updater.restart_job(id) flash('Job requeued') return redirect(getBasePath(request) + '/install_status') flash('unknown id - restart failed') return redirect(getBasePath(request) + '/install_status')
def install_file_all_devices(self): jobname = request.args.get('jobname', None) type_ = request.args.get('type', None) if jobname is None or type_ is None: flash('No File or Type selected') return redirect(getBasePath(request) + '/install_status') devices = self._mapping_manager.get_all_devices() for device in devices: self._device_updater.preadd_job(origin=device, job=jobname, id_=int(time.time()), type=type_) time.sleep(1) flash('Job successfully queued') return redirect(getBasePath(request) + '/install_status')
def delete_log_entry(self): id_ = request.args.get('id') if self._device_updater.delete_log_id(id_): flash('Job could be deleted successfully') else: flash('Job could not be deleted successfully') return redirect(getBasePath(request) + '/install_status')
def savesortwalker(self): walkernr = request.args.get('walkernr') data = request.args.getlist('position[]') edit = request.args.get('edit') datavalue = [] with open('configs/mappings.json') as f: mapping = json.load(f) if 'walker' not in mapping: mapping['walker'] = [] for ase in data: _temp = ase.split("|") walkerlist = {'walkerarea': _temp[0], 'walkertype': _temp[1], 'walkervalue': _temp[2], 'walkermax': _temp[3], 'walkertext': _temp[4]} datavalue.append(walkerlist) mapping['walker'][int(walkernr)]['setup'] = datavalue with open('configs/mappings.json', 'w') as outfile: json.dump(mapping, outfile, indent=4, sort_keys=True) return redirect(getBasePath(request) + "/config?type=walker&area=walker&block=fields&edit=" + str(edit), code=302)
def install_file(self): jobname = request.args.get('jobname') origin = request.args.get('origin') useadb = request.args.get('adb', False) type_ = request.args.get('type', None) devicemappings = self._mapping_manager.get_all_devicemappings() adb = devicemappings.get(origin, {}).get('adb', False) if os.path.exists(os.path.join(self._args.upload_path, jobname)): if useadb == 'True': if self._adb_connect.push_file(adb, origin, os.path.join(self._args.upload_path, jobname)) and \ self._adb_connect.send_shell_command( adb, origin, "pm install -r /sdcard/Download/" + str(jobname)): flash('File could be installed successfully') else: flash('File could not be installed successfully :(') else: self._device_updater.preadd_job(origin=origin, job=jobname, id_=int(time.time()), type=type_) flash('File successfully queued --> See Job Status') elif type_ != jobType.INSTALLATION: self._device_updater.preadd_job(origin=origin, job=jobname, id_=int(time.time()), type=type_) flash('Job successfully queued --> See Job Status') return redirect( getBasePath(request) + '/uploaded_files?origin=' + str(origin) + '&adb=' + str(useadb))
def delsetting(self): global device_mappings, areas edit = request.args.get('edit') area = request.args.get('area') with open('configs/mappings.json') as f: mapping = json.load(f) if 'walker' not in mapping: mapping['walker'] = [] for key, entry in enumerate(mapping[area]): if 'name' in entry: _checkfield = 'name' if 'origin' in entry: _checkfield = 'origin' if 'username' in entry: _checkfield = 'username' if 'walkername' in entry: _checkfield = 'walkername' if 'devicepool' in entry: _checkfield = 'devicepool' if str(edit) == str(entry[_checkfield]): del mapping[area][key] with open('configs/mappings.json', 'w') as outfile: json.dump(mapping, outfile, indent=4, sort_keys=True) return redirect(getBasePath(request) + "/showsettings", code=302)
def modify_gym_hash(self): hash = request.args.get('hash') id = request.args.get('id') self._db.delete_hash_table(str(hash), 'gym', 'in', 'hash') self._db.insert_hash(hash, 'gym', id, '999', unique_hash="madmin") return redirect(getBasePath(request) + "/gyms", code=302)
def trigger_research_menu(self): origin = request.args.get('origin') try: self.research_trigger_queue.put(origin) except Exception as e: self._logger.exception( 'MADmin: Exception occurred while trigger research menu: {}.', e) return redirect(getBasePath(request) + '/phonecontrol')
def submit_hash(self): hash = request.args.get('hash') id = request.args.get('id') if self._db.insert_hash(hash, 'gym', id, '999', unique_hash="madmin"): for file in glob.glob("www_hash/unkgym_*" + str(hash) + ".jpg"): copyfile(file, 'www_hash/gym_0_0_' + str(hash) + '.jpg') os.remove(file) return redirect(getBasePath(request) + "/unknown", code=302)
def delete_file(self): hash = request.args.get('hash') type = request.args.get('type') redi = request.args.get('redirect') if not hash or not type: return 'Missing Argument...' for file in glob.glob("ocr/www_hash/*" + str(hash) + ".jpg"): os.remove(file) return redirect(getBasePath(request) + '/' + str(redi), code=302)
def job_for_worker(self): jobname = request.args.get('jobname', None) type_ = request.args.get('type', None) devices = request.args.getlist('device[]') for device in devices: self._device_updater.preadd_job(origin=device, job=jobname, id_=int(time.time()), type=type_) time.sleep(1) flash('Job successfully queued') return redirect(getBasePath(request) + '/install_status')
def upload(self): if request.method == 'POST': # check if the post request has the file part if 'file' not in request.files: flash('No file part') return redirect(request.url) file = request.files['file'] if file.filename == '': flash('No file selected for uploading') return redirect(request.url) if file and allowed_file(file.filename): filename = secure_filename(file.filename) file.save(os.path.join(self._args.upload_path, filename)) flash('File could be uploaded successfully') return redirect(getBasePath(request) + '/uploaded_files') else: flash('Allowed file type is apk only!') return redirect(getBasePath(request) + request.url) return render_template('upload.html', header="File Upload", title="File Upload")
def modify_raid_mon(self): hash = request.args.get('hash') id = request.args.get('gym') mon = request.args.get('mon') lvl = request.args.get('lvl') newJsonString = encodeHashJson(id, lvl, mon) self._db.delete_hash_table(str(hash), 'raid', 'in', 'hash') self._db.insert_hash(hash, 'raid', newJsonString, '999', unique_hash="madmin") return redirect(getBasePath(request) + "/raids", code=302)
def savefence(self): name = request.args.get('name', False) coords = request.args.get('coords', False) if not name and not coords: return redirect(getBasePath(request) + "/map", code=302) coords_split = coords.split("|") geofence_file_path = self._args.geofence_file_path file = open(os.path.join(geofence_file_path, (str(name) + ".txt")), "a") file.write("[" + str(name) + "]\n") for i in range(len(coords_split)): if coords_split[i] != '': latlon_split = coords_split[i].split(",") file.write("{0},{1}\n".format(str(float(latlon_split[0])), str(float(latlon_split[1])))) file.close() return redirect(getBasePath(request) + "/map", code=302)
def addnew(self): area = request.args.get('area') line = '' with open('madmin/static/vars/vars_parser.json') as f: settings = json.load(f) if (len(settings[area])) == 1: return redirect(getBasePath(request) + '/config?type=' + area + '&area=' + area + '&block=fields', code=302) for output in settings[area]: line = line + '<h3><a href="config?type=' + str(output['name']) + '&area=' + str( area) + '&block=fields">' + str(output['name']) + '</a></h3><h5>' + str( output['description']) + '</h5><hr>' return render_template('sel_type.html', line=line, title="Type selector", running_ocr=(self._args.only_ocr))
def restart_phone(self): origin = request.args.get('origin') useadb = request.args.get('adb') adb = self._device_mapping[origin].get('adb', False) self._logger.info('MADmin: Restart Phone ({})', str(origin)) if useadb == 'True' and self._adb_connect.send_shell_command( adb, origin, "am broadcast -a android.intent.action.BOOT_COMPLETED"): self._logger.info('MADMin: ADB shell command successfully ({})', str(origin)) else: temp_comm = self._ws_server.get_origin_communicator(origin) temp_comm.reboot() return redirect(getBasePath(request) + '/phonecontrol')
def clear_game_data(self): origin = request.args.get('origin') useadb = request.args.get('adb') devicemappings = self._mapping_manager.get_all_devicemappings() adb = devicemappings.get(origin, {}).get('adb', False) self._logger.info('MADmin: Clear game data for phone ({})', str(origin)) if (useadb == 'True' and self._adb_connect.send_shell_command( adb, origin, "pm clear com.nianticlabs.pokemongo")): self._logger.info('MADMin: ADB shell command successfully ({})', str(origin)) else: temp_comm = self._ws_server.get_origin_communicator(origin) temp_comm.resetAppdata("com.nianticlabs.pokemongo") return redirect(getBasePath(request) + '/phonecontrol')
def delwalker(self): walker = request.args.get('walker') walkernr = request.args.get('walkernr') walkerposition = request.args.get('walkerposition') with open('configs/mappings.json') as f: mapping = json.load(f) if 'walker' not in mapping: mapping['walker'] = [] del mapping['walker'][int(walkernr)]['setup'][int(walkerposition)] with open('configs/mappings.json', 'w') as outfile: json.dump(mapping, outfile, indent=4, sort_keys=True) return redirect(getBasePath(request) + "/config?type=walker&area=walker&block=fields&edit=" + str(walker), code=302)
def delete_log(self): onlysuccess = request.args.get('only_success', False) self._device_updater.delete_log(onlysuccess=onlysuccess) return redirect(getBasePath(request) + '/install_status')
def reload(self): if not self._args.auto_reload_config: self._mapping_mananger.update() return redirect(getBasePath(request) + "/showsettings", code=302)
def addedit(self): data = request.form.to_dict(flat=False) datavalue = {} for ase in data: key = ','.join(data[ase]) datavalue[ase] = key edit = datavalue.get("edit", False) block = datavalue.get("block", False) area = datavalue.get("area", False) mode = datavalue.get("mode", False) with open('configs/mappings.json') as f: mapping = json.load(f) if 'walker' not in mapping: mapping['walker'] = [] if 'devicesettings' not in mapping: mapping['devicesettings'] = [] with open('madmin/static/vars/settings.json') as f: settings = json.load(f) if edit: for entry in mapping[area]: if 'name' in entry: _checkfield = 'name' if 'origin' in entry: _checkfield = 'origin' if 'username' in entry: _checkfield = 'username' if 'walkername' in entry: _checkfield = 'walkername' if 'devicepool' in entry: _checkfield = 'devicepool' if str(edit) == str(entry[_checkfield]): if str(block) == str("settings"): for key, value in datavalue.items(): if value == '' or value == 'None': if key in entry['settings']: del entry['settings'][key] elif value in area: continue else: if str(key) not in ('block', 'area', 'type', 'edit', 'mode'): entry['settings'][key] = self.match_type(value) else: for key, value in datavalue.items(): if value == '': if key in entry: del entry[key] elif value in area: continue else: if str(key) in ('geofence'): entry[key] = value elif str(key) not in ('block', 'area', 'type', 'edit'): entry[key] = self.match_type(value) else: new = {} for key, value in datavalue.items(): if value != '' and value not in area: if str(key) in ('geofence'): new[key] = value elif str(key) not in ('block', 'area', 'type', 'edit'): new[key] = self.match_type(value) if str(block) == str("settings"): mapping[area]['settings'].append(new) else: if settings[area]['has_settings'] == 'true': new['settings'] = {} mapping[area].append(new) with open('configs/mappings.json', 'w') as outfile: json.dump(mapping, outfile, indent=4, sort_keys=True) return redirect(getBasePath(request) + "/showsettings", code=302)
def delete_file(self): filename = request.args.get('filename') if os.path.exists(os.path.join(self._args.upload_path, filename)): os.remove(os.path.join(self._args.upload_path, filename)) flash('File could be deleted successfully') return redirect(getBasePath(request) + '/uploaded_files')
def addwalker(self): fieldwebsite = [] walkervalue = "" walkerposition = "" walkermax = "" walkertext = "" edit = request.args.get('edit') walker = request.args.get('walker') add = request.args.get('add') walkernr = request.args.get('walkernr') with open('configs/mappings.json') as f: mapping = json.load(f) if 'walker' not in mapping: mapping['walker'] = [] if add: walkerarea = request.args.get('walkerarea') walkertype = request.args.get('walkertype') walkervalue = request.args.get('walkervalue') walkernr = request.args.get('walkernr') walkermax = request.args.get('walkermax') walkertext = request.args.get('walkertext').replace(' ', '_') walkerposition = request.args.get('walkerposition', False) if not walkerposition: walkerposition = False oldwalkerposition = request.args.get('oldwalkerposition') edit = request.args.get('edit') walkerlist = {'walkerarea': walkerarea, 'walkertype': walkertype, 'walkervalue': walkervalue, 'walkermax': walkermax, 'walkertext': walkertext} if 'setup' not in mapping['walker'][int(walkernr)]: mapping['walker'][int(walkernr)]['setup'] = [] if edit: if int(walkerposition) == int(oldwalkerposition): mapping['walker'][int(walkernr)]['setup'][int( walkerposition)] = walkerlist else: del mapping['walker'][int( walkernr)]['setup'][int(oldwalkerposition)] if walkerposition: mapping['walker'][int(walkernr)]['setup'].insert( int(walkerposition), walkerlist) else: mapping['walker'][int(walkernr)]['setup'].insert( 999, walkerlist) else: if walkerposition: mapping['walker'][int(walkernr)]['setup'].insert( int(walkerposition), walkerlist) else: mapping['walker'][int(walkernr)]['setup'].insert( 999, walkerlist) with open('configs/mappings.json', 'w') as outfile: json.dump(mapping, outfile, indent=4, sort_keys=True) return redirect(getBasePath(request) + "/config?type=walker&area=walker&block=fields&edit=" + str(walker), code=302) if walker and edit: walkerposition = request.args.get('walkerposition') _walkerval = mapping['walker'][int( walkernr)]['setup'][int(walkerposition)] walkerarea = _walkerval['walkerarea'] walkertype = _walkerval['walkertype'] walkervalue = _walkerval['walkervalue'] walkermax = _walkerval.get('walkermax', '') walkertext = _walkerval.get('walkertext', '').replace(' ', '_') if walkermax is None: walkermax = '' edit = True fieldwebsite.append('<form action="addwalker" id="settings">') fieldwebsite.append( '<input type="hidden" name="walker" value="' + walker + '">') fieldwebsite.append('<input type="hidden" name="add" value=True>') if walker and edit: fieldwebsite.append( '<input type="hidden" name="oldwalkerposition" value=' + str(walkerposition) + '>') fieldwebsite.append('<input type="hidden" name="edit" value=True>') fieldwebsite.append( '<input type="hidden" name="walkernr" value=' + str(walkernr) + '>') req = "required" # lockvalue = 'readonly' lockvalue = '' _temp = '<div class="form-group"><label>Area</label><br /><small class="form-text text-muted">Select the Area' \ '</small><select class="form-control" name="walkerarea" ' + \ lockvalue + ' ' + req + '>' with open('configs/mappings.json') as f: mapping = json.load(f) if 'walker' not in mapping: mapping['walker'] = [] mapping['areas'].append({'name': None}) for option in mapping['areas']: sel = '' if edit: if str(walkerarea).lower() == str(option['name']).lower(): sel = 'selected' _temp = _temp + '<option value="' + str(option['name']) + '" ' + sel + '>' + str( option['name']) + '</option>' sel = '' _temp = _temp + '</select></div>' fieldwebsite.append(str(_temp)) req = "required" _temp = '<div class="form-group"><label>Walkermode</label><br /><small class="form-text text-muted">' \ 'Choose the way to end the route:<br>' \ '<b>countdown</b>: Kill worker after X seconds<br>' \ '<b>timer</b>: Kill worker after X:XX o´clock (Format: 24h f.e. 21:30 -> 9:30 pm)<br>' \ '<b>round</b>: Kill worker after X rounds<br>' \ '<b>period</b>: Kill worker if outside the period (Format: 24h f.e. 7:00-21:00)<br>' \ '<b>coords*</b>: Kill worker if no more coords are present<br>' \ '<b>idle*</b>: Idle worker and close Pogo till time or in period (check sleepmode of phone - ' \ 'display must be on in this time!)<br>' \ '<b>*Additionally for coords/idle (walkervalue):</b><br>' \ '- Kill worker after X:XX o´clock (Format: 24h)<br>' \ '- Kill worker if outside of a period (Format: 24h f.e. 7:00-21:00)<br>' \ '</small>' \ '<select class="form-control" name="walkertype" ' + lockvalue + ' ' + req + '>' _options = ('countdown#timer#round#period#coords#idle').split('#') for option in _options: if edit: if str(walkertype).lower() in str(option).lower(): sel = 'selected' _temp = _temp + '<option value="' + \ str(option) + '" ' + sel + '>' + str(option) + '</option>' sel = '' _temp = _temp + '</select></div>' fieldwebsite.append(str(_temp)) fieldwebsite.append('<div class="form-group"><label>Value for Walkermode</label><br />' '<small class="form-text text-muted"></small>' '<input type="text" name="walkervalue" value="' + str( walkervalue) + '" data-rule-validatewalkervalue="true"></div>') fieldwebsite.append('<div class="form-group"><label>Max. Walker in Area</label><br />' '<small class="form-text text-muted">Empty = infinitely</small>' '<input type="text" name="walkermax" value="' + str(walkermax) + '"></div>') fieldwebsite.append('<div class="form-group"><label>Description</label><br />' '<small class="form-text text-muted"></small>' '<input type="text" name="walkertext" value="' + str(walkertext).replace('_', ' ') + '"></div>') fieldwebsite.append('<div class="form-group"><label>Position in Walker</label><br />' '<small class="form-text text-muted">Set position in walker (0=first / empty=append on list)' '</small>' '<input type="text" name="walkerposition" value="' + str(walkerposition) + '"></div>') fieldwebsite.append( '<button type="submit" class="btn btn-primary">Save</button></form>') if edit: header = "Edit " + walkerarea + " (" + walker + ")" else: header = "Add new " + walker return render_template('parser.html', editform=fieldwebsite, header=header, title="edit settings", running_ocr=(self._args.only_ocr))
def reload_jobs(self): logger.info("Reload existing jobs") self._device_updater.init_jobs() return redirect(getBasePath(request) + '/uploaded_files')