aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXe Iaso <me@xeiaso.net>2024-06-27 06:34:25 -0400
committerXe Iaso <me@xeiaso.net>2024-06-27 06:34:25 -0400
commitef3d8ccd0419838d8b8e30ea72586f03b5dbbb5a (patch)
tree091bad39ffee04e9222679a9b1a9e3ad509e0043
parent835c034940c8e988831e5735763984a45044f3d9 (diff)
downloadxesite-ef3d8ccd0419838d8b8e30ea72586f03b5dbbb5a.tar.xz
xesite-ef3d8ccd0419838d8b8e30ea72586f03b5dbbb5a.zip
cmd/fabricate-generation: upload to Tigris
Signed-off-by: Xe Iaso <me@xeiaso.net>
-rw-r--r--cmd/fabricate-generation/main.go132
-rw-r--r--go.mod19
-rw-r--r--go.sum40
-rw-r--r--lume/src/_includes/base.njk10
4 files changed, 155 insertions, 46 deletions
diff --git a/cmd/fabricate-generation/main.go b/cmd/fabricate-generation/main.go
index ef83546..bb2d44c 100644
--- a/cmd/fabricate-generation/main.go
+++ b/cmd/fabricate-generation/main.go
@@ -1,29 +1,38 @@
package main
import (
+ "bytes"
"context"
"flag"
+ "fmt"
+ "io"
+ "log"
"log/slog"
+ "mime"
"net/http"
"os"
+ "path/filepath"
+ "strings"
+ "github.com/aws/aws-sdk-go-v2/service/s3"
+ "github.com/aws/aws-sdk-go/aws"
"github.com/facebookgo/flagenv"
_ "github.com/joho/godotenv/autoload"
"golang.org/x/oauth2"
"gopkg.in/mxpv/patreon-go.v1"
+ "within.website/x/tigris"
"within.website/x/web"
"xeiaso.net/v4/internal"
+ "xeiaso.net/v4/internal/lume"
"xeiaso.net/v4/internal/saasproxytoken"
)
var (
- githubSHA = flag.String("github-sha", "", "GitHub SHA to use for the site")
- miToken = flag.String("mi-token", "", "Token to use for the mi API")
- patreonSaasProxyURL = flag.String("patreon-saasproxy-url", "http://patreon-saasproxy/give-token", "URL to use for the patreon saasproxy")
- tailscaleClientID = flag.String("tailscale-client-id", "", "Tailscale client ID to use")
- tailscaleClientSecret = flag.String("tailscale-client-secret", "", "Tailscale client secret to use")
-
- regions = []string{"yyz", "bos", "iad", "den", "dfw", "ord", "mia", "phx", "lax", "yul", "gdl", "sjc", "sea", "atl", "ewr", "qro", "ams", "fra", "cdg", "lhr", "mad", "waw", "arn", "gru", "scl", "otp", "eze", "nrt", "bog", "gig", "hkg", "bom", "jnb", "sin", "syd"}
+ bucketName = flag.String("bucket-name", "xesite-dev", "Name of the S3 bucket to upload to")
+ githubSHA = flag.String("github-sha", "", "GitHub SHA to use for the site")
+ miURL = flag.String("mimi-announce-url", "", "Mi url (named mimi-announce-url for historical reasons)")
+ patreonSaasProxyURL = flag.String("patreon-saasproxy-url", "http://xesite-patreon-saasproxy.flycast", "URL to use for the patreon saasproxy")
+ siteURL = flag.String("site-url", "https://xeiaso.net/", "URL to use for the site")
)
func main() {
@@ -33,45 +42,37 @@ func main() {
slog.Info("starting up", "github-sha", *githubSHA)
- /*
- pc, err := NewPatreonClient(hc)
- if err != nil {
- slog.Error("can't create patreon client", "err", err)
- }
-
- os.MkdirAll("./var", 0700)
-
- fs, err := lume.New(context.Background(), &lume.Options{
- Branch: "main",
- Repo: "https://github.com/Xe/site",
- StaticSiteDir: "lume",
- URL: "https://xeiaso.net",
- Development: false,
- PatreonClient: pc,
- DataDir: "./var",
- MiToken: *miToken,
- })
- if err != nil {
- log.Fatal(err)
- }
+ pc, err := NewPatreonClient(http.DefaultClient)
+ if err != nil {
+ slog.Error("can't create patreon client", "err", err)
+ }
- defer fs.Close()
+ os.MkdirAll("./var", 0700)
- var wg sync.WaitGroup
+ s3c, err := tigris.Client(context.Background())
+ if err != nil {
+ log.Fatal(err)
+ }
- for _, region := range regions {
- wg.Add(1)
- go func(region string) {
- defer wg.Done()
+ fs, err := lume.New(context.Background(), &lume.Options{
+ Branch: "main",
+ Repo: "https://github.com/Xe/site",
+ StaticSiteDir: "lume",
+ URL: "https://xeiaso.net",
+ Development: false,
+ PatreonClient: pc,
+ DataDir: "./var",
+ MiURL: *miURL,
+ })
+ if err != nil {
+ log.Fatal(err)
+ }
- if err := uploadSlug(hc, "xedn-"+region, "./var/site.zip"); err != nil {
- slog.Error("error updating", "region", region, "error", err)
- }
- }(region)
- }
+ defer fs.Close()
- wg.Wait()
- */
+ if err := uploadFolderToS3(context.Background(), s3c, "./var/repo/lume/_site", *bucketName); err != nil {
+ log.Fatal(err)
+ }
}
func uploadSlug(cli *http.Client, host, fname string) error {
@@ -115,3 +116,52 @@ func NewPatreonClient(hc *http.Client) (*patreon.Client, error) {
return client, nil
}
+
+func uploadFolderToS3(ctx context.Context, s3c *s3.Client, folderPath, bucketName string) error {
+ // Ensure folderPath ends with a slash to correctly trim the prefix from file paths
+ cleanFolderPath := filepath.Clean(folderPath) + string(os.PathSeparator)
+
+ err := filepath.Walk(cleanFolderPath, func(path string, info os.FileInfo, err error) error {
+ if err != nil {
+ return err
+ }
+ if !info.IsDir() {
+ file, err := os.Open(path)
+ if err != nil {
+ return fmt.Errorf("failed to open file %q, %v", path, err)
+ }
+ defer file.Close()
+
+ fileContent, err := io.ReadAll(file)
+ if err != nil {
+ return fmt.Errorf("failed to read file %q, %v", path, err)
+ }
+
+ ext := filepath.Ext(path)
+ mimeType := mime.TypeByExtension(ext)
+ if mimeType == "" {
+ mimeType = "application/octet-stream" // Default MIME type if unknown
+ }
+
+ key := strings.TrimPrefix(path, cleanFolderPath)
+
+ _, err = s3c.PutObject(ctx, &s3.PutObjectInput{
+ Bucket: aws.String(bucketName),
+ Key: aws.String(key),
+ Body: bytes.NewReader(fileContent),
+ ContentType: aws.String(mimeType),
+ })
+ if err != nil {
+ return fmt.Errorf("failed to upload file %q to bucket %q, %v", path, bucketName, err)
+ }
+ slog.Info("uploaded file", "file", path, "bucket", bucketName)
+ }
+ return nil
+ })
+
+ if err != nil {
+ return fmt.Errorf("failed to walk through folder %q, %v", folderPath, err)
+ }
+
+ return nil
+}
diff --git a/go.mod b/go.mod
index 52a8a60..fd30f8d 100644
--- a/go.mod
+++ b/go.mod
@@ -5,6 +5,8 @@ go 1.22.0
toolchain go1.22.4
require (
+ github.com/aws/aws-sdk-go v1.53.6
+ github.com/aws/aws-sdk-go-v2/service/s3 v1.54.3
github.com/bep/debounce v1.2.1
github.com/donatj/hmacsig v1.1.0
github.com/emicklei/proto v1.13.2
@@ -28,6 +30,23 @@ require (
dario.cat/mergo v1.0.0 // indirect
github.com/Microsoft/go-winio v0.6.1 // indirect
github.com/ProtonMail/go-crypto v1.0.0 // indirect
+ github.com/aws/aws-sdk-go-v2 v1.27.0 // indirect
+ github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect
+ github.com/aws/aws-sdk-go-v2/config v1.27.10 // indirect
+ github.com/aws/aws-sdk-go-v2/credentials v1.17.10 // indirect
+ github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.7 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.9 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.7 // indirect
+ github.com/aws/aws-sdk-go-v2/service/sso v1.20.4 // indirect
+ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4 // indirect
+ github.com/aws/aws-sdk-go-v2/service/sts v1.28.6 // indirect
+ github.com/aws/smithy-go v1.20.2 // indirect
github.com/cloudflare/circl v1.3.7 // indirect
github.com/cyphar/filepath-securejoin v0.2.4 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
diff --git a/go.sum b/go.sum
index b25e57b..8aaadaa 100644
--- a/go.sum
+++ b/go.sum
@@ -9,6 +9,44 @@ github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFI
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
+github.com/aws/aws-sdk-go v1.53.6 h1:1/MYh/VmxdJu7v2bwvDA2JS30UI7bg62QYgQ7KxMa/Q=
+github.com/aws/aws-sdk-go v1.53.6/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk=
+github.com/aws/aws-sdk-go-v2 v1.27.0 h1:7bZWKoXhzI+mMR/HjdMx8ZCC5+6fY0lS5tr0bbgiLlo=
+github.com/aws/aws-sdk-go-v2 v1.27.0/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM=
+github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to=
+github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2/go.mod h1:lPprDr1e6cJdyYeGXnRaJoP4Md+cDBvi2eOj00BlGmg=
+github.com/aws/aws-sdk-go-v2/config v1.27.10 h1:PS+65jThT0T/snC5WjyfHHyUgG+eBoupSDV+f838cro=
+github.com/aws/aws-sdk-go-v2/config v1.27.10/go.mod h1:BePM7Vo4OBpHreKRUMuDXX+/+JWP38FLkzl5m27/Jjs=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.10 h1:qDZ3EA2lv1KangvQB6y258OssCHD0xvaGiEDkG4X/10=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.10/go.mod h1:6t3sucOaYDwDssHQa0ojH1RpmVmF5/jArkye1b2FKMI=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 h1:FVJ0r5XTHSmIHJV6KuDmdYhEpvlHpiSd38RQWhut5J4=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1/go.mod h1:zusuAeqezXzAB24LGuzuekqMAEgWkVYukBec3kr3jUg=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7 h1:lf/8VTF2cM+N4SLzaYJERKEWAXq8MOMpZfU6wEPWsPk=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.7/go.mod h1:4SjkU7QiqK2M9oozyMzfZ/23LmUY+h3oFqhdeP5OMiI=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7 h1:4OYVp0705xu8yjdyoWix0r9wPIRXnIzzOoUpQVHIJ/g=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.7/go.mod h1:vd7ESTEvI76T2Na050gODNmNU7+OyKrIKroYTu4ABiI=
+github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU=
+github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY=
+github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.7 h1:/FUtT3xsoHO3cfh+I/kCbcMCN98QZRsiFet/V8QkWSs=
+github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.7/go.mod h1:MaCAgWpGooQoCWZnMur97rGn5dp350w2+CeiV5406wE=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg=
+github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.9 h1:UXqEWQI0n+q0QixzU0yUUQBZXRd5037qdInTIHFTl98=
+github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.9/go.mod h1:xP6Gq6fzGZT8w/ZN+XvGMZ2RU1LeEs7b2yUP5DN8NY4=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9 h1:Wx0rlZoEJR7JwlSZcHnEa7CNjrSIyVxMFWGAaXy4fJY=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.9/go.mod h1:aVMHdE0aHO3v+f/iw01fmXV/5DbfQ3Bi9nN7nd9bE9Y=
+github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.7 h1:uO5XR6QGBcmPyo2gxofYJLFkcVQ4izOoGDNenlZhTEk=
+github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.7/go.mod h1:feeeAYfAcwTReM6vbwjEyDmiGho+YgBhaFULuXDW8kc=
+github.com/aws/aws-sdk-go-v2/service/s3 v1.54.3 h1:57NtjG+WLims0TxIQbjTqebZUKDM03DfM11ANAekW0s=
+github.com/aws/aws-sdk-go-v2/service/s3 v1.54.3/go.mod h1:739CllldowZiPPsDFcJHNF4FXrVxaSGVnZ9Ez9Iz9hc=
+github.com/aws/aws-sdk-go-v2/service/sso v1.20.4 h1:WzFol5Cd+yDxPAdnzTA5LmpHYSWinhmSj4rQChV0ee8=
+github.com/aws/aws-sdk-go-v2/service/sso v1.20.4/go.mod h1:qGzynb/msuZIE8I75DVRCUXw3o3ZyBmUvMwQ2t/BrGM=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4 h1:Jux+gDDyi1Lruk+KHF91tK2KCuY61kzoCpvtvJJBtOE=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4/go.mod h1:mUYPBhaF2lGiukDEjJX2BLRRKTmoUSitGDUgM4tRxak=
+github.com/aws/aws-sdk-go-v2/service/sts v1.28.6 h1:cwIxeBttqPN3qkaAjcEcsh8NYr8n2HZPkcKgPAi1phU=
+github.com/aws/aws-sdk-go-v2/service/sts v1.28.6/go.mod h1:FZf1/nKNEkHdGGJP/cI2MoIMquumuRK6ol3QQJNDxmw=
+github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q=
+github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E=
github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY=
github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0=
github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
@@ -67,6 +105,8 @@ github.com/invopop/yaml v0.3.1 h1:f0+ZpmhfBSS4MhG+4HYseMdJhoeeopbSKbq5Rpeelso=
github.com/invopop/yaml v0.3.1/go.mod h1:PMOp3nn4/12yEZUFfmOuNHJsZToEEOwoWsT+D81KkeA=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
+github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
+github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
diff --git a/lume/src/_includes/base.njk b/lume/src/_includes/base.njk
index 7d9e9b4..14fb543 100644
--- a/lume/src/_includes/base.njk
+++ b/lume/src/_includes/base.njk
@@ -84,27 +84,27 @@
</a>
</div>
<div class="flex items-center flex-shrink-0 mr-6">
- <a href="/blog" class="text-fg-1 dark:text-fgDark-1">
+ <a href="/blog/" class="text-fg-1 dark:text-fgDark-1">
<span class="text-xl font-aile tracking-tight">Blog</span>
</a>
</div>
<div class="flex items-center flex-shrink-0 mr-6">
- <a href="/contact" class="text-fg-1 dark:text-fgDark-1">
+ <a href="/contact/" class="text-fg-1 dark:text-fgDark-1">
<span class="text-xl font-aile tracking-tight">Contact</span>
</a>
</div>
<div class="flex items-center flex-shrink-0 mr-6">
- <a href="/resume" class="text-fg-1 dark:text-fgDark-1">
+ <a href="/resume/" class="text-fg-1 dark:text-fgDark-1">
<span class="text-xl font-aile tracking-tight">Resume</span>
</a>
</div>
<div class="flex items-center flex-shrink-0 mr-6">
- <a href="/talks" class="text-fg-1 dark:text-fgDark-1">
+ <a href="/talks/" class="text-fg-1 dark:text-fgDark-1">
<span class="text-xl font-aile tracking-tight">Talks</span>
</a>
</div>
<div class="flex items-center flex-shrink-0 mr-6">
- <a href="/vods" class="text-fg-1 dark:text-fgDark-1">
+ <a href="/vods/" class="text-fg-1 dark:text-fgDark-1">
<span class="text-xl font-aile tracking-tight">VODs</span>
</a>
</div>