Skip to content
Snippets Groups Projects
Commit 8e3cd73e authored by Florent Gluck's avatar Florent Gluck
Browse files

Consolidated allutils/files packages into common/utils/files.go

parent 49c34a50
No related branches found
No related tags found
No related merge requests found
...@@ -3,7 +3,6 @@ package cmdVM ...@@ -3,7 +3,6 @@ package cmdVM
import ( import (
u "nexus-client/utils" u "nexus-client/utils"
cu "nexus-common/utils" cu "nexus-common/utils"
"nexus-libclient/utils"
libclient "nexus-libclient/vm" libclient "nexus-libclient/vm"
"os" "os"
) )
...@@ -67,7 +66,7 @@ func (cmd *ImportDir) Run(args []string) int { ...@@ -67,7 +66,7 @@ func (cmd *ImportDir) Run(args []string) int {
} }
tmpTarGzFile += ".tar.gz" tmpTarGzFile += ".tar.gz"
defer os.Remove(tmpTarGzFile) defer os.Remove(tmpTarGzFile)
if err := utils.TarGzDir(localDir, tmpTarGzFile); err != nil { if err := cu.TarGzDir(localDir, tmpTarGzFile); err != nil {
u.PrintlnErr(err) u.PrintlnErr(err)
return 1 return 1
} }
......
package utils package utils
import ( import (
"archive/tar"
"bytes"
"compress/gzip"
"errors" "errors"
"io"
"io/fs"
"os" "os"
"path/filepath" "path/filepath"
"strings"
"github.com/google/uuid" "github.com/google/uuid"
) )
...@@ -38,3 +44,107 @@ func CreateRandomEmptyFile() (string, error) { ...@@ -38,3 +44,107 @@ func CreateRandomEmptyFile() (string, error) {
return filePath, nil return filePath, nil
} }
// Creates a tar.gz archive of dir and all its files and subdirectories.
// Note: dir can also be a file.
// Source code slightly modified from: https://gist.github.com/mimoo/25fc9716e0f1353791f5908f94d6e726
func TarGzDir(dir, archive string) error {
_, err := os.Stat(dir)
if errors.Is(err, fs.ErrNotExist) {
return errors.New("Error: \"" + dir + "\" does not exist")
}
var buf bytes.Buffer
gzWriter := gzip.NewWriter(&buf)
tarWriter := tar.NewWriter(gzWriter)
// Walks through every file in the directory
filepath.Walk(dir, func(file string, fi os.FileInfo, e error) error {
header, err := tar.FileInfoHeader(fi, file)
if err != nil {
return err
}
fileRel := strings.TrimPrefix(file, dir)
fileRel = filepath.Join(filepath.Base(dir), fileRel)
header.Name = filepath.ToSlash(fileRel)
if err := tarWriter.WriteHeader(header); err != nil {
return err
}
// if not a dir, write file content
if !fi.IsDir() {
data, err := os.Open(file)
if err != nil {
return err
}
if _, err := io.Copy(tarWriter, data); err != nil {
return err
}
}
return nil
})
if err := tarWriter.Close(); err != nil {
return err
}
if err := gzWriter.Close(); err != nil {
return err
}
fileToWrite, err := os.OpenFile(archive, os.O_CREATE|os.O_RDWR, os.FileMode(0750))
if err != nil {
return err
}
if _, err := io.Copy(fileToWrite, &buf); err != nil {
return err
}
return nil
}
// Returns the list of subdirectories present in dir.
func GetSubDirs(dir string) ([]string, error) {
subDirs := []string{}
currentDir, err := os.Open(dir)
if err != nil {
return nil, err
}
// Retrieves all files entries in the directory (0 = all files in the directory).
files, err := currentDir.Readdir(0)
if err != nil {
currentDir.Close()
return nil, err
}
currentDir.Close()
// Loop over file entries
for _, f := range files {
if f.IsDir() {
subDirs = append(subDirs, filepath.Join(dir, f.Name()))
}
}
return subDirs, nil
}
func CopyFiles(source, dest string) error {
src, err := os.Open(source)
if err != nil {
return err
}
defer src.Close()
dst, err := os.Create(dest)
if err != nil {
return err
}
defer dst.Close()
_, err = io.Copy(dst, src)
return err
}
...@@ -6,9 +6,19 @@ replace nexus-common => ../common ...@@ -6,9 +6,19 @@ replace nexus-common => ../common
require nexus-common v0.0.0-00010101000000-000000000000 require nexus-common v0.0.0-00010101000000-000000000000
require golang.org/x/net v0.27.0 // indirect require (
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
golang.org/x/crypto v0.25.0 // indirect
golang.org/x/net v0.27.0 // indirect
golang.org/x/sys v0.22.0 // indirect
golang.org/x/text v0.16.0 // indirect
)
require ( require (
github.com/go-playground/validator/v10 v10.23.0
github.com/go-resty/resty/v2 v2.16.2 github.com/go-resty/resty/v2 v2.16.2
github.com/google/uuid v1.6.0 // indirect github.com/google/uuid v1.6.0
) )
github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.23.0 h1:/PwmTwZhS0dPkav3cdK9kV1FsAmrL8sThn8IHr/sO+o=
github.com/go-playground/validator/v10 v10.23.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
github.com/go-resty/resty/v2 v2.16.2 h1:CpRqTjIzq/rweXUt9+GxzzQdlkqMdt8Lm/fuK/CAbAg= github.com/go-resty/resty/v2 v2.16.2 h1:CpRqTjIzq/rweXUt9+GxzzQdlkqMdt8Lm/fuK/CAbAg=
github.com/go-resty/resty/v2 v2.16.2/go.mod h1:0fHAoK7JoBy/Ch36N8VFeMsK7xQOHhvWaC3iOktwmIU= github.com/go-resty/resty/v2 v2.16.2/go.mod h1:0fHAoK7JoBy/Ch36N8VFeMsK7xQOHhvWaC3iOktwmIU=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
package utils
import (
"archive/tar"
"bytes"
"compress/gzip"
"errors"
"io"
"io/fs"
"os"
"path/filepath"
"strings"
)
// Creates a tar.gz archive of dir and all its files and subdirectories.
// Note: dir can also be a file.
// Source code slightly modified from: https://gist.github.com/mimoo/25fc9716e0f1353791f5908f94d6e726
func TarGzDir(dir, archive string) error {
_, err := os.Stat(dir)
if errors.Is(err, fs.ErrNotExist) {
return errors.New("Error: \"" + dir + "\" does not exist")
}
var buf bytes.Buffer
gzWriter := gzip.NewWriter(&buf)
tarWriter := tar.NewWriter(gzWriter)
// Walks through every file in the directory
filepath.Walk(dir, func(file string, fi os.FileInfo, err error) error {
header, err := tar.FileInfoHeader(fi, file)
if err != nil {
return err
}
fileRel := strings.TrimPrefix(file, dir)
fileRel = filepath.Join(filepath.Base(dir), fileRel)
header.Name = filepath.ToSlash(fileRel)
if err := tarWriter.WriteHeader(header); err != nil {
return err
}
// if not a dir, write file content
if !fi.IsDir() {
data, err := os.Open(file)
if err != nil {
return err
}
if _, err := io.Copy(tarWriter, data); err != nil {
return err
}
}
return nil
})
if err := tarWriter.Close(); err != nil {
return err
}
if err := gzWriter.Close(); err != nil {
return err
}
fileToWrite, err := os.OpenFile(archive, os.O_CREATE|os.O_RDWR, os.FileMode(0750))
if err != nil {
return err
}
if _, err := io.Copy(fileToWrite, &buf); err != nil {
return err
}
return nil
}
package utils
import (
"io"
"os"
"path/filepath"
)
// Returns the list of subdirectories present in dir.
func GetSubDirs(dir string) ([]string, error) {
subDirs := []string{}
currentDir, err := os.Open(dir)
if err != nil {
return nil, err
}
// Retrieves all files entries in the directory (0 = all files in the directory).
files, err := currentDir.Readdir(0)
if err != nil {
currentDir.Close()
return nil, err
}
currentDir.Close()
// Loop over file entries
for _, f := range files {
if f.IsDir() {
subDirs = append(subDirs, filepath.Join(dir, f.Name()))
}
}
return subDirs, nil
}
func CopyFiles(source, dest string) error {
src, err := os.Open(source)
if err != nil {
return err
}
defer src.Close()
dst, err := os.Create(dest)
if err != nil {
return err
}
defer dst.Close()
_, err = io.Copy(dst, src)
return err
}
...@@ -5,12 +5,15 @@ import ( ...@@ -5,12 +5,15 @@ import (
"time" "time"
) )
var r *rand.Rand
// Initializes the random number generator. // Initializes the random number generator.
func RandInit() { func RandInit() {
rand.Seed(time.Now().UnixNano()) randSrc := rand.NewSource(time.Now().UnixNano())
r = rand.New(randSrc)
} }
// Returns an int in the range [min,max] (both inclusive). // Returns an int in the range [min,max] (both inclusive).
func Rand(min, max int) int { func Rand(min, max int) int {
return rand.Intn(max-min+1) + min return r.Intn(max-min+1) + min
} }
...@@ -4,8 +4,8 @@ import ( ...@@ -4,8 +4,8 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"nexus-common/template" "nexus-common/template"
"nexus-common/utils"
"nexus-server/exec" "nexus-server/exec"
"nexus-server/utils"
"os" "os"
"path/filepath" "path/filepath"
"time" "time"
......
...@@ -3,7 +3,7 @@ package vms ...@@ -3,7 +3,7 @@ package vms
import ( import (
"errors" "errors"
t "nexus-common/template" t "nexus-common/template"
"nexus-server/utils" "nexus-common/utils"
"os" "os"
"path" "path"
"path/filepath" "path/filepath"
......
...@@ -6,6 +6,7 @@ import ( ...@@ -6,6 +6,7 @@ import (
"math" "math"
"nexus-common/caps" "nexus-common/caps"
"nexus-common/params" "nexus-common/params"
cu "nexus-common/utils"
vmc "nexus-common/vm" vmc "nexus-common/vm"
"nexus-server/config" "nexus-server/config"
"nexus-server/exec" "nexus-server/exec"
...@@ -62,19 +63,19 @@ func InitVMs() error { ...@@ -62,19 +63,19 @@ func InitVMs() error {
vms.usedPorts[conf.Core.APIDefaultPort] = true vms.usedPorts[conf.Core.APIDefaultPort] = true
errMsg := "Failed reading VMs directory: " errMsg := "Failed reading VMs directory: "
dirs1, err := utils.GetSubDirs(vmsDir) dirs1, err := cu.GetSubDirs(vmsDir)
if err != nil { if err != nil {
return errors.New(errMsg + err.Error()) return errors.New(errMsg + err.Error())
} }
for d1 := range dirs1 { for d1 := range dirs1 {
dirs2, err := utils.GetSubDirs(dirs1[d1]) dirs2, err := cu.GetSubDirs(dirs1[d1])
if err != nil { if err != nil {
return errors.New(errMsg + err.Error()) return errors.New(errMsg + err.Error())
} }
for d2 := range dirs2 { for d2 := range dirs2 {
dirs3, err := utils.GetSubDirs(dirs2[d2]) dirs3, err := cu.GetSubDirs(dirs2[d2])
if err != nil { if err != nil {
return errors.New(errMsg + err.Error()) return errors.New(errMsg + err.Error())
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment