add repair duplicates
This commit is contained in:
72
src/main.rs
72
src/main.rs
@ -15,11 +15,19 @@ struct Cli{
|
|||||||
|
|
||||||
#[derive(Subcommand)]
|
#[derive(Subcommand)]
|
||||||
enum Commands{
|
enum Commands{
|
||||||
|
RepairDuplicates(RepairDuplicatesCommand),
|
||||||
RepairPolicies(RepairPoliciesCommand),
|
RepairPolicies(RepairPoliciesCommand),
|
||||||
Review(ReviewCommand),
|
Review(ReviewCommand),
|
||||||
UploadScripts(UploadScriptsCommand),
|
UploadScripts(UploadScriptsCommand),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Args)]
|
||||||
|
struct RepairDuplicatesCommand{
|
||||||
|
#[arg(long)]
|
||||||
|
session_id_file:PathBuf,
|
||||||
|
#[arg(long)]
|
||||||
|
api_url:String,
|
||||||
|
}
|
||||||
#[derive(Args)]
|
#[derive(Args)]
|
||||||
struct RepairPoliciesCommand{
|
struct RepairPoliciesCommand{
|
||||||
#[arg(long)]
|
#[arg(long)]
|
||||||
@ -46,7 +54,11 @@ struct UploadScriptsCommand{
|
|||||||
async fn main(){
|
async fn main(){
|
||||||
let cli=Cli::parse();
|
let cli=Cli::parse();
|
||||||
match cli.command{
|
match cli.command{
|
||||||
Commands::RepairPolicies(command)=>repair(RepairPoliciesConfig{
|
Commands::RepairDuplicates(command)=>repair_duplicates(RepairDuplicatesConfig{
|
||||||
|
session_id:std::fs::read_to_string(command.session_id_file).unwrap(),
|
||||||
|
api_url:command.api_url,
|
||||||
|
}).await.unwrap(),
|
||||||
|
Commands::RepairPolicies(command)=>repair_policies(RepairPoliciesConfig{
|
||||||
session_id:std::fs::read_to_string(command.session_id_file).unwrap(),
|
session_id:std::fs::read_to_string(command.session_id_file).unwrap(),
|
||||||
api_url:command.api_url,
|
api_url:command.api_url,
|
||||||
}).await.unwrap(),
|
}).await.unwrap(),
|
||||||
@ -460,7 +472,7 @@ struct RepairPoliciesConfig{
|
|||||||
session_id:String,
|
session_id:String,
|
||||||
api_url:String,
|
api_url:String,
|
||||||
}
|
}
|
||||||
async fn repair(config:RepairPoliciesConfig)->Result<(),RepairPoliciesError>{
|
async fn repair_policies(config:RepairPoliciesConfig)->Result<(),RepairPoliciesError>{
|
||||||
let cookie=submissions_api::Cookie::new(&config.session_id).map_err(RepairPoliciesError::Cookie)?;
|
let cookie=submissions_api::Cookie::new(&config.session_id).map_err(RepairPoliciesError::Cookie)?;
|
||||||
let api=&submissions_api::external::Context::new(config.api_url,cookie).map_err(RepairPoliciesError::Reqwest)?;
|
let api=&submissions_api::external::Context::new(config.api_url,cookie).map_err(RepairPoliciesError::Reqwest)?;
|
||||||
|
|
||||||
@ -509,3 +521,59 @@ async fn repair(config:RepairPoliciesConfig)->Result<(),RepairPoliciesError>{
|
|||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
#[derive(Debug)]
|
||||||
|
enum RepairDuplicatesError{
|
||||||
|
Cookie(submissions_api::CookieError),
|
||||||
|
Reqwest(submissions_api::ReqwestError),
|
||||||
|
GetScripts(submissions_api::Error),
|
||||||
|
DeleteScript(submissions_api::Error),
|
||||||
|
}
|
||||||
|
|
||||||
|
struct RepairDuplicatesConfig{
|
||||||
|
session_id:String,
|
||||||
|
api_url:String,
|
||||||
|
}
|
||||||
|
async fn repair_duplicates(config:RepairDuplicatesConfig)->Result<(),RepairDuplicatesError>{
|
||||||
|
let cookie=submissions_api::Cookie::new(&config.session_id).map_err(RepairDuplicatesError::Cookie)?;
|
||||||
|
let api=&submissions_api::external::Context::new(config.api_url,cookie).map_err(RepairDuplicatesError::Reqwest)?;
|
||||||
|
|
||||||
|
let mut sources=std::collections::HashSet::new();
|
||||||
|
|
||||||
|
const LIMIT:u32=100;
|
||||||
|
let mut page=1;
|
||||||
|
loop{
|
||||||
|
println!("Downloading page {page}...");
|
||||||
|
let scripts=api.get_scripts(submissions_api::types::GetScriptsRequest{
|
||||||
|
Page:page,
|
||||||
|
Limit:LIMIT,
|
||||||
|
Name:None,
|
||||||
|
Hash:None,
|
||||||
|
Source:None,
|
||||||
|
ResourceType:None,
|
||||||
|
ResourceID:None,
|
||||||
|
}).await.map_err(RepairDuplicatesError::GetScripts)?;
|
||||||
|
|
||||||
|
let done=scripts.len()<LIMIT as usize;
|
||||||
|
|
||||||
|
for script in scripts{
|
||||||
|
if !sources.insert(script.Source){
|
||||||
|
println!("Deleting duplicate script {:?}",script.ID);
|
||||||
|
api.delete_script(submissions_api::types::GetScriptRequest{
|
||||||
|
ScriptID:script.ID,
|
||||||
|
}).await.map_err(RepairDuplicatesError::DeleteScript)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if done{
|
||||||
|
// We scanned all policies
|
||||||
|
println!("Done!");
|
||||||
|
break;
|
||||||
|
}else{
|
||||||
|
page+=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user