]> git.proxmox.com Git - proxmox-backup.git/commitdiff
src/bin/proxmox-backup-client.rs: implement completion for backup groups
authorDietmar Maurer <dietmar@proxmox.com>
Wed, 13 Mar 2019 10:56:37 +0000 (11:56 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Wed, 13 Mar 2019 10:56:37 +0000 (11:56 +0100)
src/bin/proxmox-backup-client.rs
src/client/http_client.rs

index 6bdee694aad0353efe6fb2bc3ebe4fcbe8bebde9..e51ba94af6807c4aa922a921b7bae647b668238c 100644 (file)
@@ -581,6 +581,42 @@ fn prune(
     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(
@@ -643,6 +679,7 @@ fn main() {
                 .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(
index a43ff3e9e6251adeaca9cab5283273f839f929e4..27179ecc48bdf4f335f70814f159d78eef55b7a1 100644 (file)
@@ -257,6 +257,45 @@ impl HttpClient {
         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('/');