def route_nuke(firmware_id): """ Delete a firmware entry and also delete the file from disk """ # check firmware exists in database fw = db.session.query(Firmware).filter( Firmware.firmware_id == firmware_id).first() if not fw: flash('No firmware {} exists'.format(firmware_id), 'danger') return redirect(url_for('firmware.route_firmware')) # firmware is not deleted yet if not fw.is_deleted: flash('Cannot nuke file not yet deleted', 'danger') return redirect(url_for('firmware.route_show', firmware_id=firmware_id)) # security check if not fw.check_acl('@nuke'): flash('Permission denied: Insufficient permissions to nuke firmware', 'danger') return redirect(url_for('firmware.route_show', firmware_id=firmware_id)) # really delete firmware path = os.path.join(app.config['RESTORE_DIR'], fw.filename) if os.path.exists(path): os.remove(path) # delete shard cache if they exist for md in fw.mds: for shard in md.shards: path = _get_shard_path(shard) if os.path.exists(path): os.remove(path) # generate next cron run fw.remote.is_dirty = True # delete everything we stored about the firmware db.session.delete(fw) # all done db.session.commit() flash('Firmware nuked', 'info') return redirect(url_for('firmware.route_firmware'))
def _purge_old_deleted_firmware(): # find all unsigned firmware for fw in db.session.query(Firmware)\ .join(Remote).filter(Remote.name == 'deleted')\ .order_by(Firmware.timestamp.asc()): if fw.target_duration > datetime.timedelta(days=30 * 6): print('Deleting %s as age %s' % (fw.filename, fw.target_duration)) path = os.path.join(app.config['RESTORE_DIR'], fw.filename) if os.path.exists(path): os.remove(path) for md in fw.mds: for shard in md.shards: path = _get_shard_path(shard) if os.path.exists(path): os.remove(path) db.session.delete(fw) db.session.commit()