diff options
Diffstat (limited to 'users/wpcarro/tools/rfcToKindle/main.go')
-rw-r--r-- | users/wpcarro/tools/rfcToKindle/main.go | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/users/wpcarro/tools/rfcToKindle/main.go b/users/wpcarro/tools/rfcToKindle/main.go new file mode 100644 index 000000000000..0f4f2dd9ec4f --- /dev/null +++ b/users/wpcarro/tools/rfcToKindle/main.go @@ -0,0 +1,89 @@ +// Author: wpcarro@gmail.com +// +// Wirelessly transfer RFC documents to your Kindle to device for an alternative +// medium for reading. +// +// Usage: +// ```shell +// > go run rfcToKindle.go -document rfc6479 -recipient username@kindle.com +// ``` +// +// This uses `sendgmr` to send the file to the Kindle. Make sure: +// 1. That `sendgmr` is installed and available on $PATH. +// 2. That it is configured to work with your preferred email address. +// 3. That the email address `sendgmr` is configured to use is whitelisted in +// your Kindle "Personal Document Settings". + +package main + +import ( + "flag" + "fmt" + "io" + "io/ioutil" + "log" + "net/http" + "os" + "os/exec" + "strings" +) + +func main() { + document := flag.String("document", "", "(Required) The name of the document to fetch. For example \"RFC6479\".") + recipient := flag.String("recipient", "", "(Required) The email address of the Kindle device.") + subject := flag.String("subject", "", "(Optional) The email address of the Kindle device.") + flag.Parse() + + if *document == "" { + // TODO: Is log.Fatal the best function to use here? + log.Fatal("-document cannot be empty. See -help for more information.") + } + + if *recipient == "" { + log.Fatal("-recipient cannot be empty. See -help for more information.") + } + + *document = strings.ToLower(*document) + + url := fmt.Sprintf("https://www.ietf.org/rfc/%s.txt", *document) + resp, err := http.Get(url) + fmt.Printf("Downloading %s ... ", url) + + if err != nil { + log.Fatal(err) + } + defer resp.Body.Close() + + f, err := ioutil.TempFile("", fmt.Sprintf("%s-*.txt", *document)) + if err != nil { + log.Fatal(err) + } + // TODO: Verify if this is cleaning up or not. + defer os.Remove(f.Name()) + + _, err = io.Copy(f, resp.Body) + if err != nil { + log.Fatal(err) + } + fmt.Println("done.") + + if *subject == "" { + *subject = fmt.Sprintf("%s - Sent from rfcToKindle.go", *document) + } + + // Although I couldn't find it documented anywhere, the email sent to the + // Kindle must have a body, even if the body isn't used for anything. + fmt.Printf("Emailing %s to %s ... ", f.Name(), *recipient) + cmd := exec.Command("sendgmr", + fmt.Sprintf("--to=%s", *recipient), + fmt.Sprintf("--body_file=%s", f.Name()), + fmt.Sprintf("--subject=%s", *subject), + fmt.Sprintf("--attachment_files=%s", f.Name())) + err = cmd.Run() + if err != nil { + log.Fatal(err) + } + fmt.Println("done.") + + os.Exit(0) +} |