pkg/syncthing/gui.go
package syncthing
import (
"archive/zip"
"bytes"
"embed"
"io"
"os"
"path/filepath"
"github.com/wencaiwulue/kubevpn/v2/pkg/config"
)
//go:embed gui.zip
var assetsZip embed.FS
func MakeSureGui() error {
return ExtractSyncthingGUIZipToDir(assetsZip, "gui.zip", config.GetSyncthingPath())
}
func ExtractSyncthingGUIZipToDir(fs embed.FS, zipPath, targetDir string) error {
zipData, err := fs.Open(zipPath)
if err != nil {
return err
}
defer zipData.Close()
all, err := io.ReadAll(zipData)
if err != nil {
return err
}
zipReader, err := zip.NewReader(bytes.NewReader(all), int64(len(all)))
if err != nil {
return err
}
for _, file := range zipReader.File {
filePath := filepath.Join(targetDir, file.Name)
if file.FileInfo().IsDir() {
if err = os.MkdirAll(filePath, file.Mode()); err != nil {
return err
}
continue
}
if err = os.MkdirAll(filepath.Dir(filePath), 0755); err != nil {
return err
}
var fileWriter *os.File
fileWriter, err = os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, file.Mode())
if err != nil {
return err
}
var fileReader io.ReadCloser
fileReader, err = file.Open()
if err != nil {
_ = fileWriter.Close()
return err
}
_, err = io.Copy(fileWriter, fileReader)
_ = fileReader.Close()
_ = fileWriter.Close()
if err != nil {
return err
}
}
return nil
}