Files
packets/pkg/packet.lua.d/utils.go

82 lines
1.4 KiB
Go

package packet
import (
"archive/tar"
"compress/gzip"
"fmt"
"io"
"log"
"math/rand"
"os"
"path/filepath"
"strings"
)
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$%!@%&*()-=+[]{}:;.,1234567890"
func randStringBytes(n int) string {
b := make([]byte, n)
for i := range b {
b[i] = letterBytes[rand.Intn(len(letterBytes))]
}
return string(b)
}
func Dearchive(archive, outdir string) error {
switch {
case strings.HasSuffix(archive, ".tar.gz"):
f, err := os.Open(archive)
if err != nil {
return err
}
gzReader, err := gzip.NewReader(f)
if err != nil {
return err
}
tarReader := tar.NewReader(gzReader)
for {
header, err := tarReader.Next()
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
destination := filepath.Join(outdir, header.Name)
fmt.Println(destination)
switch header.Typeflag {
case tar.TypeDir:
if err := os.Mkdir(destination, header.FileInfo().Mode()); err != nil {
return err
}
case tar.TypeReg:
if err := os.MkdirAll(filepath.Dir(destination), 0777); err != nil {
return err
}
outFile, err := os.Create(destination)
if err != nil {
return err
}
if _, err := io.Copy(outFile, tarReader); err != nil {
return err
}
outFile.Close()
default:
return fmt.Errorf("unknow filetype")
}
}
}
return nil
}