Permalink
Cannot retrieve contributors at this time
Fetching contributors…
| // Copyright © 2016 Alan A. A. Donovan & Brian W. Kernighan. | |
| // License: https://creativecommons.org/licenses/by-nc-sa/4.0/ | |
| // See page 312. | |
| // Package storage is part of a hypothetical cloud storage server. | |
| //!+main | |
| package storage | |
| import ( | |
| "fmt" | |
| "log" | |
| "net/smtp" | |
| ) | |
| // NOTE: this differs slightly from the printed version. | |
| var usage = make(map[string]int64) | |
| func bytesInUse(username string) int64 { return usage[username] } | |
| // E-mail sender configuration. | |
| // NOTE: never put passwords in source code! | |
| const sender = "notifications@example.com" | |
| const password = "correcthorsebatterystaple" | |
| const hostname = "smtp.example.com" | |
| const template = `Warning: you are using %d bytes of storage, | |
| %d%% of your quota.` | |
| //!+factored | |
| var notifyUser = func(username, msg string) { | |
| auth := smtp.PlainAuth("", sender, password, hostname) | |
| err := smtp.SendMail(hostname+":587", auth, sender, | |
| []string{username}, []byte(msg)) | |
| if err != nil { | |
| log.Printf("smtp.SendEmail(%s) failed: %s", username, err) | |
| } | |
| } | |
| func CheckQuota(username string) { | |
| used := bytesInUse(username) | |
| const quota = 1000000000 // 1GB | |
| percent := 100 * used / quota | |
| if percent < 90 { | |
| return // OK | |
| } | |
| msg := fmt.Sprintf(template, used, percent) | |
| notifyUser(username, msg) | |
| } | |
| //!-factored |