Exemplo n.º 1
0
// Update the meta data, meta sign, public key
func (uc *UpdateClient) Update(repoURL string) error {
	repo, err := client.NewUCRepo(repoURL)
	if err != nil {
		return err
	}

	needUpdate := false
	remoteMetaBytes, err := repo.GetMeta()
	if err != nil {
		return err
	}

	localMetaFile := filepath.Join(uc.getCacheDir(), repo.NRString(), defaultMeta)
	localMetaBytes, err := ioutil.ReadFile(localMetaFile)
	if err != nil {
		needUpdate = true
	} else {
		var remoteMeta utils.Meta
		var localMeta utils.Meta
		json.Unmarshal(remoteMetaBytes, &remoteMeta)
		json.Unmarshal(localMetaBytes, &localMeta)
		needUpdate = localMeta.Before(remoteMeta)
	}

	if !needUpdate {
		fmt.Println("Already updated to the latest version.")
		return nil
	}

	uc.save(repo, defaultMeta, remoteMetaBytes)
	signBytes, _ := repo.GetMetaSign()
	pubBytes, _ := repo.GetPublicKey()
	err = utils.SHA256Verify(pubBytes, remoteMetaBytes, signBytes)
	if err != nil {
		fmt.Println("Fail to verify meta by public key")
		return err
	}

	metaURL, err := uc.save(repo, defaultMeta, remoteMetaBytes)
	if err != nil {
		return err
	}

	signURL, err := uc.save(repo, defaultMetaSign, signBytes)
	if err != nil {
		os.Remove(metaURL)
		return err
	}

	_, err = uc.save(repo, defaultPublicKey, pubBytes)
	if err != nil {
		os.Remove(metaURL)
		os.Remove(signURL)
		return err
	}

	return nil
}