Ok(result)
}
+fn complete_backup_group(arg: &str, param: &HashMap<String, String>) -> Vec<String> {
+
+ let mut result = vec![];
+
+ let repo_url = match param.get("repository") {
+ Some(v) => v,
+ _ => return result,
+ };
+
+ let repo: BackupRepository = match repo_url.parse() {
+ Ok(v) => v,
+ _ => return result,
+ };
+
+ let mut client = HttpClient::new(repo.host(), repo.user());
+
+ let path = format!("api2/json/admin/datastore/{}/groups", repo.store());
+
+ let resp = match client.try_get(&path) {
+ Ok(v) => v,
+ _ => return result,
+ };
+
+ if let Some(list) = resp["data"].as_array() {
+ for item in list {
+ if let Some(backup_id) = item["backup-id"].as_str() {
+ if let Some(backup_type) = item["backup-type"].as_str() {
+ result.push(format!("{}/{}", backup_type, backup_id));
+ }
+ }
+ }
+ }
+
+ result
+}
+
fn main() {
let repo_url_schema: Arc<Schema> = Arc::new(
.required("group", StringSchema::new("Backup group."))
))
.arg_param(vec!["repository", "group"])
+ .completion_cb("group", complete_backup_group)
.completion_cb("repository", complete_repository);
let forget_cmd_def = CliCommand::new(
Self::run_request(request)
}
+ /// like get(), but use existing credentials (never asks for password).
+ /// this simply fails when there is no ticket
+ pub fn try_get(&mut self, path: &str) -> Result<Value, Error> {
+
+ let path = path.trim_matches('/');
+ let url: Uri = format!("https://{}:8007/{}", self.server, path).parse()?;
+
+ let mut credentials = None;
+
+ if let Some(ref ticket) = self.ticket {
+ if let Some(ref token) = self.token {
+ credentials = Some((ticket.clone(), token.clone()));
+ }
+ }
+
+ if credentials == None {
+ if let Some((ticket, token)) = load_ticket_info(&self.server, &self.username) {
+ credentials = Some((ticket.clone(), token.clone()));
+ }
+ }
+
+ if credentials == None {
+ bail!("unable to get credentials");
+ }
+
+ let (ticket, _token) = credentials.unwrap();
+
+ let enc_ticket = percent_encode(ticket.as_bytes(), DEFAULT_ENCODE_SET).to_string();
+
+ let request = Request::builder()
+ .method("GET")
+ .uri(url)
+ .header("User-Agent", "proxmox-backup-client/1.0")
+ .header("Cookie", format!("PBSAuthCookie={}", enc_ticket))
+ .body(Body::empty())?;
+
+ Self::run_request(request)
+ }
+
pub fn delete(&mut self, path: &str) -> Result<Value, Error> {
let path = path.trim_matches('/');