diff options
| author | Xe Iaso <me@xeiaso.net> | 2024-06-27 06:34:25 -0400 |
|---|---|---|
| committer | Xe Iaso <me@xeiaso.net> | 2024-06-27 06:34:25 -0400 |
| commit | ef3d8ccd0419838d8b8e30ea72586f03b5dbbb5a (patch) | |
| tree | 091bad39ffee04e9222679a9b1a9e3ad509e0043 | |
| parent | 835c034940c8e988831e5735763984a45044f3d9 (diff) | |
| download | xesite-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.go | 132 | ||||
| -rw-r--r-- | go.mod | 19 | ||||
| -rw-r--r-- | go.sum | 40 | ||||
| -rw-r--r-- | lume/src/_includes/base.njk | 10 |
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 +} @@ -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 @@ -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> |
