Initial Commit
This commit is contained in:
commit
7c7b6c436d
30
main.go
Normal file
30
main.go
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
)
|
||||||
|
|
||||||
|
/* ---BPM | Bubble Package Manager--- */
|
||||||
|
/* Made By CapCreeperGR */
|
||||||
|
/* A simple-to-use package manager */
|
||||||
|
/* ---------------------------------- */
|
||||||
|
|
||||||
|
var rootDir string = "/"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Printf("Running %s %s\n", getKernel(), getArch())
|
||||||
|
//_, err := readPackage("test_hello_package/hello.bpm")
|
||||||
|
err := installPackage("test_hello_package/hello.bpm", rootDir)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Could not read package\nError: %s\n", err)
|
||||||
|
}
|
||||||
|
pkgs, err := getInstalledPackages(rootDir)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Could not get installed Packages!\nError: %s\n", err)
|
||||||
|
}
|
||||||
|
for _, pkg := range pkgs {
|
||||||
|
fmt.Println(pkg)
|
||||||
|
}
|
||||||
|
fmt.Println(getPackageFiles("hello"))
|
||||||
|
}
|
237
package_utils.go
Normal file
237
package_utils.go
Normal file
@ -0,0 +1,237 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"archive/tar"
|
||||||
|
"bufio"
|
||||||
|
"compress/gzip"
|
||||||
|
"errors"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
"slices"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type packageInfo struct {
|
||||||
|
name string
|
||||||
|
description string
|
||||||
|
version string
|
||||||
|
depends []string
|
||||||
|
provides []string
|
||||||
|
}
|
||||||
|
|
||||||
|
func readPackage(filename string) (*packageInfo, error) {
|
||||||
|
if _, err := os.Stat(filename); os.IsNotExist(err) {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
file, err := os.Open(filename)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
archive, err := gzip.NewReader(file)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
tr := tar.NewReader(archive)
|
||||||
|
for {
|
||||||
|
header, err := tr.Next()
|
||||||
|
if err == io.EOF {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if header.Name == "pkg.info" {
|
||||||
|
bs, _ := io.ReadAll(tr)
|
||||||
|
err := file.Close()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
pkgInfo, err := readPackageInfo(string(bs))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return pkgInfo, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil, errors.New("pkg.info not found in archive")
|
||||||
|
}
|
||||||
|
|
||||||
|
func readPackageInfo(contents string) (*packageInfo, error) {
|
||||||
|
pkgInfo := packageInfo{}
|
||||||
|
lines := strings.Split(contents, "\n")
|
||||||
|
for num, line := range lines {
|
||||||
|
split := strings.SplitN(line, ":", 2)
|
||||||
|
if len(split) != 2 {
|
||||||
|
return nil, errors.New("invalid pkg.info format at line " + strconv.Itoa(num))
|
||||||
|
}
|
||||||
|
split[0] = strings.Trim(split[0], " ")
|
||||||
|
split[1] = strings.Trim(split[1], " ")
|
||||||
|
switch split[0] {
|
||||||
|
case "name":
|
||||||
|
pkgInfo.name = split[1]
|
||||||
|
case "description":
|
||||||
|
pkgInfo.description = split[1]
|
||||||
|
case "version":
|
||||||
|
pkgInfo.version = split[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return &pkgInfo, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func createInfoFile(pkgInfo packageInfo) string {
|
||||||
|
ret := ""
|
||||||
|
ret = ret + "name: " + pkgInfo.name + "\n"
|
||||||
|
ret = ret + "description: " + pkgInfo.description + "\n"
|
||||||
|
ret = ret + "version: " + pkgInfo.version + "\n"
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func installPackage(filename, installDir string) error {
|
||||||
|
if _, err := os.Stat(filename); os.IsNotExist(err) {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
file, err := os.Open(filename)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
archive, err := gzip.NewReader(file)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
tr := tar.NewReader(archive)
|
||||||
|
var files []string
|
||||||
|
var pkgInfo *packageInfo
|
||||||
|
for {
|
||||||
|
header, err := tr.Next()
|
||||||
|
if err == io.EOF {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if header.Name == "pkg.info" {
|
||||||
|
bs, _ := io.ReadAll(tr)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
pkgInfo, err = readPackageInfo(string(bs))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if strings.HasPrefix(header.Name, "files/") && header.Name != "files/" {
|
||||||
|
extractFilename := path.Join(installDir, strings.TrimPrefix(header.Name, "files/"))
|
||||||
|
switch header.Typeflag {
|
||||||
|
case tar.TypeDir:
|
||||||
|
files = append(files, strings.TrimPrefix(header.Name, "files/"))
|
||||||
|
if err := os.Mkdir(extractFilename, 0755); err != nil && !os.IsExist(err) {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
case tar.TypeReg:
|
||||||
|
outFile, err := os.Create(extractFilename)
|
||||||
|
files = append(files, strings.TrimPrefix(header.Name, "files/"))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, err := io.Copy(outFile, tr); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := os.Chmod(extractFilename, header.FileInfo().Mode()); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = outFile.Close()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return errors.New("ExtractTarGz: uknown type: " + strconv.Itoa(int(header.Typeflag)) + " in " + extractFilename)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if pkgInfo == nil {
|
||||||
|
return errors.New("pkg.info not found in archive")
|
||||||
|
}
|
||||||
|
slices.Sort(files)
|
||||||
|
slices.Reverse(files)
|
||||||
|
|
||||||
|
dataDir := path.Join(installDir, "var/lib/bpm/installed/")
|
||||||
|
err = os.MkdirAll(dataDir, 755)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
pkgDir := path.Join(dataDir, pkgInfo.name)
|
||||||
|
err = os.RemoveAll(pkgDir)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = os.Mkdir(pkgDir, 755)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
f, err := os.Create(path.Join(pkgDir, "files"))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, line := range files {
|
||||||
|
_, err := f.WriteString(line + "\n")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f.Close()
|
||||||
|
|
||||||
|
f, err = os.Create(path.Join(pkgDir, "info"))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = f.WriteString(createInfoFile(*pkgInfo))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
f.Close()
|
||||||
|
|
||||||
|
archive.Close()
|
||||||
|
file.Close()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getInstalledPackages(rootDir string) ([]string, error) {
|
||||||
|
dataDir := path.Join(rootDir, "var/lib/bpm/installed/")
|
||||||
|
items, err := os.ReadDir(dataDir)
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var ret []string
|
||||||
|
for _, item := range items {
|
||||||
|
ret = append(ret, item.Name())
|
||||||
|
}
|
||||||
|
return ret, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getPackageFiles(pkg string) []string {
|
||||||
|
var ret []string
|
||||||
|
dataDir := path.Join(rootDir, "var/lib/bpm/installed/")
|
||||||
|
pkgDir := path.Join(dataDir, pkg)
|
||||||
|
files := path.Join(pkgDir, "files")
|
||||||
|
if _, err := os.Stat(dataDir); os.IsNotExist(err) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if _, err := os.Stat(pkgDir); os.IsNotExist(err) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
file, err := os.Open(files)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
scanner := bufio.NewScanner(file)
|
||||||
|
for scanner.Scan() {
|
||||||
|
ret = append(ret, scanner.Text())
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
BIN
test_hello_package/files/usr/bin/hello
Executable file
BIN
test_hello_package/files/usr/bin/hello
Executable file
Binary file not shown.
BIN
test_hello_package/hello.bpm
Normal file
BIN
test_hello_package/hello.bpm
Normal file
Binary file not shown.
3
test_hello_package/pkg.info
Normal file
3
test_hello_package/pkg.info
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
name: hello
|
||||||
|
description: A simple hello world program
|
||||||
|
version: 1.0
|
29
utils.go
Normal file
29
utils.go
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "syscall"
|
||||||
|
|
||||||
|
func getArch() string {
|
||||||
|
u := syscall.Utsname{}
|
||||||
|
err := syscall.Uname(&u)
|
||||||
|
if err != nil {
|
||||||
|
return "unknown"
|
||||||
|
}
|
||||||
|
return byteArrayToString(u.Machine[:])
|
||||||
|
}
|
||||||
|
|
||||||
|
func getKernel() string {
|
||||||
|
u := syscall.Utsname{}
|
||||||
|
err := syscall.Uname(&u)
|
||||||
|
if err != nil {
|
||||||
|
return "unknown"
|
||||||
|
}
|
||||||
|
return byteArrayToString(u.Sysname[:]) + " " + byteArrayToString(u.Release[:])
|
||||||
|
}
|
||||||
|
|
||||||
|
func byteArrayToString(bs []int8) string {
|
||||||
|
b := make([]byte, len(bs))
|
||||||
|
for i, v := range bs {
|
||||||
|
b[i] = byte(v)
|
||||||
|
}
|
||||||
|
return string(b)
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user