internal/sequence/sequence_linux.go (66 lines of code) (raw):
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
package sequence
import (
"fmt"
"github.com/Azure/azure-extension-foundation/errorhelper"
"github.com/Azure/azure-extension-foundation/internal/settings"
"io/ioutil"
"os"
"path/filepath"
"sort"
"strconv"
"strings"
)
var mostRecentSequenceFileName = "mrseq"
const chmod = os.FileMode(0600)
// GetEnvironmentMostRecentSequenceNumber returns the environment most recent sequence number
func GetEnvironmentMostRecentSequenceNumber() (int, error) {
hEnv, err := settings.GetEnvironment()
if err != nil {
return -1, errorhelper.AddStackToError(fmt.Errorf("unable to parse handler environment : %s", err))
}
return findEnvironmentMostRecentSequenceNumber(hEnv.HandlerEnvironment.ConfigFolder)
}
// GetExtensionMostRecentSequenceNumber returns the extension most recent sequence number
func GetExtensionSequenceNumber() (int, error) {
return findExtensionMostRecentSequenceNumber()
}
// SetExtensionMostRecentSequenceNumber sets the extension most recent sequence number by writing the sequence
// number to the respective extension "mrseq" file
func SetExtensionMostRecentSequenceNumber(sequenceNumber int) error {
return setExtensionMostRecentSequenceNumber(sequenceNumber)
}
// findEnvironmentMostRecentSequenceNumber finds the most recent environment mrseq by looking up at the
// highest *.settings file in the handler config folder
func findEnvironmentMostRecentSequenceNumber(configFolder string) (int, error) {
g, err := filepath.Glob(configFolder + "/*.settings")
if err != nil {
return 0, errorhelper.AddStackToError(err)
}
sequence := make([]int, len(g))
for _, v := range g {
f := filepath.Base(v)
i, err := strconv.Atoi(strings.Replace(f, ".settings", "", 1))
if err != nil {
return 0, errorhelper.AddStackToError(fmt.Errorf("can't parse int from filename: %s", f))
}
sequence = append(sequence, i)
}
if len(sequence) == 0 {
return 0, errorhelper.AddStackToError(fmt.Errorf("can't find out seqnum from %s, not enough files", configFolder))
}
sort.Sort(sort.Reverse(sort.IntSlice(sequence)))
return sequence[0], nil
}
// findExtensionMostRecentSequenceNumber find the most recent extension mrseq by reading the extension "mrseq" file
func findExtensionMostRecentSequenceNumber() (int, error) {
mrseqStr, err := ioutil.ReadFile(mostRecentSequenceFileName)
if err != nil {
if os.IsNotExist(err) {
return -1, nil
}
return -1, errorhelper.AddStackToError(fmt.Errorf("failed to read mrseq file : %s", err))
}
mrseq, err := strconv.Atoi(string(mrseqStr))
return mrseq, errorhelper.AddStackToError(err)
}
// setExtensionMostRecentSequenceNumber sets the extension mrseq by writing the current mrseq in the extension
// "mrseq" file
func setExtensionMostRecentSequenceNumber(sequenceNumber int) error {
b := []byte(fmt.Sprintf("%v", sequenceNumber))
err := ioutil.WriteFile(mostRecentSequenceFileName, b, chmod)
if err != nil {
return errorhelper.AddStackToError(err)
}
return nil
}