func Sync(con *glacier.Connection, db *DB, vault string) error { go handleClose(db) lastSync, err := db.Get("inventory-last-run") if err != nil { return err } if lastSync != "" { fmt.Printf("WARNING: A successful sync was performed on %v,\n", lastSync) fmt.Printf("if a new sync is started, any previous jobs running won't be tracked anymore.\n") fmt.Printf("Are you sure you want to continue (yes/no)? ") if !askForConfirmation() { log.Printf("Aborting...") db.Close() os.Exit(1) } else { db.Drop() } } var jobId string jobId, err = db.Get("inventory-job-id") if err != nil { return err } var jobExists bool if jobId != "" { jobExists = true _, err := con.DescribeJob(vault, jobId) if err != nil { jobExists = false log.Printf("Job %v isn't available anymore", jobId) } } if jobId == "" || !jobExists { jobId, err = con.InitiateInventoryJob(vault, "", "") if err != nil { return err } log.Printf("Initiated a new inventory job: %v", jobId) if err := db.Set("inventory-job-id", jobId); err != nil { return err } } else { log.Printf("Checking job %v", jobId) } log.Printf("Waiting for job to complete, you can safely CTRL+C and resume this process") for { job, err := con.DescribeJob(vault, jobId) if err != nil { return err } if job.Completed { log.Printf("Job %v completed", jobId) break } time.Sleep(checkDelay) } inventory, err := con.GetInventoryJob(vault, jobId) if err != nil { return err } for index, archive := range inventory.ArchiveList { archiveJson, err := json.Marshal(&archive) if err != nil { return err } log.Printf("Saving archive %v", archive.ArchiveId) if err := db.Set(fmt.Sprintf("archive:%v", index), string(archiveJson)); err != nil { return err } } if err := db.Set("inventory-last-run", time.Now().Format(time.RFC3339)); err != nil { return err } log.Printf("Inventory saved, sync done") return nil }