forked from shoobyban/filehelper
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtar.go
159 lines (140 loc) · 3 KB
/
tar.go
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
package filehelper
import (
"archive/tar"
"bytes"
"fmt"
"io"
"io/ioutil"
"log"
"os"
"time"
"github.com/shoobyban/slog"
)
// WriteTar will append to datafile with filename using buf data
func WriteTar(datafile, filename string, buf []byte) {
f, err := os.OpenFile(datafile, os.O_RDWR, os.ModePerm)
if err != nil {
f, err = os.OpenFile(datafile, os.O_WRONLY|os.O_CREATE, os.ModePerm)
} else {
fi, err := os.Stat(datafile)
if err != nil {
log.Fatalln(err)
}
if fi.Size() > 1024 {
if _, err = f.Seek(-2<<9, os.SEEK_END); err != nil {
log.Fatalln(err)
}
}
}
tw := tar.NewWriter(f)
hdr := &tar.Header{
Name: filename,
Typeflag: tar.TypeReg,
ModTime: time.Now(),
AccessTime: time.Now(),
ChangeTime: time.Now(),
Mode: 0644,
Size: int64(len(buf)),
Format: tar.FormatGNU,
}
slog.Infof("Writing %s %d", filename, int64(len(buf)))
if err := tw.WriteHeader(hdr); err != nil {
slog.Infof("Error writing tar header %s", err.Error())
}
if _, err := tw.Write(buf); err != nil {
slog.Infof("Error writing tar data %s", err.Error())
}
if err := tw.Close(); err != nil {
slog.Infof("Error closing tar %s", err.Error())
}
f.Close()
}
// ListTar will return file list from given tar file
func ListTar(filename string) []string {
var ret []string
f, err := os.Open(filename)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer f.Close()
tarReader := tar.NewReader(f)
// defer io.Copy(os.Stdout, tarReader)
for true {
header, err := tarReader.Next()
if err == io.EOF {
break
}
if err != nil {
fmt.Println(err)
os.Exit(1)
}
name := header.Name
switch header.Typeflag {
case tar.TypeReg: // = regular file
ret = append(ret, name)
default:
ret = append(ret, name)
}
}
return ret
}
// ReadTar reads filename from given tarball and returns content
func ReadTar(tarfile, filename string) interface{} {
f, err := os.Open(tarfile)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer f.Close()
tarReader := tar.NewReader(f)
for true {
header, err := tarReader.Next()
if err == io.EOF {
break
}
if err != nil {
fmt.Println(err)
os.Exit(1)
}
if header.Name == filename {
bs, _ := ioutil.ReadAll(tarReader)
return bs
}
}
return nil
}
// FindInTar looks for search string in tarball, returns list of filenames and matches
func FindInTar(tarfile, search string) map[string]string {
f, err := os.Open(tarfile)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer f.Close()
res := map[string]string{}
tarReader := tar.NewReader(f)
for true {
header, err := tarReader.Next()
if err == io.EOF {
break
}
if err != nil {
fmt.Println(err)
os.Exit(1)
}
bs, _ := ioutil.ReadAll(tarReader)
if bytes.Contains(bs, []byte(search)) {
begining := bytes.Index(bs, []byte(search))
end := begining + len(search) + 3
if begining > 3 {
begining = begining - 3
}
if end > len(bs) {
end = len(bs)
}
res[header.Name] = string(bs[begining:end])
}
}
return res
}