1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
package main
import (
"crypto/sha256"
"encoding/base32"
"encoding/base64"
"encoding/binary"
"encoding/hex"
"fmt"
log "github.com/sirupsen/logrus"
"go.mongodb.org/mongo-driver/bson/primitive"
"io"
"os"
"time"
)
func Sha256Sum(fileName string) (string, error) {
f, err := os.Open(fileName)
if err != nil {
return "", err
}
defer func() {
err = f.Close()
if err != nil {
log.WithError(err).WithField("filename", fileName).Error("failed to close file")
}
}()
h := sha256.New()
if _, err := io.Copy(h, f); err != nil {
return "", err
}
return fmt.Sprintf("%x", h.Sum(nil)), nil
}
func CustomRowID(payload uint64, timestamp time.Time) RowID {
var key [12]byte
binary.BigEndian.PutUint32(key[0:4], uint32(timestamp.Unix()))
binary.BigEndian.PutUint64(key[4:12], payload)
if oid, err := primitive.ObjectIDFromHex(hex.EncodeToString(key[:])); err == nil {
return oid
} else {
log.WithError(err).Warn("failed to create object id")
return primitive.NewObjectID()
}
}
func NewRowID() RowID {
return primitive.NewObjectID()
}
func EmptyRowID() RowID {
return [12]byte{}
}
func RowIDFromHex(hex string) (RowID, error) {
rowID, err := primitive.ObjectIDFromHex(hex)
return rowID, err
}
func FileExists(filename string) bool {
info, err := os.Stat(filename)
if os.IsNotExist(err) {
return false
}
return !info.IsDir()
}
func FileSize(filename string) int64 {
info, err := os.Stat(filename)
if os.IsNotExist(err) {
return -1
}
return info.Size()
}
func byID(id RowID) OrderedDocument {
return OrderedDocument{{"_id", id}}
}
func DecodeBytes(buffer []byte, format string) string {
switch format {
case "hex":
return hex.EncodeToString(buffer)
case "hexdump":
return hex.Dump(buffer)
case "base32":
return base32.StdEncoding.EncodeToString(buffer)
case "base64":
return base64.StdEncoding.EncodeToString(buffer)
case "ascii":
str := fmt.Sprintf("%+q", buffer)
return str[1 : len(str)-1]
case "binary":
str := fmt.Sprintf("%b", buffer)
return str[1 : len(str)-1]
case "decimal":
str := fmt.Sprintf("%d", buffer)
return str[1 : len(str)-1]
case "octal":
str := fmt.Sprintf("%o", buffer)
return str[1 : len(str)-1]
default:
return string(buffer)
}
}
func CopyFile(dst, src string) error {
in, err := os.Open(src)
if err != nil {
return err
}
out, err := os.Create(dst)
if err != nil {
return err
}
if _, err = io.Copy(out, in); err != nil {
return err
}
if err := in.Close(); err != nil {
return err
}
return out.Close()
}
|