util: Add a fedora mirror lookup function
This commit is contained in:
@@ -35,15 +35,57 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/url"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
// FedoraDownloadURL is the default fedora releases and updates download
|
||||||
|
// URL. If you try to use this, you will get redirected to a mirror near
|
||||||
|
// you.
|
||||||
|
FedoraDownloadURL = "https://download.fedoraproject.org/pub/fedora/linux/"
|
||||||
|
|
||||||
// FedoraReleasesEndpointJSON is the location of the fedora release data
|
// FedoraReleasesEndpointJSON is the location of the fedora release data
|
||||||
// as specified in json format.
|
// as specified in json format.
|
||||||
FedoraReleasesEndpointJSON = "https://fedoraproject.org/releases.json"
|
FedoraReleasesEndpointJSON = "https://fedoraproject.org/releases.json"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// GetFedoraDownloadURL gets an https base path of a mirror to use for
|
||||||
|
// downloading both the fedora release and updates. It is supposed to find
|
||||||
|
// something nearest to you.
|
||||||
|
// TODO: Do we need to specify version and arch to make sure mirror has those?
|
||||||
|
func GetFedoraDownloadURL(ctx context.Context) (string, error) {
|
||||||
|
var out *url.URL
|
||||||
|
checkRedirectFunc := func(req *http.Request, via []*http.Request) error {
|
||||||
|
out = req.URL
|
||||||
|
if len(via) > 1 {
|
||||||
|
return fmt.Errorf("too many redirects")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
client := &http.Client{
|
||||||
|
CheckRedirect: checkRedirectFunc,
|
||||||
|
}
|
||||||
|
req, err := http.NewRequestWithContext(ctx, "GET", FedoraDownloadURL, nil)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
result, err := client.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
defer result.Body.Close()
|
||||||
|
|
||||||
|
if out == nil {
|
||||||
|
return "", fmt.Errorf("no url found")
|
||||||
|
}
|
||||||
|
if out.Scheme != "https" {
|
||||||
|
return "", fmt.Errorf("bad scheme, got: %s", out.Scheme)
|
||||||
|
}
|
||||||
|
|
||||||
|
return out.String(), nil
|
||||||
|
}
|
||||||
|
|
||||||
// FedoraRelease is a partial struct of the available data in the json releases
|
// FedoraRelease is a partial struct of the available data in the json releases
|
||||||
// file found. This was determined by inspection.
|
// file found. This was determined by inspection.
|
||||||
type FedoraRelease struct {
|
type FedoraRelease struct {
|
||||||
|
|||||||
Reference in New Issue
Block a user