Files
go-dpkg/apt/repo.go
Matheus Sampaio Queiroga 8cf5fcbfc3
All checks were successful
Golang test / go-test (pull_request) Successful in 21s
Golang test / go-test (push) Successful in 21s
Refactor deb822 package: Remove deprecated files and implement new encoding/decoding logic
- Deleted old deb822_encode.go and deb822_types.go files.
- Introduced new deb822_encode.go with improved Marshall function and Writer struct for encoding.
- Added deb822_decode.go for decoding functionality with enhanced error handling.
- Created deb822_rawdata.go to define RawData type for handling raw deb822 values.
- Implemented Description type in deb822/datatype/description.go for structured description handling.
- Updated Package struct in dpkg/header.go to use new Description type.
- Refactored UnmarshalBinary method in dpkg/header.go to utilize new deb822 decoding logic.
- Added comprehensive tests for encoding and decoding in deb822_encode_test.go and deb822_decode_test.go.
- Removed internal scanner package as it was no longer needed.

Signed-off-by: Matheus Sampaio Queiroga <srherobrine20@gmail.com>
2025-06-22 22:05:41 -03:00

152 lines
4.4 KiB
Go

package apt
import (
"errors"
"fmt"
"io"
"net/http"
"net/url"
"path"
"strings"
"time"
"sirherobrine23.com.br/sirherobrine23/go-dpkg/deb822"
opengpg_crypto "github.com/ProtonMail/gopenpgp/v3/crypto"
)
var (
ErrDownServer error = errors.New("server is shutdown or not avaible")
ErrPackagesNotFound error = errors.New("packages not found")
)
// Release file from dists/<Suite>/Release, dists/<Suite>/InRelease or dists/<Suite>/Release.gpg
type AptRelease struct {
Origin string `json:"origin"`
Label string `json:"label"`
Suite string `json:"suite"`
Codename string `json:"codename,omitempty"`
Date time.Time `json:"date,omitzero"`
AcquireByHash bool `json:"acquire-by-hash"`
Archs []string `json:"architectures,omitempty"`
Components []string `json:"components,omitempty"`
Description string `json:"description,omitempty"`
Extra map[string]string `json:"extra,omitempty"`
MD5 ReleaseSum `json:"md5,omitempty"`
SHA1 ReleaseSum `json:"sha1,omitempty"`
SHA256 ReleaseSum `json:"sha256,omitempty"`
SHA512 ReleaseSum `json:"sha512,omitempty"`
}
type SuiteAptRelease map[string]*AptRelease
// Get [*AptRelease] from AptSource.Suites
func (apt AptSource) Release() (SuiteAptRelease, error) {
suites := SuiteAptRelease{}
for _, uriMain := range apt.URIs {
for _, suite := range apt.Suites {
var debRelease map[string]string
// Attemp get packages with InRelease
{
res, err := http.Get(uriMain.ResolveReference(&url.URL{Path: path.Join(uriMain.Path, "dists", suite, "InRelease")}).String())
if err != nil {
return nil, err
}
defer res.Body.Close()
if res.StatusCode == http.StatusOK {
body, err := io.ReadAll(res.Body)
if err != nil {
return nil, err
}
if message, err := opengpg_crypto.NewPGPMessageFromArmored(string(body)); err == nil {
if debRelease, err = deb822.NewReader(message.NewReader()).Deb822(); err != nil && !(err == io.EOF || err == deb822.ErrNextDeb822) {
return nil, err
}
}
}
}
// Get packages with Release file
if debRelease == nil {
res, err := http.Get(uriMain.ResolveReference(&url.URL{Path: path.Join(uriMain.Path, "dists", suite, "Release")}).String())
if err != nil {
return nil, err
}
defer res.Body.Close()
if res.StatusCode == http.StatusOK {
if debRelease, err = deb822.NewReader(res.Body).Deb822(); err != nil && !(err == io.EOF || err == deb822.ErrNextDeb822) {
return nil, err
}
}
}
// Without Release info
if debRelease == nil {
return nil, fmt.Errorf("cannot get Release file")
}
release := &AptRelease{
Label: debRelease["Label"],
Archs: strings.Fields(debRelease["Architectures"]),
Description: debRelease["Description"],
Components: strings.Fields(debRelease["Components"]),
Codename: debRelease["Codename"],
Origin: debRelease["Origin"],
Suite: debRelease["Suite"],
AcquireByHash: debRelease["Acquire-By-Hash"] == "yes",
Extra: debRelease,
}
var err error
if date, ok := debRelease["Date"]; ok {
if release.Date, err = time.Parse(time.RFC1123, date); err != nil {
return nil, err
}
}
if value, ok := debRelease["MD5Sum"]; ok {
if release.MD5, err = SumLines(value); err != nil {
return nil, err
}
}
if value, ok := debRelease["SHA1"]; ok {
if release.SHA1, err = SumLines(value); err != nil {
return nil, err
}
}
if value, ok := debRelease["SHA256"]; ok {
if release.SHA256, err = SumLines(value); err != nil {
return nil, err
}
}
if value, ok := debRelease["SHA512"]; ok {
if release.SHA512, err = SumLines(value); err != nil {
return nil, err
}
}
delete(debRelease, "Label")
delete(debRelease, "Architectures")
delete(debRelease, "Description")
delete(debRelease, "Components")
delete(debRelease, "Codename")
delete(debRelease, "Origin")
delete(debRelease, "Suite")
delete(debRelease, "Acquire-By-Hash")
delete(debRelease, "Date")
delete(debRelease, "MD5Sum")
delete(debRelease, "SHA1")
delete(debRelease, "SHA256")
delete(debRelease, "SHA512")
suites[suite] = release
}
}
if len(suites) > 0 {
return suites, nil
}
return nil, ErrDownServer
}