コード例 #1
0
ファイル: util.go プロジェクト: marsmensch/blobstash
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
}