first commit
This commit is contained in:
153
lib/repo.go
Normal file
153
lib/repo.go
Normal file
@ -0,0 +1,153 @@
|
||||
package lib
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"net/url"
|
||||
"os"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/log"
|
||||
"gopkg.in/ini.v1"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
Repos []Repo `json:"repos"`
|
||||
}
|
||||
|
||||
var Repos []Repo
|
||||
type Repo struct {
|
||||
Source string `json:"source"`
|
||||
Branch string `json:"branch"`
|
||||
Name string `json:"name"`
|
||||
URL string `json:"url"`
|
||||
}
|
||||
|
||||
var Packages []Package
|
||||
type Package struct {
|
||||
Name string
|
||||
Repo string
|
||||
Desc string
|
||||
Size string
|
||||
Sum string
|
||||
URL string
|
||||
Ver string
|
||||
}
|
||||
|
||||
func LoadPackgae(sec *ini.Section) (Package, error) {
|
||||
var pkg Package
|
||||
pkg.Name = sec.Name()
|
||||
|
||||
k, err := sec.GetKey("version")
|
||||
if err != nil {
|
||||
return pkg, err
|
||||
}
|
||||
pkg.Ver = k.String()
|
||||
|
||||
k, err = sec.GetKey("desc")
|
||||
if err != nil {
|
||||
return pkg, err
|
||||
}
|
||||
pkg.Desc = k.String()
|
||||
|
||||
k, err = sec.GetKey("size")
|
||||
if err != nil {
|
||||
return pkg, err
|
||||
}
|
||||
|
||||
size, err := k.Int()
|
||||
if err != nil {
|
||||
return pkg, err
|
||||
}
|
||||
pkg.Size = SizeFromBytes(size)
|
||||
|
||||
k, err = sec.GetKey("sum")
|
||||
if err != nil {
|
||||
return pkg, err
|
||||
}
|
||||
pkg.Sum = k.String()
|
||||
|
||||
return pkg, nil
|
||||
}
|
||||
|
||||
func GetRepo(r Repo) ([]Package, error){
|
||||
var pkgs []Package
|
||||
|
||||
furl, err := url.JoinPath(r.URL, r.Name+".tar.gz")
|
||||
if err != nil {
|
||||
return pkgs, err
|
||||
}
|
||||
|
||||
agent := fiber.Get(furl)
|
||||
code, body, errs := agent.Bytes()
|
||||
if len(errs) > 0 {
|
||||
return pkgs, errors.New("Request failed")
|
||||
}
|
||||
|
||||
if code != 200 {
|
||||
return pkgs, errors.New("Bad response")
|
||||
}
|
||||
|
||||
list, err := ExtractFile(body, "pkgs")
|
||||
if err != nil {
|
||||
return pkgs, err
|
||||
}
|
||||
|
||||
repo := ini.Empty()
|
||||
err = repo.Append([]byte(list))
|
||||
if err != nil {
|
||||
return pkgs, err
|
||||
}
|
||||
|
||||
for _, s := range repo.Sections() {
|
||||
if s.Name() == "DEFAULT" {
|
||||
continue
|
||||
}
|
||||
|
||||
pkg, err := LoadPackgae(s)
|
||||
if err != nil {
|
||||
log.Errorf("Error loading %s: %s", s.Name(), err)
|
||||
continue
|
||||
}
|
||||
|
||||
pkg.Repo = r.Name
|
||||
pkg.URL, err = url.JoinPath(
|
||||
r.Source, "src/branch/"+r.Branch+"/src", pkg.Name, "pkg.sh")
|
||||
pkgs = append(pkgs, pkg)
|
||||
}
|
||||
|
||||
return pkgs, nil
|
||||
}
|
||||
|
||||
func LoadRepos() {
|
||||
Repos = []Repo{}
|
||||
|
||||
data, err := os.ReadFile("cfg.json")
|
||||
if err != nil {
|
||||
log.Error("Failed to read the configuration")
|
||||
}
|
||||
|
||||
var cfg Config
|
||||
err = json.Unmarshal(data, &cfg)
|
||||
if err != nil {
|
||||
log.Errorf("Failed to parse the configuration: %s", err)
|
||||
}
|
||||
|
||||
Repos = cfg.Repos
|
||||
}
|
||||
|
||||
func LoadAllPkgs() {
|
||||
LoadRepos()
|
||||
Packages = []Package{}
|
||||
|
||||
for _, r := range Repos {
|
||||
pkgs, err := GetRepo(r)
|
||||
if err != nil {
|
||||
log.Errorf("Error loading %s: %s", r.Name, err.Error())
|
||||
continue
|
||||
}
|
||||
Packages = append(Packages, pkgs...)
|
||||
}
|
||||
|
||||
log.Infof("Loaded total %d packages", len(Packages))
|
||||
}
|
104
lib/util.go
Normal file
104
lib/util.go
Normal file
@ -0,0 +1,104 @@
|
||||
package lib
|
||||
|
||||
import (
|
||||
"archive/tar"
|
||||
"bytes"
|
||||
"compress/gzip"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
)
|
||||
|
||||
func RenderError(c *fiber.Ctx, code int) error{
|
||||
var msg string = "Server Error"
|
||||
c.Status(code)
|
||||
|
||||
switch code {
|
||||
case 404:
|
||||
msg = "Not Found"
|
||||
}
|
||||
|
||||
return c.Render("error", fiber.Map{
|
||||
"msg": msg,
|
||||
})
|
||||
}
|
||||
|
||||
func SizeFromBytes(size int) string {
|
||||
if(size > 1024*1024*1024) {
|
||||
return fmt.Sprintf("%dGB", (size/1024/1024/1024))
|
||||
}else if(size > 1024*1024) {
|
||||
return fmt.Sprintf("%dMB", (size/1024/1024))
|
||||
}else if(size > 1024) {
|
||||
return fmt.Sprintf("%dKB", (size/1024))
|
||||
}
|
||||
return fmt.Sprintf("%dB", size)
|
||||
}
|
||||
|
||||
func ExtractFile(raw []byte, file string) (string, error){
|
||||
stream := bytes.NewReader(raw)
|
||||
ustream, err := gzip.NewReader(stream)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
reader := tar.NewReader(ustream)
|
||||
var header *tar.Header
|
||||
|
||||
for header, err = reader.Next(); err == nil; header, err = reader.Next() {
|
||||
if header.Typeflag != tar.TypeReg {
|
||||
return "", errors.New("Found invalid entry in archive")
|
||||
}
|
||||
|
||||
if header.Name != file {
|
||||
continue
|
||||
}
|
||||
|
||||
buf := new(strings.Builder)
|
||||
_, err := io.Copy(buf, reader)
|
||||
if err != nil {
|
||||
return "", errors.New("Failed to extract file to memory")
|
||||
}
|
||||
|
||||
return buf.String(), nil
|
||||
}
|
||||
|
||||
return "", errors.New("File not found")
|
||||
}
|
||||
|
||||
func GetTimePassed(t time.Time) string {
|
||||
diff := time.Since(t)
|
||||
res := fmt.Sprintf(
|
||||
"%ds ago",
|
||||
int(diff.Seconds()),
|
||||
)
|
||||
|
||||
if diff.Minutes() > 1 {
|
||||
res = fmt.Sprintf(
|
||||
"%dm and %ds ago",
|
||||
int(diff.Minutes()), int(diff.Seconds())-(int(diff.Minutes())*60),
|
||||
)
|
||||
}
|
||||
|
||||
if diff.Hours() > 1 {
|
||||
res = fmt.Sprintf("%dh and %dm ago",
|
||||
int(diff.Hours()),
|
||||
int(diff.Minutes())-(int(diff.Hours())*60),
|
||||
)
|
||||
}
|
||||
|
||||
return res
|
||||
}
|
||||
|
||||
func CleanString(s string) string{
|
||||
var possible_bad_char_list_that_i_made_up_which_may_contain_bad_xss_chars_look_im_not_gonna_search_for_a_xss_charlist_just_to_prevent_self_xss []string = []string{"'", "\"", "/", "<", ">", "?", "=", "#", "(", ")", "{", "}", "*", "!", "`", "[", "]"}
|
||||
|
||||
for _, c := range possible_bad_char_list_that_i_made_up_which_may_contain_bad_xss_chars_look_im_not_gonna_search_for_a_xss_charlist_just_to_prevent_self_xss {
|
||||
s = strings.ReplaceAll(s, c, "")
|
||||
}
|
||||
|
||||
return s
|
||||
}
|
Reference in New Issue
Block a user