core/sys/xtract.go
2023-11-12 02:07:06 +01:00

133 lines
2.4 KiB
Go

package sys
import (
"archive/zip"
"bufio"
"bytes"
"compress/bzip2"
"compress/gzip"
"fmt"
"io"
"log"
"os"
"github.com/ulikunitz/xz"
)
type Xtract struct {
dir string
reader *bufio.Reader
bar *io.Writer
outFile string
withBar bool
}
func NewXtract(dir string, outFile string) *Xtract {
return &Xtract{dir: dir, outFile: outFile, withBar: false}
}
func (x *Xtract) AddBar(bar *io.Writer) {
x.bar = bar
x.withBar = true
}
func (x *Xtract) setCompressedFile(dumpName string) {
path := fmt.Sprintf("%s/%s", x.dir, dumpName)
file, err := os.Open(path)
if err != nil {
panic(err)
}
x.reader = bufio.NewReader(file)
}
func (x *Xtract) writeUncompressedData(out *bytes.Buffer) bool {
err := os.WriteFile(x.outFile, out.Bytes(), 0644)
if err != nil {
panic(err)
}
return true
}
func (x *Xtract) UnGzip(dumpName string) bool {
x.setCompressedFile(dumpName)
var out bytes.Buffer
r, err := gzip.NewReader(x.reader)
if err != nil {
panic(err)
}
if x.withBar {
_, err = io.Copy(io.MultiWriter(&out, *x.bar), r)
} else {
_, err = io.Copy(&out, r)
}
if err != nil {
panic(err)
}
// if x.withBar {
// x.bar.Clear()
// }
return x.writeUncompressedData(&out)
}
func (x *Xtract) UnBz2(dumpName string) bool {
x.setCompressedFile(dumpName)
var out bytes.Buffer
r := bzip2.NewReader(x.reader)
var err error
if x.withBar {
_, err = io.Copy(io.MultiWriter(&out, *x.bar), r)
} else {
_, err = io.Copy(&out, r)
}
if err != nil {
panic(err)
}
return x.writeUncompressedData(&out)
}
func (x *Xtract) UnXz(dumpName string) bool {
x.setCompressedFile(dumpName)
var out bytes.Buffer
r, err := xz.NewReader(x.reader)
if err != nil {
panic(err)
}
if x.withBar {
_, err = io.Copy(io.MultiWriter(&out, *x.bar), r)
} else {
_, err = io.Copy(&out, r)
}
if err != nil {
panic(err)
}
return x.writeUncompressedData(&out)
}
func (x *Xtract) UnZip(dumpName string) bool {
var done bool = false
path := fmt.Sprintf("%s/%s", x.dir, dumpName)
r, err := zip.OpenReader(path)
if err != nil {
panic(err)
}
defer r.Close()
if len(r.File) > 0 {
rc, err := r.File[0].Open()
if err != nil {
log.Fatal(err)
}
var out bytes.Buffer
if x.withBar {
_, err = io.Copy(io.MultiWriter(&out, *x.bar), rc)
} else {
_, err = io.Copy(&out, rc)
}
if err != nil {
log.Fatal(err)
}
rc.Close()
done = x.writeUncompressedData(&out)
}
return done
}