diff options
Diffstat (limited to 'doRelease.go')
| -rw-r--r-- | doRelease.go | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/doRelease.go b/doRelease.go new file mode 100644 index 0000000..887dab9 --- /dev/null +++ b/doRelease.go @@ -0,0 +1,175 @@ +package main + +import ( + "bytes" + "crypto/sha256" + "errors" + "fmt" + "os" + "os/exec" + "path/filepath" + "strings" + "time" + + "go.wit.com/lib/gui/shell" + "go.wit.com/log" +) + +func doRelease() (string, error) { + // log.Info(r, err2) + shell.RunVerbose([]string{"rm", "-rf", "/home/mirrors/wit/dists"}) + // shell.RunVerbose([]string{"rm", "f", "/home/mirrors/wit/dists/sid/InRelease"}) + // shell.RunVerbose([]string{"rm", "f", "/home/mirrors/wit/dists/sid/Release"}) + // shell.RunVerbose([]string{"rm", "f", "/home/mirrors/wit/dists/sid/Release.gpg"}) + + // dists.working/sid/main/binary-amd64 + if err := os.MkdirAll("/home/mirrors/wit/dists/sid/main/binary-amd64", 0755); err != nil { + log.Info("did not work", err) + } else { + log.Info("did work") + } + + if me.pb.BaseDir != "/home/mirrors/wit" { + me.pb.Filename = "/home/mirrors/wit/mirrors.wit.com.pb" + me.pb.BaseDir = "/home/mirrors/wit" + me.pb.Save() + panic("missing /home/mirrors/wit as BaseDir") + } + + if err := os.Chdir(me.pb.BaseDir); err != nil { + me.sh.BadExit("no '"+me.pb.BaseDir+"' directory", err) + } + + if !shell.IsDir("pool/") { + me.sh.BadExit("no "+filepath.Join(me.pb.BaseDir, "pool")+" directory", errors.New("mount -a ? missing wit/pool/")) + } + + log.Info("Processing dir", filepath.Join(me.pb.BaseDir, "pool")) + + // arch := "amd64" + + newest := doGetNewest("amd64") + newest.SortPackage() + thefile := doMakePackagesFile(newest) + fullname := "/home/mirrors/wit/dists/sid/main/binary-amd64/Packages" + if err := os.WriteFile(fullname, []byte(thefile), os.ModePerm); err != nil { + return fullname, err + } + + r, err := shell.RunVerbose([]string{"gzip", "-k", fullname}) + log.Info(r, err) + // r, err := shell.RunVerbose([]string{"gzip", fullname}) + // panic("blah") + // shell.RunVerbose([]string{"bzip2", "-k", fullname}) + // shell.RunVerbose([]string{"bzip2", fullname}) + + allfiles, _ := FindFiles("dists/sid/main") + for i, filename := range allfiles { + log.Info(i, filename) + } + + releasePath := filepath.Join("/home/mirrors/wit/dists/sid", "Release") + + rfile, _ := os.OpenFile(releasePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) + fmt.Fprintf(rfile, "Origin: WIT.COM Debian Sid\n") + fmt.Fprintf(rfile, "Label: WIT.COM Debian Sid\n") + fmt.Fprintf(rfile, "Suite: sid\n") + fmt.Fprintf(rfile, "Codename: sid\n") + fmt.Fprintf(rfile, "Date: %s\n", time.Now().UTC().Format(time.RFC1123Z)) + fmt.Fprintf(rfile, "Architectures: riscv64 amd64 arm64 all\n") + fmt.Fprintf(rfile, "Components: main\n") + fmt.Fprintf(rfile, "Description: Tooling for RiscV, Semiconductor Designs & Private Clouds\n") + + /* + fmt.Fprintf(rfile, "MD5SUM:\n") + for i, filename := range allfiles { + log.Info(i, filename) + fileBytes, _ := os.ReadFile(filename) + sum := fmt.Sprintf("%x", md5.Sum(fileBytes)) // deprecated + newfile := strings.TrimPrefix(filename, "dists/sid/") + fmt.Fprintf(rfile, " %s %d %s\n", sum, len(fileBytes), newfile) + } + fmt.Fprintf(rfile, "SHA1:\n") + for i, filename := range allfiles { + log.Info(i, filename) + fileBytes, _ := os.ReadFile(filename) + sum := fmt.Sprintf("%x", sha1.Sum(fileBytes)) + newfile := strings.TrimPrefix(filename, "dists/sid/") + fmt.Fprintf(rfile, " %s %d %s\n", sum, len(fileBytes), newfile) + } + */ + fmt.Fprintf(rfile, "SHA256:\n") + for i, filename := range allfiles { + log.Info(i, filename) + fileBytes, _ := os.ReadFile(filename) + sum := fmt.Sprintf("%x", sha256.Sum256(fileBytes)) + newfile := strings.TrimPrefix(filename, "dists/sid/") + fmt.Fprintf(rfile, " %s %d %s\n", sum, len(fileBytes), newfile) + } + // fmt.Fprintf(rfile, "SHA1:\n") + // fmt.Fprintf(rfile, "SHA256:\n") + rfile.Close() + + // Sign the file + log.Println("Signing with GPG key:", gpgKeyID) + + distPath := "/home/mirrors/wit/dists/sid" + // Create InRelease + cmdClearSign := exec.Command("gpg", "--default-key", gpgKeyID, "--clearsign", "-o", filepath.Join(distPath, "InRelease"), releasePath) + if err := runCommand(cmdClearSign); err != nil { + log.Printf("failed to create InRelease: %v\n", err) + } + + // Create Release.gpg + cmdDetachedSign := exec.Command("gpg", "--default-key", gpgKeyID, "-abs", "-o", filepath.Join(distPath, "Release.gpg"), releasePath) + if err := runCommand(cmdDetachedSign); err != nil { + log.Printf("failed to create Release.gpg: %v\n", err) + } + /* + var sum string + switch name { + case "MD5Sum": + sum = fmt.Sprintf("%x", md5.Sum(fileBytes)) + case "SHA1": + sum = fmt.Sprintf("%x", sha1.Sum(fileBytes)) + case "SHA256": + // FIX 3: Use the correct sha256.Sum256 function. + sum = fmt.Sprintf("%x", sha256.Sum256(fileBytes)) + */ + + log.Info("Package file:", fullname) + log.Info("Release file:", releasePath) + log.Info("InRelease file:", filepath.Join(distPath, "InRelease")) + cmd := []string{"apt-get", "update"} + cmd = append(cmd, "-o", "Dir::Etc::sourcelist=/etc/apt/sources.list.d/wit.list") + cmd = append(cmd, "-o", "Dir::Etc::sourceparts=/dev/null") + cmd = append(cmd, "-o", "APT::Get::List-Cleanup=0") + log.Info("apt update :", cmd) + log.Info("") + log.Info("Finished Everything") + log.Info("") + + if argv.Verbose { + log.Info("") + shell.RunVerbose(cmd) + log.Info("") + log.Info("") + log.Info("Local file:", "/var/lib/apt/lists/mirrors.wit.com_wit_dists_sid_main_binary-amd64_Packages") + log.Info("") + shell.RunVerbose([]string{"head", "-n", "15", "/var/lib/apt/lists/mirrors.wit.com_wit_dists_sid_main_binary-amd64_Packages"}) + log.Info("apt install :", "apt install wit-tools") + log.Info("") + } + + return "did everything", nil +} + +func runCommand(cmd *exec.Cmd) error { + var stderr bytes.Buffer + cmd.Stderr = &stderr + err := cmd.Run() + if err != nil { + return fmt.Errorf("command '%s' failed: %v\nStderr: %s", cmd.String(), err, stderr.String()) + } + return nil +} |
