-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
Copy pathdpkg_status.go
91 lines (78 loc) · 1.81 KB
/
dpkg_status.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
package main
import (
"archive/tar"
"compress/gzip"
"flag"
"fmt"
"io"
"log"
"os"
"path/filepath"
"time"
"github.com/ulikunitz/xz"
)
const DPKG_STATUS_DIR = "./var/lib/dpkg/status.d"
func main() {
var control, packageName, output string
flag.StringVar(&control, "control", "", "")
flag.StringVar(&packageName, "package-name", "", "")
flag.StringVar(&output, "output", "", "")
flag.Parse()
controlFile, err := os.Open(control)
panicIfErr(err)
defer controlFile.Close()
var controlReader io.Reader = controlFile
switch filepath.Ext(control) {
case ".xz":
controlReader, err = xz.NewReader(controlFile)
panicIfErr(err)
case ".gz":
controlReader, err = gzip.NewReader(controlFile)
panicIfErr(err)
}
controlTar := tar.NewReader(controlReader)
outputFile, err := os.Create(output)
panicIfErr(err)
defer outputFile.Close()
outputTar := tar.NewWriter(outputFile)
defer outputTar.Close()
seenDpkgDir := false
if !seenDpkgDir {
err = outputTar.WriteHeader(&tar.Header{
Name: DPKG_STATUS_DIR,
Typeflag: tar.TypeDir,
Mode: 0o755,
ChangeTime: time.Now(),
})
panicIfErr(err)
}
for {
header, err := controlTar.Next()
if err == io.EOF {
break
} else {
panicIfErr(err)
}
var rewriteTo string
if header.Name == "./control" || header.Name == "control" {
rewriteTo = "%s/%s"
} else if header.Name == "./md5sums" || header.Name == "md5sums" {
rewriteTo = "%s/%s.md5sums"
} else {
continue
}
if header.Typeflag != tar.TypeReg {
log.Fatalf("%s is not a regular file.", header.Name)
}
newHeader := header
newHeader.Name = fmt.Sprintf(rewriteTo, DPKG_STATUS_DIR, packageName)
err = outputTar.WriteHeader(header)
panicIfErr(err)
_, err = io.Copy(outputTar, controlTar)
}
}
func panicIfErr(err error) {
if err != nil {
log.Fatal(err)
}
}