forked from TrueCloudLab/distribution
Update vendor directory to match expectation of vndr tool
Adds READMEs and enforces vendor is done at repository root Signed-off-by: Derek McGowan <derek@mcgstyle.net>
This commit is contained in:
parent
7b9ebdc54f
commit
b22c6b7a4e
55 changed files with 7153 additions and 3 deletions
|
@ -10,7 +10,7 @@ github.com/docker/goamz f0a21f5b2e12f83a505ecf79b633bb2035cf6f85
|
||||||
github.com/docker/libtrust fa567046d9b14f6aa788882a950d69651d230b21
|
github.com/docker/libtrust fa567046d9b14f6aa788882a950d69651d230b21
|
||||||
github.com/garyburd/redigo 535138d7bcd717d6531c701ef5933d98b1866257
|
github.com/garyburd/redigo 535138d7bcd717d6531c701ef5933d98b1866257
|
||||||
github.com/go-ini/ini 2ba15ac2dc9cdf88c110ec2dc0ced7fa45f5678c
|
github.com/go-ini/ini 2ba15ac2dc9cdf88c110ec2dc0ced7fa45f5678c
|
||||||
github.com/golang/protobuf/proto 8d92cf5fc15a4382f8964b08e1f42a75c0591aa3
|
github.com/golang/protobuf 8d92cf5fc15a4382f8964b08e1f42a75c0591aa3
|
||||||
github.com/gorilla/context 14f550f51af52180c2eefed15e5fd18d63c0a64a
|
github.com/gorilla/context 14f550f51af52180c2eefed15e5fd18d63c0a64a
|
||||||
github.com/gorilla/handlers 60c7bfde3e33c201519a200a4507a158cc03a17b
|
github.com/gorilla/handlers 60c7bfde3e33c201519a200a4507a158cc03a17b
|
||||||
github.com/gorilla/mux e444e69cbd2e2e3e0749a2f3c717cec491552bbf
|
github.com/gorilla/mux e444e69cbd2e2e3e0749a2f3c717cec491552bbf
|
||||||
|
@ -22,14 +22,14 @@ github.com/ncw/swift b964f2ca856aac39885e258ad25aec08d5f64ee6
|
||||||
github.com/spf13/cobra 312092086bed4968099259622145a0c9ae280064
|
github.com/spf13/cobra 312092086bed4968099259622145a0c9ae280064
|
||||||
github.com/spf13/pflag 5644820622454e71517561946e3d94b9f9db6842
|
github.com/spf13/pflag 5644820622454e71517561946e3d94b9f9db6842
|
||||||
github.com/stevvooe/resumable 51ad44105773cafcbe91927f70ac68e1bf78f8b4
|
github.com/stevvooe/resumable 51ad44105773cafcbe91927f70ac68e1bf78f8b4
|
||||||
github.com/xenolf/lego/acme a9d8cec0e6563575e5868a005359ac97911b5985
|
github.com/xenolf/lego a9d8cec0e6563575e5868a005359ac97911b5985
|
||||||
github.com/yvasiyarov/go-metrics 57bccd1ccd43f94bb17fdd8bf3007059b802f85e
|
github.com/yvasiyarov/go-metrics 57bccd1ccd43f94bb17fdd8bf3007059b802f85e
|
||||||
github.com/yvasiyarov/gorelic a9bba5b9ab508a086f9a12b8c51fab68478e2128
|
github.com/yvasiyarov/gorelic a9bba5b9ab508a086f9a12b8c51fab68478e2128
|
||||||
github.com/yvasiyarov/newrelic_platform_go b21fdbd4370f3717f3bbd2bf41c223bc273068e6
|
github.com/yvasiyarov/newrelic_platform_go b21fdbd4370f3717f3bbd2bf41c223bc273068e6
|
||||||
golang.org/x/crypto c10c31b5e94b6f7a0283272dc2bb27163dcea24b
|
golang.org/x/crypto c10c31b5e94b6f7a0283272dc2bb27163dcea24b
|
||||||
golang.org/x/net 4876518f9e71663000c348837735820161a42df7
|
golang.org/x/net 4876518f9e71663000c348837735820161a42df7
|
||||||
golang.org/x/oauth2 045497edb6234273d67dbc25da3f2ddbc4c4cacf
|
golang.org/x/oauth2 045497edb6234273d67dbc25da3f2ddbc4c4cacf
|
||||||
golang.org/x/time/rate a4bde12657593d5e90d0533a3e4fd95e635124cb
|
golang.org/x/time a4bde12657593d5e90d0533a3e4fd95e635124cb
|
||||||
google.golang.org/api 9bf6e6e569ff057f75d9604a46c52928f17d2b54
|
google.golang.org/api 9bf6e6e569ff057f75d9604a46c52928f17d2b54
|
||||||
google.golang.org/appengine 12d5545dc1cfa6047a286d5e853841b6471f4c19
|
google.golang.org/appengine 12d5545dc1cfa6047a286d5e853841b6471f4c19
|
||||||
google.golang.org/cloud 975617b05ea8a58727e6c1a06b6161ff4185a9f2
|
google.golang.org/cloud 975617b05ea8a58727e6c1a06b6161ff4185a9f2
|
||||||
|
|
116
vendor/github.com/Azure/azure-sdk-for-go/README.md
generated
vendored
Normal file
116
vendor/github.com/Azure/azure-sdk-for-go/README.md
generated
vendored
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
# Microsoft Azure SDK for Go
|
||||||
|
|
||||||
|
This project provides various Go packages to perform operations
|
||||||
|
on Microsoft Azure REST APIs.
|
||||||
|
|
||||||
|
[![GoDoc](https://godoc.org/github.com/Azure/azure-sdk-for-go?status.svg)](https://godoc.org/github.com/Azure/azure-sdk-for-go) [![Build Status](https://travis-ci.org/Azure/azure-sdk-for-go.svg?branch=master)](https://travis-ci.org/Azure/azure-sdk-for-go)
|
||||||
|
|
||||||
|
> **NOTE:** This repository is under heavy ongoing development and
|
||||||
|
is likely to break over time. We currently do not have any releases
|
||||||
|
yet. If you are planning to use the repository, please consider vendoring
|
||||||
|
the packages in your project and update them when a stable tag is out.
|
||||||
|
|
||||||
|
# Packages
|
||||||
|
|
||||||
|
## Azure Resource Manager (ARM)
|
||||||
|
|
||||||
|
[About ARM](/arm/README.md)
|
||||||
|
|
||||||
|
- [analysisservices](/arm/analysisservices)
|
||||||
|
- [authorization](/arm/authorization)
|
||||||
|
- [batch](/arm/batch)
|
||||||
|
- [cdn](/arm/cdn)
|
||||||
|
- [cognitiveservices](/arm/cognitiveservices)
|
||||||
|
- [commerce](/arm/commerce)
|
||||||
|
- [compute](/arm/compute)
|
||||||
|
- [containerregistry](/arm/containerregistry)
|
||||||
|
- [containerservice](/arm/containerservice)
|
||||||
|
- [datalake-analytics/account](/arm/datalake-analytics/account)
|
||||||
|
- [datalake-store/account](/arm/datalake-store/account)
|
||||||
|
- [devtestlabs](/arm/devtestlabs)
|
||||||
|
- [dns](/arm/dns)
|
||||||
|
- [documentdb](/arm/documentdb)
|
||||||
|
- [eventhub](/arm/eventhub)
|
||||||
|
- [intune](/arm/intune)
|
||||||
|
- [iothub](/arm/iothub)
|
||||||
|
- [keyvault](/arm/keyvault)
|
||||||
|
- [logic](/arm/logic)
|
||||||
|
- [machinelearning/commitmentplans](/arm/machinelearning/commitmentplans)
|
||||||
|
- [machinelearning/webservices](/arm/machinelearning/webservices)
|
||||||
|
- [mediaservices](/arm/mediaservices)
|
||||||
|
- [mobileengagement](/arm/mobileengagement)
|
||||||
|
- [network](/arm/network)
|
||||||
|
- [notificationhubs](/arm/notificationhubs)
|
||||||
|
- [powerbiembedded](/arm/powerbiembedded)
|
||||||
|
- [recoveryservices](/arm/recoveryservices)
|
||||||
|
- [redis](/arm/redis)
|
||||||
|
- [resources/features](/arm/resources/features)
|
||||||
|
- [resources/links](/arm/resources/links)
|
||||||
|
- [resources/locks](/arm/resources/locks)
|
||||||
|
- [resources/policy](/arm/resources/policy)
|
||||||
|
- [resources/resources](/arm/resources/resources)
|
||||||
|
- [resources/subscriptions](/arm/resources/subscriptions)
|
||||||
|
- [scheduler](/arm/scheduler)
|
||||||
|
- [search](/arm/search)
|
||||||
|
- [servermanagement](/arm/servermanagement)
|
||||||
|
- [servicebus](/arm/servicebus)
|
||||||
|
- [sql](/arm/sql)
|
||||||
|
- [storage](/arm/storage)
|
||||||
|
- [trafficmanager](/arm/trafficmanager)
|
||||||
|
- [web](/arm/web)
|
||||||
|
|
||||||
|
## Azure Service Management (ASM), aka classic deployment
|
||||||
|
|
||||||
|
[About ASM](/management/README.md)
|
||||||
|
|
||||||
|
- [affinitygroup](/management/affinitygroup)
|
||||||
|
- [hostedservice](/management/hostedservice)
|
||||||
|
- [location](/management/location)
|
||||||
|
- [networksecuritygroup](/management/networksecuritygroup)
|
||||||
|
- [osimage](/management/osimage)
|
||||||
|
- [sql](/management/sql)
|
||||||
|
- [storageservice](/management/storageservice)
|
||||||
|
- [virtualmachine](/management/virtualmachine)
|
||||||
|
- [virtualmachinedisk](/management/virtualmachinedisk)
|
||||||
|
- [virtualmachineimage](/management/virtualmachineimage)
|
||||||
|
- [virtualnetwork](/management/virtualnetwork)
|
||||||
|
- [vmutils](/management/vmutils)
|
||||||
|
|
||||||
|
## Azure Storage SDK for Go
|
||||||
|
|
||||||
|
[About Storage](/storage/README.md)
|
||||||
|
|
||||||
|
- [storage](/storage)
|
||||||
|
|
||||||
|
# Installation
|
||||||
|
|
||||||
|
- [Install Go 1.7](https://golang.org/dl/).
|
||||||
|
|
||||||
|
- Go get the SDK:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ go get -d github.com/Azure/azure-sdk-for-go
|
||||||
|
```
|
||||||
|
|
||||||
|
> **IMPORTANT:** We highly suggest vendoring Azure SDK for Go as a dependency. For vendoring dependencies, Azure SDK for Go uses [glide](https://github.com/Masterminds/glide). If you haven't already, install glide. Navigate to your project directory and install the dependencies.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cd your/project
|
||||||
|
$ glide create
|
||||||
|
$ glide install
|
||||||
|
```
|
||||||
|
|
||||||
|
# Documentation
|
||||||
|
|
||||||
|
Read the Godoc of the repository at [Godoc.org](http://godoc.org/github.com/Azure/azure-sdk-for-go/).
|
||||||
|
|
||||||
|
# Contribute
|
||||||
|
|
||||||
|
If you would like to become an active contributor to this project please follow the instructions provided in [Microsoft Azure Projects Contribution Guidelines](http://azure.github.io/guidelines/).
|
||||||
|
|
||||||
|
# License
|
||||||
|
|
||||||
|
This project is published under [Apache 2.0 License](LICENSE).
|
||||||
|
|
||||||
|
-----
|
||||||
|
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
|
5
vendor/github.com/Azure/azure-sdk-for-go/storage/README.md
generated
vendored
Normal file
5
vendor/github.com/Azure/azure-sdk-for-go/storage/README.md
generated
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# Azure Storage SDK for Go
|
||||||
|
|
||||||
|
The `github.com/Azure/azure-sdk-for-go/storage` package is used to perform operations in Azure Storage Service. To manage your storage accounts (Azure Resource Manager / ARM), use the [github.com/Azure/azure-sdk-for-go/arm/storage](../arm/storage) package. For your classic storage accounts (Azure Service Management / ASM), use [github.com/Azure/azure-sdk-for-go/management/storageservice](../management/storageservice) package.
|
||||||
|
|
||||||
|
This package includes support for [Azure Storage Emulator](https://azure.microsoft.com/documentation/articles/storage-use-emulator/)
|
425
vendor/github.com/Sirupsen/logrus/README.md
generated
vendored
Normal file
425
vendor/github.com/Sirupsen/logrus/README.md
generated
vendored
Normal file
|
@ -0,0 +1,425 @@
|
||||||
|
# Logrus <img src="http://i.imgur.com/hTeVwmJ.png" width="40" height="40" alt=":walrus:" class="emoji" title=":walrus:"/> [![Build Status](https://travis-ci.org/Sirupsen/logrus.svg?branch=master)](https://travis-ci.org/Sirupsen/logrus) [![GoDoc](https://godoc.org/github.com/Sirupsen/logrus?status.svg)](https://godoc.org/github.com/Sirupsen/logrus)
|
||||||
|
|
||||||
|
Logrus is a structured logger for Go (golang), completely API compatible with
|
||||||
|
the standard library logger. [Godoc][godoc]. **Please note the Logrus API is not
|
||||||
|
yet stable (pre 1.0). Logrus itself is completely stable and has been used in
|
||||||
|
many large deployments. The core API is unlikely to change much but please
|
||||||
|
version control your Logrus to make sure you aren't fetching latest `master` on
|
||||||
|
every build.**
|
||||||
|
|
||||||
|
Nicely color-coded in development (when a TTY is attached, otherwise just
|
||||||
|
plain text):
|
||||||
|
|
||||||
|
![Colored](http://i.imgur.com/PY7qMwd.png)
|
||||||
|
|
||||||
|
With `log.SetFormatter(&log.JSONFormatter{})`, for easy parsing by logstash
|
||||||
|
or Splunk:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{"animal":"walrus","level":"info","msg":"A group of walrus emerges from the
|
||||||
|
ocean","size":10,"time":"2014-03-10 19:57:38.562264131 -0400 EDT"}
|
||||||
|
|
||||||
|
{"level":"warning","msg":"The group's number increased tremendously!",
|
||||||
|
"number":122,"omg":true,"time":"2014-03-10 19:57:38.562471297 -0400 EDT"}
|
||||||
|
|
||||||
|
{"animal":"walrus","level":"info","msg":"A giant walrus appears!",
|
||||||
|
"size":10,"time":"2014-03-10 19:57:38.562500591 -0400 EDT"}
|
||||||
|
|
||||||
|
{"animal":"walrus","level":"info","msg":"Tremendously sized cow enters the ocean.",
|
||||||
|
"size":9,"time":"2014-03-10 19:57:38.562527896 -0400 EDT"}
|
||||||
|
|
||||||
|
{"level":"fatal","msg":"The ice breaks!","number":100,"omg":true,
|
||||||
|
"time":"2014-03-10 19:57:38.562543128 -0400 EDT"}
|
||||||
|
```
|
||||||
|
|
||||||
|
With the default `log.SetFormatter(&log.TextFormatter{})` when a TTY is not
|
||||||
|
attached, the output is compatible with the
|
||||||
|
[logfmt](http://godoc.org/github.com/kr/logfmt) format:
|
||||||
|
|
||||||
|
```text
|
||||||
|
time="2015-03-26T01:27:38-04:00" level=debug msg="Started observing beach" animal=walrus number=8
|
||||||
|
time="2015-03-26T01:27:38-04:00" level=info msg="A group of walrus emerges from the ocean" animal=walrus size=10
|
||||||
|
time="2015-03-26T01:27:38-04:00" level=warning msg="The group's number increased tremendously!" number=122 omg=true
|
||||||
|
time="2015-03-26T01:27:38-04:00" level=debug msg="Temperature changes" temperature=-4
|
||||||
|
time="2015-03-26T01:27:38-04:00" level=panic msg="It's over 9000!" animal=orca size=9009
|
||||||
|
time="2015-03-26T01:27:38-04:00" level=fatal msg="The ice breaks!" err=&{0x2082280c0 map[animal:orca size:9009] 2015-03-26 01:27:38.441574009 -0400 EDT panic It's over 9000!} number=100 omg=true
|
||||||
|
exit status 1
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Example
|
||||||
|
|
||||||
|
The simplest way to use Logrus is simply the package-level exported logger:
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
log "github.com/Sirupsen/logrus"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
log.WithFields(log.Fields{
|
||||||
|
"animal": "walrus",
|
||||||
|
}).Info("A walrus appears")
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that it's completely api-compatible with the stdlib logger, so you can
|
||||||
|
replace your `log` imports everywhere with `log "github.com/Sirupsen/logrus"`
|
||||||
|
and you'll now have the flexibility of Logrus. You can customize it all you
|
||||||
|
want:
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
log "github.com/Sirupsen/logrus"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
// Log as JSON instead of the default ASCII formatter.
|
||||||
|
log.SetFormatter(&log.JSONFormatter{})
|
||||||
|
|
||||||
|
// Output to stderr instead of stdout, could also be a file.
|
||||||
|
log.SetOutput(os.Stderr)
|
||||||
|
|
||||||
|
// Only log the warning severity or above.
|
||||||
|
log.SetLevel(log.WarnLevel)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
log.WithFields(log.Fields{
|
||||||
|
"animal": "walrus",
|
||||||
|
"size": 10,
|
||||||
|
}).Info("A group of walrus emerges from the ocean")
|
||||||
|
|
||||||
|
log.WithFields(log.Fields{
|
||||||
|
"omg": true,
|
||||||
|
"number": 122,
|
||||||
|
}).Warn("The group's number increased tremendously!")
|
||||||
|
|
||||||
|
log.WithFields(log.Fields{
|
||||||
|
"omg": true,
|
||||||
|
"number": 100,
|
||||||
|
}).Fatal("The ice breaks!")
|
||||||
|
|
||||||
|
// A common pattern is to re-use fields between logging statements by re-using
|
||||||
|
// the logrus.Entry returned from WithFields()
|
||||||
|
contextLogger := log.WithFields(log.Fields{
|
||||||
|
"common": "this is a common field",
|
||||||
|
"other": "I also should be logged always",
|
||||||
|
})
|
||||||
|
|
||||||
|
contextLogger.Info("I'll be logged with common and other field")
|
||||||
|
contextLogger.Info("Me too")
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
For more advanced usage such as logging to multiple locations from the same
|
||||||
|
application, you can also create an instance of the `logrus` Logger:
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/Sirupsen/logrus"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Create a new instance of the logger. You can have any number of instances.
|
||||||
|
var log = logrus.New()
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// The API for setting attributes is a little different than the package level
|
||||||
|
// exported logger. See Godoc.
|
||||||
|
log.Out = os.Stderr
|
||||||
|
|
||||||
|
log.WithFields(logrus.Fields{
|
||||||
|
"animal": "walrus",
|
||||||
|
"size": 10,
|
||||||
|
}).Info("A group of walrus emerges from the ocean")
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Fields
|
||||||
|
|
||||||
|
Logrus encourages careful, structured logging though logging fields instead of
|
||||||
|
long, unparseable error messages. For example, instead of: `log.Fatalf("Failed
|
||||||
|
to send event %s to topic %s with key %d")`, you should log the much more
|
||||||
|
discoverable:
|
||||||
|
|
||||||
|
```go
|
||||||
|
log.WithFields(log.Fields{
|
||||||
|
"event": event,
|
||||||
|
"topic": topic,
|
||||||
|
"key": key,
|
||||||
|
}).Fatal("Failed to send event")
|
||||||
|
```
|
||||||
|
|
||||||
|
We've found this API forces you to think about logging in a way that produces
|
||||||
|
much more useful logging messages. We've been in countless situations where just
|
||||||
|
a single added field to a log statement that was already there would've saved us
|
||||||
|
hours. The `WithFields` call is optional.
|
||||||
|
|
||||||
|
In general, with Logrus using any of the `printf`-family functions should be
|
||||||
|
seen as a hint you should add a field, however, you can still use the
|
||||||
|
`printf`-family functions with Logrus.
|
||||||
|
|
||||||
|
#### Hooks
|
||||||
|
|
||||||
|
You can add hooks for logging levels. For example to send errors to an exception
|
||||||
|
tracking service on `Error`, `Fatal` and `Panic`, info to StatsD or log to
|
||||||
|
multiple places simultaneously, e.g. syslog.
|
||||||
|
|
||||||
|
Logrus comes with [built-in hooks](hooks/). Add those, or your custom hook, in
|
||||||
|
`init`:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
log "github.com/Sirupsen/logrus"
|
||||||
|
"gopkg.in/gemnasium/logrus-airbrake-hook.v2" // the package is named "aibrake"
|
||||||
|
logrus_syslog "github.com/Sirupsen/logrus/hooks/syslog"
|
||||||
|
"log/syslog"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
|
||||||
|
// Use the Airbrake hook to report errors that have Error severity or above to
|
||||||
|
// an exception tracker. You can create custom hooks, see the Hooks section.
|
||||||
|
log.AddHook(airbrake.NewHook(123, "xyz", "production"))
|
||||||
|
|
||||||
|
hook, err := logrus_syslog.NewSyslogHook("udp", "localhost:514", syslog.LOG_INFO, "")
|
||||||
|
if err != nil {
|
||||||
|
log.Error("Unable to connect to local syslog daemon")
|
||||||
|
} else {
|
||||||
|
log.AddHook(hook)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Note: Syslog hook also support connecting to local syslog (Ex. "/dev/log" or "/var/run/syslog" or "/var/run/log"). For the detail, please check the [syslog hook README](hooks/syslog/README.md).
|
||||||
|
|
||||||
|
| Hook | Description |
|
||||||
|
| ----- | ----------- |
|
||||||
|
| [Airbrake](https://github.com/gemnasium/logrus-airbrake-hook) | Send errors to the Airbrake API V3. Uses the official [`gobrake`](https://github.com/airbrake/gobrake) behind the scenes. |
|
||||||
|
| [Airbrake "legacy"](https://github.com/gemnasium/logrus-airbrake-legacy-hook) | Send errors to an exception tracking service compatible with the Airbrake API V2. Uses [`airbrake-go`](https://github.com/tobi/airbrake-go) behind the scenes. |
|
||||||
|
| [Papertrail](https://github.com/polds/logrus-papertrail-hook) | Send errors to the [Papertrail](https://papertrailapp.com) hosted logging service via UDP. |
|
||||||
|
| [Syslog](https://github.com/Sirupsen/logrus/blob/master/hooks/syslog/syslog.go) | Send errors to remote syslog server. Uses standard library `log/syslog` behind the scenes. |
|
||||||
|
| [Bugsnag](https://github.com/Shopify/logrus-bugsnag/blob/master/bugsnag.go) | Send errors to the Bugsnag exception tracking service. |
|
||||||
|
| [Sentry](https://github.com/evalphobia/logrus_sentry) | Send errors to the Sentry error logging and aggregation service. |
|
||||||
|
| [Hiprus](https://github.com/nubo/hiprus) | Send errors to a channel in hipchat. |
|
||||||
|
| [Logrusly](https://github.com/sebest/logrusly) | Send logs to [Loggly](https://www.loggly.com/) |
|
||||||
|
| [Slackrus](https://github.com/johntdyer/slackrus) | Hook for Slack chat. |
|
||||||
|
| [Journalhook](https://github.com/wercker/journalhook) | Hook for logging to `systemd-journald` |
|
||||||
|
| [Graylog](https://github.com/gemnasium/logrus-graylog-hook) | Hook for logging to [Graylog](http://graylog2.org/) |
|
||||||
|
| [Raygun](https://github.com/squirkle/logrus-raygun-hook) | Hook for logging to [Raygun.io](http://raygun.io/) |
|
||||||
|
| [LFShook](https://github.com/rifflock/lfshook) | Hook for logging to the local filesystem |
|
||||||
|
| [Honeybadger](https://github.com/agonzalezro/logrus_honeybadger) | Hook for sending exceptions to Honeybadger |
|
||||||
|
| [Mail](https://github.com/zbindenren/logrus_mail) | Hook for sending exceptions via mail |
|
||||||
|
| [Rollrus](https://github.com/heroku/rollrus) | Hook for sending errors to rollbar |
|
||||||
|
| [Fluentd](https://github.com/evalphobia/logrus_fluent) | Hook for logging to fluentd |
|
||||||
|
| [Mongodb](https://github.com/weekface/mgorus) | Hook for logging to mongodb |
|
||||||
|
| [Influxus] (http://github.com/vlad-doru/influxus) | Hook for concurrently logging to [InfluxDB] (http://influxdata.com/) |
|
||||||
|
| [InfluxDB](https://github.com/Abramovic/logrus_influxdb) | Hook for logging to influxdb |
|
||||||
|
| [Octokit](https://github.com/dorajistyle/logrus-octokit-hook) | Hook for logging to github via octokit |
|
||||||
|
| [DeferPanic](https://github.com/deferpanic/dp-logrus) | Hook for logging to DeferPanic |
|
||||||
|
| [Redis-Hook](https://github.com/rogierlommers/logrus-redis-hook) | Hook for logging to a ELK stack (through Redis) |
|
||||||
|
| [Amqp-Hook](https://github.com/vladoatanasov/logrus_amqp) | Hook for logging to Amqp broker (Like RabbitMQ) |
|
||||||
|
| [KafkaLogrus](https://github.com/goibibo/KafkaLogrus) | Hook for logging to kafka |
|
||||||
|
| [Typetalk](https://github.com/dragon3/logrus-typetalk-hook) | Hook for logging to [Typetalk](https://www.typetalk.in/) |
|
||||||
|
| [ElasticSearch](https://github.com/sohlich/elogrus) | Hook for logging to ElasticSearch|
|
||||||
|
| [Sumorus](https://github.com/doublefree/sumorus) | Hook for logging to [SumoLogic](https://www.sumologic.com/)|
|
||||||
|
| [Scribe](https://github.com/sagar8192/logrus-scribe-hook) | Hook for logging to [Scribe](https://github.com/facebookarchive/scribe)|
|
||||||
|
| [Logstash](https://github.com/bshuster-repo/logrus-logstash-hook) | Hook for logging to [Logstash](https://www.elastic.co/products/logstash) |
|
||||||
|
| [logz.io](https://github.com/ripcurld00d/logrus-logzio-hook) | Hook for logging to [logz.io](https://logz.io), a Log as a Service using Logstash |
|
||||||
|
| [Logmatic.io](https://github.com/logmatic/logmatic-go) | Hook for logging to [Logmatic.io](http://logmatic.io/) |
|
||||||
|
| [Pushover](https://github.com/toorop/logrus_pushover) | Send error via [Pushover](https://pushover.net) |
|
||||||
|
|
||||||
|
|
||||||
|
#### Level logging
|
||||||
|
|
||||||
|
Logrus has six logging levels: Debug, Info, Warning, Error, Fatal and Panic.
|
||||||
|
|
||||||
|
```go
|
||||||
|
log.Debug("Useful debugging information.")
|
||||||
|
log.Info("Something noteworthy happened!")
|
||||||
|
log.Warn("You should probably take a look at this.")
|
||||||
|
log.Error("Something failed but I'm not quitting.")
|
||||||
|
// Calls os.Exit(1) after logging
|
||||||
|
log.Fatal("Bye.")
|
||||||
|
// Calls panic() after logging
|
||||||
|
log.Panic("I'm bailing.")
|
||||||
|
```
|
||||||
|
|
||||||
|
You can set the logging level on a `Logger`, then it will only log entries with
|
||||||
|
that severity or anything above it:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Will log anything that is info or above (warn, error, fatal, panic). Default.
|
||||||
|
log.SetLevel(log.InfoLevel)
|
||||||
|
```
|
||||||
|
|
||||||
|
It may be useful to set `log.Level = logrus.DebugLevel` in a debug or verbose
|
||||||
|
environment if your application has that.
|
||||||
|
|
||||||
|
#### Entries
|
||||||
|
|
||||||
|
Besides the fields added with `WithField` or `WithFields` some fields are
|
||||||
|
automatically added to all logging events:
|
||||||
|
|
||||||
|
1. `time`. The timestamp when the entry was created.
|
||||||
|
2. `msg`. The logging message passed to `{Info,Warn,Error,Fatal,Panic}` after
|
||||||
|
the `AddFields` call. E.g. `Failed to send event.`
|
||||||
|
3. `level`. The logging level. E.g. `info`.
|
||||||
|
|
||||||
|
#### Environments
|
||||||
|
|
||||||
|
Logrus has no notion of environment.
|
||||||
|
|
||||||
|
If you wish for hooks and formatters to only be used in specific environments,
|
||||||
|
you should handle that yourself. For example, if your application has a global
|
||||||
|
variable `Environment`, which is a string representation of the environment you
|
||||||
|
could do:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
log "github.com/Sirupsen/logrus"
|
||||||
|
)
|
||||||
|
|
||||||
|
init() {
|
||||||
|
// do something here to set environment depending on an environment variable
|
||||||
|
// or command-line flag
|
||||||
|
if Environment == "production" {
|
||||||
|
log.SetFormatter(&log.JSONFormatter{})
|
||||||
|
} else {
|
||||||
|
// The TextFormatter is default, you don't actually have to do this.
|
||||||
|
log.SetFormatter(&log.TextFormatter{})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This configuration is how `logrus` was intended to be used, but JSON in
|
||||||
|
production is mostly only useful if you do log aggregation with tools like
|
||||||
|
Splunk or Logstash.
|
||||||
|
|
||||||
|
#### Formatters
|
||||||
|
|
||||||
|
The built-in logging formatters are:
|
||||||
|
|
||||||
|
* `logrus.TextFormatter`. Logs the event in colors if stdout is a tty, otherwise
|
||||||
|
without colors.
|
||||||
|
* *Note:* to force colored output when there is no TTY, set the `ForceColors`
|
||||||
|
field to `true`. To force no colored output even if there is a TTY set the
|
||||||
|
`DisableColors` field to `true`
|
||||||
|
* `logrus.JSONFormatter`. Logs fields as JSON.
|
||||||
|
|
||||||
|
Third party logging formatters:
|
||||||
|
|
||||||
|
* [`logstash`](https://github.com/bshuster-repo/logrus-logstash-hook). Logs fields as [Logstash](http://logstash.net) Events.
|
||||||
|
* [`prefixed`](https://github.com/x-cray/logrus-prefixed-formatter). Displays log entry source along with alternative layout.
|
||||||
|
* [`zalgo`](https://github.com/aybabtme/logzalgo). Invoking the P͉̫o̳̼̊w̖͈̰͎e̬͔̭͂r͚̼̹̲ ̫͓͉̳͈ō̠͕͖̚f̝͍̠ ͕̲̞͖͑Z̖̫̤̫ͪa͉̬͈̗l͖͎g̳̥o̰̥̅!̣͔̲̻͊̄ ̙̘̦̹̦.
|
||||||
|
|
||||||
|
You can define your formatter by implementing the `Formatter` interface,
|
||||||
|
requiring a `Format` method. `Format` takes an `*Entry`. `entry.Data` is a
|
||||||
|
`Fields` type (`map[string]interface{}`) with all your fields as well as the
|
||||||
|
default ones (see Entries section above):
|
||||||
|
|
||||||
|
```go
|
||||||
|
type MyJSONFormatter struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
log.SetFormatter(new(MyJSONFormatter))
|
||||||
|
|
||||||
|
func (f *MyJSONFormatter) Format(entry *Entry) ([]byte, error) {
|
||||||
|
// Note this doesn't include Time, Level and Message which are available on
|
||||||
|
// the Entry. Consult `godoc` on information about those fields or read the
|
||||||
|
// source of the official loggers.
|
||||||
|
serialized, err := json.Marshal(entry.Data)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err)
|
||||||
|
}
|
||||||
|
return append(serialized, '\n'), nil
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Logger as an `io.Writer`
|
||||||
|
|
||||||
|
Logrus can be transformed into an `io.Writer`. That writer is the end of an `io.Pipe` and it is your responsibility to close it.
|
||||||
|
|
||||||
|
```go
|
||||||
|
w := logger.Writer()
|
||||||
|
defer w.Close()
|
||||||
|
|
||||||
|
srv := http.Server{
|
||||||
|
// create a stdlib log.Logger that writes to
|
||||||
|
// logrus.Logger.
|
||||||
|
ErrorLog: log.New(w, "", 0),
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Each line written to that writer will be printed the usual way, using formatters
|
||||||
|
and hooks. The level for those entries is `info`.
|
||||||
|
|
||||||
|
#### Rotation
|
||||||
|
|
||||||
|
Log rotation is not provided with Logrus. Log rotation should be done by an
|
||||||
|
external program (like `logrotate(8)`) that can compress and delete old log
|
||||||
|
entries. It should not be a feature of the application-level logger.
|
||||||
|
|
||||||
|
#### Tools
|
||||||
|
|
||||||
|
| Tool | Description |
|
||||||
|
| ---- | ----------- |
|
||||||
|
|[Logrus Mate](https://github.com/gogap/logrus_mate)|Logrus mate is a tool for Logrus to manage loggers, you can initial logger's level, hook and formatter by config file, the logger will generated with different config at different environment.|
|
||||||
|
|[Logrus Viper Helper](https://github.com/heirko/go-contrib/tree/master/logrusHelper)|An Helper arround Logrus to wrap with spf13/Viper to load configuration with fangs! And to simplify Logrus configuration use some behavior of [Logrus Mate](https://github.com/gogap/logrus_mate). [sample](https://github.com/heirko/iris-contrib/blob/master/middleware/logrus-logger/example) |
|
||||||
|
|
||||||
|
#### Testing
|
||||||
|
|
||||||
|
Logrus has a built in facility for asserting the presence of log messages. This is implemented through the `test` hook and provides:
|
||||||
|
|
||||||
|
* decorators for existing logger (`test.NewLocal` and `test.NewGlobal`) which basically just add the `test` hook
|
||||||
|
* a test logger (`test.NewNullLogger`) that just records log messages (and does not output any):
|
||||||
|
|
||||||
|
```go
|
||||||
|
logger, hook := NewNullLogger()
|
||||||
|
logger.Error("Hello error")
|
||||||
|
|
||||||
|
assert.Equal(1, len(hook.Entries))
|
||||||
|
assert.Equal(logrus.ErrorLevel, hook.LastEntry().Level)
|
||||||
|
assert.Equal("Hello error", hook.LastEntry().Message)
|
||||||
|
|
||||||
|
hook.Reset()
|
||||||
|
assert.Nil(hook.LastEntry())
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Fatal handlers
|
||||||
|
|
||||||
|
Logrus can register one or more functions that will be called when any `fatal`
|
||||||
|
level message is logged. The registered handlers will be executed before
|
||||||
|
logrus performs a `os.Exit(1)`. This behavior may be helpful if callers need
|
||||||
|
to gracefully shutdown. Unlike a `panic("Something went wrong...")` call which can be intercepted with a deferred `recover` a call to `os.Exit(1)` can not be intercepted.
|
||||||
|
|
||||||
|
```
|
||||||
|
...
|
||||||
|
handler := func() {
|
||||||
|
// gracefully shutdown something...
|
||||||
|
}
|
||||||
|
logrus.RegisterExitHandler(handler)
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Thread safty
|
||||||
|
|
||||||
|
By default Logger is protected by mutex for concurrent writes, this mutex is invoked when calling hooks and writing logs.
|
||||||
|
If you are sure such locking is not needed, you can call logger.SetNoLock() to disable the locking.
|
||||||
|
|
||||||
|
Situation when locking is not needed includes:
|
||||||
|
|
||||||
|
* You have no hooks registered, or hooks calling is already thread-safe.
|
||||||
|
|
||||||
|
* Writing to logger.Out is already thread-safe, for example:
|
||||||
|
|
||||||
|
1) logger.Out is protected by locks.
|
||||||
|
|
||||||
|
2) logger.Out is a os.File handler opened with `O_APPEND` flag, and every write is smaller than 4k. (This allow multi-thread/multi-process writing)
|
||||||
|
|
||||||
|
(Refer to http://www.notthewizard.com/2014/06/17/are-files-appends-really-atomic/)
|
202
vendor/github.com/aws/aws-sdk-go/LICENSE.txt
generated
vendored
Normal file
202
vendor/github.com/aws/aws-sdk-go/LICENSE.txt
generated
vendored
Normal file
|
@ -0,0 +1,202 @@
|
||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
3
vendor/github.com/aws/aws-sdk-go/NOTICE.txt
generated
vendored
Normal file
3
vendor/github.com/aws/aws-sdk-go/NOTICE.txt
generated
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
AWS SDK for Go
|
||||||
|
Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
|
Copyright 2014-2015 Stripe, Inc.
|
121
vendor/github.com/aws/aws-sdk-go/README.md
generated
vendored
Normal file
121
vendor/github.com/aws/aws-sdk-go/README.md
generated
vendored
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
# AWS SDK for Go
|
||||||
|
|
||||||
|
<span style="display: inline-block;">
|
||||||
|
[![API Reference](http://img.shields.io/badge/api-reference-blue.svg)](http://docs.aws.amazon.com/sdk-for-go/api)
|
||||||
|
[![Join the chat at https://gitter.im/aws/aws-sdk-go](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/aws/aws-sdk-go?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||||
|
[![Build Status](https://img.shields.io/travis/aws/aws-sdk-go.svg)](https://travis-ci.org/aws/aws-sdk-go)
|
||||||
|
[![Apache V2 License](http://img.shields.io/badge/license-Apache%20V2-blue.svg)](https://github.com/aws/aws-sdk-go/blob/master/LICENSE.txt)
|
||||||
|
</span>
|
||||||
|
|
||||||
|
aws-sdk-go is the official AWS SDK for the Go programming language.
|
||||||
|
|
||||||
|
Checkout our [release notes](https://github.com/aws/aws-sdk-go/releases) for information about the latest bug fixes, updates, and features added to the SDK.
|
||||||
|
|
||||||
|
## Installing
|
||||||
|
|
||||||
|
If you are using Go 1.5 with the `GO15VENDOREXPERIMENT=1` vendoring flag, or 1.6 and higher you can use the following command to retrieve the SDK. The SDK's non-testing dependencies will be included and are vendored in the `vendor` folder.
|
||||||
|
|
||||||
|
go get -u github.com/aws/aws-sdk-go
|
||||||
|
|
||||||
|
Otherwise if your Go environment does not have vendoring support enabled, or you do not want to include the vendored SDK's dependencies you can use the following command to retrieve the SDK and its non-testing dependencies using `go get`.
|
||||||
|
|
||||||
|
go get -u github.com/aws/aws-sdk-go/aws/...
|
||||||
|
go get -u github.com/aws/aws-sdk-go/service/...
|
||||||
|
|
||||||
|
If you're looking to retrieve just the SDK without any dependencies use the following command.
|
||||||
|
|
||||||
|
go get -d github.com/aws/aws-sdk-go/
|
||||||
|
|
||||||
|
These two processes will still include the `vendor` folder and it should be deleted if its not going to be used by your environment.
|
||||||
|
|
||||||
|
rm -rf $GOPATH/src/github.com/aws/aws-sdk-go/vendor
|
||||||
|
|
||||||
|
## Reference Documentation
|
||||||
|
[`Getting Started Guide`](https://aws.amazon.com/sdk-for-go/) - This document is a general introduction how to configure and make requests with the SDK. If this is your first time using the SDK, this documentation and the API documentation will help you get started. This document focuses on the syntax and behavior of the SDK. The [Service Developer Guide](https://aws.amazon.com/documentation/) will help you get started using specific AWS services.
|
||||||
|
|
||||||
|
[`SDK API Reference Documentation`](https://docs.aws.amazon.com/sdk-for-go/api/) - Use this document to look up all API operation input and output parameters for AWS services supported by the SDK. The API reference also includes documentation of the SDK, and examples how to using the SDK, service client API operations, and API operation require parameters.
|
||||||
|
|
||||||
|
[`Service Developer Guide`](https://aws.amazon.com/documentation/) - Use this documentation to learn how to interface with an AWS service. These are great guides both, if you're getting started with a service, or looking for more information on a service. You should not need this document for coding, though in some cases, services may supply helpful samples that you might want to look out for.
|
||||||
|
|
||||||
|
[`SDK Examples`](https://github.com/aws/aws-sdk-go/tree/master/example) - Included in the SDK's repo are a several hand crafted examples using the SDK features and AWS services.
|
||||||
|
|
||||||
|
## Configuring Credentials
|
||||||
|
|
||||||
|
Before using the SDK, ensure that you've configured credentials. The best
|
||||||
|
way to configure credentials on a development machine is to use the
|
||||||
|
`~/.aws/credentials` file, which might look like:
|
||||||
|
|
||||||
|
```
|
||||||
|
[default]
|
||||||
|
aws_access_key_id = AKID1234567890
|
||||||
|
aws_secret_access_key = MY-SECRET-KEY
|
||||||
|
```
|
||||||
|
|
||||||
|
You can learn more about the credentials file from this
|
||||||
|
[blog post](http://blogs.aws.amazon.com/security/post/Tx3D6U6WSFGOK2H/A-New-and-Standardized-Way-to-Manage-Credentials-in-the-AWS-SDKs).
|
||||||
|
|
||||||
|
Alternatively, you can set the following environment variables:
|
||||||
|
|
||||||
|
```
|
||||||
|
AWS_ACCESS_KEY_ID=AKID1234567890
|
||||||
|
AWS_SECRET_ACCESS_KEY=MY-SECRET-KEY
|
||||||
|
```
|
||||||
|
|
||||||
|
### AWS shared config file (`~/.aws/config`)
|
||||||
|
The AWS SDK for Go added support the shared config file in release [v1.3.0](https://github.com/aws/aws-sdk-go/releases/tag/v1.3.0). You can opt into enabling support for the shared config by setting the environment variable `AWS_SDK_LOAD_CONFIG` to a truthy value. See the [Session](https://github.com/aws/aws-sdk-go/wiki/sessions) wiki for more information about this feature.
|
||||||
|
|
||||||
|
## Using the Go SDK
|
||||||
|
|
||||||
|
To use a service in the SDK, create a service variable by calling the `New()`
|
||||||
|
function. Once you have a service client, you can call API operations which each
|
||||||
|
return response data and a possible error.
|
||||||
|
|
||||||
|
To list a set of instance IDs from EC2, you could run:
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/session"
|
||||||
|
"github.com/aws/aws-sdk-go/service/ec2"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
sess, err := session.NewSession()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create an EC2 service object in the "us-west-2" region
|
||||||
|
// Note that you can also configure your region globally by
|
||||||
|
// exporting the AWS_REGION environment variable
|
||||||
|
svc := ec2.New(sess, &aws.Config{Region: aws.String("us-west-2")})
|
||||||
|
|
||||||
|
// Call the DescribeInstances Operation
|
||||||
|
resp, err := svc.DescribeInstances(nil)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// resp has all of the response data, pull out instance IDs:
|
||||||
|
fmt.Println("> Number of reservation sets: ", len(resp.Reservations))
|
||||||
|
for idx, res := range resp.Reservations {
|
||||||
|
fmt.Println(" > Number of instances: ", len(res.Instances))
|
||||||
|
for _, inst := range resp.Reservations[idx].Instances {
|
||||||
|
fmt.Println(" - Instance ID: ", *inst.InstanceId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
You can find more information and operations in our
|
||||||
|
[API documentation](http://docs.aws.amazon.com/sdk-for-go/api/).
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This SDK is distributed under the
|
||||||
|
[Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0),
|
||||||
|
see LICENSE.txt and NOTICE.txt for more information.
|
4
vendor/github.com/aws/aws-sdk-go/private/README.md
generated
vendored
Normal file
4
vendor/github.com/aws/aws-sdk-go/private/README.md
generated
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
## AWS SDK for Go Private packages ##
|
||||||
|
`private` is a collection of packages used internally by the SDK, and is subject to have breaking changes. This package is not `internal` so that if you really need to use its functionality, and understand breaking changes will be made, you are able to.
|
||||||
|
|
||||||
|
These packages will be refactored in the future so that the API generator and model parsers are exposed cleanly on their own. Making it easier for you to generate your own code based on the API models.
|
95
vendor/github.com/bshuster-repo/logrus-logstash-hook/README.md
generated
vendored
Normal file
95
vendor/github.com/bshuster-repo/logrus-logstash-hook/README.md
generated
vendored
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
# Logstash hook for logrus <img src="http://i.imgur.com/hTeVwmJ.png" width="40" height="40" alt=":walrus:" class="emoji" title=":walrus:" /> [![Build Status](https://travis-ci.org/bshuster-repo/logrus-logstash-hook.svg?branch=master)](https://travis-ci.org/bshuster-repo/logrus-logstash-hook)
|
||||||
|
Use this hook to send the logs to [Logstash](https://www.elastic.co/products/logstash) over both UDP and TCP.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/Sirupsen/logrus"
|
||||||
|
"github.com/bshuster-repo/logrus-logstash-hook"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
log := logrus.New()
|
||||||
|
hook, err := logrus_logstash.NewHook("tcp", "172.17.0.2:9999", "myappName")
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
log.Hooks.Add(hook)
|
||||||
|
ctx := log.WithFields(logrus.Fields{
|
||||||
|
"method": "main",
|
||||||
|
})
|
||||||
|
...
|
||||||
|
ctx.Info("Hello World!")
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This is how it will look like:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
{
|
||||||
|
"@timestamp" => "2016-02-29T16:57:23.000Z",
|
||||||
|
"@version" => "1",
|
||||||
|
"level" => "info",
|
||||||
|
"message" => "Hello World!",
|
||||||
|
"method" => "main",
|
||||||
|
"host" => "172.17.0.1",
|
||||||
|
"port" => 45199,
|
||||||
|
"type" => "myappName"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
## Hook Fields
|
||||||
|
Fields can be added to the hook, which will always be in the log context.
|
||||||
|
This can be done when creating the hook:
|
||||||
|
|
||||||
|
```go
|
||||||
|
|
||||||
|
hook, err := logrus_logstash.NewHookWithFields("tcp", "172.17.0.2:9999", "myappName", logrus.Fields{
|
||||||
|
"hostname": os.Hostname(),
|
||||||
|
"serviceName": "myServiceName",
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
Or afterwards:
|
||||||
|
|
||||||
|
```go
|
||||||
|
|
||||||
|
hook.WithFields(logrus.Fields{
|
||||||
|
"hostname": os.Hostname(),
|
||||||
|
"serviceName": "myServiceName",
|
||||||
|
})
|
||||||
|
```
|
||||||
|
This allows you to set up the hook so logging is available immediately, and add important fields as they become available.
|
||||||
|
|
||||||
|
Single fields can be added/updated using 'WithField':
|
||||||
|
|
||||||
|
```go
|
||||||
|
|
||||||
|
hook.WithField("status", "running")
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Field prefix
|
||||||
|
|
||||||
|
The hook allows you to send logging to logstash and also retain the default std output in text format.
|
||||||
|
However to keep this console output readable some fields might need to be omitted from the default non-hooked log output.
|
||||||
|
Each hook can be configured with a prefix used to identify fields which are only to be logged to the logstash connection.
|
||||||
|
For example if you don't want to see the hostname and serviceName on each log line in the console output you can add a prefix:
|
||||||
|
|
||||||
|
```go
|
||||||
|
|
||||||
|
|
||||||
|
hook, err := logrus_logstash.NewHookWithFields("tcp", "172.17.0.2:9999", "myappName", logrus.Fields{
|
||||||
|
"_hostname": os.Hostname(),
|
||||||
|
"_serviceName": "myServiceName",
|
||||||
|
})
|
||||||
|
...
|
||||||
|
hook.WithPrefix("_")
|
||||||
|
```
|
||||||
|
|
||||||
|
There are also constructors available which allow you to specify the prefix from the start.
|
||||||
|
The std-out will not have the '\_hostname' and '\_servicename' fields, and the logstash output will, but the prefix will be dropped from the name.
|
20
vendor/github.com/bugsnag/bugsnag-go/LICENSE.txt
generated
vendored
Normal file
20
vendor/github.com/bugsnag/bugsnag-go/LICENSE.txt
generated
vendored
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
Copyright (c) 2014 Bugsnag
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
489
vendor/github.com/bugsnag/bugsnag-go/README.md
generated
vendored
Normal file
489
vendor/github.com/bugsnag/bugsnag-go/README.md
generated
vendored
Normal file
|
@ -0,0 +1,489 @@
|
||||||
|
Bugsnag Notifier for Golang
|
||||||
|
===========================
|
||||||
|
|
||||||
|
The Bugsnag Notifier for Golang gives you instant notification of panics, or
|
||||||
|
unexpected errors, in your golang app. Any unhandled panics will trigger a
|
||||||
|
notification to be sent to your Bugsnag project.
|
||||||
|
|
||||||
|
[Bugsnag](http://bugsnag.com) captures errors in real-time from your web,
|
||||||
|
mobile and desktop applications, helping you to understand and resolve them
|
||||||
|
as fast as possible. [Create a free account](http://bugsnag.com) to start
|
||||||
|
capturing exceptions from your applications.
|
||||||
|
|
||||||
|
## How to Install
|
||||||
|
|
||||||
|
1. Download the code
|
||||||
|
|
||||||
|
```shell
|
||||||
|
go get github.com/bugsnag/bugsnag-go
|
||||||
|
```
|
||||||
|
|
||||||
|
### Using with net/http apps
|
||||||
|
|
||||||
|
For a golang app based on [net/http](https://godoc.org/net/http), integrating
|
||||||
|
Bugsnag takes two steps. You should also use these instructions if you're using
|
||||||
|
the [gorilla toolkit](http://www.gorillatoolkit.org/), or the
|
||||||
|
[pat](https://github.com/bmizerany/pat/) muxer.
|
||||||
|
|
||||||
|
1. Configure bugsnag at the start of your `main()` function:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import "github.com/bugsnag/bugsnag-go"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
bugsnag.Configure(bugsnag.Configuration{
|
||||||
|
APIKey: "YOUR_API_KEY_HERE",
|
||||||
|
ReleaseStage: "production",
|
||||||
|
// more configuration options
|
||||||
|
})
|
||||||
|
|
||||||
|
// rest of your program.
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Wrap your server in a [bugsnag.Handler](https://godoc.org/github.com/bugsnag/bugsnag-go/#Handler)
|
||||||
|
|
||||||
|
```go
|
||||||
|
// a. If you're using the builtin http mux, you can just pass
|
||||||
|
// bugsnag.Handler(nil) to http.ListenAndServer
|
||||||
|
http.ListenAndServe(":8080", bugsnag.Handler(nil))
|
||||||
|
|
||||||
|
// b. If you're creating a server manually yourself, you can set
|
||||||
|
// its handlers the same way
|
||||||
|
srv := http.Server{
|
||||||
|
Handler: bugsnag.Handler(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// c. If you're not using the builtin http mux, wrap your own handler
|
||||||
|
// (though make sure that it doesn't already catch panics)
|
||||||
|
http.ListenAndServe(":8080", bugsnag.Handler(handler))
|
||||||
|
```
|
||||||
|
|
||||||
|
### Using with Revel apps
|
||||||
|
|
||||||
|
There are two steps to get panic handling in [revel](https://revel.github.io) apps.
|
||||||
|
|
||||||
|
1. Add the `bugsnagrevel.Filter` immediately after the `revel.PanicFilter` in `app/init.go`:
|
||||||
|
|
||||||
|
```go
|
||||||
|
|
||||||
|
import "github.com/bugsnag/bugsnag-go/revel"
|
||||||
|
|
||||||
|
revel.Filters = []revel.Filter{
|
||||||
|
revel.PanicFilter,
|
||||||
|
bugsnagrevel.Filter,
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Set bugsnag.apikey in the top section of `conf/app.conf`.
|
||||||
|
|
||||||
|
```
|
||||||
|
module.static=github.com/revel/revel/modules/static
|
||||||
|
|
||||||
|
bugsnag.apikey=YOUR_API_KEY_HERE
|
||||||
|
|
||||||
|
[dev]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Using with Google App Engine
|
||||||
|
|
||||||
|
1. Configure bugsnag at the start of your `init()` function:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import "github.com/bugsnag/bugsnag-go"
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
bugsnag.Configure(bugsnag.Configuration{
|
||||||
|
APIKey: "YOUR_API_KEY_HERE",
|
||||||
|
})
|
||||||
|
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Wrap *every* http.Handler or http.HandlerFunc with Bugsnag:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// a. If you're using HandlerFuncs
|
||||||
|
http.HandleFunc("/", bugsnag.HandlerFunc(
|
||||||
|
func (w http.ResponseWriter, r *http.Request) {
|
||||||
|
// ...
|
||||||
|
}))
|
||||||
|
|
||||||
|
// b. If you're using Handlers
|
||||||
|
http.Handle("/", bugsnag.Handler(myHttpHandler))
|
||||||
|
```
|
||||||
|
|
||||||
|
3. In order to use Bugsnag, you must provide the current
|
||||||
|
[`appengine.Context`](https://developers.google.com/appengine/docs/go/reference#Context), or
|
||||||
|
current `*http.Request` as rawData. The easiest way to do this is to create a new notifier.
|
||||||
|
|
||||||
|
```go
|
||||||
|
c := appengine.NewContext(r)
|
||||||
|
notifier := bugsnag.New(c)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
notifier.Notify(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
go func () {
|
||||||
|
defer notifier.Recover()
|
||||||
|
|
||||||
|
// ...
|
||||||
|
}()
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Notifying Bugsnag manually
|
||||||
|
|
||||||
|
Bugsnag will automatically handle any panics that crash your program and notify
|
||||||
|
you of them. If you've integrated with `revel` or `net/http`, then you'll also
|
||||||
|
be notified of any panics() that happen while processing a request.
|
||||||
|
|
||||||
|
Sometimes however it's useful to manually notify Bugsnag of a problem. To do this,
|
||||||
|
call [`bugsnag.Notify()`](https://godoc.org/github.com/bugsnag/bugsnag-go/#Notify)
|
||||||
|
|
||||||
|
```go
|
||||||
|
if err != nil {
|
||||||
|
bugsnag.Notify(err)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Manual panic handling
|
||||||
|
|
||||||
|
To avoid a panic in a goroutine from crashing your entire app, you can use
|
||||||
|
[`bugsnag.Recover()`](https://godoc.org/github.com/bugsnag/bugsnag-go/#Recover)
|
||||||
|
to stop a panic from unwinding the stack any further. When `Recover()` is hit,
|
||||||
|
it will send any current panic to Bugsnag and then stop panicking. This is
|
||||||
|
most useful at the start of a goroutine:
|
||||||
|
|
||||||
|
```go
|
||||||
|
go func() {
|
||||||
|
defer bugsnag.Recover()
|
||||||
|
|
||||||
|
// ...
|
||||||
|
}()
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternatively you can use
|
||||||
|
[`bugsnag.AutoNotify()`](https://godoc.org/github.com/bugsnag/bugsnag-go/#Recover)
|
||||||
|
to notify bugsnag of a panic while letting the program continue to panic. This
|
||||||
|
is useful if you're using a Framework that already has some handling of panics
|
||||||
|
and you are retrofitting bugsnag support.
|
||||||
|
|
||||||
|
```go
|
||||||
|
defer bugsnag.AutoNotify()
|
||||||
|
```
|
||||||
|
|
||||||
|
## Sending Custom Data
|
||||||
|
|
||||||
|
Most functions in the Bugsnag API, including `bugsnag.Notify()`,
|
||||||
|
`bugsnag.Recover()`, `bugsnag.AutoNotify()`, and `bugsnag.Handler()` let you
|
||||||
|
attach data to the notifications that they send. To do this you pass in rawData,
|
||||||
|
which can be any of the supported types listed here. To add support for more
|
||||||
|
types of rawData see [OnBeforeNotify](#custom-data-with-onbeforenotify).
|
||||||
|
|
||||||
|
### Custom MetaData
|
||||||
|
|
||||||
|
Custom metaData appears as tabs on Bugsnag.com. You can set it by passing
|
||||||
|
a [`bugsnag.MetaData`](https://godoc.org/github.com/bugsnag/bugsnag-go/#MetaData)
|
||||||
|
object as rawData.
|
||||||
|
|
||||||
|
```go
|
||||||
|
bugsnag.Notify(err,
|
||||||
|
bugsnag.MetaData{
|
||||||
|
"Account": {
|
||||||
|
"Name": Account.Name,
|
||||||
|
"Paying": Account.Plan.Premium,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### Request data
|
||||||
|
|
||||||
|
Bugsnag can extract interesting data from
|
||||||
|
[`*http.Request`](https://godoc.org/net/http/#Request) objects, and
|
||||||
|
[`*revel.Controller`](https://godoc.org/github.com/revel/revel/#Controller)
|
||||||
|
objects. These are automatically passed in when handling panics, and you can
|
||||||
|
pass them yourself.
|
||||||
|
|
||||||
|
```go
|
||||||
|
func (w http.ResponseWriter, r *http.Request) {
|
||||||
|
bugsnag.Notify(err, r)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### User data
|
||||||
|
|
||||||
|
User data is searchable, and the `Id` powers the count of users affected. You
|
||||||
|
can set which user an error affects by passing a
|
||||||
|
[`bugsnag.User`](https://godoc.org/github.com/bugsnag/bugsnag-go/#User) object as
|
||||||
|
rawData.
|
||||||
|
|
||||||
|
```go
|
||||||
|
bugsnag.Notify(err,
|
||||||
|
bugsnag.User{Id: "1234", Name: "Conrad", Email: "me@cirw.in"})
|
||||||
|
```
|
||||||
|
|
||||||
|
### Context
|
||||||
|
|
||||||
|
The context shows up prominently in the list view so that you can get an idea
|
||||||
|
of where a problem occurred. You can set it by passing a
|
||||||
|
[`bugsnag.Context`](https://godoc.org/github.com/bugsnag/bugsnag-go/#Context)
|
||||||
|
object as rawData.
|
||||||
|
|
||||||
|
```go
|
||||||
|
bugsnag.Notify(err, bugsnag.Context{"backgroundJob"})
|
||||||
|
```
|
||||||
|
|
||||||
|
### Severity
|
||||||
|
|
||||||
|
Bugsnag supports three severities, `SeverityError`, `SeverityWarning`, and `SeverityInfo`.
|
||||||
|
You can set the severity of an error by passing one of these objects as rawData.
|
||||||
|
|
||||||
|
```go
|
||||||
|
bugsnag.Notify(err, bugsnag.SeverityInfo)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
You must call `bugsnag.Configure()` at the start of your program to use Bugsnag, you pass it
|
||||||
|
a [`bugsnag.Configuration`](https://godoc.org/github.com/bugsnag/bugsnag-go/#Configuration) object
|
||||||
|
containing any of the following values.
|
||||||
|
|
||||||
|
### APIKey
|
||||||
|
|
||||||
|
The Bugsnag API key can be found on your [Bugsnag dashboard](https://bugsnag.com) under "Settings".
|
||||||
|
|
||||||
|
```go
|
||||||
|
bugsnag.Configure(bugsnag.Configuration{
|
||||||
|
APIKey: "YOUR_API_KEY_HERE",
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### Endpoint
|
||||||
|
|
||||||
|
The Bugsnag endpoint defaults to `https://notify.bugsnag.com/`. If you're using Bugsnag enterprise,
|
||||||
|
you should set this to the endpoint of your local instance.
|
||||||
|
|
||||||
|
```go
|
||||||
|
bugsnag.Configure(bugsnag.Configuration{
|
||||||
|
Endpoint: "http://bugsnag.internal:49000/",
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### ReleaseStage
|
||||||
|
|
||||||
|
The ReleaseStage tracks where your app is deployed. You should set this to `production`, `staging`,
|
||||||
|
`development` or similar as appropriate.
|
||||||
|
|
||||||
|
```go
|
||||||
|
bugsnag.Configure(bugsnag.Configuration{
|
||||||
|
ReleaseStage: "development",
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### NotifyReleaseStages
|
||||||
|
|
||||||
|
The list of ReleaseStages to notify in. By default Bugsnag will notify you in all release stages, but
|
||||||
|
you can use this to silence development errors.
|
||||||
|
|
||||||
|
```go
|
||||||
|
bugsnag.Configure(bugsnag.Configuration{
|
||||||
|
NotifyReleaseStages: []string{"production", "staging"},
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### AppVersion
|
||||||
|
|
||||||
|
If you use a versioning scheme for deploys of your app, Bugsnag can use the `AppVersion` to only
|
||||||
|
re-open errors if they occur in later version of the app.
|
||||||
|
|
||||||
|
```go
|
||||||
|
bugsnag.Configure(bugsnag.Configuration{
|
||||||
|
AppVersion: "1.2.3",
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### Hostname
|
||||||
|
|
||||||
|
The hostname is used to track where exceptions are coming from in the Bugsnag dashboard. The
|
||||||
|
default value is obtained from `os.Hostname()` so you won't often need to change this.
|
||||||
|
|
||||||
|
```go
|
||||||
|
bugsnag.Configure(bugsnag.Configuration{
|
||||||
|
Hostname: "go1",
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### ProjectPackages
|
||||||
|
|
||||||
|
In order to determine where a crash happens Bugsnag needs to know which packages you consider to
|
||||||
|
be part of your app (as opposed to a library). By default this is set to `[]string{"main*"}`. Strings
|
||||||
|
are matched to package names using [`filepath.Match`](http://godoc.org/path/filepath#Match).
|
||||||
|
|
||||||
|
```go
|
||||||
|
bugsnag.Configure(bugsnag.Configuration{
|
||||||
|
ProjectPackages: []string{"main", "github.com/domain/myapp/*"},
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### ParamsFilters
|
||||||
|
|
||||||
|
Sometimes sensitive data is accidentally included in Bugsnag MetaData. You can remove it by
|
||||||
|
setting `ParamsFilters`. Any key in the `MetaData` that includes any string in the filters
|
||||||
|
will be redacted. The default is `[]string{"password", "secret"}`, which prevents fields like
|
||||||
|
`password`, `password_confirmation` and `secret_answer` from being sent.
|
||||||
|
|
||||||
|
```go
|
||||||
|
bugsnag.Configure(bugsnag.Configuration{
|
||||||
|
ParamsFilters: []string{"password", "secret"},
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Logger
|
||||||
|
|
||||||
|
The Logger to write to in case of an error inside Bugsnag. This defaults to the global logger.
|
||||||
|
|
||||||
|
```go
|
||||||
|
bugsnag.Configure(bugsnag.Configuration{
|
||||||
|
Logger: app.Logger,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### PanicHandler
|
||||||
|
|
||||||
|
The first time Bugsnag is configured, it wraps the running program in a panic
|
||||||
|
handler using [panicwrap](http://godoc.org/github.com/ConradIrwin/panicwrap). This
|
||||||
|
forks a sub-process which monitors unhandled panics. To prevent this, set
|
||||||
|
`PanicHandler` to `func() {}` the first time you call
|
||||||
|
`bugsnag.Configure`. This will prevent bugsnag from being able to notify you about
|
||||||
|
unhandled panics.
|
||||||
|
|
||||||
|
```go
|
||||||
|
bugsnag.Configure(bugsnag.Configuration{
|
||||||
|
PanicHandler: func() {},
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### Synchronous
|
||||||
|
|
||||||
|
Bugsnag usually starts a new goroutine before sending notifications. This means
|
||||||
|
that notifications can be lost if you do a bugsnag.Notify and then immediately
|
||||||
|
os.Exit. To avoid this problem, set Bugsnag to Synchronous (or just `panic()`
|
||||||
|
instead ;).
|
||||||
|
|
||||||
|
```go
|
||||||
|
bugsnag.Configure(bugsnag.Configuration{
|
||||||
|
Synchronous: true
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
Or just for one error:
|
||||||
|
|
||||||
|
```go
|
||||||
|
bugsnag.Notify(err, bugsnag.Configuration{Synchronous: true})
|
||||||
|
```
|
||||||
|
|
||||||
|
### Transport
|
||||||
|
|
||||||
|
The transport configures how Bugsnag makes http requests. By default we use
|
||||||
|
[`http.DefaultTransport`](http://godoc.org/net/http#RoundTripper) which handles
|
||||||
|
HTTP proxies automatically using the `$HTTP_PROXY` environment variable.
|
||||||
|
|
||||||
|
```go
|
||||||
|
bugsnag.Configure(bugsnag.Configuration{
|
||||||
|
Transport: http.DefaultTransport,
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
## Custom data with OnBeforeNotify
|
||||||
|
|
||||||
|
While it's nice that you can pass `MetaData` directly into `bugsnag.Notify`,
|
||||||
|
`bugsnag.AutoNotify`, and `bugsnag.Recover`, this can be a bit cumbersome and
|
||||||
|
inefficient — you're constructing the meta-data whether or not it will actually
|
||||||
|
be used. A better idea is to pass raw data in to these functions, and add an
|
||||||
|
`OnBeforeNotify` filter that converts them into `MetaData`.
|
||||||
|
|
||||||
|
For example, lets say our system processes jobs:
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Job struct{
|
||||||
|
Retry bool
|
||||||
|
UserId string
|
||||||
|
UserEmail string
|
||||||
|
Name string
|
||||||
|
Params map[string]string
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
You can pass a job directly into Bugsnag.notify:
|
||||||
|
|
||||||
|
```go
|
||||||
|
bugsnag.Notify(err, job)
|
||||||
|
```
|
||||||
|
|
||||||
|
And then add a filter to extract information from that job and attach it to the
|
||||||
|
Bugsnag event:
|
||||||
|
|
||||||
|
```go
|
||||||
|
bugsnag.OnBeforeNotify(
|
||||||
|
func(event *bugsnag.Event, config *bugsnag.Configuration) error {
|
||||||
|
|
||||||
|
// Search all the RawData for any *Job pointers that we're passed in
|
||||||
|
// to bugsnag.Notify() and friends.
|
||||||
|
for _, datum := range event.RawData {
|
||||||
|
if job, ok := datum.(*Job); ok {
|
||||||
|
// don't notify bugsnag about errors in retries
|
||||||
|
if job.Retry {
|
||||||
|
return fmt.Errorf("not notifying about retried jobs")
|
||||||
|
}
|
||||||
|
|
||||||
|
// add the job as a tab on Bugsnag.com
|
||||||
|
event.MetaData.AddStruct("Job", job)
|
||||||
|
|
||||||
|
// set the user correctly
|
||||||
|
event.User = &User{Id: job.UserId, Email: job.UserEmail}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// continue notifying as normal
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
## Advanced Usage
|
||||||
|
|
||||||
|
If you want to have multiple different configurations around in one program,
|
||||||
|
you can use `bugsnag.New()` to create multiple independent instances of
|
||||||
|
Bugsnag. You can use these without calling `bugsnag.Configure()`, but bear in
|
||||||
|
mind that until you call `bugsnag.Configure()` unhandled panics will not be
|
||||||
|
sent to bugsnag.
|
||||||
|
|
||||||
|
```go
|
||||||
|
notifier := bugsnag.New(bugsnag.Configuration{
|
||||||
|
APIKey: "YOUR_OTHER_API_KEY",
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
In fact any place that lets you pass in `rawData` also allows you to pass in
|
||||||
|
configuration. For example to send http errors to one bugsnag project, you
|
||||||
|
could do:
|
||||||
|
|
||||||
|
```go
|
||||||
|
bugsnag.Handler(nil, bugsnag.Configuration{APIKey: "YOUR_OTHER_API_KEY"})
|
||||||
|
```
|
||||||
|
|
||||||
|
### GroupingHash
|
||||||
|
|
||||||
|
If you need to override Bugsnag's grouping algorithm, you can set the
|
||||||
|
`GroupingHash` in an `OnBeforeNotify`:
|
||||||
|
|
||||||
|
```go
|
||||||
|
bugsnag.OnBeforeNotify(
|
||||||
|
func (event *bugsnag.Event, config *bugsnag.Configuration) error {
|
||||||
|
event.GroupingHash = calculateGroupingHash(event)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
```
|
6
vendor/github.com/bugsnag/bugsnag-go/errors/README.md
generated
vendored
Normal file
6
vendor/github.com/bugsnag/bugsnag-go/errors/README.md
generated
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
Adds stacktraces to errors in golang.
|
||||||
|
|
||||||
|
This was made to help build the Bugsnag notifier but can be used standalone if
|
||||||
|
you like to have stacktraces on errors.
|
||||||
|
|
||||||
|
See [Godoc](https://godoc.org/github.com/bugsnag/bugsnag-go/errors) for the API docs.
|
101
vendor/github.com/bugsnag/panicwrap/README.md
generated
vendored
Normal file
101
vendor/github.com/bugsnag/panicwrap/README.md
generated
vendored
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
# panicwrap
|
||||||
|
|
||||||
|
panicwrap is a Go library that re-executes a Go binary and monitors stderr
|
||||||
|
output from the binary for a panic. When it find a panic, it executes a
|
||||||
|
user-defined handler function. Stdout, stderr, stdin, signals, and exit
|
||||||
|
codes continue to work as normal, making the existence of panicwrap mostly
|
||||||
|
invisble to the end user until a panic actually occurs.
|
||||||
|
|
||||||
|
Since a panic is truly a bug in the program meant to crash the runtime,
|
||||||
|
globally catching panics within Go applications is not supposed to be possible.
|
||||||
|
Despite this, it is often useful to have a way to know when panics occur.
|
||||||
|
panicwrap allows you to do something with these panics, such as writing them
|
||||||
|
to a file, so that you can track when panics occur.
|
||||||
|
|
||||||
|
panicwrap is ***not a panic recovery system***. Panics indicate serious
|
||||||
|
problems with your application and _should_ crash the runtime. panicwrap
|
||||||
|
is just meant as a way to monitor for panics. If you still think this is
|
||||||
|
the worst idea ever, read the section below on why.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
* **SIMPLE!**
|
||||||
|
* Works with all Go applications on all platforms Go supports
|
||||||
|
* Custom behavior when a panic occurs
|
||||||
|
* Stdout, stderr, stdin, exit codes, and signals continue to work as
|
||||||
|
expected.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Using panicwrap is simple. It behaves a lot like `fork`, if you know
|
||||||
|
how that works. A basic example is shown below.
|
||||||
|
|
||||||
|
Because it would be sad to panic while capturing a panic, it is recommended
|
||||||
|
that the handler functions for panicwrap remain relatively simple and well
|
||||||
|
tested. panicwrap itself contains many tests.
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/mitchellh/panicwrap"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
exitStatus, err := panicwrap.BasicWrap(panicHandler)
|
||||||
|
if err != nil {
|
||||||
|
// Something went wrong setting up the panic wrapper. Unlikely,
|
||||||
|
// but possible.
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// If exitStatus >= 0, then we're the parent process and the panicwrap
|
||||||
|
// re-executed ourselves and completed. Just exit with the proper status.
|
||||||
|
if exitStatus >= 0 {
|
||||||
|
os.Exit(exitStatus)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise, exitStatus < 0 means we're the child. Continue executing as
|
||||||
|
// normal...
|
||||||
|
|
||||||
|
// Let's say we panic
|
||||||
|
panic("oh shucks")
|
||||||
|
}
|
||||||
|
|
||||||
|
func panicHandler(output string) {
|
||||||
|
// output contains the full output (including stack traces) of the
|
||||||
|
// panic. Put it in a file or something.
|
||||||
|
fmt.Printf("The child panicked:\n\n%s\n", output)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## How Does it Work?
|
||||||
|
|
||||||
|
panicwrap works by re-executing the running program (retaining arguments,
|
||||||
|
environmental variables, etc.) and monitoring the stderr of the program.
|
||||||
|
Since Go always outputs panics in a predictable way with a predictable
|
||||||
|
exit code, panicwrap is able to reliably detect panics and allow the parent
|
||||||
|
process to handle them.
|
||||||
|
|
||||||
|
## WHY?! Panics should CRASH!
|
||||||
|
|
||||||
|
Yes, panics _should_ crash. They are 100% always indicative of bugs.
|
||||||
|
However, in some cases, such as user-facing programs (programs like
|
||||||
|
[Packer](http://github.com/mitchellh/packer) or
|
||||||
|
[Docker](http://github.com/dotcloud/docker)), it is up to the user to
|
||||||
|
report such panics. This is unreliable, at best, and it would be better if the
|
||||||
|
program could have a way to automatically report panics. panicwrap provides
|
||||||
|
a way to do this.
|
||||||
|
|
||||||
|
For backend applications, it is easier to detect crashes (since the application
|
||||||
|
exits). However, it is still nice sometimes to more intelligently log
|
||||||
|
panics in some way. For example, at [HashiCorp](http://www.hashicorp.com),
|
||||||
|
we use panicwrap to log panics to timestamped files with some additional
|
||||||
|
data (configuration settings at the time, environmental variables, etc.)
|
||||||
|
|
||||||
|
The goal of panicwrap is _not_ to hide panics. It is instead to provide
|
||||||
|
a clean mechanism for handling them before bubbling the up to the user
|
||||||
|
and ultimately crashing.
|
191
vendor/github.com/denverdino/aliyungo/LICENSE.txt
generated
vendored
Normal file
191
vendor/github.com/denverdino/aliyungo/LICENSE.txt
generated
vendored
Normal file
|
@ -0,0 +1,191 @@
|
||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
https://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
Copyright 2015-2015 Li Yi (denverdino@gmail.com).
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
143
vendor/github.com/denverdino/aliyungo/README.md
generated
vendored
Normal file
143
vendor/github.com/denverdino/aliyungo/README.md
generated
vendored
Normal file
|
@ -0,0 +1,143 @@
|
||||||
|
# AliyunGo: Go SDK for Aliyun Services
|
||||||
|
|
||||||
|
This is an unofficial Go SDK for Aliyun Services. You are welcome for contribution.
|
||||||
|
|
||||||
|
|
||||||
|
## Package Structure
|
||||||
|
|
||||||
|
* ecs: [Elastic Compute Service](https://help.aliyun.com/document_detail/ecs/open-api/summary.html)
|
||||||
|
* oss: [Open Storage Service](https://help.aliyun.com/document_detail/oss/api-reference/abstract.html)
|
||||||
|
* slb: [Server Load Balancer](https://help.aliyun.com/document_detail/slb/api-reference/brief-introduction.html)
|
||||||
|
* dns: [DNS](https://help.aliyun.com/document_detail/dns/api-reference/summary.html)
|
||||||
|
* sls: [Logging Service](https://help.aliyun.com/document_detail/sls/api/overview.html)
|
||||||
|
* ram: [Resource Access Management](https://help.aliyun.com/document_detail/ram/ram-api-reference/intro/intro.html)
|
||||||
|
* rds: [Relational Database Service](https://help.aliyun.com/document_detail/26226.html)
|
||||||
|
* cms: [Cloud Monitor Service](https://help.aliyun.com/document_detail/28615.html)
|
||||||
|
* sts: [Security Token Service](https://help.aliyun.com/document_detail/28756.html)
|
||||||
|
* dm: [Direct Mail]
|
||||||
|
(https://help.aliyun.com/document_detail/29414.html)
|
||||||
|
* common: Common libary of Aliyun Go SDK
|
||||||
|
* util: Utility helpers
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/denverdino/aliyungo/ecs"
|
||||||
|
)
|
||||||
|
|
||||||
|
const ACCESS_KEY_ID = "<YOUR_ID>"
|
||||||
|
const ACCESS_KEY_SECRET = "<****>"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
client := ecs.NewClient(ACCESS_KEY_ID, ACCESS_KEY_SECRET)
|
||||||
|
fmt.Print(client.DescribeRegions())
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
* ECS: [https://godoc.org/github.com/denverdino/aliyungo/ecs](https://godoc.org/github.com/denverdino/aliyungo/ecs) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/ecs?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/ecs)
|
||||||
|
* OSS: [https://godoc.org/github.com/denverdino/aliyungo/oss](https://godoc.org/github.com/denverdino/aliyungo/oss) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/oss?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/oss)
|
||||||
|
* SLB: [https://godoc.org/github.com/denverdino/aliyungo/slb](https://godoc.org/github.com/denverdino/aliyungo/slb) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/slb?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/slb)
|
||||||
|
* DNS: [https://godoc.org/github.com/denverdino/aliyungo/dns](https://godoc.org/github.com/denverdino/aliyungo/dns) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/dns?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/dns)
|
||||||
|
* SLS: [https://godoc.org/github.com/denverdino/aliyungo/sls](https://godoc.org/github.com/denverdino/aliyungo/sls) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/sls?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/sls)
|
||||||
|
* RAM: [https://godoc.org/github.com/denverdino/aliyungo/ram](https://godoc.org/github.com/denverdino/aliyungo/ram) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/ram?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/ram)
|
||||||
|
* RDS: [https://godoc.org/github.com/denverdino/aliyungo/rds](https://godoc.org/github.com/denverdino/aliyungo/rds) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/rds?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/rds)
|
||||||
|
* CMS: [https://godoc.org/github.com/denverdino/aliyungo/cms](https://godoc.org/github.com/denverdino/aliyungo/cms) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/cms?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/cms)
|
||||||
|
* STS: [https://godoc.org/github.com/denverdino/aliyungo/sts](https://godoc.org/github.com/denverdino/aliyungo/sts) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/sts?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/sts)
|
||||||
|
* DM: [https://godoc.org/github.com/denverdino/aliyungo/dm](https://godoc.org/github.com/denverdino/aliyungo/dm) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/dm?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/dm)
|
||||||
|
|
||||||
|
## Build and Install
|
||||||
|
|
||||||
|
go get:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
go get github.com/denverdino/aliyungo
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Test ECS
|
||||||
|
|
||||||
|
Modify "ecs/config_test.go"
|
||||||
|
|
||||||
|
```sh
|
||||||
|
TestAccessKeyId = "MY_ACCESS_KEY_ID"
|
||||||
|
TestAccessKeySecret = "MY_ACCESS_KEY_ID"
|
||||||
|
TestInstanceId = "MY_INSTANCE_ID"
|
||||||
|
TestIAmRich = false
|
||||||
|
```
|
||||||
|
|
||||||
|
* TestAccessKeyId: the Access Key Id
|
||||||
|
* TestAccessKeySecret: the Access Key Secret.
|
||||||
|
* TestInstanceId: the existing instance id for testing. It will be stopped and restarted during testing.
|
||||||
|
* TestIAmRich(Optional): If it is set to true, it will perform tests to create virtual machines and disks under your account. And you will pay the bill. :-)
|
||||||
|
|
||||||
|
Under "ecs" and run
|
||||||
|
|
||||||
|
```sh
|
||||||
|
go test
|
||||||
|
```
|
||||||
|
|
||||||
|
## Test OSS
|
||||||
|
|
||||||
|
Modify "oss/config_test.go"
|
||||||
|
|
||||||
|
```sh
|
||||||
|
TestAccessKeyId = "MY_ACCESS_KEY_ID"
|
||||||
|
TestAccessKeySecret = "MY_ACCESS_KEY_ID"
|
||||||
|
TestRegion = oss.Beijing
|
||||||
|
TestBucket = "denverdino"
|
||||||
|
```
|
||||||
|
|
||||||
|
* TestAccessKeyId: the Access Key Id
|
||||||
|
* TestAccessKeySecret: the Access Key Secret.
|
||||||
|
* TestRegion: the region of OSS for testing
|
||||||
|
* TestBucket: the bucket name for testing
|
||||||
|
|
||||||
|
|
||||||
|
Under "oss" and run
|
||||||
|
|
||||||
|
```sh
|
||||||
|
go test
|
||||||
|
```
|
||||||
|
|
||||||
|
## Contributors
|
||||||
|
|
||||||
|
* Li Yi (denverdino@gmail.com)
|
||||||
|
* tgic (farmer1992@gmail.com)
|
||||||
|
* Yu Zhou (oscarrr110@gmail.com)
|
||||||
|
* Yufei Zhang
|
||||||
|
* linuxlikerqq
|
||||||
|
* Changhai Yan (changhai.ych@alibaba-inc.com)
|
||||||
|
* Jizhong Jiang (jiangjizhong@gmail.com)
|
||||||
|
* Kent Wang (pragkent@gmail.com)
|
||||||
|
* ringtail (zhongwei.lzw@alibaba-inc.com)
|
||||||
|
* aiden0z (aiden0xz@gmail.com)
|
||||||
|
* jimmycmh
|
||||||
|
* menglingwei
|
||||||
|
* mingang.he (dustgle@gmail.com)
|
||||||
|
* chainone (chainone@gmail.com)
|
||||||
|
* johnzeng
|
||||||
|
|
||||||
|
## License
|
||||||
|
This project is licensed under the Apache License, Version 2.0. See [LICENSE](https://github.com/denverdino/aliyungo/blob/master/LICENSE.txt) for the full license text.
|
||||||
|
|
||||||
|
|
||||||
|
## Related projects
|
||||||
|
|
||||||
|
* Aliyun ECS driver for Docker Machine: [Pull request](https://github.com/docker/machine/pull/1182)
|
||||||
|
|
||||||
|
* Aliyun OSS driver for Docker Registry V2: [Pull request](https://github.com/docker/distribution/pull/514)
|
||||||
|
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
|
The GO API design of OSS refer the implementation from [https://github.com/AdRoll/goamz](https://github.com/AdRoll)
|
68
vendor/github.com/docker/goamz/README.md
generated
vendored
Normal file
68
vendor/github.com/docker/goamz/README.md
generated
vendored
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
# News
|
||||||
|
We are putting together plans for future changes. We obviously depend on all of you to take part in the planning for the future of goamz and execution of the plans. Other than the regulare 'issues' and 'pull requests' please also have a look at TODO.md.
|
||||||
|
|
||||||
|
It is inevitable that there will be backward-*in*compatible changes. Please subscribe to the google group to get all the news (it will only be used for announcements, all the technical discussions will happen on github).
|
||||||
|
|
||||||
|
Google group: https://groups.google.com/forum/#!forum/goamz-announcements
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# GoAMZ
|
||||||
|
|
||||||
|
[![Build Status](https://travis-ci.org/docker/goamz.png?branch=master)](https://travis-ci.org/docker/goamz)
|
||||||
|
|
||||||
|
The _goamz_ package enables Go programs to interact with Amazon Web Services.
|
||||||
|
|
||||||
|
This is a fork of the version [developed within Canonical](https://wiki.ubuntu.com/goamz) with additional functionality and services from [a number of contributors](https://github.com/docker/goamz/contributors)!
|
||||||
|
|
||||||
|
The API of AWS is very comprehensive, though, and goamz doesn't even scratch the surface of it. That said, it's fairly well tested, and is the foundation in which further calls can easily be integrated. We'll continue extending the API as necessary - Pull Requests are _very_ welcome!
|
||||||
|
|
||||||
|
The following packages are available at the moment:
|
||||||
|
|
||||||
|
```
|
||||||
|
github.com/docker/goamz/aws
|
||||||
|
github.com/docker/goamz/cloudwatch
|
||||||
|
github.com/docker/goamz/dynamodb
|
||||||
|
github.com/docker/goamz/ec2
|
||||||
|
github.com/docker/goamz/elb
|
||||||
|
github.com/docker/goamz/iam
|
||||||
|
github.com/docker/goamz/kinesis
|
||||||
|
github.com/docker/goamz/s3
|
||||||
|
github.com/docker/goamz/sqs
|
||||||
|
github.com/docker/goamz/sns
|
||||||
|
|
||||||
|
github.com/docker/goamz/exp/mturk
|
||||||
|
github.com/docker/goamz/exp/sdb
|
||||||
|
github.com/docker/goamz/exp/ses
|
||||||
|
```
|
||||||
|
|
||||||
|
Packages under `exp/` are still in an experimental or unfinished/unpolished state.
|
||||||
|
|
||||||
|
## API documentation
|
||||||
|
|
||||||
|
The API documentation is currently available at:
|
||||||
|
|
||||||
|
[http://godoc.org/github.com/docker/goamz](http://godoc.org/github.com/docker/goamz)
|
||||||
|
|
||||||
|
## How to build and install goamz
|
||||||
|
|
||||||
|
Just use `go get` with any of the available packages. For example:
|
||||||
|
|
||||||
|
* `$ go get github.com/docker/goamz/ec2`
|
||||||
|
* `$ go get github.com/docker/goamz/s3`
|
||||||
|
|
||||||
|
## Running tests
|
||||||
|
|
||||||
|
To run tests, first install gocheck with:
|
||||||
|
|
||||||
|
`$ go get launchpad.net/gocheck`
|
||||||
|
|
||||||
|
Then run go test as usual:
|
||||||
|
|
||||||
|
`$ go test github.com/docker/goamz/...`
|
||||||
|
|
||||||
|
_Note:_ running all tests with the command `go test ./...` will currently fail as tests do not tear down their HTTP listeners.
|
||||||
|
|
||||||
|
If you want to run integration tests (costs money), set up the EC2 environment variables as usual, and run:
|
||||||
|
|
||||||
|
`$ gotest -i`
|
18
vendor/github.com/docker/libtrust/README.md
generated
vendored
Normal file
18
vendor/github.com/docker/libtrust/README.md
generated
vendored
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
# libtrust
|
||||||
|
|
||||||
|
Libtrust is library for managing authentication and authorization using public key cryptography.
|
||||||
|
|
||||||
|
Authentication is handled using the identity attached to the public key.
|
||||||
|
Libtrust provides multiple methods to prove possession of the private key associated with an identity.
|
||||||
|
- TLS x509 certificates
|
||||||
|
- Signature verification
|
||||||
|
- Key Challenge
|
||||||
|
|
||||||
|
Authorization and access control is managed through a distributed trust graph.
|
||||||
|
Trust servers are used as the authorities of the trust graph and allow caching portions of the graph for faster access.
|
||||||
|
|
||||||
|
## Copyright and license
|
||||||
|
|
||||||
|
Code and documentation copyright 2014 Docker, inc. Code released under the Apache 2.0 license.
|
||||||
|
Docs released under Creative commons.
|
||||||
|
|
44
vendor/github.com/garyburd/redigo/README.markdown
generated
vendored
Normal file
44
vendor/github.com/garyburd/redigo/README.markdown
generated
vendored
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
Redigo
|
||||||
|
======
|
||||||
|
|
||||||
|
Redigo is a [Go](http://golang.org/) client for the [Redis](http://redis.io/) database.
|
||||||
|
|
||||||
|
Features
|
||||||
|
-------
|
||||||
|
|
||||||
|
* A [Print-like](http://godoc.org/github.com/garyburd/redigo/redis#hdr-Executing_Commands) API with support for all Redis commands.
|
||||||
|
* [Pipelining](http://godoc.org/github.com/garyburd/redigo/redis#hdr-Pipelining), including pipelined transactions.
|
||||||
|
* [Publish/Subscribe](http://godoc.org/github.com/garyburd/redigo/redis#hdr-Publish_and_Subscribe).
|
||||||
|
* [Connection pooling](http://godoc.org/github.com/garyburd/redigo/redis#Pool).
|
||||||
|
* [Script helper type](http://godoc.org/github.com/garyburd/redigo/redis#Script) with optimistic use of EVALSHA.
|
||||||
|
* [Helper functions](http://godoc.org/github.com/garyburd/redigo/redis#hdr-Reply_Helpers) for working with command replies.
|
||||||
|
|
||||||
|
Documentation
|
||||||
|
-------------
|
||||||
|
|
||||||
|
- [API Reference](http://godoc.org/github.com/garyburd/redigo/redis)
|
||||||
|
- [FAQ](https://github.com/garyburd/redigo/wiki/FAQ)
|
||||||
|
|
||||||
|
Installation
|
||||||
|
------------
|
||||||
|
|
||||||
|
Install Redigo using the "go get" command:
|
||||||
|
|
||||||
|
go get github.com/garyburd/redigo/redis
|
||||||
|
|
||||||
|
The Go distribution is Redigo's only dependency.
|
||||||
|
|
||||||
|
Contributing
|
||||||
|
------------
|
||||||
|
|
||||||
|
Contributions are welcome.
|
||||||
|
|
||||||
|
Before writing code, send mail to gary@beagledreams.com to discuss what you
|
||||||
|
plan to do. This gives me a chance to validate the design, avoid duplication of
|
||||||
|
effort and ensure that the changes fit the goals of the project. Do not start
|
||||||
|
the discussion with a pull request.
|
||||||
|
|
||||||
|
License
|
||||||
|
-------
|
||||||
|
|
||||||
|
Redigo is available under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html).
|
709
vendor/github.com/go-ini/ini/README.md
generated
vendored
Normal file
709
vendor/github.com/go-ini/ini/README.md
generated
vendored
Normal file
|
@ -0,0 +1,709 @@
|
||||||
|
INI [![Build Status](https://travis-ci.org/go-ini/ini.svg?branch=master)](https://travis-ci.org/go-ini/ini)
|
||||||
|
===
|
||||||
|
|
||||||
|
![](https://avatars0.githubusercontent.com/u/10216035?v=3&s=200)
|
||||||
|
|
||||||
|
Package ini provides INI file read and write functionality in Go.
|
||||||
|
|
||||||
|
[简体中文](README_ZH.md)
|
||||||
|
|
||||||
|
## Feature
|
||||||
|
|
||||||
|
- Load multiple data sources(`[]byte` or file) with overwrites.
|
||||||
|
- Read with recursion values.
|
||||||
|
- Read with parent-child sections.
|
||||||
|
- Read with auto-increment key names.
|
||||||
|
- Read with multiple-line values.
|
||||||
|
- Read with tons of helper methods.
|
||||||
|
- Read and convert values to Go types.
|
||||||
|
- Read and **WRITE** comments of sections and keys.
|
||||||
|
- Manipulate sections, keys and comments with ease.
|
||||||
|
- Keep sections and keys in order as you parse and save.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
To use a tagged revision:
|
||||||
|
|
||||||
|
go get gopkg.in/ini.v1
|
||||||
|
|
||||||
|
To use with latest changes:
|
||||||
|
|
||||||
|
go get github.com/go-ini/ini
|
||||||
|
|
||||||
|
Please add `-u` flag to update in the future.
|
||||||
|
|
||||||
|
### Testing
|
||||||
|
|
||||||
|
If you want to test on your machine, please apply `-t` flag:
|
||||||
|
|
||||||
|
go get -t gopkg.in/ini.v1
|
||||||
|
|
||||||
|
Please add `-u` flag to update in the future.
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
### Loading from data sources
|
||||||
|
|
||||||
|
A **Data Source** is either raw data in type `[]byte` or a file name with type `string` and you can load **as many data sources as you want**. Passing other types will simply return an error.
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg, err := ini.Load([]byte("raw data"), "filename")
|
||||||
|
```
|
||||||
|
|
||||||
|
Or start with an empty object:
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg := ini.Empty()
|
||||||
|
```
|
||||||
|
|
||||||
|
When you cannot decide how many data sources to load at the beginning, you will still be able to **Append()** them later.
|
||||||
|
|
||||||
|
```go
|
||||||
|
err := cfg.Append("other file", []byte("other raw data"))
|
||||||
|
```
|
||||||
|
|
||||||
|
If you have a list of files with possibilities that some of them may not available at the time, and you don't know exactly which ones, you can use `LooseLoad` to ignore nonexistent files without returning error.
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg, err := ini.LooseLoad("filename", "filename_404")
|
||||||
|
```
|
||||||
|
|
||||||
|
The cool thing is, whenever the file is available to load while you're calling `Reload` method, it will be counted as usual.
|
||||||
|
|
||||||
|
#### Ignore cases of key name
|
||||||
|
|
||||||
|
When you do not care about cases of section and key names, you can use `InsensitiveLoad` to force all names to be lowercased while parsing.
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg, err := ini.InsensitiveLoad("filename")
|
||||||
|
//...
|
||||||
|
|
||||||
|
// sec1 and sec2 are the exactly same section object
|
||||||
|
sec1, err := cfg.GetSection("Section")
|
||||||
|
sec2, err := cfg.GetSection("SecTIOn")
|
||||||
|
|
||||||
|
// key1 and key2 are the exactly same key object
|
||||||
|
key1, err := cfg.GetKey("Key")
|
||||||
|
key2, err := cfg.GetKey("KeY")
|
||||||
|
```
|
||||||
|
|
||||||
|
#### MySQL-like boolean key
|
||||||
|
|
||||||
|
MySQL's configuration allows a key without value as follows:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[mysqld]
|
||||||
|
...
|
||||||
|
skip-host-cache
|
||||||
|
skip-name-resolve
|
||||||
|
```
|
||||||
|
|
||||||
|
By default, this is considered as missing value. But if you know you're going to deal with those cases, you can assign advanced load options:
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg, err := LoadSources(LoadOptions{AllowBooleanKeys: true}, "my.cnf"))
|
||||||
|
```
|
||||||
|
|
||||||
|
The value of those keys are always `true`, and when you save to a file, it will keep in the same foramt as you read.
|
||||||
|
|
||||||
|
### Working with sections
|
||||||
|
|
||||||
|
To get a section, you would need to:
|
||||||
|
|
||||||
|
```go
|
||||||
|
section, err := cfg.GetSection("section name")
|
||||||
|
```
|
||||||
|
|
||||||
|
For a shortcut for default section, just give an empty string as name:
|
||||||
|
|
||||||
|
```go
|
||||||
|
section, err := cfg.GetSection("")
|
||||||
|
```
|
||||||
|
|
||||||
|
When you're pretty sure the section exists, following code could make your life easier:
|
||||||
|
|
||||||
|
```go
|
||||||
|
section := cfg.Section("")
|
||||||
|
```
|
||||||
|
|
||||||
|
What happens when the section somehow does not exist? Don't panic, it automatically creates and returns a new section to you.
|
||||||
|
|
||||||
|
To create a new section:
|
||||||
|
|
||||||
|
```go
|
||||||
|
err := cfg.NewSection("new section")
|
||||||
|
```
|
||||||
|
|
||||||
|
To get a list of sections or section names:
|
||||||
|
|
||||||
|
```go
|
||||||
|
sections := cfg.Sections()
|
||||||
|
names := cfg.SectionStrings()
|
||||||
|
```
|
||||||
|
|
||||||
|
### Working with keys
|
||||||
|
|
||||||
|
To get a key under a section:
|
||||||
|
|
||||||
|
```go
|
||||||
|
key, err := cfg.Section("").GetKey("key name")
|
||||||
|
```
|
||||||
|
|
||||||
|
Same rule applies to key operations:
|
||||||
|
|
||||||
|
```go
|
||||||
|
key := cfg.Section("").Key("key name")
|
||||||
|
```
|
||||||
|
|
||||||
|
To check if a key exists:
|
||||||
|
|
||||||
|
```go
|
||||||
|
yes := cfg.Section("").HasKey("key name")
|
||||||
|
```
|
||||||
|
|
||||||
|
To create a new key:
|
||||||
|
|
||||||
|
```go
|
||||||
|
err := cfg.Section("").NewKey("name", "value")
|
||||||
|
```
|
||||||
|
|
||||||
|
To get a list of keys or key names:
|
||||||
|
|
||||||
|
```go
|
||||||
|
keys := cfg.Section("").Keys()
|
||||||
|
names := cfg.Section("").KeyStrings()
|
||||||
|
```
|
||||||
|
|
||||||
|
To get a clone hash of keys and corresponding values:
|
||||||
|
|
||||||
|
```go
|
||||||
|
hash := cfg.Section("").KeysHash()
|
||||||
|
```
|
||||||
|
|
||||||
|
### Working with values
|
||||||
|
|
||||||
|
To get a string value:
|
||||||
|
|
||||||
|
```go
|
||||||
|
val := cfg.Section("").Key("key name").String()
|
||||||
|
```
|
||||||
|
|
||||||
|
To validate key value on the fly:
|
||||||
|
|
||||||
|
```go
|
||||||
|
val := cfg.Section("").Key("key name").Validate(func(in string) string {
|
||||||
|
if len(in) == 0 {
|
||||||
|
return "default"
|
||||||
|
}
|
||||||
|
return in
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
If you do not want any auto-transformation (such as recursive read) for the values, you can get raw value directly (this way you get much better performance):
|
||||||
|
|
||||||
|
```go
|
||||||
|
val := cfg.Section("").Key("key name").Value()
|
||||||
|
```
|
||||||
|
|
||||||
|
To check if raw value exists:
|
||||||
|
|
||||||
|
```go
|
||||||
|
yes := cfg.Section("").HasValue("test value")
|
||||||
|
```
|
||||||
|
|
||||||
|
To get value with types:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// For boolean values:
|
||||||
|
// true when value is: 1, t, T, TRUE, true, True, YES, yes, Yes, y, ON, on, On
|
||||||
|
// false when value is: 0, f, F, FALSE, false, False, NO, no, No, n, OFF, off, Off
|
||||||
|
v, err = cfg.Section("").Key("BOOL").Bool()
|
||||||
|
v, err = cfg.Section("").Key("FLOAT64").Float64()
|
||||||
|
v, err = cfg.Section("").Key("INT").Int()
|
||||||
|
v, err = cfg.Section("").Key("INT64").Int64()
|
||||||
|
v, err = cfg.Section("").Key("UINT").Uint()
|
||||||
|
v, err = cfg.Section("").Key("UINT64").Uint64()
|
||||||
|
v, err = cfg.Section("").Key("TIME").TimeFormat(time.RFC3339)
|
||||||
|
v, err = cfg.Section("").Key("TIME").Time() // RFC3339
|
||||||
|
|
||||||
|
v = cfg.Section("").Key("BOOL").MustBool()
|
||||||
|
v = cfg.Section("").Key("FLOAT64").MustFloat64()
|
||||||
|
v = cfg.Section("").Key("INT").MustInt()
|
||||||
|
v = cfg.Section("").Key("INT64").MustInt64()
|
||||||
|
v = cfg.Section("").Key("UINT").MustUint()
|
||||||
|
v = cfg.Section("").Key("UINT64").MustUint64()
|
||||||
|
v = cfg.Section("").Key("TIME").MustTimeFormat(time.RFC3339)
|
||||||
|
v = cfg.Section("").Key("TIME").MustTime() // RFC3339
|
||||||
|
|
||||||
|
// Methods start with Must also accept one argument for default value
|
||||||
|
// when key not found or fail to parse value to given type.
|
||||||
|
// Except method MustString, which you have to pass a default value.
|
||||||
|
|
||||||
|
v = cfg.Section("").Key("String").MustString("default")
|
||||||
|
v = cfg.Section("").Key("BOOL").MustBool(true)
|
||||||
|
v = cfg.Section("").Key("FLOAT64").MustFloat64(1.25)
|
||||||
|
v = cfg.Section("").Key("INT").MustInt(10)
|
||||||
|
v = cfg.Section("").Key("INT64").MustInt64(99)
|
||||||
|
v = cfg.Section("").Key("UINT").MustUint(3)
|
||||||
|
v = cfg.Section("").Key("UINT64").MustUint64(6)
|
||||||
|
v = cfg.Section("").Key("TIME").MustTimeFormat(time.RFC3339, time.Now())
|
||||||
|
v = cfg.Section("").Key("TIME").MustTime(time.Now()) // RFC3339
|
||||||
|
```
|
||||||
|
|
||||||
|
What if my value is three-line long?
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[advance]
|
||||||
|
ADDRESS = """404 road,
|
||||||
|
NotFound, State, 5000
|
||||||
|
Earth"""
|
||||||
|
```
|
||||||
|
|
||||||
|
Not a problem!
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg.Section("advance").Key("ADDRESS").String()
|
||||||
|
|
||||||
|
/* --- start ---
|
||||||
|
404 road,
|
||||||
|
NotFound, State, 5000
|
||||||
|
Earth
|
||||||
|
------ end --- */
|
||||||
|
```
|
||||||
|
|
||||||
|
That's cool, how about continuation lines?
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[advance]
|
||||||
|
two_lines = how about \
|
||||||
|
continuation lines?
|
||||||
|
lots_of_lines = 1 \
|
||||||
|
2 \
|
||||||
|
3 \
|
||||||
|
4
|
||||||
|
```
|
||||||
|
|
||||||
|
Piece of cake!
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg.Section("advance").Key("two_lines").String() // how about continuation lines?
|
||||||
|
cfg.Section("advance").Key("lots_of_lines").String() // 1 2 3 4
|
||||||
|
```
|
||||||
|
|
||||||
|
Well, I hate continuation lines, how do I disable that?
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg, err := ini.LoadSources(ini.LoadOptions{
|
||||||
|
IgnoreContinuation: true,
|
||||||
|
}, "filename")
|
||||||
|
```
|
||||||
|
|
||||||
|
Holy crap!
|
||||||
|
|
||||||
|
Note that single quotes around values will be stripped:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
foo = "some value" // foo: some value
|
||||||
|
bar = 'some value' // bar: some value
|
||||||
|
```
|
||||||
|
|
||||||
|
That's all? Hmm, no.
|
||||||
|
|
||||||
|
#### Helper methods of working with values
|
||||||
|
|
||||||
|
To get value with given candidates:
|
||||||
|
|
||||||
|
```go
|
||||||
|
v = cfg.Section("").Key("STRING").In("default", []string{"str", "arr", "types"})
|
||||||
|
v = cfg.Section("").Key("FLOAT64").InFloat64(1.1, []float64{1.25, 2.5, 3.75})
|
||||||
|
v = cfg.Section("").Key("INT").InInt(5, []int{10, 20, 30})
|
||||||
|
v = cfg.Section("").Key("INT64").InInt64(10, []int64{10, 20, 30})
|
||||||
|
v = cfg.Section("").Key("UINT").InUint(4, []int{3, 6, 9})
|
||||||
|
v = cfg.Section("").Key("UINT64").InUint64(8, []int64{3, 6, 9})
|
||||||
|
v = cfg.Section("").Key("TIME").InTimeFormat(time.RFC3339, time.Now(), []time.Time{time1, time2, time3})
|
||||||
|
v = cfg.Section("").Key("TIME").InTime(time.Now(), []time.Time{time1, time2, time3}) // RFC3339
|
||||||
|
```
|
||||||
|
|
||||||
|
Default value will be presented if value of key is not in candidates you given, and default value does not need be one of candidates.
|
||||||
|
|
||||||
|
To validate value in a given range:
|
||||||
|
|
||||||
|
```go
|
||||||
|
vals = cfg.Section("").Key("FLOAT64").RangeFloat64(0.0, 1.1, 2.2)
|
||||||
|
vals = cfg.Section("").Key("INT").RangeInt(0, 10, 20)
|
||||||
|
vals = cfg.Section("").Key("INT64").RangeInt64(0, 10, 20)
|
||||||
|
vals = cfg.Section("").Key("UINT").RangeUint(0, 3, 9)
|
||||||
|
vals = cfg.Section("").Key("UINT64").RangeUint64(0, 3, 9)
|
||||||
|
vals = cfg.Section("").Key("TIME").RangeTimeFormat(time.RFC3339, time.Now(), minTime, maxTime)
|
||||||
|
vals = cfg.Section("").Key("TIME").RangeTime(time.Now(), minTime, maxTime) // RFC3339
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Auto-split values into a slice
|
||||||
|
|
||||||
|
To use zero value of type for invalid inputs:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4]
|
||||||
|
// Input: how, 2.2, are, you -> [0.0 2.2 0.0 0.0]
|
||||||
|
vals = cfg.Section("").Key("STRINGS").Strings(",")
|
||||||
|
vals = cfg.Section("").Key("FLOAT64S").Float64s(",")
|
||||||
|
vals = cfg.Section("").Key("INTS").Ints(",")
|
||||||
|
vals = cfg.Section("").Key("INT64S").Int64s(",")
|
||||||
|
vals = cfg.Section("").Key("UINTS").Uints(",")
|
||||||
|
vals = cfg.Section("").Key("UINT64S").Uint64s(",")
|
||||||
|
vals = cfg.Section("").Key("TIMES").Times(",")
|
||||||
|
```
|
||||||
|
|
||||||
|
To exclude invalid values out of result slice:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4]
|
||||||
|
// Input: how, 2.2, are, you -> [2.2]
|
||||||
|
vals = cfg.Section("").Key("FLOAT64S").ValidFloat64s(",")
|
||||||
|
vals = cfg.Section("").Key("INTS").ValidInts(",")
|
||||||
|
vals = cfg.Section("").Key("INT64S").ValidInt64s(",")
|
||||||
|
vals = cfg.Section("").Key("UINTS").ValidUints(",")
|
||||||
|
vals = cfg.Section("").Key("UINT64S").ValidUint64s(",")
|
||||||
|
vals = cfg.Section("").Key("TIMES").ValidTimes(",")
|
||||||
|
```
|
||||||
|
|
||||||
|
Or to return nothing but error when have invalid inputs:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4]
|
||||||
|
// Input: how, 2.2, are, you -> error
|
||||||
|
vals = cfg.Section("").Key("FLOAT64S").StrictFloat64s(",")
|
||||||
|
vals = cfg.Section("").Key("INTS").StrictInts(",")
|
||||||
|
vals = cfg.Section("").Key("INT64S").StrictInt64s(",")
|
||||||
|
vals = cfg.Section("").Key("UINTS").StrictUints(",")
|
||||||
|
vals = cfg.Section("").Key("UINT64S").StrictUint64s(",")
|
||||||
|
vals = cfg.Section("").Key("TIMES").StrictTimes(",")
|
||||||
|
```
|
||||||
|
|
||||||
|
### Save your configuration
|
||||||
|
|
||||||
|
Finally, it's time to save your configuration to somewhere.
|
||||||
|
|
||||||
|
A typical way to save configuration is writing it to a file:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// ...
|
||||||
|
err = cfg.SaveTo("my.ini")
|
||||||
|
err = cfg.SaveToIndent("my.ini", "\t")
|
||||||
|
```
|
||||||
|
|
||||||
|
Another way to save is writing to a `io.Writer` interface:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// ...
|
||||||
|
cfg.WriteTo(writer)
|
||||||
|
cfg.WriteToIndent(writer, "\t")
|
||||||
|
```
|
||||||
|
|
||||||
|
By default, spaces are used to align "=" sign between key and values, to disable that:
|
||||||
|
|
||||||
|
```go
|
||||||
|
ini.PrettyFormat = false
|
||||||
|
```
|
||||||
|
|
||||||
|
## Advanced Usage
|
||||||
|
|
||||||
|
### Recursive Values
|
||||||
|
|
||||||
|
For all value of keys, there is a special syntax `%(<name>)s`, where `<name>` is the key name in same section or default section, and `%(<name>)s` will be replaced by corresponding value(empty string if key not found). You can use this syntax at most 99 level of recursions.
|
||||||
|
|
||||||
|
```ini
|
||||||
|
NAME = ini
|
||||||
|
|
||||||
|
[author]
|
||||||
|
NAME = Unknwon
|
||||||
|
GITHUB = https://github.com/%(NAME)s
|
||||||
|
|
||||||
|
[package]
|
||||||
|
FULL_NAME = github.com/go-ini/%(NAME)s
|
||||||
|
```
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg.Section("author").Key("GITHUB").String() // https://github.com/Unknwon
|
||||||
|
cfg.Section("package").Key("FULL_NAME").String() // github.com/go-ini/ini
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parent-child Sections
|
||||||
|
|
||||||
|
You can use `.` in section name to indicate parent-child relationship between two or more sections. If the key not found in the child section, library will try again on its parent section until there is no parent section.
|
||||||
|
|
||||||
|
```ini
|
||||||
|
NAME = ini
|
||||||
|
VERSION = v1
|
||||||
|
IMPORT_PATH = gopkg.in/%(NAME)s.%(VERSION)s
|
||||||
|
|
||||||
|
[package]
|
||||||
|
CLONE_URL = https://%(IMPORT_PATH)s
|
||||||
|
|
||||||
|
[package.sub]
|
||||||
|
```
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg.Section("package.sub").Key("CLONE_URL").String() // https://gopkg.in/ini.v1
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Retrieve parent keys available to a child section
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg.Section("package.sub").ParentKeys() // ["CLONE_URL"]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Auto-increment Key Names
|
||||||
|
|
||||||
|
If key name is `-` in data source, then it would be seen as special syntax for auto-increment key name start from 1, and every section is independent on counter.
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[features]
|
||||||
|
-: Support read/write comments of keys and sections
|
||||||
|
-: Support auto-increment of key names
|
||||||
|
-: Support load multiple files to overwrite key values
|
||||||
|
```
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg.Section("features").KeyStrings() // []{"#1", "#2", "#3"}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Map To Struct
|
||||||
|
|
||||||
|
Want more objective way to play with INI? Cool.
|
||||||
|
|
||||||
|
```ini
|
||||||
|
Name = Unknwon
|
||||||
|
age = 21
|
||||||
|
Male = true
|
||||||
|
Born = 1993-01-01T20:17:05Z
|
||||||
|
|
||||||
|
[Note]
|
||||||
|
Content = Hi is a good man!
|
||||||
|
Cities = HangZhou, Boston
|
||||||
|
```
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Note struct {
|
||||||
|
Content string
|
||||||
|
Cities []string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Person struct {
|
||||||
|
Name string
|
||||||
|
Age int `ini:"age"`
|
||||||
|
Male bool
|
||||||
|
Born time.Time
|
||||||
|
Note
|
||||||
|
Created time.Time `ini:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
cfg, err := ini.Load("path/to/ini")
|
||||||
|
// ...
|
||||||
|
p := new(Person)
|
||||||
|
err = cfg.MapTo(p)
|
||||||
|
// ...
|
||||||
|
|
||||||
|
// Things can be simpler.
|
||||||
|
err = ini.MapTo(p, "path/to/ini")
|
||||||
|
// ...
|
||||||
|
|
||||||
|
// Just map a section? Fine.
|
||||||
|
n := new(Note)
|
||||||
|
err = cfg.Section("Note").MapTo(n)
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Can I have default value for field? Absolutely.
|
||||||
|
|
||||||
|
Assign it before you map to struct. It will keep the value as it is if the key is not presented or got wrong type.
|
||||||
|
|
||||||
|
```go
|
||||||
|
// ...
|
||||||
|
p := &Person{
|
||||||
|
Name: "Joe",
|
||||||
|
}
|
||||||
|
// ...
|
||||||
|
```
|
||||||
|
|
||||||
|
It's really cool, but what's the point if you can't give me my file back from struct?
|
||||||
|
|
||||||
|
### Reflect From Struct
|
||||||
|
|
||||||
|
Why not?
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Embeded struct {
|
||||||
|
Dates []time.Time `delim:"|"`
|
||||||
|
Places []string `ini:"places,omitempty"`
|
||||||
|
None []int `ini:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Author struct {
|
||||||
|
Name string `ini:"NAME"`
|
||||||
|
Male bool
|
||||||
|
Age int
|
||||||
|
GPA float64
|
||||||
|
NeverMind string `ini:"-"`
|
||||||
|
*Embeded
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
a := &Author{"Unknwon", true, 21, 2.8, "",
|
||||||
|
&Embeded{
|
||||||
|
[]time.Time{time.Now(), time.Now()},
|
||||||
|
[]string{"HangZhou", "Boston"},
|
||||||
|
[]int{},
|
||||||
|
}}
|
||||||
|
cfg := ini.Empty()
|
||||||
|
err = ini.ReflectFrom(cfg, a)
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
So, what do I get?
|
||||||
|
|
||||||
|
```ini
|
||||||
|
NAME = Unknwon
|
||||||
|
Male = true
|
||||||
|
Age = 21
|
||||||
|
GPA = 2.8
|
||||||
|
|
||||||
|
[Embeded]
|
||||||
|
Dates = 2015-08-07T22:14:22+08:00|2015-08-07T22:14:22+08:00
|
||||||
|
places = HangZhou,Boston
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Name Mapper
|
||||||
|
|
||||||
|
To save your time and make your code cleaner, this library supports [`NameMapper`](https://gowalker.org/gopkg.in/ini.v1#NameMapper) between struct field and actual section and key name.
|
||||||
|
|
||||||
|
There are 2 built-in name mappers:
|
||||||
|
|
||||||
|
- `AllCapsUnderscore`: it converts to format `ALL_CAPS_UNDERSCORE` then match section or key.
|
||||||
|
- `TitleUnderscore`: it converts to format `title_underscore` then match section or key.
|
||||||
|
|
||||||
|
To use them:
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Info struct {
|
||||||
|
PackageName string
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
err = ini.MapToWithMapper(&Info{}, ini.TitleUnderscore, []byte("package_name=ini"))
|
||||||
|
// ...
|
||||||
|
|
||||||
|
cfg, err := ini.Load([]byte("PACKAGE_NAME=ini"))
|
||||||
|
// ...
|
||||||
|
info := new(Info)
|
||||||
|
cfg.NameMapper = ini.AllCapsUnderscore
|
||||||
|
err = cfg.MapTo(info)
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Same rules of name mapper apply to `ini.ReflectFromWithMapper` function.
|
||||||
|
|
||||||
|
#### Value Mapper
|
||||||
|
|
||||||
|
To expand values (e.g. from environment variables), you can use the `ValueMapper` to transform values:
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Env struct {
|
||||||
|
Foo string `ini:"foo"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
cfg, err := ini.Load([]byte("[env]\nfoo = ${MY_VAR}\n")
|
||||||
|
cfg.ValueMapper = os.ExpandEnv
|
||||||
|
// ...
|
||||||
|
env := &Env{}
|
||||||
|
err = cfg.Section("env").MapTo(env)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This would set the value of `env.Foo` to the value of the environment variable `MY_VAR`.
|
||||||
|
|
||||||
|
#### Other Notes On Map/Reflect
|
||||||
|
|
||||||
|
Any embedded struct is treated as a section by default, and there is no automatic parent-child relations in map/reflect feature:
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Child struct {
|
||||||
|
Age string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Parent struct {
|
||||||
|
Name string
|
||||||
|
Child
|
||||||
|
}
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
City string
|
||||||
|
Parent
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Example configuration:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
City = Boston
|
||||||
|
|
||||||
|
[Parent]
|
||||||
|
Name = Unknwon
|
||||||
|
|
||||||
|
[Child]
|
||||||
|
Age = 21
|
||||||
|
```
|
||||||
|
|
||||||
|
What if, yes, I'm paranoid, I want embedded struct to be in the same section. Well, all roads lead to Rome.
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Child struct {
|
||||||
|
Age string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Parent struct {
|
||||||
|
Name string
|
||||||
|
Child `ini:"Parent"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
City string
|
||||||
|
Parent
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Example configuration:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
City = Boston
|
||||||
|
|
||||||
|
[Parent]
|
||||||
|
Name = Unknwon
|
||||||
|
Age = 21
|
||||||
|
```
|
||||||
|
|
||||||
|
## Getting Help
|
||||||
|
|
||||||
|
- [API Documentation](https://gowalker.org/gopkg.in/ini.v1)
|
||||||
|
- [File An Issue](https://github.com/go-ini/ini/issues/new)
|
||||||
|
|
||||||
|
## FAQs
|
||||||
|
|
||||||
|
### What does `BlockMode` field do?
|
||||||
|
|
||||||
|
By default, library lets you read and write values so we need a locker to make sure your data is safe. But in cases that you are very sure about only reading data through the library, you can set `cfg.BlockMode = false` to speed up read operations about **50-70%** faster.
|
||||||
|
|
||||||
|
### Why another INI library?
|
||||||
|
|
||||||
|
Many people are using my another INI library [goconfig](https://github.com/Unknwon/goconfig), so the reason for this one is I would like to make more Go style code. Also when you set `cfg.BlockMode = false`, this one is about **10-30%** faster.
|
||||||
|
|
||||||
|
To make those changes I have to confirm API broken, so it's safer to keep it in another place and start using `gopkg.in` to version my package at this time.(PS: shorter import path)
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This project is under Apache v2 License. See the [LICENSE](LICENSE) file for the full license text.
|
696
vendor/github.com/go-ini/ini/README_ZH.md
generated
vendored
Normal file
696
vendor/github.com/go-ini/ini/README_ZH.md
generated
vendored
Normal file
|
@ -0,0 +1,696 @@
|
||||||
|
本包提供了 Go 语言中读写 INI 文件的功能。
|
||||||
|
|
||||||
|
## 功能特性
|
||||||
|
|
||||||
|
- 支持覆盖加载多个数据源(`[]byte` 或文件)
|
||||||
|
- 支持递归读取键值
|
||||||
|
- 支持读取父子分区
|
||||||
|
- 支持读取自增键名
|
||||||
|
- 支持读取多行的键值
|
||||||
|
- 支持大量辅助方法
|
||||||
|
- 支持在读取时直接转换为 Go 语言类型
|
||||||
|
- 支持读取和 **写入** 分区和键的注释
|
||||||
|
- 轻松操作分区、键值和注释
|
||||||
|
- 在保存文件时分区和键值会保持原有的顺序
|
||||||
|
|
||||||
|
## 下载安装
|
||||||
|
|
||||||
|
使用一个特定版本:
|
||||||
|
|
||||||
|
go get gopkg.in/ini.v1
|
||||||
|
|
||||||
|
使用最新版:
|
||||||
|
|
||||||
|
go get github.com/go-ini/ini
|
||||||
|
|
||||||
|
如需更新请添加 `-u` 选项。
|
||||||
|
|
||||||
|
### 测试安装
|
||||||
|
|
||||||
|
如果您想要在自己的机器上运行测试,请使用 `-t` 标记:
|
||||||
|
|
||||||
|
go get -t gopkg.in/ini.v1
|
||||||
|
|
||||||
|
如需更新请添加 `-u` 选项。
|
||||||
|
|
||||||
|
## 开始使用
|
||||||
|
|
||||||
|
### 从数据源加载
|
||||||
|
|
||||||
|
一个 **数据源** 可以是 `[]byte` 类型的原始数据,或 `string` 类型的文件路径。您可以加载 **任意多个** 数据源。如果您传递其它类型的数据源,则会直接返回错误。
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg, err := ini.Load([]byte("raw data"), "filename")
|
||||||
|
```
|
||||||
|
|
||||||
|
或者从一个空白的文件开始:
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg := ini.Empty()
|
||||||
|
```
|
||||||
|
|
||||||
|
当您在一开始无法决定需要加载哪些数据源时,仍可以使用 **Append()** 在需要的时候加载它们。
|
||||||
|
|
||||||
|
```go
|
||||||
|
err := cfg.Append("other file", []byte("other raw data"))
|
||||||
|
```
|
||||||
|
|
||||||
|
当您想要加载一系列文件,但是不能够确定其中哪些文件是不存在的,可以通过调用函数 `LooseLoad` 来忽略它们(`Load` 会因为文件不存在而返回错误):
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg, err := ini.LooseLoad("filename", "filename_404")
|
||||||
|
```
|
||||||
|
|
||||||
|
更牛逼的是,当那些之前不存在的文件在重新调用 `Reload` 方法的时候突然出现了,那么它们会被正常加载。
|
||||||
|
|
||||||
|
#### 忽略键名的大小写
|
||||||
|
|
||||||
|
有时候分区和键的名称大小写混合非常烦人,这个时候就可以通过 `InsensitiveLoad` 将所有分区和键名在读取里强制转换为小写:
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg, err := ini.InsensitiveLoad("filename")
|
||||||
|
//...
|
||||||
|
|
||||||
|
// sec1 和 sec2 指向同一个分区对象
|
||||||
|
sec1, err := cfg.GetSection("Section")
|
||||||
|
sec2, err := cfg.GetSection("SecTIOn")
|
||||||
|
|
||||||
|
// key1 和 key2 指向同一个键对象
|
||||||
|
key1, err := cfg.GetKey("Key")
|
||||||
|
key2, err := cfg.GetKey("KeY")
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 类似 MySQL 配置中的布尔值键
|
||||||
|
|
||||||
|
MySQL 的配置文件中会出现没有具体值的布尔类型的键:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[mysqld]
|
||||||
|
...
|
||||||
|
skip-host-cache
|
||||||
|
skip-name-resolve
|
||||||
|
```
|
||||||
|
|
||||||
|
默认情况下这被认为是缺失值而无法完成解析,但可以通过高级的加载选项对它们进行处理:
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg, err := LoadSources(LoadOptions{AllowBooleanKeys: true}, "my.cnf"))
|
||||||
|
```
|
||||||
|
|
||||||
|
这些键的值永远为 `true`,且在保存到文件时也只会输出键名。
|
||||||
|
|
||||||
|
### 操作分区(Section)
|
||||||
|
|
||||||
|
获取指定分区:
|
||||||
|
|
||||||
|
```go
|
||||||
|
section, err := cfg.GetSection("section name")
|
||||||
|
```
|
||||||
|
|
||||||
|
如果您想要获取默认分区,则可以用空字符串代替分区名:
|
||||||
|
|
||||||
|
```go
|
||||||
|
section, err := cfg.GetSection("")
|
||||||
|
```
|
||||||
|
|
||||||
|
当您非常确定某个分区是存在的,可以使用以下简便方法:
|
||||||
|
|
||||||
|
```go
|
||||||
|
section := cfg.Section("")
|
||||||
|
```
|
||||||
|
|
||||||
|
如果不小心判断错了,要获取的分区其实是不存在的,那会发生什么呢?没事的,它会自动创建并返回一个对应的分区对象给您。
|
||||||
|
|
||||||
|
创建一个分区:
|
||||||
|
|
||||||
|
```go
|
||||||
|
err := cfg.NewSection("new section")
|
||||||
|
```
|
||||||
|
|
||||||
|
获取所有分区对象或名称:
|
||||||
|
|
||||||
|
```go
|
||||||
|
sections := cfg.Sections()
|
||||||
|
names := cfg.SectionStrings()
|
||||||
|
```
|
||||||
|
|
||||||
|
### 操作键(Key)
|
||||||
|
|
||||||
|
获取某个分区下的键:
|
||||||
|
|
||||||
|
```go
|
||||||
|
key, err := cfg.Section("").GetKey("key name")
|
||||||
|
```
|
||||||
|
|
||||||
|
和分区一样,您也可以直接获取键而忽略错误处理:
|
||||||
|
|
||||||
|
```go
|
||||||
|
key := cfg.Section("").Key("key name")
|
||||||
|
```
|
||||||
|
|
||||||
|
判断某个键是否存在:
|
||||||
|
|
||||||
|
```go
|
||||||
|
yes := cfg.Section("").HasKey("key name")
|
||||||
|
```
|
||||||
|
|
||||||
|
创建一个新的键:
|
||||||
|
|
||||||
|
```go
|
||||||
|
err := cfg.Section("").NewKey("name", "value")
|
||||||
|
```
|
||||||
|
|
||||||
|
获取分区下的所有键或键名:
|
||||||
|
|
||||||
|
```go
|
||||||
|
keys := cfg.Section("").Keys()
|
||||||
|
names := cfg.Section("").KeyStrings()
|
||||||
|
```
|
||||||
|
|
||||||
|
获取分区下的所有键值对的克隆:
|
||||||
|
|
||||||
|
```go
|
||||||
|
hash := cfg.Section("").KeysHash()
|
||||||
|
```
|
||||||
|
|
||||||
|
### 操作键值(Value)
|
||||||
|
|
||||||
|
获取一个类型为字符串(string)的值:
|
||||||
|
|
||||||
|
```go
|
||||||
|
val := cfg.Section("").Key("key name").String()
|
||||||
|
```
|
||||||
|
|
||||||
|
获取值的同时通过自定义函数进行处理验证:
|
||||||
|
|
||||||
|
```go
|
||||||
|
val := cfg.Section("").Key("key name").Validate(func(in string) string {
|
||||||
|
if len(in) == 0 {
|
||||||
|
return "default"
|
||||||
|
}
|
||||||
|
return in
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
如果您不需要任何对值的自动转变功能(例如递归读取),可以直接获取原值(这种方式性能最佳):
|
||||||
|
|
||||||
|
```go
|
||||||
|
val := cfg.Section("").Key("key name").Value()
|
||||||
|
```
|
||||||
|
|
||||||
|
判断某个原值是否存在:
|
||||||
|
|
||||||
|
```go
|
||||||
|
yes := cfg.Section("").HasValue("test value")
|
||||||
|
```
|
||||||
|
|
||||||
|
获取其它类型的值:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// 布尔值的规则:
|
||||||
|
// true 当值为:1, t, T, TRUE, true, True, YES, yes, Yes, y, ON, on, On
|
||||||
|
// false 当值为:0, f, F, FALSE, false, False, NO, no, No, n, OFF, off, Off
|
||||||
|
v, err = cfg.Section("").Key("BOOL").Bool()
|
||||||
|
v, err = cfg.Section("").Key("FLOAT64").Float64()
|
||||||
|
v, err = cfg.Section("").Key("INT").Int()
|
||||||
|
v, err = cfg.Section("").Key("INT64").Int64()
|
||||||
|
v, err = cfg.Section("").Key("UINT").Uint()
|
||||||
|
v, err = cfg.Section("").Key("UINT64").Uint64()
|
||||||
|
v, err = cfg.Section("").Key("TIME").TimeFormat(time.RFC3339)
|
||||||
|
v, err = cfg.Section("").Key("TIME").Time() // RFC3339
|
||||||
|
|
||||||
|
v = cfg.Section("").Key("BOOL").MustBool()
|
||||||
|
v = cfg.Section("").Key("FLOAT64").MustFloat64()
|
||||||
|
v = cfg.Section("").Key("INT").MustInt()
|
||||||
|
v = cfg.Section("").Key("INT64").MustInt64()
|
||||||
|
v = cfg.Section("").Key("UINT").MustUint()
|
||||||
|
v = cfg.Section("").Key("UINT64").MustUint64()
|
||||||
|
v = cfg.Section("").Key("TIME").MustTimeFormat(time.RFC3339)
|
||||||
|
v = cfg.Section("").Key("TIME").MustTime() // RFC3339
|
||||||
|
|
||||||
|
// 由 Must 开头的方法名允许接收一个相同类型的参数来作为默认值,
|
||||||
|
// 当键不存在或者转换失败时,则会直接返回该默认值。
|
||||||
|
// 但是,MustString 方法必须传递一个默认值。
|
||||||
|
|
||||||
|
v = cfg.Seciont("").Key("String").MustString("default")
|
||||||
|
v = cfg.Section("").Key("BOOL").MustBool(true)
|
||||||
|
v = cfg.Section("").Key("FLOAT64").MustFloat64(1.25)
|
||||||
|
v = cfg.Section("").Key("INT").MustInt(10)
|
||||||
|
v = cfg.Section("").Key("INT64").MustInt64(99)
|
||||||
|
v = cfg.Section("").Key("UINT").MustUint(3)
|
||||||
|
v = cfg.Section("").Key("UINT64").MustUint64(6)
|
||||||
|
v = cfg.Section("").Key("TIME").MustTimeFormat(time.RFC3339, time.Now())
|
||||||
|
v = cfg.Section("").Key("TIME").MustTime(time.Now()) // RFC3339
|
||||||
|
```
|
||||||
|
|
||||||
|
如果我的值有好多行怎么办?
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[advance]
|
||||||
|
ADDRESS = """404 road,
|
||||||
|
NotFound, State, 5000
|
||||||
|
Earth"""
|
||||||
|
```
|
||||||
|
|
||||||
|
嗯哼?小 case!
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg.Section("advance").Key("ADDRESS").String()
|
||||||
|
|
||||||
|
/* --- start ---
|
||||||
|
404 road,
|
||||||
|
NotFound, State, 5000
|
||||||
|
Earth
|
||||||
|
------ end --- */
|
||||||
|
```
|
||||||
|
|
||||||
|
赞爆了!那要是我属于一行的内容写不下想要写到第二行怎么办?
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[advance]
|
||||||
|
two_lines = how about \
|
||||||
|
continuation lines?
|
||||||
|
lots_of_lines = 1 \
|
||||||
|
2 \
|
||||||
|
3 \
|
||||||
|
4
|
||||||
|
```
|
||||||
|
|
||||||
|
简直是小菜一碟!
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg.Section("advance").Key("two_lines").String() // how about continuation lines?
|
||||||
|
cfg.Section("advance").Key("lots_of_lines").String() // 1 2 3 4
|
||||||
|
```
|
||||||
|
|
||||||
|
可是我有时候觉得两行连在一起特别没劲,怎么才能不自动连接两行呢?
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg, err := ini.LoadSources(ini.LoadOptions{
|
||||||
|
IgnoreContinuation: true,
|
||||||
|
}, "filename")
|
||||||
|
```
|
||||||
|
|
||||||
|
哇靠给力啊!
|
||||||
|
|
||||||
|
需要注意的是,值两侧的单引号会被自动剔除:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
foo = "some value" // foo: some value
|
||||||
|
bar = 'some value' // bar: some value
|
||||||
|
```
|
||||||
|
|
||||||
|
这就是全部了?哈哈,当然不是。
|
||||||
|
|
||||||
|
#### 操作键值的辅助方法
|
||||||
|
|
||||||
|
获取键值时设定候选值:
|
||||||
|
|
||||||
|
```go
|
||||||
|
v = cfg.Section("").Key("STRING").In("default", []string{"str", "arr", "types"})
|
||||||
|
v = cfg.Section("").Key("FLOAT64").InFloat64(1.1, []float64{1.25, 2.5, 3.75})
|
||||||
|
v = cfg.Section("").Key("INT").InInt(5, []int{10, 20, 30})
|
||||||
|
v = cfg.Section("").Key("INT64").InInt64(10, []int64{10, 20, 30})
|
||||||
|
v = cfg.Section("").Key("UINT").InUint(4, []int{3, 6, 9})
|
||||||
|
v = cfg.Section("").Key("UINT64").InUint64(8, []int64{3, 6, 9})
|
||||||
|
v = cfg.Section("").Key("TIME").InTimeFormat(time.RFC3339, time.Now(), []time.Time{time1, time2, time3})
|
||||||
|
v = cfg.Section("").Key("TIME").InTime(time.Now(), []time.Time{time1, time2, time3}) // RFC3339
|
||||||
|
```
|
||||||
|
|
||||||
|
如果获取到的值不是候选值的任意一个,则会返回默认值,而默认值不需要是候选值中的一员。
|
||||||
|
|
||||||
|
验证获取的值是否在指定范围内:
|
||||||
|
|
||||||
|
```go
|
||||||
|
vals = cfg.Section("").Key("FLOAT64").RangeFloat64(0.0, 1.1, 2.2)
|
||||||
|
vals = cfg.Section("").Key("INT").RangeInt(0, 10, 20)
|
||||||
|
vals = cfg.Section("").Key("INT64").RangeInt64(0, 10, 20)
|
||||||
|
vals = cfg.Section("").Key("UINT").RangeUint(0, 3, 9)
|
||||||
|
vals = cfg.Section("").Key("UINT64").RangeUint64(0, 3, 9)
|
||||||
|
vals = cfg.Section("").Key("TIME").RangeTimeFormat(time.RFC3339, time.Now(), minTime, maxTime)
|
||||||
|
vals = cfg.Section("").Key("TIME").RangeTime(time.Now(), minTime, maxTime) // RFC3339
|
||||||
|
```
|
||||||
|
|
||||||
|
##### 自动分割键值到切片(slice)
|
||||||
|
|
||||||
|
当存在无效输入时,使用零值代替:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4]
|
||||||
|
// Input: how, 2.2, are, you -> [0.0 2.2 0.0 0.0]
|
||||||
|
vals = cfg.Section("").Key("STRINGS").Strings(",")
|
||||||
|
vals = cfg.Section("").Key("FLOAT64S").Float64s(",")
|
||||||
|
vals = cfg.Section("").Key("INTS").Ints(",")
|
||||||
|
vals = cfg.Section("").Key("INT64S").Int64s(",")
|
||||||
|
vals = cfg.Section("").Key("UINTS").Uints(",")
|
||||||
|
vals = cfg.Section("").Key("UINT64S").Uint64s(",")
|
||||||
|
vals = cfg.Section("").Key("TIMES").Times(",")
|
||||||
|
```
|
||||||
|
|
||||||
|
从结果切片中剔除无效输入:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4]
|
||||||
|
// Input: how, 2.2, are, you -> [2.2]
|
||||||
|
vals = cfg.Section("").Key("FLOAT64S").ValidFloat64s(",")
|
||||||
|
vals = cfg.Section("").Key("INTS").ValidInts(",")
|
||||||
|
vals = cfg.Section("").Key("INT64S").ValidInt64s(",")
|
||||||
|
vals = cfg.Section("").Key("UINTS").ValidUints(",")
|
||||||
|
vals = cfg.Section("").Key("UINT64S").ValidUint64s(",")
|
||||||
|
vals = cfg.Section("").Key("TIMES").ValidTimes(",")
|
||||||
|
```
|
||||||
|
|
||||||
|
当存在无效输入时,直接返回错误:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Input: 1.1, 2.2, 3.3, 4.4 -> [1.1 2.2 3.3 4.4]
|
||||||
|
// Input: how, 2.2, are, you -> error
|
||||||
|
vals = cfg.Section("").Key("FLOAT64S").StrictFloat64s(",")
|
||||||
|
vals = cfg.Section("").Key("INTS").StrictInts(",")
|
||||||
|
vals = cfg.Section("").Key("INT64S").StrictInt64s(",")
|
||||||
|
vals = cfg.Section("").Key("UINTS").StrictUints(",")
|
||||||
|
vals = cfg.Section("").Key("UINT64S").StrictUint64s(",")
|
||||||
|
vals = cfg.Section("").Key("TIMES").StrictTimes(",")
|
||||||
|
```
|
||||||
|
|
||||||
|
### 保存配置
|
||||||
|
|
||||||
|
终于到了这个时刻,是时候保存一下配置了。
|
||||||
|
|
||||||
|
比较原始的做法是输出配置到某个文件:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// ...
|
||||||
|
err = cfg.SaveTo("my.ini")
|
||||||
|
err = cfg.SaveToIndent("my.ini", "\t")
|
||||||
|
```
|
||||||
|
|
||||||
|
另一个比较高级的做法是写入到任何实现 `io.Writer` 接口的对象中:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// ...
|
||||||
|
cfg.WriteTo(writer)
|
||||||
|
cfg.WriteToIndent(writer, "\t")
|
||||||
|
```
|
||||||
|
|
||||||
|
默认情况下,空格将被用于对齐键值之间的等号以美化输出结果,以下代码可以禁用该功能:
|
||||||
|
|
||||||
|
```go
|
||||||
|
ini.PrettyFormat = false
|
||||||
|
```
|
||||||
|
|
||||||
|
### 高级用法
|
||||||
|
|
||||||
|
#### 递归读取键值
|
||||||
|
|
||||||
|
在获取所有键值的过程中,特殊语法 `%(<name>)s` 会被应用,其中 `<name>` 可以是相同分区或者默认分区下的键名。字符串 `%(<name>)s` 会被相应的键值所替代,如果指定的键不存在,则会用空字符串替代。您可以最多使用 99 层的递归嵌套。
|
||||||
|
|
||||||
|
```ini
|
||||||
|
NAME = ini
|
||||||
|
|
||||||
|
[author]
|
||||||
|
NAME = Unknwon
|
||||||
|
GITHUB = https://github.com/%(NAME)s
|
||||||
|
|
||||||
|
[package]
|
||||||
|
FULL_NAME = github.com/go-ini/%(NAME)s
|
||||||
|
```
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg.Section("author").Key("GITHUB").String() // https://github.com/Unknwon
|
||||||
|
cfg.Section("package").Key("FULL_NAME").String() // github.com/go-ini/ini
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 读取父子分区
|
||||||
|
|
||||||
|
您可以在分区名称中使用 `.` 来表示两个或多个分区之间的父子关系。如果某个键在子分区中不存在,则会去它的父分区中再次寻找,直到没有父分区为止。
|
||||||
|
|
||||||
|
```ini
|
||||||
|
NAME = ini
|
||||||
|
VERSION = v1
|
||||||
|
IMPORT_PATH = gopkg.in/%(NAME)s.%(VERSION)s
|
||||||
|
|
||||||
|
[package]
|
||||||
|
CLONE_URL = https://%(IMPORT_PATH)s
|
||||||
|
|
||||||
|
[package.sub]
|
||||||
|
```
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg.Section("package.sub").Key("CLONE_URL").String() // https://gopkg.in/ini.v1
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 获取上级父分区下的所有键名
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg.Section("package.sub").ParentKeys() // ["CLONE_URL"]
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 读取自增键名
|
||||||
|
|
||||||
|
如果数据源中的键名为 `-`,则认为该键使用了自增键名的特殊语法。计数器从 1 开始,并且分区之间是相互独立的。
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[features]
|
||||||
|
-: Support read/write comments of keys and sections
|
||||||
|
-: Support auto-increment of key names
|
||||||
|
-: Support load multiple files to overwrite key values
|
||||||
|
```
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg.Section("features").KeyStrings() // []{"#1", "#2", "#3"}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 映射到结构
|
||||||
|
|
||||||
|
想要使用更加面向对象的方式玩转 INI 吗?好主意。
|
||||||
|
|
||||||
|
```ini
|
||||||
|
Name = Unknwon
|
||||||
|
age = 21
|
||||||
|
Male = true
|
||||||
|
Born = 1993-01-01T20:17:05Z
|
||||||
|
|
||||||
|
[Note]
|
||||||
|
Content = Hi is a good man!
|
||||||
|
Cities = HangZhou, Boston
|
||||||
|
```
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Note struct {
|
||||||
|
Content string
|
||||||
|
Cities []string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Person struct {
|
||||||
|
Name string
|
||||||
|
Age int `ini:"age"`
|
||||||
|
Male bool
|
||||||
|
Born time.Time
|
||||||
|
Note
|
||||||
|
Created time.Time `ini:"-"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
cfg, err := ini.Load("path/to/ini")
|
||||||
|
// ...
|
||||||
|
p := new(Person)
|
||||||
|
err = cfg.MapTo(p)
|
||||||
|
// ...
|
||||||
|
|
||||||
|
// 一切竟可以如此的简单。
|
||||||
|
err = ini.MapTo(p, "path/to/ini")
|
||||||
|
// ...
|
||||||
|
|
||||||
|
// 嗯哼?只需要映射一个分区吗?
|
||||||
|
n := new(Note)
|
||||||
|
err = cfg.Section("Note").MapTo(n)
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
结构的字段怎么设置默认值呢?很简单,只要在映射之前对指定字段进行赋值就可以了。如果键未找到或者类型错误,该值不会发生改变。
|
||||||
|
|
||||||
|
```go
|
||||||
|
// ...
|
||||||
|
p := &Person{
|
||||||
|
Name: "Joe",
|
||||||
|
}
|
||||||
|
// ...
|
||||||
|
```
|
||||||
|
|
||||||
|
这样玩 INI 真的好酷啊!然而,如果不能还给我原来的配置文件,有什么卵用?
|
||||||
|
|
||||||
|
### 从结构反射
|
||||||
|
|
||||||
|
可是,我有说不能吗?
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Embeded struct {
|
||||||
|
Dates []time.Time `delim:"|"`
|
||||||
|
Places []string `ini:"places,omitempty"`
|
||||||
|
None []int `ini:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Author struct {
|
||||||
|
Name string `ini:"NAME"`
|
||||||
|
Male bool
|
||||||
|
Age int
|
||||||
|
GPA float64
|
||||||
|
NeverMind string `ini:"-"`
|
||||||
|
*Embeded
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
a := &Author{"Unknwon", true, 21, 2.8, "",
|
||||||
|
&Embeded{
|
||||||
|
[]time.Time{time.Now(), time.Now()},
|
||||||
|
[]string{"HangZhou", "Boston"},
|
||||||
|
[]int{},
|
||||||
|
}}
|
||||||
|
cfg := ini.Empty()
|
||||||
|
err = ini.ReflectFrom(cfg, a)
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
瞧瞧,奇迹发生了。
|
||||||
|
|
||||||
|
```ini
|
||||||
|
NAME = Unknwon
|
||||||
|
Male = true
|
||||||
|
Age = 21
|
||||||
|
GPA = 2.8
|
||||||
|
|
||||||
|
[Embeded]
|
||||||
|
Dates = 2015-08-07T22:14:22+08:00|2015-08-07T22:14:22+08:00
|
||||||
|
places = HangZhou,Boston
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 名称映射器(Name Mapper)
|
||||||
|
|
||||||
|
为了节省您的时间并简化代码,本库支持类型为 [`NameMapper`](https://gowalker.org/gopkg.in/ini.v1#NameMapper) 的名称映射器,该映射器负责结构字段名与分区名和键名之间的映射。
|
||||||
|
|
||||||
|
目前有 2 款内置的映射器:
|
||||||
|
|
||||||
|
- `AllCapsUnderscore`:该映射器将字段名转换至格式 `ALL_CAPS_UNDERSCORE` 后再去匹配分区名和键名。
|
||||||
|
- `TitleUnderscore`:该映射器将字段名转换至格式 `title_underscore` 后再去匹配分区名和键名。
|
||||||
|
|
||||||
|
使用方法:
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Info struct{
|
||||||
|
PackageName string
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
err = ini.MapToWithMapper(&Info{}, ini.TitleUnderscore, []byte("package_name=ini"))
|
||||||
|
// ...
|
||||||
|
|
||||||
|
cfg, err := ini.Load([]byte("PACKAGE_NAME=ini"))
|
||||||
|
// ...
|
||||||
|
info := new(Info)
|
||||||
|
cfg.NameMapper = ini.AllCapsUnderscore
|
||||||
|
err = cfg.MapTo(info)
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
使用函数 `ini.ReflectFromWithMapper` 时也可应用相同的规则。
|
||||||
|
|
||||||
|
#### 值映射器(Value Mapper)
|
||||||
|
|
||||||
|
值映射器允许使用一个自定义函数自动展开值的具体内容,例如:运行时获取环境变量:
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Env struct {
|
||||||
|
Foo string `ini:"foo"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
cfg, err := ini.Load([]byte("[env]\nfoo = ${MY_VAR}\n")
|
||||||
|
cfg.ValueMapper = os.ExpandEnv
|
||||||
|
// ...
|
||||||
|
env := &Env{}
|
||||||
|
err = cfg.Section("env").MapTo(env)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
本例中,`env.Foo` 将会是运行时所获取到环境变量 `MY_VAR` 的值。
|
||||||
|
|
||||||
|
#### 映射/反射的其它说明
|
||||||
|
|
||||||
|
任何嵌入的结构都会被默认认作一个不同的分区,并且不会自动产生所谓的父子分区关联:
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Child struct {
|
||||||
|
Age string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Parent struct {
|
||||||
|
Name string
|
||||||
|
Child
|
||||||
|
}
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
City string
|
||||||
|
Parent
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
示例配置文件:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
City = Boston
|
||||||
|
|
||||||
|
[Parent]
|
||||||
|
Name = Unknwon
|
||||||
|
|
||||||
|
[Child]
|
||||||
|
Age = 21
|
||||||
|
```
|
||||||
|
|
||||||
|
很好,但是,我就是要嵌入结构也在同一个分区。好吧,你爹是李刚!
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Child struct {
|
||||||
|
Age string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Parent struct {
|
||||||
|
Name string
|
||||||
|
Child `ini:"Parent"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
City string
|
||||||
|
Parent
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
示例配置文件:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
City = Boston
|
||||||
|
|
||||||
|
[Parent]
|
||||||
|
Name = Unknwon
|
||||||
|
Age = 21
|
||||||
|
```
|
||||||
|
|
||||||
|
## 获取帮助
|
||||||
|
|
||||||
|
- [API 文档](https://gowalker.org/gopkg.in/ini.v1)
|
||||||
|
- [创建工单](https://github.com/go-ini/ini/issues/new)
|
||||||
|
|
||||||
|
## 常见问题
|
||||||
|
|
||||||
|
### 字段 `BlockMode` 是什么?
|
||||||
|
|
||||||
|
默认情况下,本库会在您进行读写操作时采用锁机制来确保数据时间。但在某些情况下,您非常确定只进行读操作。此时,您可以通过设置 `cfg.BlockMode = false` 来将读操作提升大约 **50-70%** 的性能。
|
||||||
|
|
||||||
|
### 为什么要写另一个 INI 解析库?
|
||||||
|
|
||||||
|
许多人都在使用我的 [goconfig](https://github.com/Unknwon/goconfig) 来完成对 INI 文件的操作,但我希望使用更加 Go 风格的代码。并且当您设置 `cfg.BlockMode = false` 时,会有大约 **10-30%** 的性能提升。
|
||||||
|
|
||||||
|
为了做出这些改变,我必须对 API 进行破坏,所以新开一个仓库是最安全的做法。除此之外,本库直接使用 `gopkg.in` 来进行版本化发布。(其实真相是导入路径更短了)
|
199
vendor/github.com/golang/protobuf/README.md
generated
vendored
Normal file
199
vendor/github.com/golang/protobuf/README.md
generated
vendored
Normal file
|
@ -0,0 +1,199 @@
|
||||||
|
# Go support for Protocol Buffers
|
||||||
|
|
||||||
|
Google's data interchange format.
|
||||||
|
Copyright 2010 The Go Authors.
|
||||||
|
https://github.com/golang/protobuf
|
||||||
|
|
||||||
|
This package and the code it generates requires at least Go 1.4.
|
||||||
|
|
||||||
|
This software implements Go bindings for protocol buffers. For
|
||||||
|
information about protocol buffers themselves, see
|
||||||
|
https://developers.google.com/protocol-buffers/
|
||||||
|
|
||||||
|
## Installation ##
|
||||||
|
|
||||||
|
To use this software, you must:
|
||||||
|
- Install the standard C++ implementation of protocol buffers from
|
||||||
|
https://developers.google.com/protocol-buffers/
|
||||||
|
- Of course, install the Go compiler and tools from
|
||||||
|
https://golang.org/
|
||||||
|
See
|
||||||
|
https://golang.org/doc/install
|
||||||
|
for details or, if you are using gccgo, follow the instructions at
|
||||||
|
https://golang.org/doc/install/gccgo
|
||||||
|
- Grab the code from the repository and install the proto package.
|
||||||
|
The simplest way is to run `go get -u github.com/golang/protobuf/{proto,protoc-gen-go}`.
|
||||||
|
The compiler plugin, protoc-gen-go, will be installed in $GOBIN,
|
||||||
|
defaulting to $GOPATH/bin. It must be in your $PATH for the protocol
|
||||||
|
compiler, protoc, to find it.
|
||||||
|
|
||||||
|
This software has two parts: a 'protocol compiler plugin' that
|
||||||
|
generates Go source files that, once compiled, can access and manage
|
||||||
|
protocol buffers; and a library that implements run-time support for
|
||||||
|
encoding (marshaling), decoding (unmarshaling), and accessing protocol
|
||||||
|
buffers.
|
||||||
|
|
||||||
|
There is support for gRPC in Go using protocol buffers.
|
||||||
|
See the note at the bottom of this file for details.
|
||||||
|
|
||||||
|
There are no insertion points in the plugin.
|
||||||
|
|
||||||
|
|
||||||
|
## Using protocol buffers with Go ##
|
||||||
|
|
||||||
|
Once the software is installed, there are two steps to using it.
|
||||||
|
First you must compile the protocol buffer definitions and then import
|
||||||
|
them, with the support library, into your program.
|
||||||
|
|
||||||
|
To compile the protocol buffer definition, run protoc with the --go_out
|
||||||
|
parameter set to the directory you want to output the Go code to.
|
||||||
|
|
||||||
|
protoc --go_out=. *.proto
|
||||||
|
|
||||||
|
The generated files will be suffixed .pb.go. See the Test code below
|
||||||
|
for an example using such a file.
|
||||||
|
|
||||||
|
|
||||||
|
The package comment for the proto library contains text describing
|
||||||
|
the interface provided in Go for protocol buffers. Here is an edited
|
||||||
|
version.
|
||||||
|
|
||||||
|
==========
|
||||||
|
|
||||||
|
The proto package converts data structures to and from the
|
||||||
|
wire format of protocol buffers. It works in concert with the
|
||||||
|
Go source code generated for .proto files by the protocol compiler.
|
||||||
|
|
||||||
|
A summary of the properties of the protocol buffer interface
|
||||||
|
for a protocol buffer variable v:
|
||||||
|
|
||||||
|
- Names are turned from camel_case to CamelCase for export.
|
||||||
|
- There are no methods on v to set fields; just treat
|
||||||
|
them as structure fields.
|
||||||
|
- There are getters that return a field's value if set,
|
||||||
|
and return the field's default value if unset.
|
||||||
|
The getters work even if the receiver is a nil message.
|
||||||
|
- The zero value for a struct is its correct initialization state.
|
||||||
|
All desired fields must be set before marshaling.
|
||||||
|
- A Reset() method will restore a protobuf struct to its zero state.
|
||||||
|
- Non-repeated fields are pointers to the values; nil means unset.
|
||||||
|
That is, optional or required field int32 f becomes F *int32.
|
||||||
|
- Repeated fields are slices.
|
||||||
|
- Helper functions are available to aid the setting of fields.
|
||||||
|
Helpers for getting values are superseded by the
|
||||||
|
GetFoo methods and their use is deprecated.
|
||||||
|
msg.Foo = proto.String("hello") // set field
|
||||||
|
- Constants are defined to hold the default values of all fields that
|
||||||
|
have them. They have the form Default_StructName_FieldName.
|
||||||
|
Because the getter methods handle defaulted values,
|
||||||
|
direct use of these constants should be rare.
|
||||||
|
- Enums are given type names and maps from names to values.
|
||||||
|
Enum values are prefixed with the enum's type name. Enum types have
|
||||||
|
a String method, and a Enum method to assist in message construction.
|
||||||
|
- Nested groups and enums have type names prefixed with the name of
|
||||||
|
the surrounding message type.
|
||||||
|
- Extensions are given descriptor names that start with E_,
|
||||||
|
followed by an underscore-delimited list of the nested messages
|
||||||
|
that contain it (if any) followed by the CamelCased name of the
|
||||||
|
extension field itself. HasExtension, ClearExtension, GetExtension
|
||||||
|
and SetExtension are functions for manipulating extensions.
|
||||||
|
- Oneof field sets are given a single field in their message,
|
||||||
|
with distinguished wrapper types for each possible field value.
|
||||||
|
- Marshal and Unmarshal are functions to encode and decode the wire format.
|
||||||
|
|
||||||
|
When the .proto file specifies `syntax="proto3"`, there are some differences:
|
||||||
|
|
||||||
|
- Non-repeated fields of non-message type are values instead of pointers.
|
||||||
|
- Getters are only generated for message and oneof fields.
|
||||||
|
- Enum types do not get an Enum method.
|
||||||
|
|
||||||
|
Consider file test.proto, containing
|
||||||
|
|
||||||
|
```proto
|
||||||
|
package example;
|
||||||
|
|
||||||
|
enum FOO { X = 17; };
|
||||||
|
|
||||||
|
message Test {
|
||||||
|
required string label = 1;
|
||||||
|
optional int32 type = 2 [default=77];
|
||||||
|
repeated int64 reps = 3;
|
||||||
|
optional group OptionalGroup = 4 {
|
||||||
|
required string RequiredField = 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
To create and play with a Test object from the example package,
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"github.com/golang/protobuf/proto"
|
||||||
|
"path/to/example"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
test := &example.Test {
|
||||||
|
Label: proto.String("hello"),
|
||||||
|
Type: proto.Int32(17),
|
||||||
|
Reps: []int64{1, 2, 3},
|
||||||
|
Optionalgroup: &example.Test_OptionalGroup {
|
||||||
|
RequiredField: proto.String("good bye"),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
data, err := proto.Marshal(test)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("marshaling error: ", err)
|
||||||
|
}
|
||||||
|
newTest := &example.Test{}
|
||||||
|
err = proto.Unmarshal(data, newTest)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("unmarshaling error: ", err)
|
||||||
|
}
|
||||||
|
// Now test and newTest contain the same data.
|
||||||
|
if test.GetLabel() != newTest.GetLabel() {
|
||||||
|
log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel())
|
||||||
|
}
|
||||||
|
// etc.
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Parameters ##
|
||||||
|
|
||||||
|
To pass extra parameters to the plugin, use a comma-separated
|
||||||
|
parameter list separated from the output directory by a colon:
|
||||||
|
|
||||||
|
|
||||||
|
protoc --go_out=plugins=grpc,import_path=mypackage:. *.proto
|
||||||
|
|
||||||
|
|
||||||
|
- `import_prefix=xxx` - a prefix that is added onto the beginning of
|
||||||
|
all imports. Useful for things like generating protos in a
|
||||||
|
subdirectory, or regenerating vendored protobufs in-place.
|
||||||
|
- `import_path=foo/bar` - used as the package if no input files
|
||||||
|
declare `go_package`. If it contains slashes, everything up to the
|
||||||
|
rightmost slash is ignored.
|
||||||
|
- `plugins=plugin1+plugin2` - specifies the list of sub-plugins to
|
||||||
|
load. The only plugin in this repo is `grpc`.
|
||||||
|
- `Mfoo/bar.proto=quux/shme` - declares that foo/bar.proto is
|
||||||
|
associated with Go package quux/shme. This is subject to the
|
||||||
|
import_prefix parameter.
|
||||||
|
|
||||||
|
## gRPC Support ##
|
||||||
|
|
||||||
|
If a proto file specifies RPC services, protoc-gen-go can be instructed to
|
||||||
|
generate code compatible with gRPC (http://www.grpc.io/). To do this, pass
|
||||||
|
the `plugins` parameter to protoc-gen-go; the usual way is to insert it into
|
||||||
|
the --go_out argument to protoc:
|
||||||
|
|
||||||
|
protoc --go_out=plugins=grpc:. *.proto
|
||||||
|
|
||||||
|
## Plugins ##
|
||||||
|
|
||||||
|
The `protoc-gen-go/generator` package exposes a plugin interface,
|
||||||
|
which is used by the gRPC code generation. This interface is not
|
||||||
|
supported and is subject to incompatible changes without notice.
|
7
vendor/github.com/gorilla/context/README.md
generated
vendored
Normal file
7
vendor/github.com/gorilla/context/README.md
generated
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
context
|
||||||
|
=======
|
||||||
|
[![Build Status](https://travis-ci.org/gorilla/context.png?branch=master)](https://travis-ci.org/gorilla/context)
|
||||||
|
|
||||||
|
gorilla/context is a general purpose registry for global request variables.
|
||||||
|
|
||||||
|
Read the full documentation here: http://www.gorillatoolkit.org/pkg/context
|
52
vendor/github.com/gorilla/handlers/README.md
generated
vendored
Normal file
52
vendor/github.com/gorilla/handlers/README.md
generated
vendored
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
gorilla/handlers
|
||||||
|
================
|
||||||
|
[![GoDoc](https://godoc.org/github.com/gorilla/handlers?status.svg)](https://godoc.org/github.com/gorilla/handlers) [![Build Status](https://travis-ci.org/gorilla/handlers.svg?branch=master)](https://travis-ci.org/gorilla/handlers)
|
||||||
|
|
||||||
|
Package handlers is a collection of handlers (aka "HTTP middleware") for use
|
||||||
|
with Go's `net/http` package (or any framework supporting `http.Handler`), including:
|
||||||
|
|
||||||
|
* `LoggingHandler` for logging HTTP requests in the Apache [Common Log
|
||||||
|
Format](http://httpd.apache.org/docs/2.2/logs.html#common).
|
||||||
|
* `CombinedLoggingHandler` for logging HTTP requests in the Apache [Combined Log
|
||||||
|
Format](http://httpd.apache.org/docs/2.2/logs.html#combined) commonly used by
|
||||||
|
both Apache and nginx.
|
||||||
|
* `CompressHandler` for gzipping responses.
|
||||||
|
* `ContentTypeHandler` for validating requests against a list of accepted
|
||||||
|
content types.
|
||||||
|
* `MethodHandler` for matching HTTP methods against handlers in a
|
||||||
|
`map[string]http.Handler`
|
||||||
|
* `ProxyHeaders` for populating `r.RemoteAddr` and `r.URL.Scheme` based on the
|
||||||
|
`X-Forwarded-For`, `X-Real-IP`, `X-Forwarded-Proto` and RFC7239 `Forwarded`
|
||||||
|
headers when running a Go server behind a HTTP reverse proxy.
|
||||||
|
* `CanonicalHost` for re-directing to the preferred host when handling multiple
|
||||||
|
domains (i.e. multiple CNAME aliases).
|
||||||
|
|
||||||
|
Other handlers are documented [on the Gorilla
|
||||||
|
website](http://www.gorillatoolkit.org/pkg/handlers).
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
A simple example using `handlers.LoggingHandler` and `handlers.CompressHandler`:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"github.com/gorilla/handlers"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
r := http.NewServeMux()
|
||||||
|
|
||||||
|
// Only log requests to our admin dashboard to stdout
|
||||||
|
r.Handle("/admin", handlers.LoggingHandler(os.Stdout, http.HandlerFunc(ShowAdminDashboard)))
|
||||||
|
r.HandleFunc("/", ShowIndex)
|
||||||
|
|
||||||
|
// Wrap our server with our gzip handler to gzip compress all responses.
|
||||||
|
http.ListenAndServe(":8000", handlers.CompressHandler(r))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
BSD licensed. See the included LICENSE file for details.
|
||||||
|
|
7
vendor/github.com/gorilla/mux/README.md
generated
vendored
Normal file
7
vendor/github.com/gorilla/mux/README.md
generated
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
mux
|
||||||
|
===
|
||||||
|
[![Build Status](https://travis-ci.org/gorilla/mux.png?branch=master)](https://travis-ci.org/gorilla/mux)
|
||||||
|
|
||||||
|
gorilla/mux is a powerful URL router and dispatcher.
|
||||||
|
|
||||||
|
Read the full documentation here: http://www.gorillatoolkit.org/pkg/mux
|
23
vendor/github.com/inconshreveable/mousetrap/README.md
generated
vendored
Normal file
23
vendor/github.com/inconshreveable/mousetrap/README.md
generated
vendored
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# mousetrap
|
||||||
|
|
||||||
|
mousetrap is a tiny library that answers a single question.
|
||||||
|
|
||||||
|
On a Windows machine, was the process invoked by someone double clicking on
|
||||||
|
the executable file while browsing in explorer?
|
||||||
|
|
||||||
|
### Motivation
|
||||||
|
|
||||||
|
Windows developers unfamiliar with command line tools will often "double-click"
|
||||||
|
the executable for a tool. Because most CLI tools print the help and then exit
|
||||||
|
when invoked without arguments, this is often very frustrating for those users.
|
||||||
|
|
||||||
|
mousetrap provides a way to detect these invocations so that you can provide
|
||||||
|
more helpful behavior and instructions on how to run the CLI tool. To see what
|
||||||
|
this looks like, both from an organizational and a technical perspective, see
|
||||||
|
https://inconshreveable.com/09-09-2014/sweat-the-small-stuff/
|
||||||
|
|
||||||
|
### The interface
|
||||||
|
|
||||||
|
The library exposes a single interface:
|
||||||
|
|
||||||
|
func StartedByExplorer() (bool)
|
7
vendor/github.com/jmespath/go-jmespath/README.md
generated
vendored
Normal file
7
vendor/github.com/jmespath/go-jmespath/README.md
generated
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# go-jmespath - A JMESPath implementation in Go
|
||||||
|
|
||||||
|
[![Build Status](https://img.shields.io/travis/jmespath/go-jmespath.svg)](https://travis-ci.org/jmespath/go-jmespath)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
See http://jmespath.org for more info.
|
154
vendor/github.com/miekg/dns/README.md
generated
vendored
Normal file
154
vendor/github.com/miekg/dns/README.md
generated
vendored
Normal file
|
@ -0,0 +1,154 @@
|
||||||
|
[![Build Status](https://travis-ci.org/miekg/dns.svg?branch=master)](https://travis-ci.org/miekg/dns) [![](https://godoc.org/github.com/miekg/dns?status.svg)](https://godoc.org/github.com/miekg/dns)
|
||||||
|
|
||||||
|
# Alternative (more granular) approach to a DNS library
|
||||||
|
|
||||||
|
> Less is more.
|
||||||
|
|
||||||
|
Complete and usable DNS library. All widely used Resource Records are
|
||||||
|
supported, including the DNSSEC types. It follows a lean and mean philosophy.
|
||||||
|
If there is stuff you should know as a DNS programmer there isn't a convenience
|
||||||
|
function for it. Server side and client side programming is supported, i.e. you
|
||||||
|
can build servers and resolvers with it.
|
||||||
|
|
||||||
|
We try to keep the "master" branch as sane as possible and at the bleeding edge
|
||||||
|
of standards, avoiding breaking changes wherever reasonable. We support the last
|
||||||
|
two versions of Go, currently: 1.5 and 1.6.
|
||||||
|
|
||||||
|
# Goals
|
||||||
|
|
||||||
|
* KISS;
|
||||||
|
* Fast;
|
||||||
|
* Small API, if its easy to code in Go, don't make a function for it.
|
||||||
|
|
||||||
|
# Users
|
||||||
|
|
||||||
|
A not-so-up-to-date-list-that-may-be-actually-current:
|
||||||
|
|
||||||
|
* https://cloudflare.com
|
||||||
|
* https://github.com/abh/geodns
|
||||||
|
* http://www.statdns.com/
|
||||||
|
* http://www.dnsinspect.com/
|
||||||
|
* https://github.com/chuangbo/jianbing-dictionary-dns
|
||||||
|
* http://www.dns-lg.com/
|
||||||
|
* https://github.com/fcambus/rrda
|
||||||
|
* https://github.com/kenshinx/godns
|
||||||
|
* https://github.com/skynetservices/skydns
|
||||||
|
* https://github.com/hashicorp/consul
|
||||||
|
* https://github.com/DevelopersPL/godnsagent
|
||||||
|
* https://github.com/duedil-ltd/discodns
|
||||||
|
* https://github.com/StalkR/dns-reverse-proxy
|
||||||
|
* https://github.com/tianon/rawdns
|
||||||
|
* https://mesosphere.github.io/mesos-dns/
|
||||||
|
* https://pulse.turbobytes.com/
|
||||||
|
* https://play.google.com/store/apps/details?id=com.turbobytes.dig
|
||||||
|
* https://github.com/fcambus/statzone
|
||||||
|
* https://github.com/benschw/dns-clb-go
|
||||||
|
* https://github.com/corny/dnscheck for http://public-dns.info/
|
||||||
|
* https://namesmith.io
|
||||||
|
* https://github.com/miekg/unbound
|
||||||
|
* https://github.com/miekg/exdns
|
||||||
|
* https://dnslookup.org
|
||||||
|
* https://github.com/looterz/grimd
|
||||||
|
* https://github.com/phamhongviet/serf-dns
|
||||||
|
* https://github.com/mehrdadrad/mylg
|
||||||
|
* https://github.com/bamarni/dockness
|
||||||
|
* https://github.com/fffaraz/microdns
|
||||||
|
|
||||||
|
Send pull request if you want to be listed here.
|
||||||
|
|
||||||
|
# Features
|
||||||
|
|
||||||
|
* UDP/TCP queries, IPv4 and IPv6;
|
||||||
|
* RFC 1035 zone file parsing ($INCLUDE, $ORIGIN, $TTL and $GENERATE (for all record types) are supported;
|
||||||
|
* Fast:
|
||||||
|
* Reply speed around ~ 80K qps (faster hardware results in more qps);
|
||||||
|
* Parsing RRs ~ 100K RR/s, that's 5M records in about 50 seconds;
|
||||||
|
* Server side programming (mimicking the net/http package);
|
||||||
|
* Client side programming;
|
||||||
|
* DNSSEC: signing, validating and key generation for DSA, RSA and ECDSA;
|
||||||
|
* EDNS0, NSID, Cookies;
|
||||||
|
* AXFR/IXFR;
|
||||||
|
* TSIG, SIG(0);
|
||||||
|
* DNS over TLS: optional encrypted connection between client and server;
|
||||||
|
* DNS name compression;
|
||||||
|
* Depends only on the standard library.
|
||||||
|
|
||||||
|
Have fun!
|
||||||
|
|
||||||
|
Miek Gieben - 2010-2012 - <miek@miek.nl>
|
||||||
|
|
||||||
|
# Building
|
||||||
|
|
||||||
|
Building is done with the `go` tool. If you have setup your GOPATH
|
||||||
|
correctly, the following should work:
|
||||||
|
|
||||||
|
go get github.com/miekg/dns
|
||||||
|
go build github.com/miekg/dns
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
A short "how to use the API" is at the beginning of doc.go (this also will show
|
||||||
|
when you call `godoc github.com/miekg/dns`).
|
||||||
|
|
||||||
|
Example programs can be found in the `github.com/miekg/exdns` repository.
|
||||||
|
|
||||||
|
## Supported RFCs
|
||||||
|
|
||||||
|
*all of them*
|
||||||
|
|
||||||
|
* 103{4,5} - DNS standard
|
||||||
|
* 1348 - NSAP record (removed the record)
|
||||||
|
* 1982 - Serial Arithmetic
|
||||||
|
* 1876 - LOC record
|
||||||
|
* 1995 - IXFR
|
||||||
|
* 1996 - DNS notify
|
||||||
|
* 2136 - DNS Update (dynamic updates)
|
||||||
|
* 2181 - RRset definition - there is no RRset type though, just []RR
|
||||||
|
* 2537 - RSAMD5 DNS keys
|
||||||
|
* 2065 - DNSSEC (updated in later RFCs)
|
||||||
|
* 2671 - EDNS record
|
||||||
|
* 2782 - SRV record
|
||||||
|
* 2845 - TSIG record
|
||||||
|
* 2915 - NAPTR record
|
||||||
|
* 2929 - DNS IANA Considerations
|
||||||
|
* 3110 - RSASHA1 DNS keys
|
||||||
|
* 3225 - DO bit (DNSSEC OK)
|
||||||
|
* 340{1,2,3} - NAPTR record
|
||||||
|
* 3445 - Limiting the scope of (DNS)KEY
|
||||||
|
* 3597 - Unknown RRs
|
||||||
|
* 403{3,4,5} - DNSSEC + validation functions
|
||||||
|
* 4255 - SSHFP record
|
||||||
|
* 4343 - Case insensitivity
|
||||||
|
* 4408 - SPF record
|
||||||
|
* 4509 - SHA256 Hash in DS
|
||||||
|
* 4592 - Wildcards in the DNS
|
||||||
|
* 4635 - HMAC SHA TSIG
|
||||||
|
* 4701 - DHCID
|
||||||
|
* 4892 - id.server
|
||||||
|
* 5001 - NSID
|
||||||
|
* 5155 - NSEC3 record
|
||||||
|
* 5205 - HIP record
|
||||||
|
* 5702 - SHA2 in the DNS
|
||||||
|
* 5936 - AXFR
|
||||||
|
* 5966 - TCP implementation recommendations
|
||||||
|
* 6605 - ECDSA
|
||||||
|
* 6725 - IANA Registry Update
|
||||||
|
* 6742 - ILNP DNS
|
||||||
|
* 6840 - Clarifications and Implementation Notes for DNS Security
|
||||||
|
* 6844 - CAA record
|
||||||
|
* 6891 - EDNS0 update
|
||||||
|
* 6895 - DNS IANA considerations
|
||||||
|
* 6975 - Algorithm Understanding in DNSSEC
|
||||||
|
* 7043 - EUI48/EUI64 records
|
||||||
|
* 7314 - DNS (EDNS) EXPIRE Option
|
||||||
|
* 7553 - URI record
|
||||||
|
* 7858 - DNS over TLS: Initiation and Performance Considerations (draft)
|
||||||
|
* 7873 - Domain Name System (DNS) Cookies (draft-ietf-dnsop-cookies)
|
||||||
|
* xxxx - EDNS0 DNS Update Lease (draft)
|
||||||
|
|
||||||
|
## Loosely based upon
|
||||||
|
|
||||||
|
* `ldns`
|
||||||
|
* `NSD`
|
||||||
|
* `Net::DNS`
|
||||||
|
* `GRONG`
|
46
vendor/github.com/mitchellh/mapstructure/README.md
generated
vendored
Normal file
46
vendor/github.com/mitchellh/mapstructure/README.md
generated
vendored
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
# mapstructure
|
||||||
|
|
||||||
|
mapstructure is a Go library for decoding generic map values to structures
|
||||||
|
and vice versa, while providing helpful error handling.
|
||||||
|
|
||||||
|
This library is most useful when decoding values from some data stream (JSON,
|
||||||
|
Gob, etc.) where you don't _quite_ know the structure of the underlying data
|
||||||
|
until you read a part of it. You can therefore read a `map[string]interface{}`
|
||||||
|
and use this library to decode it into the proper underlying native Go
|
||||||
|
structure.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Standard `go get`:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ go get github.com/mitchellh/mapstructure
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage & Example
|
||||||
|
|
||||||
|
For usage and examples see the [Godoc](http://godoc.org/github.com/mitchellh/mapstructure).
|
||||||
|
|
||||||
|
The `Decode` function has examples associated with it there.
|
||||||
|
|
||||||
|
## But Why?!
|
||||||
|
|
||||||
|
Go offers fantastic standard libraries for decoding formats such as JSON.
|
||||||
|
The standard method is to have a struct pre-created, and populate that struct
|
||||||
|
from the bytes of the encoded format. This is great, but the problem is if
|
||||||
|
you have configuration or an encoding that changes slightly depending on
|
||||||
|
specific fields. For example, consider this JSON:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"type": "person",
|
||||||
|
"name": "Mitchell"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Perhaps we can't populate a specific structure without first reading
|
||||||
|
the "type" field from the JSON. We could always do two passes over the
|
||||||
|
decoding of the JSON (reading the "type" first, and the rest later).
|
||||||
|
However, it is much simpler to just decode this into a `map[string]interface{}`
|
||||||
|
structure, read the "type" key, then use something like this library
|
||||||
|
to decode it into the proper structure.
|
140
vendor/github.com/ncw/swift/README.md
generated
vendored
Normal file
140
vendor/github.com/ncw/swift/README.md
generated
vendored
Normal file
|
@ -0,0 +1,140 @@
|
||||||
|
Swift
|
||||||
|
=====
|
||||||
|
|
||||||
|
This package provides an easy to use library for interfacing with
|
||||||
|
Swift / Openstack Object Storage / Rackspace cloud files from the Go
|
||||||
|
Language
|
||||||
|
|
||||||
|
See here for package docs
|
||||||
|
|
||||||
|
http://godoc.org/github.com/ncw/swift
|
||||||
|
|
||||||
|
[![Build Status](https://api.travis-ci.org/ncw/swift.svg?branch=master)](https://travis-ci.org/ncw/swift) [![GoDoc](https://godoc.org/github.com/ncw/swift?status.svg)](https://godoc.org/github.com/ncw/swift)
|
||||||
|
|
||||||
|
Install
|
||||||
|
-------
|
||||||
|
|
||||||
|
Use go to install the library
|
||||||
|
|
||||||
|
go get github.com/ncw/swift
|
||||||
|
|
||||||
|
Usage
|
||||||
|
-----
|
||||||
|
|
||||||
|
See here for full package docs
|
||||||
|
|
||||||
|
- http://godoc.org/github.com/ncw/swift
|
||||||
|
|
||||||
|
Here is a short example from the docs
|
||||||
|
|
||||||
|
import "github.com/ncw/swift"
|
||||||
|
|
||||||
|
// Create a connection
|
||||||
|
c := swift.Connection{
|
||||||
|
UserName: "user",
|
||||||
|
ApiKey: "key",
|
||||||
|
AuthUrl: "auth_url",
|
||||||
|
Domain: "domain", // Name of the domain (v3 auth only)
|
||||||
|
Tenant: "tenant", // Name of the tenant (v2 auth only)
|
||||||
|
}
|
||||||
|
// Authenticate
|
||||||
|
err := c.Authenticate()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
// List all the containers
|
||||||
|
containers, err := c.ContainerNames(nil)
|
||||||
|
fmt.Println(containers)
|
||||||
|
// etc...
|
||||||
|
|
||||||
|
Additions
|
||||||
|
---------
|
||||||
|
|
||||||
|
The `rs` sub project contains a wrapper for the Rackspace specific CDN Management interface.
|
||||||
|
|
||||||
|
Testing
|
||||||
|
-------
|
||||||
|
|
||||||
|
To run the tests you can either use an embedded fake Swift server
|
||||||
|
either use a real Openstack Swift server or a Rackspace Cloud files account.
|
||||||
|
|
||||||
|
When using a real Swift server, you need to set these environment variables
|
||||||
|
before running the tests
|
||||||
|
|
||||||
|
export SWIFT_API_USER='user'
|
||||||
|
export SWIFT_API_KEY='key'
|
||||||
|
export SWIFT_AUTH_URL='https://url.of.auth.server/v1.0'
|
||||||
|
|
||||||
|
And optionally these if using v2 authentication
|
||||||
|
|
||||||
|
export SWIFT_TENANT='TenantName'
|
||||||
|
export SWIFT_TENANT_ID='TenantId'
|
||||||
|
|
||||||
|
And optionally these if using v3 authentication
|
||||||
|
|
||||||
|
export SWIFT_TENANT='TenantName'
|
||||||
|
export SWIFT_TENANT_ID='TenantId'
|
||||||
|
export SWIFT_API_DOMAIN_ID='domain id'
|
||||||
|
export SWIFT_API_DOMAIN='domain name'
|
||||||
|
|
||||||
|
And optionally these if using v3 trust
|
||||||
|
|
||||||
|
export SWIFT_TRUST_ID='TrustId'
|
||||||
|
|
||||||
|
And optionally this if you want to skip server certificate validation
|
||||||
|
|
||||||
|
export SWIFT_AUTH_INSECURE=1
|
||||||
|
|
||||||
|
And optionally this to configure the connect channel timeout, in seconds
|
||||||
|
|
||||||
|
export SWIFT_CONNECTION_CHANNEL_TIMEOUT=60
|
||||||
|
|
||||||
|
And optionally this to configure the data channel timeout, in seconds
|
||||||
|
|
||||||
|
export SWIFT_DATA_CHANNEL_TIMEOUT=60
|
||||||
|
|
||||||
|
Then run the tests with `go test`
|
||||||
|
|
||||||
|
License
|
||||||
|
-------
|
||||||
|
|
||||||
|
This is free software under the terms of MIT license (check COPYING file
|
||||||
|
included in this package).
|
||||||
|
|
||||||
|
Contact and support
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
The project website is at:
|
||||||
|
|
||||||
|
- https://github.com/ncw/swift
|
||||||
|
|
||||||
|
There you can file bug reports, ask for help or contribute patches.
|
||||||
|
|
||||||
|
Authors
|
||||||
|
-------
|
||||||
|
|
||||||
|
- Nick Craig-Wood <nick@craig-wood.com>
|
||||||
|
|
||||||
|
Contributors
|
||||||
|
------------
|
||||||
|
|
||||||
|
- Brian "bojo" Jones <mojobojo@gmail.com>
|
||||||
|
- Janika Liiv <janika@toggl.com>
|
||||||
|
- Yamamoto, Hirotaka <ymmt2005@gmail.com>
|
||||||
|
- Stephen <yo@groks.org>
|
||||||
|
- platformpurple <stephen@platformpurple.com>
|
||||||
|
- Paul Querna <pquerna@apache.org>
|
||||||
|
- Livio Soares <liviobs@gmail.com>
|
||||||
|
- thesyncim <thesyncim@gmail.com>
|
||||||
|
- lsowen <lsowen@s1network.com>
|
||||||
|
- Sylvain Baubeau <sbaubeau@redhat.com>
|
||||||
|
- Chris Kastorff <encryptio@gmail.com>
|
||||||
|
- Dai HaoJun <haojun.dai@hp.com>
|
||||||
|
- Hua Wang <wanghua.humble@gmail.com>
|
||||||
|
- Fabian Ruff <fabian@progra.de>
|
||||||
|
- Arturo Reuschenbach Puncernau <reuschenbach@gmail.com>
|
||||||
|
- Petr Kotek <petr.kotek@bigcommerce.com>
|
||||||
|
- Stefan Majewsky <stefan.majewsky@sap.com>
|
||||||
|
- Cezar Sa Espinola <cezarsa@gmail.com>
|
||||||
|
- Sam Gunaratne <samgzeit@gmail.com>
|
||||||
|
- Richard Scothern <richard.scothern@gmail.com>
|
191
vendor/github.com/opencontainers/go-digest/LICENSE.code
generated
vendored
Normal file
191
vendor/github.com/opencontainers/go-digest/LICENSE.code
generated
vendored
Normal file
|
@ -0,0 +1,191 @@
|
||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
https://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
Copyright 2016 Docker, Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
425
vendor/github.com/opencontainers/go-digest/LICENSE.docs
generated
vendored
Normal file
425
vendor/github.com/opencontainers/go-digest/LICENSE.docs
generated
vendored
Normal file
|
@ -0,0 +1,425 @@
|
||||||
|
Attribution-ShareAlike 4.0 International
|
||||||
|
|
||||||
|
=======================================================================
|
||||||
|
|
||||||
|
Creative Commons Corporation ("Creative Commons") is not a law firm and
|
||||||
|
does not provide legal services or legal advice. Distribution of
|
||||||
|
Creative Commons public licenses does not create a lawyer-client or
|
||||||
|
other relationship. Creative Commons makes its licenses and related
|
||||||
|
information available on an "as-is" basis. Creative Commons gives no
|
||||||
|
warranties regarding its licenses, any material licensed under their
|
||||||
|
terms and conditions, or any related information. Creative Commons
|
||||||
|
disclaims all liability for damages resulting from their use to the
|
||||||
|
fullest extent possible.
|
||||||
|
|
||||||
|
Using Creative Commons Public Licenses
|
||||||
|
|
||||||
|
Creative Commons public licenses provide a standard set of terms and
|
||||||
|
conditions that creators and other rights holders may use to share
|
||||||
|
original works of authorship and other material subject to copyright
|
||||||
|
and certain other rights specified in the public license below. The
|
||||||
|
following considerations are for informational purposes only, are not
|
||||||
|
exhaustive, and do not form part of our licenses.
|
||||||
|
|
||||||
|
Considerations for licensors: Our public licenses are
|
||||||
|
intended for use by those authorized to give the public
|
||||||
|
permission to use material in ways otherwise restricted by
|
||||||
|
copyright and certain other rights. Our licenses are
|
||||||
|
irrevocable. Licensors should read and understand the terms
|
||||||
|
and conditions of the license they choose before applying it.
|
||||||
|
Licensors should also secure all rights necessary before
|
||||||
|
applying our licenses so that the public can reuse the
|
||||||
|
material as expected. Licensors should clearly mark any
|
||||||
|
material not subject to the license. This includes other CC-
|
||||||
|
licensed material, or material used under an exception or
|
||||||
|
limitation to copyright. More considerations for licensors:
|
||||||
|
wiki.creativecommons.org/Considerations_for_licensors
|
||||||
|
|
||||||
|
Considerations for the public: By using one of our public
|
||||||
|
licenses, a licensor grants the public permission to use the
|
||||||
|
licensed material under specified terms and conditions. If
|
||||||
|
the licensor's permission is not necessary for any reason--for
|
||||||
|
example, because of any applicable exception or limitation to
|
||||||
|
copyright--then that use is not regulated by the license. Our
|
||||||
|
licenses grant only permissions under copyright and certain
|
||||||
|
other rights that a licensor has authority to grant. Use of
|
||||||
|
the licensed material may still be restricted for other
|
||||||
|
reasons, including because others have copyright or other
|
||||||
|
rights in the material. A licensor may make special requests,
|
||||||
|
such as asking that all changes be marked or described.
|
||||||
|
Although not required by our licenses, you are encouraged to
|
||||||
|
respect those requests where reasonable. More_considerations
|
||||||
|
for the public:
|
||||||
|
wiki.creativecommons.org/Considerations_for_licensees
|
||||||
|
|
||||||
|
=======================================================================
|
||||||
|
|
||||||
|
Creative Commons Attribution-ShareAlike 4.0 International Public
|
||||||
|
License
|
||||||
|
|
||||||
|
By exercising the Licensed Rights (defined below), You accept and agree
|
||||||
|
to be bound by the terms and conditions of this Creative Commons
|
||||||
|
Attribution-ShareAlike 4.0 International Public License ("Public
|
||||||
|
License"). To the extent this Public License may be interpreted as a
|
||||||
|
contract, You are granted the Licensed Rights in consideration of Your
|
||||||
|
acceptance of these terms and conditions, and the Licensor grants You
|
||||||
|
such rights in consideration of benefits the Licensor receives from
|
||||||
|
making the Licensed Material available under these terms and
|
||||||
|
conditions.
|
||||||
|
|
||||||
|
|
||||||
|
Section 1 -- Definitions.
|
||||||
|
|
||||||
|
a. Adapted Material means material subject to Copyright and Similar
|
||||||
|
Rights that is derived from or based upon the Licensed Material
|
||||||
|
and in which the Licensed Material is translated, altered,
|
||||||
|
arranged, transformed, or otherwise modified in a manner requiring
|
||||||
|
permission under the Copyright and Similar Rights held by the
|
||||||
|
Licensor. For purposes of this Public License, where the Licensed
|
||||||
|
Material is a musical work, performance, or sound recording,
|
||||||
|
Adapted Material is always produced where the Licensed Material is
|
||||||
|
synched in timed relation with a moving image.
|
||||||
|
|
||||||
|
b. Adapter's License means the license You apply to Your Copyright
|
||||||
|
and Similar Rights in Your contributions to Adapted Material in
|
||||||
|
accordance with the terms and conditions of this Public License.
|
||||||
|
|
||||||
|
c. BY-SA Compatible License means a license listed at
|
||||||
|
creativecommons.org/compatiblelicenses, approved by Creative
|
||||||
|
Commons as essentially the equivalent of this Public License.
|
||||||
|
|
||||||
|
d. Copyright and Similar Rights means copyright and/or similar rights
|
||||||
|
closely related to copyright including, without limitation,
|
||||||
|
performance, broadcast, sound recording, and Sui Generis Database
|
||||||
|
Rights, without regard to how the rights are labeled or
|
||||||
|
categorized. For purposes of this Public License, the rights
|
||||||
|
specified in Section 2(b)(1)-(2) are not Copyright and Similar
|
||||||
|
Rights.
|
||||||
|
|
||||||
|
e. Effective Technological Measures means those measures that, in the
|
||||||
|
absence of proper authority, may not be circumvented under laws
|
||||||
|
fulfilling obligations under Article 11 of the WIPO Copyright
|
||||||
|
Treaty adopted on December 20, 1996, and/or similar international
|
||||||
|
agreements.
|
||||||
|
|
||||||
|
f. Exceptions and Limitations means fair use, fair dealing, and/or
|
||||||
|
any other exception or limitation to Copyright and Similar Rights
|
||||||
|
that applies to Your use of the Licensed Material.
|
||||||
|
|
||||||
|
g. License Elements means the license attributes listed in the name
|
||||||
|
of a Creative Commons Public License. The License Elements of this
|
||||||
|
Public License are Attribution and ShareAlike.
|
||||||
|
|
||||||
|
h. Licensed Material means the artistic or literary work, database,
|
||||||
|
or other material to which the Licensor applied this Public
|
||||||
|
License.
|
||||||
|
|
||||||
|
i. Licensed Rights means the rights granted to You subject to the
|
||||||
|
terms and conditions of this Public License, which are limited to
|
||||||
|
all Copyright and Similar Rights that apply to Your use of the
|
||||||
|
Licensed Material and that the Licensor has authority to license.
|
||||||
|
|
||||||
|
j. Licensor means the individual(s) or entity(ies) granting rights
|
||||||
|
under this Public License.
|
||||||
|
|
||||||
|
k. Share means to provide material to the public by any means or
|
||||||
|
process that requires permission under the Licensed Rights, such
|
||||||
|
as reproduction, public display, public performance, distribution,
|
||||||
|
dissemination, communication, or importation, and to make material
|
||||||
|
available to the public including in ways that members of the
|
||||||
|
public may access the material from a place and at a time
|
||||||
|
individually chosen by them.
|
||||||
|
|
||||||
|
l. Sui Generis Database Rights means rights other than copyright
|
||||||
|
resulting from Directive 96/9/EC of the European Parliament and of
|
||||||
|
the Council of 11 March 1996 on the legal protection of databases,
|
||||||
|
as amended and/or succeeded, as well as other essentially
|
||||||
|
equivalent rights anywhere in the world.
|
||||||
|
|
||||||
|
m. You means the individual or entity exercising the Licensed Rights
|
||||||
|
under this Public License. Your has a corresponding meaning.
|
||||||
|
|
||||||
|
|
||||||
|
Section 2 -- Scope.
|
||||||
|
|
||||||
|
a. License grant.
|
||||||
|
|
||||||
|
1. Subject to the terms and conditions of this Public License,
|
||||||
|
the Licensor hereby grants You a worldwide, royalty-free,
|
||||||
|
non-sublicensable, non-exclusive, irrevocable license to
|
||||||
|
exercise the Licensed Rights in the Licensed Material to:
|
||||||
|
|
||||||
|
a. reproduce and Share the Licensed Material, in whole or
|
||||||
|
in part; and
|
||||||
|
|
||||||
|
b. produce, reproduce, and Share Adapted Material.
|
||||||
|
|
||||||
|
2. Exceptions and Limitations. For the avoidance of doubt, where
|
||||||
|
Exceptions and Limitations apply to Your use, this Public
|
||||||
|
License does not apply, and You do not need to comply with
|
||||||
|
its terms and conditions.
|
||||||
|
|
||||||
|
3. Term. The term of this Public License is specified in Section
|
||||||
|
6(a).
|
||||||
|
|
||||||
|
4. Media and formats; technical modifications allowed. The
|
||||||
|
Licensor authorizes You to exercise the Licensed Rights in
|
||||||
|
all media and formats whether now known or hereafter created,
|
||||||
|
and to make technical modifications necessary to do so. The
|
||||||
|
Licensor waives and/or agrees not to assert any right or
|
||||||
|
authority to forbid You from making technical modifications
|
||||||
|
necessary to exercise the Licensed Rights, including
|
||||||
|
technical modifications necessary to circumvent Effective
|
||||||
|
Technological Measures. For purposes of this Public License,
|
||||||
|
simply making modifications authorized by this Section 2(a)
|
||||||
|
(4) never produces Adapted Material.
|
||||||
|
|
||||||
|
5. Downstream recipients.
|
||||||
|
|
||||||
|
a. Offer from the Licensor -- Licensed Material. Every
|
||||||
|
recipient of the Licensed Material automatically
|
||||||
|
receives an offer from the Licensor to exercise the
|
||||||
|
Licensed Rights under the terms and conditions of this
|
||||||
|
Public License.
|
||||||
|
|
||||||
|
b. Additional offer from the Licensor -- Adapted Material.
|
||||||
|
Every recipient of Adapted Material from You
|
||||||
|
automatically receives an offer from the Licensor to
|
||||||
|
exercise the Licensed Rights in the Adapted Material
|
||||||
|
under the conditions of the Adapter's License You apply.
|
||||||
|
|
||||||
|
c. No downstream restrictions. You may not offer or impose
|
||||||
|
any additional or different terms or conditions on, or
|
||||||
|
apply any Effective Technological Measures to, the
|
||||||
|
Licensed Material if doing so restricts exercise of the
|
||||||
|
Licensed Rights by any recipient of the Licensed
|
||||||
|
Material.
|
||||||
|
|
||||||
|
6. No endorsement. Nothing in this Public License constitutes or
|
||||||
|
may be construed as permission to assert or imply that You
|
||||||
|
are, or that Your use of the Licensed Material is, connected
|
||||||
|
with, or sponsored, endorsed, or granted official status by,
|
||||||
|
the Licensor or others designated to receive attribution as
|
||||||
|
provided in Section 3(a)(1)(A)(i).
|
||||||
|
|
||||||
|
b. Other rights.
|
||||||
|
|
||||||
|
1. Moral rights, such as the right of integrity, are not
|
||||||
|
licensed under this Public License, nor are publicity,
|
||||||
|
privacy, and/or other similar personality rights; however, to
|
||||||
|
the extent possible, the Licensor waives and/or agrees not to
|
||||||
|
assert any such rights held by the Licensor to the limited
|
||||||
|
extent necessary to allow You to exercise the Licensed
|
||||||
|
Rights, but not otherwise.
|
||||||
|
|
||||||
|
2. Patent and trademark rights are not licensed under this
|
||||||
|
Public License.
|
||||||
|
|
||||||
|
3. To the extent possible, the Licensor waives any right to
|
||||||
|
collect royalties from You for the exercise of the Licensed
|
||||||
|
Rights, whether directly or through a collecting society
|
||||||
|
under any voluntary or waivable statutory or compulsory
|
||||||
|
licensing scheme. In all other cases the Licensor expressly
|
||||||
|
reserves any right to collect such royalties.
|
||||||
|
|
||||||
|
|
||||||
|
Section 3 -- License Conditions.
|
||||||
|
|
||||||
|
Your exercise of the Licensed Rights is expressly made subject to the
|
||||||
|
following conditions.
|
||||||
|
|
||||||
|
a. Attribution.
|
||||||
|
|
||||||
|
1. If You Share the Licensed Material (including in modified
|
||||||
|
form), You must:
|
||||||
|
|
||||||
|
a. retain the following if it is supplied by the Licensor
|
||||||
|
with the Licensed Material:
|
||||||
|
|
||||||
|
i. identification of the creator(s) of the Licensed
|
||||||
|
Material and any others designated to receive
|
||||||
|
attribution, in any reasonable manner requested by
|
||||||
|
the Licensor (including by pseudonym if
|
||||||
|
designated);
|
||||||
|
|
||||||
|
ii. a copyright notice;
|
||||||
|
|
||||||
|
iii. a notice that refers to this Public License;
|
||||||
|
|
||||||
|
iv. a notice that refers to the disclaimer of
|
||||||
|
warranties;
|
||||||
|
|
||||||
|
v. a URI or hyperlink to the Licensed Material to the
|
||||||
|
extent reasonably practicable;
|
||||||
|
|
||||||
|
b. indicate if You modified the Licensed Material and
|
||||||
|
retain an indication of any previous modifications; and
|
||||||
|
|
||||||
|
c. indicate the Licensed Material is licensed under this
|
||||||
|
Public License, and include the text of, or the URI or
|
||||||
|
hyperlink to, this Public License.
|
||||||
|
|
||||||
|
2. You may satisfy the conditions in Section 3(a)(1) in any
|
||||||
|
reasonable manner based on the medium, means, and context in
|
||||||
|
which You Share the Licensed Material. For example, it may be
|
||||||
|
reasonable to satisfy the conditions by providing a URI or
|
||||||
|
hyperlink to a resource that includes the required
|
||||||
|
information.
|
||||||
|
|
||||||
|
3. If requested by the Licensor, You must remove any of the
|
||||||
|
information required by Section 3(a)(1)(A) to the extent
|
||||||
|
reasonably practicable.
|
||||||
|
|
||||||
|
b. ShareAlike.
|
||||||
|
|
||||||
|
In addition to the conditions in Section 3(a), if You Share
|
||||||
|
Adapted Material You produce, the following conditions also apply.
|
||||||
|
|
||||||
|
1. The Adapter's License You apply must be a Creative Commons
|
||||||
|
license with the same License Elements, this version or
|
||||||
|
later, or a BY-SA Compatible License.
|
||||||
|
|
||||||
|
2. You must include the text of, or the URI or hyperlink to, the
|
||||||
|
Adapter's License You apply. You may satisfy this condition
|
||||||
|
in any reasonable manner based on the medium, means, and
|
||||||
|
context in which You Share Adapted Material.
|
||||||
|
|
||||||
|
3. You may not offer or impose any additional or different terms
|
||||||
|
or conditions on, or apply any Effective Technological
|
||||||
|
Measures to, Adapted Material that restrict exercise of the
|
||||||
|
rights granted under the Adapter's License You apply.
|
||||||
|
|
||||||
|
|
||||||
|
Section 4 -- Sui Generis Database Rights.
|
||||||
|
|
||||||
|
Where the Licensed Rights include Sui Generis Database Rights that
|
||||||
|
apply to Your use of the Licensed Material:
|
||||||
|
|
||||||
|
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
|
||||||
|
to extract, reuse, reproduce, and Share all or a substantial
|
||||||
|
portion of the contents of the database;
|
||||||
|
|
||||||
|
b. if You include all or a substantial portion of the database
|
||||||
|
contents in a database in which You have Sui Generis Database
|
||||||
|
Rights, then the database in which You have Sui Generis Database
|
||||||
|
Rights (but not its individual contents) is Adapted Material,
|
||||||
|
|
||||||
|
including for purposes of Section 3(b); and
|
||||||
|
c. You must comply with the conditions in Section 3(a) if You Share
|
||||||
|
all or a substantial portion of the contents of the database.
|
||||||
|
|
||||||
|
For the avoidance of doubt, this Section 4 supplements and does not
|
||||||
|
replace Your obligations under this Public License where the Licensed
|
||||||
|
Rights include other Copyright and Similar Rights.
|
||||||
|
|
||||||
|
|
||||||
|
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
|
||||||
|
|
||||||
|
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
|
||||||
|
EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
|
||||||
|
AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
|
||||||
|
ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
|
||||||
|
IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
|
||||||
|
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
|
||||||
|
ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
|
||||||
|
KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
|
||||||
|
ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
|
||||||
|
|
||||||
|
b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
|
||||||
|
TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
|
||||||
|
NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
|
||||||
|
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
|
||||||
|
COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
|
||||||
|
USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
|
||||||
|
DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
|
||||||
|
IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
|
||||||
|
|
||||||
|
c. The disclaimer of warranties and limitation of liability provided
|
||||||
|
above shall be interpreted in a manner that, to the extent
|
||||||
|
possible, most closely approximates an absolute disclaimer and
|
||||||
|
waiver of all liability.
|
||||||
|
|
||||||
|
|
||||||
|
Section 6 -- Term and Termination.
|
||||||
|
|
||||||
|
a. This Public License applies for the term of the Copyright and
|
||||||
|
Similar Rights licensed here. However, if You fail to comply with
|
||||||
|
this Public License, then Your rights under this Public License
|
||||||
|
terminate automatically.
|
||||||
|
|
||||||
|
b. Where Your right to use the Licensed Material has terminated under
|
||||||
|
Section 6(a), it reinstates:
|
||||||
|
|
||||||
|
1. automatically as of the date the violation is cured, provided
|
||||||
|
it is cured within 30 days of Your discovery of the
|
||||||
|
violation; or
|
||||||
|
|
||||||
|
2. upon express reinstatement by the Licensor.
|
||||||
|
|
||||||
|
For the avoidance of doubt, this Section 6(b) does not affect any
|
||||||
|
right the Licensor may have to seek remedies for Your violations
|
||||||
|
of this Public License.
|
||||||
|
|
||||||
|
c. For the avoidance of doubt, the Licensor may also offer the
|
||||||
|
Licensed Material under separate terms or conditions or stop
|
||||||
|
distributing the Licensed Material at any time; however, doing so
|
||||||
|
will not terminate this Public License.
|
||||||
|
|
||||||
|
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
|
||||||
|
License.
|
||||||
|
|
||||||
|
|
||||||
|
Section 7 -- Other Terms and Conditions.
|
||||||
|
|
||||||
|
a. The Licensor shall not be bound by any additional or different
|
||||||
|
terms or conditions communicated by You unless expressly agreed.
|
||||||
|
|
||||||
|
b. Any arrangements, understandings, or agreements regarding the
|
||||||
|
Licensed Material not stated herein are separate from and
|
||||||
|
independent of the terms and conditions of this Public License.
|
||||||
|
|
||||||
|
|
||||||
|
Section 8 -- Interpretation.
|
||||||
|
|
||||||
|
a. For the avoidance of doubt, this Public License does not, and
|
||||||
|
shall not be interpreted to, reduce, limit, restrict, or impose
|
||||||
|
conditions on any use of the Licensed Material that could lawfully
|
||||||
|
be made without permission under this Public License.
|
||||||
|
|
||||||
|
b. To the extent possible, if any provision of this Public License is
|
||||||
|
deemed unenforceable, it shall be automatically reformed to the
|
||||||
|
minimum extent necessary to make it enforceable. If the provision
|
||||||
|
cannot be reformed, it shall be severed from this Public License
|
||||||
|
without affecting the enforceability of the remaining terms and
|
||||||
|
conditions.
|
||||||
|
|
||||||
|
c. No term or condition of this Public License will be waived and no
|
||||||
|
failure to comply consented to unless expressly agreed to by the
|
||||||
|
Licensor.
|
||||||
|
|
||||||
|
d. Nothing in this Public License constitutes or may be interpreted
|
||||||
|
as a limitation upon, or waiver of, any privileges and immunities
|
||||||
|
that apply to the Licensor or You, including from the legal
|
||||||
|
processes of any jurisdiction or authority.
|
||||||
|
|
||||||
|
|
||||||
|
=======================================================================
|
||||||
|
|
||||||
|
Creative Commons is not a party to its public licenses.
|
||||||
|
Notwithstanding, Creative Commons may elect to apply one of its public
|
||||||
|
licenses to material it publishes and in those instances will be
|
||||||
|
considered the "Licensor." Except for the limited purpose of indicating
|
||||||
|
that material is shared under a Creative Commons public license or as
|
||||||
|
otherwise permitted by the Creative Commons policies published at
|
||||||
|
creativecommons.org/policies, Creative Commons does not authorize the
|
||||||
|
use of the trademark "Creative Commons" or any other trademark or logo
|
||||||
|
of Creative Commons without its prior written consent including,
|
||||||
|
without limitation, in connection with any unauthorized modifications
|
||||||
|
to any of its public licenses or any other arrangements,
|
||||||
|
understandings, or agreements concerning use of licensed material. For
|
||||||
|
the avoidance of doubt, this paragraph does not form part of the public
|
||||||
|
licenses.
|
||||||
|
|
||||||
|
Creative Commons may be contacted at creativecommons.org.
|
104
vendor/github.com/opencontainers/go-digest/README.md
generated
vendored
Normal file
104
vendor/github.com/opencontainers/go-digest/README.md
generated
vendored
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
# go-digest
|
||||||
|
|
||||||
|
[![GoDoc](https://godoc.org/github.com/docker/go-digest?status.svg)](https://godoc.org/github.com/docker/go-digest) [![Go Report Card](https://goreportcard.com/badge/github.com/docker/go-digest)](https://goreportcard.com/report/github.com/docker/go-digest) [![Build Status](https://travis-ci.org/docker/go-digest.svg?branch=master)](https://travis-ci.org/docker/go-digest)
|
||||||
|
|
||||||
|
Common digest package used across the container ecosystem.
|
||||||
|
|
||||||
|
Please see the [godoc](https://godoc.org/github.com/docker/go-digest) for more information.
|
||||||
|
|
||||||
|
# What is a digest?
|
||||||
|
|
||||||
|
A digest is just a hash.
|
||||||
|
|
||||||
|
The most common use case for a digest is to create a content
|
||||||
|
identifier for use in [Content Addressable Storage](https://en.wikipedia.org/wiki/Content-addressable_storage)
|
||||||
|
systems:
|
||||||
|
|
||||||
|
```go
|
||||||
|
id := digest.FromBytes([]byte("my content"))
|
||||||
|
```
|
||||||
|
|
||||||
|
In the example above, the id can be used to uniquely identify
|
||||||
|
the byte slice "my content". This allows two disparate applications
|
||||||
|
to agree on a verifiable identifier without having to trust one
|
||||||
|
another.
|
||||||
|
|
||||||
|
An identifying digest can be verified, as follows:
|
||||||
|
|
||||||
|
```go
|
||||||
|
if id != digest.FromBytes([]byte("my content")) {
|
||||||
|
return errors.New("the content has changed!")
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
A `Verifier` type can be used to handle cases where an `io.Reader`
|
||||||
|
makes more sense:
|
||||||
|
|
||||||
|
```go
|
||||||
|
rd := getContent()
|
||||||
|
verifier := id.Verifier()
|
||||||
|
io.Copy(verifier, rd)
|
||||||
|
|
||||||
|
if !verifier.Verified() {
|
||||||
|
return errors.New("the content has changed!")
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Using [Merkle DAGs](https://en.wikipedia.org/wiki/Merkle_tree), this
|
||||||
|
can power a rich, safe, content distribution system.
|
||||||
|
|
||||||
|
# Usage
|
||||||
|
|
||||||
|
While the [godoc](https://godoc.org/github.com/docker/go-digest) is
|
||||||
|
considered the best resource, a few important items need to be called
|
||||||
|
out when using this package.
|
||||||
|
|
||||||
|
1. Make sure to import the hash implementations into your application
|
||||||
|
or the package will panic. You should have something like the
|
||||||
|
following in the main (or other entrypoint) of your application:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
_ "crypto/sha256"
|
||||||
|
_ "crypto/sha512"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
This may seem inconvenient but it allows you replace the hash
|
||||||
|
implementations with others, such as https://github.com/stevvooe/resumable.
|
||||||
|
|
||||||
|
2. Even though `digest.Digest` may be assemable as a string, _always_
|
||||||
|
verify your input with `digest.Parse` or use `Digest.Validate`
|
||||||
|
when accepting untrusted input. While there are measures to
|
||||||
|
avoid common problems, this will ensure you have valid digests
|
||||||
|
in the rest of your application.
|
||||||
|
|
||||||
|
# Stability
|
||||||
|
|
||||||
|
The Go API, at this stage, is considered stable, unless otherwise noted.
|
||||||
|
|
||||||
|
As always, before using a package export, read the [godoc](https://godoc.org/github.com/docker/go-digest).
|
||||||
|
|
||||||
|
# Contributing
|
||||||
|
|
||||||
|
This package is considered fairly complete. It has been in production
|
||||||
|
in thousands (millions?) of deployments and is fairly battle-hardened.
|
||||||
|
New additions will be met with skepticism. If you think there is a
|
||||||
|
missing feature, please file a bug clearly describing the problem and
|
||||||
|
the alternatives you tried before submitting a PR.
|
||||||
|
|
||||||
|
# Reporting security issues
|
||||||
|
|
||||||
|
The maintainers take security seriously. If you discover a security
|
||||||
|
issue, please bring it to their attention right away!
|
||||||
|
|
||||||
|
Please DO NOT file a public issue, instead send your report privately
|
||||||
|
to security@docker.com.
|
||||||
|
|
||||||
|
Security reports are greatly appreciated and we will publicly thank you
|
||||||
|
for it. We also like to send gifts—if you're into Docker schwag, make
|
||||||
|
sure to let us know. We currently do not offer a paid security bounty
|
||||||
|
program, but are not ruling it out in the future.
|
||||||
|
|
||||||
|
# Copyright and license
|
||||||
|
|
||||||
|
Copyright © 2016 Docker, Inc. All rights reserved, except as follows. Code is released under the [Apache 2.0 license](LICENSE.code). This `README.md` file and the [`CONTRIBUTING.md`](CONTRIBUTING.md) file are licensed under the Creative Commons Attribution 4.0 International License under the terms and conditions set forth in the file [`LICENSE.docs`](LICENSE.docs). You may obtain a duplicate copy of the same license, titled CC BY-SA 4.0, at http://creativecommons.org/licenses/by-sa/4.0/.
|
174
vendor/github.com/spf13/cobra/LICENSE.txt
generated
vendored
Normal file
174
vendor/github.com/spf13/cobra/LICENSE.txt
generated
vendored
Normal file
|
@ -0,0 +1,174 @@
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
485
vendor/github.com/spf13/cobra/README.md
generated
vendored
Normal file
485
vendor/github.com/spf13/cobra/README.md
generated
vendored
Normal file
|
@ -0,0 +1,485 @@
|
||||||
|
# Cobra
|
||||||
|
|
||||||
|
A Commander for modern go CLI interactions
|
||||||
|
|
||||||
|
[![Build Status](https://travis-ci.org/spf13/cobra.svg)](https://travis-ci.org/spf13/cobra)
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Cobra is a commander providing a simple interface to create powerful modern CLI
|
||||||
|
interfaces similar to git & go tools. In addition to providing an interface, Cobra
|
||||||
|
simultaneously provides a controller to organize your application code.
|
||||||
|
|
||||||
|
Inspired by go, go-Commander, gh and subcommand, Cobra improves on these by
|
||||||
|
providing **fully posix compliant flags** (including short & long versions),
|
||||||
|
**nesting commands**, and the ability to **define your own help and usage** for any or
|
||||||
|
all commands.
|
||||||
|
|
||||||
|
Cobra has an exceptionally clean interface and simple design without needless
|
||||||
|
constructors or initialization methods.
|
||||||
|
|
||||||
|
Applications built with Cobra commands are designed to be as user friendly as
|
||||||
|
possible. Flags can be placed before or after the command (as long as a
|
||||||
|
confusing space isn’t provided). Both short and long flags can be used. A
|
||||||
|
command need not even be fully typed. The shortest unambiguous string will
|
||||||
|
suffice. Help is automatically generated and available for the application or
|
||||||
|
for a specific command using either the help command or the --help flag.
|
||||||
|
|
||||||
|
## Concepts
|
||||||
|
|
||||||
|
Cobra is built on a structure of commands & flags.
|
||||||
|
|
||||||
|
**Commands** represent actions and **Flags** are modifiers for those actions.
|
||||||
|
|
||||||
|
In the following example 'server' is a command and 'port' is a flag.
|
||||||
|
|
||||||
|
hugo server --port=1313
|
||||||
|
|
||||||
|
### Commands
|
||||||
|
|
||||||
|
Command is the central point of the application. Each interaction that
|
||||||
|
the application supports will be contained in a Command. A command can
|
||||||
|
have children commands and optionally run an action.
|
||||||
|
|
||||||
|
In the example above 'server' is the command
|
||||||
|
|
||||||
|
A Command has the following structure:
|
||||||
|
|
||||||
|
type Command struct {
|
||||||
|
Use string // The one-line usage message.
|
||||||
|
Short string // The short description shown in the 'help' output.
|
||||||
|
Long string // The long message shown in the 'help <this-command>' output.
|
||||||
|
Run func(cmd *Command, args []string) // Run runs the command.
|
||||||
|
}
|
||||||
|
|
||||||
|
### Flags
|
||||||
|
|
||||||
|
A Flag is a way to modify the behavior of an command. Cobra supports
|
||||||
|
fully posix compliant flags as well as the go flag package.
|
||||||
|
A Cobra command can define flags that persist through to children commands
|
||||||
|
and flags that are only available to that command.
|
||||||
|
|
||||||
|
In the example above 'port' is the flag.
|
||||||
|
|
||||||
|
Flag functionality is provided by the [pflag
|
||||||
|
library](https://github.com/ogier/pflag), a fork of the flag standard library
|
||||||
|
which maintains the same interface while adding posix compliance.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Cobra works by creating a set of commands and then organizing them into a tree.
|
||||||
|
The tree defines the structure of the application.
|
||||||
|
|
||||||
|
Once each command is defined with it's corresponding flags, then the
|
||||||
|
tree is assigned to the commander which is finally executed.
|
||||||
|
|
||||||
|
### Installing
|
||||||
|
Using Cobra is easy. First use go get to install the latest version
|
||||||
|
of the library.
|
||||||
|
|
||||||
|
$ go get github.com/spf13/cobra
|
||||||
|
|
||||||
|
Next include cobra in your application.
|
||||||
|
|
||||||
|
import "github.com/spf13/cobra"
|
||||||
|
|
||||||
|
### Create the root command
|
||||||
|
|
||||||
|
The root command represents your binary itself.
|
||||||
|
|
||||||
|
Cobra doesn't require any special constructors. Simply create your commands.
|
||||||
|
|
||||||
|
var HugoCmd = &cobra.Command{
|
||||||
|
Use: "hugo",
|
||||||
|
Short: "Hugo is a very fast static site generator",
|
||||||
|
Long: `A Fast and Flexible Static Site Generator built with
|
||||||
|
love by spf13 and friends in Go.
|
||||||
|
Complete documentation is available at http://hugo.spf13.com`,
|
||||||
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
// Do Stuff Here
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
### Create additional commands
|
||||||
|
|
||||||
|
Additional commands can be defined.
|
||||||
|
|
||||||
|
var versionCmd = &cobra.Command{
|
||||||
|
Use: "version",
|
||||||
|
Short: "Print the version number of Hugo",
|
||||||
|
Long: `All software has versions. This is Hugo's`,
|
||||||
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
fmt.Println("Hugo Static Site Generator v0.9 -- HEAD")
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
### Attach command to its parent
|
||||||
|
In this example we are attaching it to the root, but commands can be attached at any level.
|
||||||
|
|
||||||
|
HugoCmd.AddCommand(versionCmd)
|
||||||
|
|
||||||
|
### Assign flags to a command
|
||||||
|
|
||||||
|
Since the flags are defined and used in different locations, we need to
|
||||||
|
define a variable outside with the correct scope to assign the flag to
|
||||||
|
work with.
|
||||||
|
|
||||||
|
var Verbose bool
|
||||||
|
var Source string
|
||||||
|
|
||||||
|
There are two different approaches to assign a flag.
|
||||||
|
|
||||||
|
#### Persistent Flags
|
||||||
|
|
||||||
|
A flag can be 'persistent' meaning that this flag will be available to the
|
||||||
|
command it's assigned to as well as every command under that command. For
|
||||||
|
global flags assign a flag as a persistent flag on the root.
|
||||||
|
|
||||||
|
HugoCmd.PersistentFlags().BoolVarP(&Verbose, "verbose", "v", false, "verbose output")
|
||||||
|
|
||||||
|
#### Local Flags
|
||||||
|
|
||||||
|
A flag can also be assigned locally which will only apply to that specific command.
|
||||||
|
|
||||||
|
HugoCmd.Flags().StringVarP(&Source, "source", "s", "", "Source directory to read from")
|
||||||
|
|
||||||
|
### Remove a command from its parent
|
||||||
|
|
||||||
|
Removing a command is not a common action in simple programs but it allows 3rd parties to customize an existing command tree.
|
||||||
|
|
||||||
|
In this example, we remove the existing `VersionCmd` command of an existing root command, and we replace it by our own version.
|
||||||
|
|
||||||
|
mainlib.RootCmd.RemoveCommand(mainlib.VersionCmd)
|
||||||
|
mainlib.RootCmd.AddCommand(versionCmd)
|
||||||
|
|
||||||
|
### Once all commands and flags are defined, Execute the commands
|
||||||
|
|
||||||
|
Execute should be run on the root for clarity, though it can be called on any command.
|
||||||
|
|
||||||
|
HugoCmd.Execute()
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
In the example below we have defined three commands. Two are at the top level
|
||||||
|
and one (cmdTimes) is a child of one of the top commands. In this case the root
|
||||||
|
is not executable meaning that a subcommand is required. This is accomplished
|
||||||
|
by not providing a 'Run' for the 'rootCmd'.
|
||||||
|
|
||||||
|
We have only defined one flag for a single command.
|
||||||
|
|
||||||
|
More documentation about flags is available at https://github.com/spf13/pflag
|
||||||
|
|
||||||
|
import(
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
var echoTimes int
|
||||||
|
|
||||||
|
var cmdPrint = &cobra.Command{
|
||||||
|
Use: "print [string to print]",
|
||||||
|
Short: "Print anything to the screen",
|
||||||
|
Long: `print is for printing anything back to the screen.
|
||||||
|
For many years people have printed back to the screen.
|
||||||
|
`,
|
||||||
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
fmt.Println("Print: " + strings.Join(args, " "))
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var cmdEcho = &cobra.Command{
|
||||||
|
Use: "echo [string to echo]",
|
||||||
|
Short: "Echo anything to the screen",
|
||||||
|
Long: `echo is for echoing anything back.
|
||||||
|
Echo works a lot like print, except it has a child command.
|
||||||
|
`,
|
||||||
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
fmt.Println("Print: " + strings.Join(args, " "))
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var cmdTimes = &cobra.Command{
|
||||||
|
Use: "times [# times] [string to echo]",
|
||||||
|
Short: "Echo anything to the screen more times",
|
||||||
|
Long: `echo things multiple times back to the user by providing
|
||||||
|
a count and a string.`,
|
||||||
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
for i:=0; i < echoTimes; i++ {
|
||||||
|
fmt.Println("Echo: " + strings.Join(args, " "))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
cmdTimes.Flags().IntVarP(&echoTimes, "times", "t", 1, "times to echo the input")
|
||||||
|
|
||||||
|
var rootCmd = &cobra.Command{Use: "app"}
|
||||||
|
rootCmd.AddCommand(cmdPrint, cmdEcho)
|
||||||
|
cmdEcho.AddCommand(cmdTimes)
|
||||||
|
rootCmd.Execute()
|
||||||
|
}
|
||||||
|
|
||||||
|
For a more complete example of a larger application, please checkout [Hugo](http://hugo.spf13.com)
|
||||||
|
|
||||||
|
## The Help Command
|
||||||
|
|
||||||
|
Cobra automatically adds a help command to your application when you have subcommands.
|
||||||
|
This will be called when a user runs 'app help'. Additionally help will also
|
||||||
|
support all other commands as input. Say for instance you have a command called
|
||||||
|
'create' without any additional configuration cobra will work when 'app help
|
||||||
|
create' is called. Every command will automatically have the '--help' flag added.
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
The following output is automatically generated by cobra. Nothing beyond the
|
||||||
|
command and flag definitions are needed.
|
||||||
|
|
||||||
|
> hugo help
|
||||||
|
|
||||||
|
A Fast and Flexible Static Site Generator built with
|
||||||
|
love by spf13 and friends in Go.
|
||||||
|
|
||||||
|
Complete documentation is available at http://hugo.spf13.com
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
hugo [flags]
|
||||||
|
hugo [command]
|
||||||
|
|
||||||
|
Available Commands:
|
||||||
|
server :: Hugo runs it's own a webserver to render the files
|
||||||
|
version :: Print the version number of Hugo
|
||||||
|
check :: Check content in the source directory
|
||||||
|
benchmark :: Benchmark hugo by building a site a number of times
|
||||||
|
help [command] :: Help about any command
|
||||||
|
|
||||||
|
Available Flags:
|
||||||
|
-b, --base-url="": hostname (and path) to the root eg. http://spf13.com/
|
||||||
|
-D, --build-drafts=false: include content marked as draft
|
||||||
|
--config="": config file (default is path/config.yaml|json|toml)
|
||||||
|
-d, --destination="": filesystem path to write files to
|
||||||
|
-s, --source="": filesystem path to read files relative from
|
||||||
|
--stepAnalysis=false: display memory and timing of different steps of the program
|
||||||
|
--uglyurls=false: if true, use /filename.html instead of /filename/
|
||||||
|
-v, --verbose=false: verbose output
|
||||||
|
-w, --watch=false: watch filesystem for changes and recreate as needed
|
||||||
|
|
||||||
|
Use "hugo help [command]" for more information about that command.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Help is just a command like any other. There is no special logic or behavior
|
||||||
|
around it. In fact you can provide your own if you want.
|
||||||
|
|
||||||
|
### Defining your own help
|
||||||
|
|
||||||
|
You can provide your own Help command or you own template for the default command to use.
|
||||||
|
|
||||||
|
The default help command is
|
||||||
|
|
||||||
|
func (c *Command) initHelp() {
|
||||||
|
if c.helpCommand == nil {
|
||||||
|
c.helpCommand = &Command{
|
||||||
|
Use: "help [command]",
|
||||||
|
Short: "Help about any command",
|
||||||
|
Long: `Help provides help for any command in the application.
|
||||||
|
Simply type ` + c.Name() + ` help [path to command] for full details.`,
|
||||||
|
Run: c.HelpFunc(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
c.AddCommand(c.helpCommand)
|
||||||
|
}
|
||||||
|
|
||||||
|
You can provide your own command, function or template through the following methods.
|
||||||
|
|
||||||
|
command.SetHelpCommand(cmd *Command)
|
||||||
|
|
||||||
|
command.SetHelpFunc(f func(*Command, []string))
|
||||||
|
|
||||||
|
command.SetHelpTemplate(s string)
|
||||||
|
|
||||||
|
The latter two will also apply to any children commands.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
When the user provides an invalid flag or invalid command Cobra responds by
|
||||||
|
showing the user the 'usage'
|
||||||
|
|
||||||
|
### Example
|
||||||
|
You may recognize this from the help above. That's because the default help
|
||||||
|
embeds the usage as part of it's output.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
hugo [flags]
|
||||||
|
hugo [command]
|
||||||
|
|
||||||
|
Available Commands:
|
||||||
|
server Hugo runs it's own a webserver to render the files
|
||||||
|
version Print the version number of Hugo
|
||||||
|
check Check content in the source directory
|
||||||
|
benchmark Benchmark hugo by building a site a number of times
|
||||||
|
help [command] Help about any command
|
||||||
|
|
||||||
|
Available Flags:
|
||||||
|
-b, --base-url="": hostname (and path) to the root eg. http://spf13.com/
|
||||||
|
-D, --build-drafts=false: include content marked as draft
|
||||||
|
--config="": config file (default is path/config.yaml|json|toml)
|
||||||
|
-d, --destination="": filesystem path to write files to
|
||||||
|
-s, --source="": filesystem path to read files relative from
|
||||||
|
--stepAnalysis=false: display memory and timing of different steps of the program
|
||||||
|
--uglyurls=false: if true, use /filename.html instead of /filename/
|
||||||
|
-v, --verbose=false: verbose output
|
||||||
|
-w, --watch=false: watch filesystem for changes and recreate as needed
|
||||||
|
|
||||||
|
### Defining your own usage
|
||||||
|
You can provide your own usage function or template for cobra to use.
|
||||||
|
|
||||||
|
The default usage function is
|
||||||
|
|
||||||
|
return func(c *Command) error {
|
||||||
|
err := tmpl(c.Out(), c.UsageTemplate(), c)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
Like help the function and template are over ridable through public methods.
|
||||||
|
|
||||||
|
command.SetUsageFunc(f func(*Command) error)
|
||||||
|
|
||||||
|
command.SetUsageTemplate(s string)
|
||||||
|
|
||||||
|
## PreRun or PostRun Hooks
|
||||||
|
|
||||||
|
It is possible to run functions before or after the main `Run` function of your command. The `PersistentPreRun` and `PreRun` functions will be executed before `Run`. `PersistendPostRun` and `PostRun` will be executed after `Run`. The `Persistent*Run` functions will be inherrited by children if they do not declare their own. These function are run in the following order:
|
||||||
|
|
||||||
|
- `PersistentPreRun`
|
||||||
|
- `PreRun`
|
||||||
|
- `Run`
|
||||||
|
- `PostRun`
|
||||||
|
- `PersistenPostRun`
|
||||||
|
|
||||||
|
And example of two commands which use all of these features is below. When the subcommand in executed it will run the root command's `PersistentPreRun` but not the root command's `PersistentPostRun`
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
var rootCmd = &cobra.Command{
|
||||||
|
Use: "root [sub]",
|
||||||
|
Short: "My root command",
|
||||||
|
PersistentPreRun: func(cmd *cobra.Command, args []string) {
|
||||||
|
fmt.Printf("Inside rootCmd PersistentPreRun with args: %v\n", args)
|
||||||
|
},
|
||||||
|
PreRun: func(cmd *cobra.Command, args []string) {
|
||||||
|
fmt.Printf("Inside rootCmd PreRun with args: %v\n", args)
|
||||||
|
},
|
||||||
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
fmt.Printf("Inside rootCmd Run with args: %v\n", args)
|
||||||
|
},
|
||||||
|
PostRun: func(cmd *cobra.Command, args []string) {
|
||||||
|
fmt.Printf("Inside rootCmd PostRun with args: %v\n", args)
|
||||||
|
},
|
||||||
|
PersistentPostRun: func(cmd *cobra.Command, args []string) {
|
||||||
|
fmt.Printf("Inside rootCmd PersistentPostRun with args: %v\n", args)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var subCmd = &cobra.Command{
|
||||||
|
Use: "sub [no options!]",
|
||||||
|
Short: "My sub command",
|
||||||
|
PreRun: func(cmd *cobra.Command, args []string) {
|
||||||
|
fmt.Printf("Inside subCmd PreRun with args: %v\n", args)
|
||||||
|
},
|
||||||
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
fmt.Printf("Inside subCmd Run with args: %v\n", args)
|
||||||
|
},
|
||||||
|
PostRun: func(cmd *cobra.Command, args []string) {
|
||||||
|
fmt.Printf("Inside subCmd PostRun with args: %v\n", args)
|
||||||
|
},
|
||||||
|
PersistentPostRun: func(cmd *cobra.Command, args []string) {
|
||||||
|
fmt.Printf("Inside subCmd PersistentPostRun with args: %v\n", args)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
rootCmd.AddCommand(subCmd)
|
||||||
|
|
||||||
|
rootCmd.SetArgs([]string{""})
|
||||||
|
_ = rootCmd.Execute()
|
||||||
|
fmt.Print("\n")
|
||||||
|
rootCmd.SetArgs([]string{"sub", "arg1", "arg2"})
|
||||||
|
_ = rootCmd.Execute()
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Generating markdown formatted documentation for your command
|
||||||
|
|
||||||
|
Cobra can generate a markdown formatted document based on the subcommands, flags, etc. A simple example of how to do this for your command can be found in [Markdown Docs](md_docs.md)
|
||||||
|
|
||||||
|
## Generating bash completions for your command
|
||||||
|
|
||||||
|
Cobra can generate a bash completions file. If you add more information to your command these completions can be amazingly powerful and flexible. Read more about [Bash Completions](bash_completions.md)
|
||||||
|
|
||||||
|
## Debugging
|
||||||
|
|
||||||
|
Cobra provides a ‘DebugFlags’ method on a command which when called will print
|
||||||
|
out everything Cobra knows about the flags for each command
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
command.DebugFlags()
|
||||||
|
|
||||||
|
## Release Notes
|
||||||
|
* **0.9.0** June 17, 2014
|
||||||
|
* flags can appears anywhere in the args (provided they are unambiguous)
|
||||||
|
* --help prints usage screen for app or command
|
||||||
|
* Prefix matching for commands
|
||||||
|
* Cleaner looking help and usage output
|
||||||
|
* Extensive test suite
|
||||||
|
* **0.8.0** Nov 5, 2013
|
||||||
|
* Reworked interface to remove commander completely
|
||||||
|
* Command now primary structure
|
||||||
|
* No initialization needed
|
||||||
|
* Usage & Help templates & functions definable at any level
|
||||||
|
* Updated Readme
|
||||||
|
* **0.7.0** Sept 24, 2013
|
||||||
|
* Needs more eyes
|
||||||
|
* Test suite
|
||||||
|
* Support for automatic error messages
|
||||||
|
* Support for help command
|
||||||
|
* Support for printing to any io.Writer instead of os.Stderr
|
||||||
|
* Support for persistent flags which cascade down tree
|
||||||
|
* Ready for integration into Hugo
|
||||||
|
* **0.1.0** Sept 3, 2013
|
||||||
|
* Implement first draft
|
||||||
|
|
||||||
|
## ToDo
|
||||||
|
* Launch proper documentation site
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
1. Fork it
|
||||||
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
||||||
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
||||||
|
4. Push to the branch (`git push origin my-new-feature`)
|
||||||
|
5. Create new Pull Request
|
||||||
|
|
||||||
|
## Contributors
|
||||||
|
|
||||||
|
Names in no particular order:
|
||||||
|
|
||||||
|
* [spf13](https://github.com/spf13)
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Cobra is released under the Apache 2.0 license. See [LICENSE.txt](https://github.com/spf13/cobra/blob/master/LICENSE.txt)
|
||||||
|
|
||||||
|
|
||||||
|
[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/spf13/cobra/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
|
||||||
|
|
191
vendor/github.com/spf13/pflag/README.md
generated
vendored
Normal file
191
vendor/github.com/spf13/pflag/README.md
generated
vendored
Normal file
|
@ -0,0 +1,191 @@
|
||||||
|
[![Build Status](https://travis-ci.org/spf13/pflag.svg?branch=master)](https://travis-ci.org/spf13/pflag)
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
pflag is a drop-in replacement for Go's flag package, implementing
|
||||||
|
POSIX/GNU-style --flags.
|
||||||
|
|
||||||
|
pflag is compatible with the [GNU extensions to the POSIX recommendations
|
||||||
|
for command-line options][1]. For a more precise description, see the
|
||||||
|
"Command-line flag syntax" section below.
|
||||||
|
|
||||||
|
[1]: http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html
|
||||||
|
|
||||||
|
pflag is available under the same style of BSD license as the Go language,
|
||||||
|
which can be found in the LICENSE file.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
pflag is available using the standard `go get` command.
|
||||||
|
|
||||||
|
Install by running:
|
||||||
|
|
||||||
|
go get github.com/ogier/pflag
|
||||||
|
|
||||||
|
Run tests by running:
|
||||||
|
|
||||||
|
go test github.com/ogier/pflag
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
pflag is a drop-in replacement of Go's native flag package. If you import
|
||||||
|
pflag under the name "flag" then all code should continue to function
|
||||||
|
with no changes.
|
||||||
|
|
||||||
|
``` go
|
||||||
|
import flag "github.com/ogier/pflag"
|
||||||
|
```
|
||||||
|
|
||||||
|
There is one exception to this: if you directly instantiate the Flag struct
|
||||||
|
there is one more field "Shorthand" that you will need to set.
|
||||||
|
Most code never instantiates this struct directly, and instead uses
|
||||||
|
functions such as String(), BoolVar(), and Var(), and is therefore
|
||||||
|
unaffected.
|
||||||
|
|
||||||
|
Define flags using flag.String(), Bool(), Int(), etc.
|
||||||
|
|
||||||
|
This declares an integer flag, -flagname, stored in the pointer ip, with type *int.
|
||||||
|
|
||||||
|
``` go
|
||||||
|
var ip *int = flag.Int("flagname", 1234, "help message for flagname")
|
||||||
|
```
|
||||||
|
|
||||||
|
If you like, you can bind the flag to a variable using the Var() functions.
|
||||||
|
|
||||||
|
``` go
|
||||||
|
var flagvar int
|
||||||
|
func init() {
|
||||||
|
flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname")
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Or you can create custom flags that satisfy the Value interface (with
|
||||||
|
pointer receivers) and couple them to flag parsing by
|
||||||
|
|
||||||
|
``` go
|
||||||
|
flag.Var(&flagVal, "name", "help message for flagname")
|
||||||
|
```
|
||||||
|
|
||||||
|
For such flags, the default value is just the initial value of the variable.
|
||||||
|
|
||||||
|
After all flags are defined, call
|
||||||
|
|
||||||
|
``` go
|
||||||
|
flag.Parse()
|
||||||
|
```
|
||||||
|
|
||||||
|
to parse the command line into the defined flags.
|
||||||
|
|
||||||
|
Flags may then be used directly. If you're using the flags themselves,
|
||||||
|
they are all pointers; if you bind to variables, they're values.
|
||||||
|
|
||||||
|
``` go
|
||||||
|
fmt.Println("ip has value ", *ip)
|
||||||
|
fmt.Println("flagvar has value ", flagvar)
|
||||||
|
```
|
||||||
|
|
||||||
|
After parsing, the arguments after the flag are available as the
|
||||||
|
slice flag.Args() or individually as flag.Arg(i).
|
||||||
|
The arguments are indexed from 0 through flag.NArg()-1.
|
||||||
|
|
||||||
|
The pflag package also defines some new functions that are not in flag,
|
||||||
|
that give one-letter shorthands for flags. You can use these by appending
|
||||||
|
'P' to the name of any function that defines a flag.
|
||||||
|
|
||||||
|
``` go
|
||||||
|
var ip = flag.IntP("flagname", "f", 1234, "help message")
|
||||||
|
var flagvar bool
|
||||||
|
func init() {
|
||||||
|
flag.BoolVarP("boolname", "b", true, "help message")
|
||||||
|
}
|
||||||
|
flag.VarP(&flagVar, "varname", "v", 1234, "help message")
|
||||||
|
```
|
||||||
|
|
||||||
|
Shorthand letters can be used with single dashes on the command line.
|
||||||
|
Boolean shorthand flags can be combined with other shorthand flags.
|
||||||
|
|
||||||
|
The default set of command-line flags is controlled by
|
||||||
|
top-level functions. The FlagSet type allows one to define
|
||||||
|
independent sets of flags, such as to implement subcommands
|
||||||
|
in a command-line interface. The methods of FlagSet are
|
||||||
|
analogous to the top-level functions for the command-line
|
||||||
|
flag set.
|
||||||
|
|
||||||
|
## Command line flag syntax
|
||||||
|
|
||||||
|
```
|
||||||
|
--flag // boolean flags only
|
||||||
|
--flag=x
|
||||||
|
```
|
||||||
|
|
||||||
|
Unlike the flag package, a single dash before an option means something
|
||||||
|
different than a double dash. Single dashes signify a series of shorthand
|
||||||
|
letters for flags. All but the last shorthand letter must be boolean flags.
|
||||||
|
|
||||||
|
```
|
||||||
|
// boolean flags
|
||||||
|
-f
|
||||||
|
-abc
|
||||||
|
|
||||||
|
// non-boolean flags
|
||||||
|
-n 1234
|
||||||
|
-Ifile
|
||||||
|
|
||||||
|
// mixed
|
||||||
|
-abcs "hello"
|
||||||
|
-abcn1234
|
||||||
|
```
|
||||||
|
|
||||||
|
Flag parsing stops after the terminator "--". Unlike the flag package,
|
||||||
|
flags can be interspersed with arguments anywhere on the command line
|
||||||
|
before this terminator.
|
||||||
|
|
||||||
|
Integer flags accept 1234, 0664, 0x1234 and may be negative.
|
||||||
|
Boolean flags (in their long form) accept 1, 0, t, f, true, false,
|
||||||
|
TRUE, FALSE, True, False.
|
||||||
|
Duration flags accept any input valid for time.ParseDuration.
|
||||||
|
|
||||||
|
## Mutating or "Normalizing" Flag names
|
||||||
|
|
||||||
|
It is possible to set a custom flag name 'normalization function.' It allows flag names to be mutated both when created in the code and when used on the command line to some 'normalized' form. The 'normalized' form is used for comparison. Two examples of using the custom normalization func follow.
|
||||||
|
|
||||||
|
**Example #1**: You want -, _, and . in flags to compare the same. aka --my-flag == --my_flag == --my.flag
|
||||||
|
|
||||||
|
```go
|
||||||
|
func wordSepNormalizeFunc(f *pflag.FlagSet, name string) pflag.NormalizedName {
|
||||||
|
from := []string{"-", "_"}
|
||||||
|
to := "."
|
||||||
|
for _, sep := range from {
|
||||||
|
name = strings.Replace(name, sep, to, -1)
|
||||||
|
}
|
||||||
|
return pflag.NormalizedName(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
myFlagSet.SetNormalizeFunc(wordSepNormalizeFunc)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example #2**: You want to alias two flags. aka --old-flag-name == --new-flag-name
|
||||||
|
|
||||||
|
```go
|
||||||
|
func aliasNormalizeFunc(f *pflag.FlagSet, name string) pflag.NormalizedName {
|
||||||
|
switch name {
|
||||||
|
case "old-flag-name":
|
||||||
|
name = "new-flag-name"
|
||||||
|
break
|
||||||
|
}
|
||||||
|
return pflag.NormalizedName(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
myFlagSet.SetNormalizeFunc(aliasNormalizeFunc)
|
||||||
|
```
|
||||||
|
|
||||||
|
## More info
|
||||||
|
|
||||||
|
You can see the full reference documentation of the pflag package
|
||||||
|
[at godoc.org][3], or through go's standard documentation system by
|
||||||
|
running `godoc -http=:6060` and browsing to
|
||||||
|
[http://localhost:6060/pkg/github.com/ogier/pflag][2] after
|
||||||
|
installation.
|
||||||
|
|
||||||
|
[2]: http://localhost:6060/pkg/github.com/ogier/pflag
|
||||||
|
[3]: http://godoc.org/github.com/ogier/pflag
|
6
vendor/github.com/stevvooe/resumable/README.md
generated
vendored
Normal file
6
vendor/github.com/stevvooe/resumable/README.md
generated
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
# go-crypto
|
||||||
|
A Subset of the Go `crypto` Package with a Resumable Hash Interface
|
||||||
|
|
||||||
|
### Documentation
|
||||||
|
|
||||||
|
GoDocs: http://godoc.org/github.com/stevvooe/resumable
|
248
vendor/github.com/xenolf/lego/README.md
generated
vendored
Normal file
248
vendor/github.com/xenolf/lego/README.md
generated
vendored
Normal file
|
@ -0,0 +1,248 @@
|
||||||
|
# lego
|
||||||
|
Let's Encrypt client and ACME library written in Go
|
||||||
|
|
||||||
|
[![GoDoc](https://godoc.org/github.com/xenolf/lego/acme?status.svg)](https://godoc.org/github.com/xenolf/lego/acme)
|
||||||
|
[![Build Status](https://travis-ci.org/xenolf/lego.svg?branch=master)](https://travis-ci.org/xenolf/lego)
|
||||||
|
[![Dev Chat](https://img.shields.io/badge/dev%20chat-gitter-blue.svg?label=dev+chat)](https://gitter.im/xenolf/lego)
|
||||||
|
|
||||||
|
#### General
|
||||||
|
This is a work in progress. Please do *NOT* run this on a production server and please report any bugs you find!
|
||||||
|
|
||||||
|
#### Installation
|
||||||
|
lego supports both binary installs and install from source.
|
||||||
|
|
||||||
|
To get the binary just download the latest release for your OS/Arch from [the release page](https://github.com/xenolf/lego/releases)
|
||||||
|
and put the binary somewhere convenient. lego does not assume anything about the location you run it from.
|
||||||
|
|
||||||
|
To install from source, just run
|
||||||
|
```
|
||||||
|
go get -u github.com/xenolf/lego
|
||||||
|
```
|
||||||
|
|
||||||
|
To build lego inside a Docker container, just run
|
||||||
|
```
|
||||||
|
docker build -t lego .
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Features
|
||||||
|
|
||||||
|
- Register with CA
|
||||||
|
- Obtain certificates
|
||||||
|
- Renew certificates
|
||||||
|
- Revoke certificates
|
||||||
|
- Robust implementation of all ACME challenges
|
||||||
|
- HTTP (http-01)
|
||||||
|
- TLS with Server Name Indication (tls-sni-01)
|
||||||
|
- DNS (dns-01)
|
||||||
|
- SAN certificate support
|
||||||
|
- Comes with multiple optional [DNS providers](https://github.com/xenolf/lego/tree/master/providers/dns)
|
||||||
|
- [Custom challenge solvers](https://github.com/xenolf/lego/wiki/Writing-a-Challenge-Solver)
|
||||||
|
- Certificate bundling
|
||||||
|
- OCSP helper function
|
||||||
|
|
||||||
|
Please keep in mind that CLI switches and APIs are still subject to change.
|
||||||
|
|
||||||
|
When using the standard `--path` option, all certificates and account configurations are saved to a folder *.lego* in the current working directory.
|
||||||
|
|
||||||
|
#### Sudo
|
||||||
|
The CLI does not require root permissions but needs to bind to port 80 and 443 for certain challenges.
|
||||||
|
To run the CLI without sudo, you have four options:
|
||||||
|
|
||||||
|
- Use setcap 'cap_net_bind_service=+ep' /path/to/program
|
||||||
|
- Pass the `--http` or/and the `--tls` option and specify a custom port to bind to. In this case you have to forward port 80/443 to these custom ports (see [Port Usage](#port-usage)).
|
||||||
|
- Pass the `--webroot` option and specify the path to your webroot folder. In this case the challenge will be written in a file in `.well-known/acme-challenge/` inside your webroot.
|
||||||
|
- Pass the `--dns` option and specify a DNS provider.
|
||||||
|
|
||||||
|
#### Port Usage
|
||||||
|
By default lego assumes it is able to bind to ports 80 and 443 to solve challenges.
|
||||||
|
If this is not possible in your environment, you can use the `--http` and `--tls` options to instruct
|
||||||
|
lego to listen on that interface:port for any incoming challenges.
|
||||||
|
|
||||||
|
If you are using this option, make sure you proxy all of the following traffic to these ports.
|
||||||
|
|
||||||
|
HTTP Port:
|
||||||
|
- All plaintext HTTP requests to port 80 which begin with a request path of `/.well-known/acme-challenge/` for the HTTP challenge.
|
||||||
|
|
||||||
|
TLS Port:
|
||||||
|
- All TLS handshakes on port 443 for the TLS-SNI challenge.
|
||||||
|
|
||||||
|
This traffic redirection is only needed as long as lego solves challenges. As soon as you have received your certificates you can deactivate the forwarding.
|
||||||
|
|
||||||
|
#### Usage
|
||||||
|
|
||||||
|
```
|
||||||
|
NAME:
|
||||||
|
lego - Let's Encrypt client written in Go
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
lego [global options] command [command options] [arguments...]
|
||||||
|
|
||||||
|
VERSION:
|
||||||
|
0.3.0
|
||||||
|
|
||||||
|
COMMANDS:
|
||||||
|
run Register an account, then create and install a certificate
|
||||||
|
revoke Revoke a certificate
|
||||||
|
renew Renew a certificate
|
||||||
|
dnshelp Shows additional help for the --dns global option
|
||||||
|
help, h Shows a list of commands or help for one command
|
||||||
|
|
||||||
|
GLOBAL OPTIONS:
|
||||||
|
--domains, -d [--domains option --domains option] Add domains to the process
|
||||||
|
--server, -s "https://acme-v01.api.letsencrypt.org/directory" CA hostname (and optionally :port). The server certificate must be trusted in order to avoid further modifications to the client.
|
||||||
|
--email, -m Email used for registration and recovery contact.
|
||||||
|
--accept-tos, -a By setting this flag to true you indicate that you accept the current Let's Encrypt terms of service.
|
||||||
|
--key-type, -k "rsa2048" Key type to use for private keys. Supported: rsa2048, rsa4096, rsa8192, ec256, ec384
|
||||||
|
--path "${CWD}/.lego" Directory to use for storing the data
|
||||||
|
--exclude, -x [--exclude option --exclude option] Explicitly disallow solvers by name from being used. Solvers: "http-01", "tls-sni-01".
|
||||||
|
--webroot Set the webroot folder to use for HTTP based challenges to write directly in a file in .well-known/acme-challenge
|
||||||
|
--http Set the port and interface to use for HTTP based challenges to listen on. Supported: interface:port or :port
|
||||||
|
--tls Set the port and interface to use for TLS based challenges to listen on. Supported: interface:port or :port
|
||||||
|
--dns Solve a DNS challenge using the specified provider. Disables all other challenges. Run 'lego dnshelp' for help on usage.
|
||||||
|
--help, -h show help
|
||||||
|
--version, -v print the version
|
||||||
|
```
|
||||||
|
|
||||||
|
##### CLI Example
|
||||||
|
|
||||||
|
Assumes the `lego` binary has permission to bind to ports 80 and 443. You can get a pre-built binary from the [releases](https://github.com/xenolf/lego/releases) page.
|
||||||
|
If your environment does not allow you to bind to these ports, please read [Port Usage](#port-usage).
|
||||||
|
|
||||||
|
Obtain a certificate:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ lego --email="foo@bar.com" --domains="example.com" run
|
||||||
|
```
|
||||||
|
|
||||||
|
(Find your certificate in the `.lego` folder of current working directory.)
|
||||||
|
|
||||||
|
To renew the certificate:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ lego --email="foo@bar.com" --domains="example.com" renew
|
||||||
|
```
|
||||||
|
|
||||||
|
Obtain a certificate using the DNS challenge and AWS Route 53:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ AWS_REGION=us-east-1 AWS_ACCESS_KEY_ID=my_id AWS_SECRET_ACCESS_KEY=my_key lego --email="foo@bar.com" --domains="example.com" --dns="route53" run
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that `--dns=foo` implies `--exclude=http-01` and `--exclude=tls-sni-01`. lego will not attempt other challenges if you've told it to use DNS instead.
|
||||||
|
|
||||||
|
lego defaults to communicating with the production Let's Encrypt ACME server. If you'd like to test something without issuing real certificates, consider using the staging endpoint instead:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ lego --server=https://acme-staging.api.letsencrypt.org/directory …
|
||||||
|
```
|
||||||
|
|
||||||
|
#### DNS Challenge API Details
|
||||||
|
|
||||||
|
##### AWS Route 53
|
||||||
|
|
||||||
|
The following AWS IAM policy document describes the permissions required for lego to complete the DNS challenge.
|
||||||
|
Replace `<INSERT_YOUR_HOSTED_ZONE_ID_HERE>` with the Route 53 zone ID of the domain you are authorizing.
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"Version": "2012-10-17",
|
||||||
|
"Statement": [
|
||||||
|
{
|
||||||
|
"Effect": "Allow",
|
||||||
|
"Action": [
|
||||||
|
"route53:GetChange",
|
||||||
|
"route53:ListHostedZonesByName"
|
||||||
|
],
|
||||||
|
"Resource": [
|
||||||
|
"*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Effect": "Allow",
|
||||||
|
"Action": [
|
||||||
|
"route53:ChangeResourceRecordSets"
|
||||||
|
],
|
||||||
|
"Resource": [
|
||||||
|
"arn:aws:route53:::hostedzone/<INSERT_YOUR_HOSTED_ZONE_ID_HERE>"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### ACME Library Usage
|
||||||
|
|
||||||
|
A valid, but bare-bones example use of the acme package:
|
||||||
|
|
||||||
|
```go
|
||||||
|
// You'll need a user or account type that implements acme.User
|
||||||
|
type MyUser struct {
|
||||||
|
Email string
|
||||||
|
Registration *acme.RegistrationResource
|
||||||
|
key crypto.PrivateKey
|
||||||
|
}
|
||||||
|
func (u MyUser) GetEmail() string {
|
||||||
|
return u.Email
|
||||||
|
}
|
||||||
|
func (u MyUser) GetRegistration() *acme.RegistrationResource {
|
||||||
|
return u.Registration
|
||||||
|
}
|
||||||
|
func (u MyUser) GetPrivateKey() crypto.PrivateKey {
|
||||||
|
return u.key
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a user. New accounts need an email and private key to start.
|
||||||
|
const rsaKeySize = 2048
|
||||||
|
privateKey, err := rsa.GenerateKey(rand.Reader, rsaKeySize)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
myUser := MyUser{
|
||||||
|
Email: "you@yours.com",
|
||||||
|
key: privateKey,
|
||||||
|
}
|
||||||
|
|
||||||
|
// A client facilitates communication with the CA server. This CA URL is
|
||||||
|
// configured for a local dev instance of Boulder running in Docker in a VM.
|
||||||
|
client, err := acme.NewClient("http://192.168.99.100:4000", &myUser, acme.RSA2048)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// We specify an http port of 5002 and an tls port of 5001 on all interfaces
|
||||||
|
// because we aren't running as root and can't bind a listener to port 80 and 443
|
||||||
|
// (used later when we attempt to pass challenges). Keep in mind that we still
|
||||||
|
// need to proxy challenge traffic to port 5002 and 5001.
|
||||||
|
client.SetHTTPAddress(":5002")
|
||||||
|
client.SetTLSAddress(":5001")
|
||||||
|
|
||||||
|
// New users will need to register
|
||||||
|
reg, err := client.Register()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
myUser.Registration = reg
|
||||||
|
|
||||||
|
// SAVE THE USER.
|
||||||
|
|
||||||
|
// The client has a URL to the current Let's Encrypt Subscriber
|
||||||
|
// Agreement. The user will need to agree to it.
|
||||||
|
err = client.AgreeToTOS()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// The acme library takes care of completing the challenges to obtain the certificate(s).
|
||||||
|
// The domains must resolve to this machine or you have to use the DNS challenge.
|
||||||
|
bundle := false
|
||||||
|
certificates, failures := client.ObtainCertificate([]string{"mydomain.com"}, bundle, nil)
|
||||||
|
if len(failures) > 0 {
|
||||||
|
log.Fatal(failures)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Each certificate comes back with the cert bytes, the bytes of the client's
|
||||||
|
// private key, and a certificate URL. SAVE THESE TO DISK.
|
||||||
|
fmt.Printf("%#v\n", certificates)
|
||||||
|
|
||||||
|
// ... all done.
|
||||||
|
```
|
104
vendor/github.com/yvasiyarov/go-metrics/README.md
generated
vendored
Normal file
104
vendor/github.com/yvasiyarov/go-metrics/README.md
generated
vendored
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
go-metrics
|
||||||
|
==========
|
||||||
|
|
||||||
|
Go port of Coda Hale's Metrics library: <https://github.com/codahale/metrics>.
|
||||||
|
|
||||||
|
Documentation: <http://godoc.org/github.com/rcrowley/go-metrics>.
|
||||||
|
|
||||||
|
Usage
|
||||||
|
-----
|
||||||
|
|
||||||
|
Create and update metrics:
|
||||||
|
|
||||||
|
```go
|
||||||
|
c := metrics.NewCounter()
|
||||||
|
metrics.Register("foo", c)
|
||||||
|
c.Inc(47)
|
||||||
|
|
||||||
|
g := metrics.NewGauge()
|
||||||
|
metrics.Register("bar", g)
|
||||||
|
g.Update(47)
|
||||||
|
|
||||||
|
s := metrics.NewExpDecaySample(1028, 0.015) // or metrics.NewUniformSample(1028)
|
||||||
|
h := metrics.NewHistogram(s)
|
||||||
|
metrics.Register("baz", h)
|
||||||
|
h.Update(47)
|
||||||
|
|
||||||
|
m := metrics.NewMeter()
|
||||||
|
metrics.Register("quux", m)
|
||||||
|
m.Mark(47)
|
||||||
|
|
||||||
|
t := metrics.NewTimer()
|
||||||
|
metrics.Register("bang", t)
|
||||||
|
t.Time(func() {})
|
||||||
|
t.Update(47)
|
||||||
|
```
|
||||||
|
|
||||||
|
Periodically log every metric in human-readable form to standard error:
|
||||||
|
|
||||||
|
```go
|
||||||
|
go metrics.Log(metrics.DefaultRegistry, 60e9, log.New(os.Stderr, "metrics: ", log.Lmicroseconds))
|
||||||
|
```
|
||||||
|
|
||||||
|
Periodically log every metric in slightly-more-parseable form to syslog:
|
||||||
|
|
||||||
|
```go
|
||||||
|
w, _ := syslog.Dial("unixgram", "/dev/log", syslog.LOG_INFO, "metrics")
|
||||||
|
go metrics.Syslog(metrics.DefaultRegistry, 60e9, w)
|
||||||
|
```
|
||||||
|
|
||||||
|
Periodically emit every metric to Graphite:
|
||||||
|
|
||||||
|
```go
|
||||||
|
addr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:2003")
|
||||||
|
go metrics.Graphite(metrics.DefaultRegistry, 10e9, "metrics", addr)
|
||||||
|
```
|
||||||
|
|
||||||
|
Periodically emit every metric into InfluxDB:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import "github.com/rcrowley/go-metrics/influxdb"
|
||||||
|
|
||||||
|
go influxdb.Influxdb(metrics.DefaultRegistry, 10e9, &influxdb.Config{
|
||||||
|
Host: "127.0.0.1:8086",
|
||||||
|
Database: "metrics",
|
||||||
|
Username: "test",
|
||||||
|
Password: "test",
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
Periodically upload every metric to Librato:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import "github.com/rcrowley/go-metrics/librato"
|
||||||
|
|
||||||
|
go librato.Librato(metrics.DefaultRegistry,
|
||||||
|
10e9, // interval
|
||||||
|
"example@example.com", // account owner email address
|
||||||
|
"token", // Librato API token
|
||||||
|
"hostname", // source
|
||||||
|
[]float64{0.95}, // precentiles to send
|
||||||
|
time.Millisecond, // time unit
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
Periodically emit every metric to StatHat:
|
||||||
|
|
||||||
|
```go
|
||||||
|
import "github.com/rcrowley/go-metrics/stathat"
|
||||||
|
|
||||||
|
go stathat.Stathat(metrics.DefaultRegistry, 10e9, "example@example.com")
|
||||||
|
```
|
||||||
|
|
||||||
|
Installation
|
||||||
|
------------
|
||||||
|
|
||||||
|
```sh
|
||||||
|
go get github.com/rcrowley/go-metrics
|
||||||
|
```
|
||||||
|
|
||||||
|
StatHat support additionally requires their Go client:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
go get github.com/stathat/go
|
||||||
|
```
|
119
vendor/github.com/yvasiyarov/gorelic/README.md
generated
vendored
Normal file
119
vendor/github.com/yvasiyarov/gorelic/README.md
generated
vendored
Normal file
|
@ -0,0 +1,119 @@
|
||||||
|
# GoRelic
|
||||||
|
|
||||||
|
New Relic agent for Go runtime. It collect a lot of metrics about scheduler, garbage collector and memory allocator and
|
||||||
|
send them to NewRelic.
|
||||||
|
|
||||||
|
### Requirements
|
||||||
|
- Go 1.1 or higher
|
||||||
|
- github.com/yvasiyarov/gorelic
|
||||||
|
- github.com/yvasiyarov/newrelic_platform_go
|
||||||
|
- github.com/yvasiyarov/go-metrics
|
||||||
|
|
||||||
|
You have to install manually only first two dependencies. All other dependencies will be installed automatically
|
||||||
|
by Go toolchain.
|
||||||
|
|
||||||
|
### Installation
|
||||||
|
```bash
|
||||||
|
go get github.com/yvasiyarov/gorelic
|
||||||
|
```
|
||||||
|
and add to the initialization part of your application following code:
|
||||||
|
```go
|
||||||
|
import (
|
||||||
|
"github.com/yvasiyarov/gorelic"
|
||||||
|
)
|
||||||
|
....
|
||||||
|
|
||||||
|
agent := gorelic.NewAgent()
|
||||||
|
agent.Verbose = true
|
||||||
|
agent.NewrelicLicense = "YOUR NEWRELIC LICENSE KEY THERE"
|
||||||
|
agent.Run()
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### Middleware
|
||||||
|
If you using Beego, Martini, Revel or Gin framework you can hook up gorelic with your application by using the following middleware:
|
||||||
|
- https://github.com/yvasiyarov/beego_gorelic
|
||||||
|
- https://github.com/yvasiyarov/martini_gorelic
|
||||||
|
- https://github.com/yvasiyarov/gocraft_gorelic
|
||||||
|
- http://wiki.colar.net/revel_newelic
|
||||||
|
- https://github.com/jingweno/negroni-gorelic
|
||||||
|
- https://github.com/brandfolder/gin-gorelic
|
||||||
|
|
||||||
|
|
||||||
|
### Configuration
|
||||||
|
- NewrelicLicense - its the only mandatory setting of this agent.
|
||||||
|
- NewrelicName - component name in NewRelic dashboard. Default value: "Go daemon"
|
||||||
|
- NewrelicPollInterval - how often metrics will be sent to NewRelic. Default value: 60 seconds
|
||||||
|
- Verbose - print some usefull for debugging information. Default value: false
|
||||||
|
- CollectGcStat - should agent collect garbage collector statistic or not. Default value: true
|
||||||
|
- CollectHTTPStat - should agent collect HTTP metrics. Default value: false
|
||||||
|
- CollectMemoryStat - should agent collect memory allocator statistic or not. Default value: true
|
||||||
|
- GCPollInterval - how often should GC statistic collected. Default value: 10 seconds. It has performance impact. For more information, please, see metrics documentation.
|
||||||
|
- MemoryAllocatorPollInterval - how often should memory allocator statistic collected. Default value: 60 seconds. It has performance impact. For more information, please, read metrics documentation.
|
||||||
|
|
||||||
|
|
||||||
|
## Metrics reported by plugin
|
||||||
|
This agent use functions exposed by runtime or runtime/debug packages to collect most important information about Go runtime.
|
||||||
|
|
||||||
|
### General metrics
|
||||||
|
- Runtime/General/NOGoroutines - number of runned go routines, as it reported by NumGoroutine() from runtime package
|
||||||
|
- Runtime/General/NOCgoCalls - number of runned cgo calls, as it reported by NumCgoCall() from runtime package
|
||||||
|
|
||||||
|
### Garbage collector metrics
|
||||||
|
- Runtime/GC/NumberOfGCCalls - Nuber of GC calls, as it reported by ReadGCStats() from runtime/debug
|
||||||
|
- Runtime/GC/PauseTotalTime - Total pause time diring GC calls, as it reported by ReadGCStats() from runtime/debug (in nanoseconds)
|
||||||
|
- Runtime/GC/GCTime/Max - max GC time
|
||||||
|
- Runtime/GC/GCTime/Min - min GC time
|
||||||
|
- Runtime/GC/GCTime/Mean - GC mean time
|
||||||
|
- Runtime/GC/GCTime/Percentile95 - 95% percentile of GC time
|
||||||
|
|
||||||
|
All this metrics are measured in nanoseconds. Last 4 of them can be inaccurate if GC called more often then once in GCPollInterval.
|
||||||
|
If in your workload GC is called more often - you can consider decreasing value of GCPollInterval.
|
||||||
|
But be carefull, ReadGCStats() blocks mheap, so its not good idea to set GCPollInterval to very low values.
|
||||||
|
|
||||||
|
### Memory allocator
|
||||||
|
- Component/Runtime/Memory/SysMem/Total - number of bytes/minute allocated from OS totally.
|
||||||
|
- Component/Runtime/Memory/SysMem/Stack - number of bytes/minute allocated from OS for stacks.
|
||||||
|
- Component/Runtime/Memory/SysMem/MSpan - number of bytes/minute allocated from OS for internal MSpan structs.
|
||||||
|
- Component/Runtime/Memory/SysMem/MCache - number of bytes/minute allocated from OS for internal MCache structs.
|
||||||
|
- Component/Runtime/Memory/SysMem/Heap - number of bytes/minute allocated from OS for heap.
|
||||||
|
- Component/Runtime/Memory/SysMem/BuckHash - number of bytes/minute allocated from OS for internal BuckHash structs.
|
||||||
|
- Component/Runtime/Memory/Operations/NoFrees - number of memory frees per minute
|
||||||
|
- Component/Runtime/Memory/Operations/NoMallocs - number of memory allocations per minute
|
||||||
|
- Component/Runtime/Memory/Operations/NoPointerLookups - number of pointer lookups per minute
|
||||||
|
- Component/Runtime/Memory/InUse/Total - total amount of memory in use
|
||||||
|
- Component/Runtime/Memory/InUse/Heap - amount of memory in use for heap
|
||||||
|
- Component/Runtime/Memory/InUse/MCacheInuse - amount of memory in use for MCache internal structures
|
||||||
|
- Component/Runtime/Memory/InUse/MSpanInuse - amount of memory in use for MSpan internal structures
|
||||||
|
- Component/Runtime/Memory/InUse/Stack - amount of memory in use for stacks
|
||||||
|
|
||||||
|
### Process metrics
|
||||||
|
- Component/Runtime/System/Threads - number of OS threads used
|
||||||
|
- Runtime/System/FDSize - number of file descriptors, used by process
|
||||||
|
- Runtime/System/Memory/VmPeakSize - VM max size
|
||||||
|
- Runtime/System/Memory/VmCurrent - VM current size
|
||||||
|
- Runtime/System/Memory/RssPeak - max size of resident memory set
|
||||||
|
- Runtime/System/Memory/RssCurrent - current size of resident memory set
|
||||||
|
|
||||||
|
All this metrics collected once in MemoryAllocatorPollInterval. In order to collect this statistic agent use ReadMemStats() routine.
|
||||||
|
This routine calls stoptheworld() internally and it block everything. So, please, consider this when you change MemoryAllocatorPollInterval value.
|
||||||
|
|
||||||
|
### HTTP metrics
|
||||||
|
- throughput (requests per second), calculated for last minute
|
||||||
|
- mean throughput (requests per second)
|
||||||
|
- mean response time
|
||||||
|
- min response time
|
||||||
|
- max response time
|
||||||
|
- 75%, 90%, 95% percentiles for response time
|
||||||
|
|
||||||
|
|
||||||
|
In order to collect HTTP metrics, handler functions must be wrapped using WrapHTTPHandlerFunc:
|
||||||
|
|
||||||
|
```go
|
||||||
|
http.HandleFunc("/", agent.WrapHTTPHandlerFunc(handler))
|
||||||
|
```
|
||||||
|
|
||||||
|
## TODO
|
||||||
|
- Collect per-size allocation statistic
|
||||||
|
- Collect user defined metrics
|
||||||
|
|
11
vendor/github.com/yvasiyarov/newrelic_platform_go/README.md
generated
vendored
Normal file
11
vendor/github.com/yvasiyarov/newrelic_platform_go/README.md
generated
vendored
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
New Relic Platform Agent SDK for Go(golang)
|
||||||
|
====================
|
||||||
|
|
||||||
|
[![Build Status](https://travis-ci.org/yvasiyarov/newrelic_platform_go.png?branch=master)](https://travis-ci.org/yvasiyarov/newrelic_platform_go)
|
||||||
|
|
||||||
|
This package provide very simple interface to NewRelic Platform http://newrelic.com/platform
|
||||||
|
|
||||||
|
For example of usage see examples/wave_plugin.go
|
||||||
|
|
||||||
|
For real-word example, you can have a look at:
|
||||||
|
https://github.com/yvasiyarov/newrelic_sphinx
|
3
vendor/golang.org/x/crypto/README
generated
vendored
Normal file
3
vendor/golang.org/x/crypto/README
generated
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
This repository holds supplementary Go cryptography libraries.
|
||||||
|
|
||||||
|
To submit changes to this repository, see http://golang.org/doc/contribute.html.
|
3
vendor/golang.org/x/net/README
generated
vendored
Normal file
3
vendor/golang.org/x/net/README
generated
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
This repository holds supplementary Go networking libraries.
|
||||||
|
|
||||||
|
To submit changes to this repository, see http://golang.org/doc/contribute.html.
|
20
vendor/golang.org/x/net/http2/README
generated
vendored
Normal file
20
vendor/golang.org/x/net/http2/README
generated
vendored
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
This is a work-in-progress HTTP/2 implementation for Go.
|
||||||
|
|
||||||
|
It will eventually live in the Go standard library and won't require
|
||||||
|
any changes to your code to use. It will just be automatic.
|
||||||
|
|
||||||
|
Status:
|
||||||
|
|
||||||
|
* The server support is pretty good. A few things are missing
|
||||||
|
but are being worked on.
|
||||||
|
* The client work has just started but shares a lot of code
|
||||||
|
is coming along much quicker.
|
||||||
|
|
||||||
|
Docs are at https://godoc.org/golang.org/x/net/http2
|
||||||
|
|
||||||
|
Demo test server at https://http2.golang.org/
|
||||||
|
|
||||||
|
Help & bug reports welcome!
|
||||||
|
|
||||||
|
Contributing: https://golang.org/doc/contribute.html
|
||||||
|
Bugs: https://golang.org/issue/new?title=x/net/http2:+
|
64
vendor/golang.org/x/oauth2/README.md
generated
vendored
Normal file
64
vendor/golang.org/x/oauth2/README.md
generated
vendored
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
# OAuth2 for Go
|
||||||
|
|
||||||
|
[![Build Status](https://travis-ci.org/golang/oauth2.svg?branch=master)](https://travis-ci.org/golang/oauth2)
|
||||||
|
|
||||||
|
oauth2 package contains a client implementation for OAuth 2.0 spec.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
~~~~
|
||||||
|
go get golang.org/x/oauth2
|
||||||
|
~~~~
|
||||||
|
|
||||||
|
See godoc for further documentation and examples.
|
||||||
|
|
||||||
|
* [godoc.org/golang.org/x/oauth2](http://godoc.org/golang.org/x/oauth2)
|
||||||
|
* [godoc.org/golang.org/x/oauth2/google](http://godoc.org/golang.org/x/oauth2/google)
|
||||||
|
|
||||||
|
|
||||||
|
## App Engine
|
||||||
|
|
||||||
|
In change 96e89be (March 2015) we removed the `oauth2.Context2` type in favor
|
||||||
|
of the [`context.Context`](https://golang.org/x/net/context#Context) type from
|
||||||
|
the `golang.org/x/net/context` package
|
||||||
|
|
||||||
|
This means its no longer possible to use the "Classic App Engine"
|
||||||
|
`appengine.Context` type with the `oauth2` package. (You're using
|
||||||
|
Classic App Engine if you import the package `"appengine"`.)
|
||||||
|
|
||||||
|
To work around this, you may use the new `"google.golang.org/appengine"`
|
||||||
|
package. This package has almost the same API as the `"appengine"` package,
|
||||||
|
but it can be fetched with `go get` and used on "Managed VMs" and well as
|
||||||
|
Classic App Engine.
|
||||||
|
|
||||||
|
See the [new `appengine` package's readme](https://github.com/golang/appengine#updating-a-go-app-engine-app)
|
||||||
|
for information on updating your app.
|
||||||
|
|
||||||
|
If you don't want to update your entire app to use the new App Engine packages,
|
||||||
|
you may use both sets of packages in parallel, using only the new packages
|
||||||
|
with the `oauth2` package.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"golang.org/x/net/context"
|
||||||
|
"golang.org/x/oauth2"
|
||||||
|
"golang.org/x/oauth2/google"
|
||||||
|
newappengine "google.golang.org/appengine"
|
||||||
|
newurlfetch "google.golang.org/appengine/urlfetch"
|
||||||
|
|
||||||
|
"appengine"
|
||||||
|
)
|
||||||
|
|
||||||
|
func handler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var c appengine.Context = appengine.NewContext(r)
|
||||||
|
c.Infof("Logging a message with the old package")
|
||||||
|
|
||||||
|
var ctx context.Context = newappengine.NewContext(r)
|
||||||
|
client := &http.Client{
|
||||||
|
Transport: &oauth2.Transport{
|
||||||
|
Source: google.AppEngineTokenSource(ctx, "scope"),
|
||||||
|
Base: &newurlfetch.Transport{Context: ctx},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
client.Get("...")
|
||||||
|
}
|
||||||
|
|
1
vendor/golang.org/x/time/README
generated
vendored
Normal file
1
vendor/golang.org/x/time/README
generated
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
This repository provides supplementary Go time packages.
|
92
vendor/google.golang.org/api/README.md
generated
vendored
Normal file
92
vendor/google.golang.org/api/README.md
generated
vendored
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
# Google APIs Client Library for Go
|
||||||
|
|
||||||
|
## Status
|
||||||
|
[![Build Status](https://travis-ci.org/google/google-api-go-client.png)](https://travis-ci.org/google/google-api-go-client)
|
||||||
|
|
||||||
|
These are auto-generated Go libraries from the Google Discovery Service's JSON description files of the available "new style" Google APIs.
|
||||||
|
|
||||||
|
Due to the auto-generated nature of this collection of libraries, complete APIs or specific versions can appear or go away without notice.
|
||||||
|
As a result, you should always locally vendor any API(s) that your code relies upon.
|
||||||
|
|
||||||
|
Announcement email:
|
||||||
|
|
||||||
|
* http://groups.google.com/group/golang-nuts/browse_thread/thread/6c7281450be9a21e
|
||||||
|
|
||||||
|
Getting started documentation:
|
||||||
|
|
||||||
|
* https://github.com/google/google-api-go-client/blob/master/GettingStarted.md
|
||||||
|
|
||||||
|
In summary:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ go get google.golang.org/api/storage/v1
|
||||||
|
$ go get google.golang.org/api/tasks/v1
|
||||||
|
$ go get google.golang.org/api/moderator/v1
|
||||||
|
... etc ...
|
||||||
|
```
|
||||||
|
|
||||||
|
For docs, see e.g.:
|
||||||
|
|
||||||
|
* https://godoc.org/google.golang.org/api/storage/v1
|
||||||
|
|
||||||
|
The package of a given import is the second-to-last component, before the version number.
|
||||||
|
|
||||||
|
For examples, see:
|
||||||
|
|
||||||
|
* https://github.com/google/google-api-go-client/tree/master/examples
|
||||||
|
|
||||||
|
For support, use the golang-nuts@ mailing list:
|
||||||
|
|
||||||
|
* https://groups.google.com/group/golang-nuts
|
||||||
|
|
||||||
|
## Application Default Credentials Example
|
||||||
|
|
||||||
|
Application Default Credentials provide a simplified way to obtain credentials
|
||||||
|
for authenticating with Google APIs.
|
||||||
|
|
||||||
|
The Application Default Credentials authenticate as the application itself,
|
||||||
|
which make them great for working with Google Cloud APIs like Storage or
|
||||||
|
Datastore. They are the recommended form of authentication when building
|
||||||
|
applications that run on Google Compute Engine or Google App Engine.
|
||||||
|
|
||||||
|
Default credentials are provided by the `golang.org/x/oauth2/google` package. To use them, add the following import:
|
||||||
|
|
||||||
|
```
|
||||||
|
import "golang.org/x/oauth2/google"
|
||||||
|
```
|
||||||
|
|
||||||
|
Some credentials types require you to specify scopes, and service entry points may not inject them. If you encounter this situation you may need to specify scopes as follows:
|
||||||
|
|
||||||
|
```
|
||||||
|
import (
|
||||||
|
"golang.org/x/net/context"
|
||||||
|
"golang.org/x/oauth2/google"
|
||||||
|
"google.golang.org/api/compute/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// Use oauth2.NoContext if there isn't a good context to pass in.
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
|
client, err := google.DefaultClient(ctx, compute.ComputeScope)
|
||||||
|
if err != nil {
|
||||||
|
//...
|
||||||
|
}
|
||||||
|
computeService, err := compute.New(client)
|
||||||
|
if err != nil {
|
||||||
|
//...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
If you need a `oauth2.TokenSource`, use the `DefaultTokenSource` function:
|
||||||
|
|
||||||
|
```
|
||||||
|
ts, err := google.DefaultTokenSource(ctx, scope1, scope2, ...)
|
||||||
|
if err != nil {
|
||||||
|
//...
|
||||||
|
}
|
||||||
|
client := oauth2.NewClient(ctx, ts)
|
||||||
|
```
|
||||||
|
|
||||||
|
See also: [golang.org/x/oauth2/google](https://godoc.org/golang.org/x/oauth2/google) package documentation.
|
73
vendor/google.golang.org/appengine/README.md
generated
vendored
Normal file
73
vendor/google.golang.org/appengine/README.md
generated
vendored
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
# Go App Engine packages
|
||||||
|
|
||||||
|
[![Build Status](https://travis-ci.org/golang/appengine.svg)](https://travis-ci.org/golang/appengine)
|
||||||
|
|
||||||
|
This repository supports the Go runtime on App Engine,
|
||||||
|
including both classic App Engine and Managed VMs.
|
||||||
|
It provides APIs for interacting with App Engine services.
|
||||||
|
Its canonical import path is `google.golang.org/appengine`.
|
||||||
|
|
||||||
|
See https://cloud.google.com/appengine/docs/go/
|
||||||
|
for more information.
|
||||||
|
|
||||||
|
File issue reports and feature requests on the [Google App Engine issue
|
||||||
|
tracker](https://code.google.com/p/googleappengine/issues/entry?template=Go%20defect).
|
||||||
|
|
||||||
|
## Directory structure
|
||||||
|
The top level directory of this repository is the `appengine` package. It
|
||||||
|
contains the
|
||||||
|
basic APIs (e.g. `appengine.NewContext`) that apply across APIs. Specific API
|
||||||
|
packages are in subdirectories (e.g. `datastore`).
|
||||||
|
|
||||||
|
There is an `internal` subdirectory that contains service protocol buffers,
|
||||||
|
plus packages required for connectivity to make API calls. App Engine apps
|
||||||
|
should not directly import any package under `internal`.
|
||||||
|
|
||||||
|
## Updating a Go App Engine app
|
||||||
|
|
||||||
|
This section describes how to update a traditional Go App Engine app to use
|
||||||
|
these packages.
|
||||||
|
|
||||||
|
### 1. Update YAML files (Managed VMs only)
|
||||||
|
|
||||||
|
The `app.yaml` file (and YAML files for modules) should have these new lines added:
|
||||||
|
```
|
||||||
|
vm: true
|
||||||
|
```
|
||||||
|
See https://cloud.google.com/appengine/docs/go/modules/#Go_Instance_scaling_and_class for details.
|
||||||
|
|
||||||
|
### 2. Update import paths
|
||||||
|
|
||||||
|
The import paths for App Engine packages are now fully qualified, based at `google.golang.org/appengine`.
|
||||||
|
You will need to update your code to use import paths starting with that; for instance,
|
||||||
|
code importing `appengine/datastore` will now need to import `google.golang.org/appengine/datastore`.
|
||||||
|
You can do that manually, or by running this command to recursively update all Go source files in the current directory:
|
||||||
|
(may require GNU sed)
|
||||||
|
```
|
||||||
|
sed -i '/"appengine/{s,"appengine,"google.golang.org/appengine,;s,appengine_,appengine/,}' \
|
||||||
|
$(find . -name '*.go')
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Update code using deprecated, removed or modified APIs
|
||||||
|
|
||||||
|
Most App Engine services are available with exactly the same API.
|
||||||
|
A few APIs were cleaned up, and some are not available yet.
|
||||||
|
This list summarises the differences:
|
||||||
|
|
||||||
|
* `appengine.Context` has been replaced with the `Context` type from `golang.org/x/net/context`.
|
||||||
|
* Logging methods that were on `appengine.Context` are now functions in `google.golang.org/appengine/log`.
|
||||||
|
* `appengine.Timeout` has been removed. Use `context.WithTimeout` instead.
|
||||||
|
* `appengine.Datacenter` now takes a `context.Context` argument.
|
||||||
|
* `datastore.PropertyLoadSaver` has been simplified to use slices in place of channels.
|
||||||
|
* `delay.Call` now returns an error.
|
||||||
|
* `search.FieldLoadSaver` now handles document metadata.
|
||||||
|
* `urlfetch.Transport` no longer has a Deadline field; set a deadline on the
|
||||||
|
`context.Context` instead.
|
||||||
|
* `aetest` no longer declares its own Context type, and uses the standard one instead.
|
||||||
|
* `taskqueue.QueueStats` no longer takes a maxTasks argument. That argument has been
|
||||||
|
deprecated and unused for a long time.
|
||||||
|
* `appengine.BackendHostname` and `appengine.BackendInstance` were for the deprecated backends feature.
|
||||||
|
Use `appengine.ModuleHostname`and `appengine.ModuleName` instead.
|
||||||
|
* Most of `appengine/file` and parts of `appengine/blobstore` are deprecated.
|
||||||
|
Use [Google Cloud Storage](https://godoc.org/google.golang.org/cloud/storage) instead.
|
||||||
|
* `appengine/socket` is not required on Managed VMs. Use the standard `net` package instead.
|
135
vendor/google.golang.org/cloud/README.md
generated
vendored
Normal file
135
vendor/google.golang.org/cloud/README.md
generated
vendored
Normal file
|
@ -0,0 +1,135 @@
|
||||||
|
# Google Cloud for Go
|
||||||
|
|
||||||
|
[![Build Status](https://travis-ci.org/GoogleCloudPlatform/gcloud-golang.svg?branch=master)](https://travis-ci.org/GoogleCloudPlatform/gcloud-golang)
|
||||||
|
|
||||||
|
**NOTE:** These packages are experimental, and may occasionally make
|
||||||
|
backwards-incompatible changes.
|
||||||
|
|
||||||
|
**NOTE:** Github repo is a mirror of [https://code.googlesource.com/gocloud](https://code.googlesource.com/gocloud).
|
||||||
|
|
||||||
|
Go packages for Google Cloud Platform services. Supported APIs include:
|
||||||
|
|
||||||
|
* Google Cloud Datastore
|
||||||
|
* Google Cloud Storage
|
||||||
|
* Google Cloud Pub/Sub
|
||||||
|
* Google Cloud Container Engine
|
||||||
|
|
||||||
|
``` go
|
||||||
|
import "google.golang.org/cloud"
|
||||||
|
```
|
||||||
|
|
||||||
|
Documentation and examples are available at
|
||||||
|
[https://godoc.org/google.golang.org/cloud](https://godoc.org/google.golang.org/cloud).
|
||||||
|
|
||||||
|
## Authorization
|
||||||
|
|
||||||
|
Authorization, throughout the package, is delegated to the godoc.org/golang.org/x/oauth2.
|
||||||
|
Refer to the [godoc documentation](https://godoc.org/golang.org/x/oauth2)
|
||||||
|
for examples on using oauth2 with the Cloud package.
|
||||||
|
|
||||||
|
## Google Cloud Datastore
|
||||||
|
|
||||||
|
[Google Cloud Datastore][cloud-datastore] ([docs][cloud-datastore-docs]) is a fully
|
||||||
|
managed, schemaless database for storing non-relational data. Cloud Datastore
|
||||||
|
automatically scales with your users and supports ACID transactions, high availability
|
||||||
|
of reads and writes, strong consistency for reads and ancestor queries, and eventual
|
||||||
|
consistency for all other queries.
|
||||||
|
|
||||||
|
Follow the [activation instructions][cloud-datastore-activation] to use the Google
|
||||||
|
Cloud Datastore API with your project.
|
||||||
|
|
||||||
|
[https://godoc.org/google.golang.org/cloud/datastore](https://godoc.org/google.golang.org/cloud/datastore)
|
||||||
|
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Post struct {
|
||||||
|
Title string
|
||||||
|
Body string `datastore:",noindex"`
|
||||||
|
PublishedAt time.Time
|
||||||
|
}
|
||||||
|
keys := []*datastore.Key{
|
||||||
|
datastore.NewKey(ctx, "Post", "post1", 0, nil),
|
||||||
|
datastore.NewKey(ctx, "Post", "post2", 0, nil),
|
||||||
|
}
|
||||||
|
posts := []*Post{
|
||||||
|
{Title: "Post 1", Body: "...", PublishedAt: time.Now()},
|
||||||
|
{Title: "Post 2", Body: "...", PublishedAt: time.Now()},
|
||||||
|
}
|
||||||
|
if _, err := datastore.PutMulti(ctx, keys, posts); err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Google Cloud Storage
|
||||||
|
|
||||||
|
[Google Cloud Storage][cloud-storage] ([docs][cloud-storage-docs]) allows you to store
|
||||||
|
data on Google infrastructure with very high reliability, performance and availability,
|
||||||
|
and can be used to distribute large data objects to users via direct download.
|
||||||
|
|
||||||
|
[https://godoc.org/google.golang.org/cloud/storage](https://godoc.org/google.golang.org/cloud/storage)
|
||||||
|
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Read the object1 from bucket.
|
||||||
|
rc, err := storage.NewReader(ctx, "bucket", "object1")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
slurp, err := ioutil.ReadAll(rc)
|
||||||
|
rc.Close()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Google Cloud Pub/Sub (Alpha)
|
||||||
|
|
||||||
|
> Google Cloud Pub/Sub is in **Alpha status**. As a result, it might change in
|
||||||
|
> backward-incompatible ways and is not recommended for production use. It is not
|
||||||
|
> subject to any SLA or deprecation policy.
|
||||||
|
|
||||||
|
[Google Cloud Pub/Sub][cloud-pubsub] ([docs][cloud-pubsub-docs]) allows you to connect
|
||||||
|
your services with reliable, many-to-many, asynchronous messaging hosted on Google's
|
||||||
|
infrastructure. Cloud Pub/Sub automatically scales as you need it and provides a foundation
|
||||||
|
for building your own robust, global services.
|
||||||
|
|
||||||
|
[https://godoc.org/google.golang.org/cloud/pubsub](https://godoc.org/google.golang.org/cloud/pubsub)
|
||||||
|
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Publish "hello world" on topic1.
|
||||||
|
msgIDs, err := pubsub.Publish(ctx, "topic1", &pubsub.Message{
|
||||||
|
Data: []byte("hello world"),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
// Pull messages via subscription1.
|
||||||
|
msgs, err := pubsub.Pull(ctx, "subscription1", 1)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Contributions are welcome. Please, see the
|
||||||
|
[CONTRIBUTING](https://github.com/GoogleCloudPlatform/gcloud-golang/blob/master/CONTRIBUTING.md)
|
||||||
|
document for details. We're using Gerrit for our code reviews. Please don't open pull
|
||||||
|
requests against this repo, new pull requests will be automatically closed.
|
||||||
|
|
||||||
|
Please note that this project is released with a Contributor Code of Conduct.
|
||||||
|
By participating in this project you agree to abide by its terms.
|
||||||
|
See [Contributor Code of Conduct](https://github.com/GoogleCloudPlatform/gcloud-golang/blob/master/CONTRIBUTING.md#contributor-code-of-conduct)
|
||||||
|
for more information.
|
||||||
|
|
||||||
|
[cloud-datastore]: https://cloud.google.com/datastore/
|
||||||
|
[cloud-datastore-docs]: https://cloud.google.com/datastore/docs
|
||||||
|
[cloud-datastore-activation]: https://cloud.google.com/datastore/docs/activate
|
||||||
|
|
||||||
|
[cloud-pubsub]: https://cloud.google.com/pubsub/
|
||||||
|
[cloud-pubsub-docs]: https://cloud.google.com/pubsub/docs
|
||||||
|
|
||||||
|
[cloud-storage]: https://cloud.google.com/storage/
|
||||||
|
[cloud-storage-docs]: https://cloud.google.com/storage/docs/overview
|
||||||
|
[cloud-storage-create-bucket]: https://cloud.google.com/storage/docs/cloud-console#_creatingbuckets
|
32
vendor/google.golang.org/grpc/README.md
generated
vendored
Normal file
32
vendor/google.golang.org/grpc/README.md
generated
vendored
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
#gRPC-Go
|
||||||
|
|
||||||
|
[![Build Status](https://travis-ci.org/grpc/grpc-go.svg)](https://travis-ci.org/grpc/grpc-go) [![GoDoc](https://godoc.org/google.golang.org/grpc?status.svg)](https://godoc.org/google.golang.org/grpc)
|
||||||
|
|
||||||
|
The Go implementation of [gRPC](http://www.grpc.io/): A high performance, open source, general RPC framework that puts mobile and HTTP/2 first. For more information see the [gRPC Quick Start](http://www.grpc.io/docs/) guide.
|
||||||
|
|
||||||
|
Installation
|
||||||
|
------------
|
||||||
|
|
||||||
|
To install this package, you need to install Go 1.4 or above and setup your Go workspace on your computer. The simplest way to install the library is to run:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ go get google.golang.org/grpc
|
||||||
|
```
|
||||||
|
|
||||||
|
Prerequisites
|
||||||
|
-------------
|
||||||
|
|
||||||
|
This requires Go 1.4 or above.
|
||||||
|
|
||||||
|
Constraints
|
||||||
|
-----------
|
||||||
|
The grpc package should only depend on standard Go packages and a small number of exceptions. If your contribution introduces new dependencies which are NOT in the [list](http://godoc.org/google.golang.org/grpc?imports), you need a discussion with gRPC-Go authors and consultants.
|
||||||
|
|
||||||
|
Documentation
|
||||||
|
-------------
|
||||||
|
See [API documentation](https://godoc.org/google.golang.org/grpc) for package and API descriptions and find examples in the [examples directory](examples/).
|
||||||
|
|
||||||
|
Status
|
||||||
|
------
|
||||||
|
Beta release
|
||||||
|
|
20
vendor/gopkg.in/check.v1/README.md
generated
vendored
Normal file
20
vendor/gopkg.in/check.v1/README.md
generated
vendored
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
Instructions
|
||||||
|
============
|
||||||
|
|
||||||
|
Install the package with:
|
||||||
|
|
||||||
|
go get gopkg.in/check.v1
|
||||||
|
|
||||||
|
Import it with:
|
||||||
|
|
||||||
|
import "gopkg.in/check.v1"
|
||||||
|
|
||||||
|
and use _check_ as the package name inside the code.
|
||||||
|
|
||||||
|
For more details, visit the project page:
|
||||||
|
|
||||||
|
* http://labix.org/gocheck
|
||||||
|
|
||||||
|
and the API documentation:
|
||||||
|
|
||||||
|
* https://gopkg.in/check.v1
|
209
vendor/gopkg.in/square/go-jose.v1/README.md
generated
vendored
Normal file
209
vendor/gopkg.in/square/go-jose.v1/README.md
generated
vendored
Normal file
|
@ -0,0 +1,209 @@
|
||||||
|
# Go JOSE
|
||||||
|
|
||||||
|
[![godoc](http://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://godoc.org/gopkg.in/square/go-jose.v1) [![license](http://img.shields.io/badge/license-apache_2.0-red.svg?style=flat)](https://raw.githubusercontent.com/square/go-jose/master/LICENSE) [![build](https://travis-ci.org/square/go-jose.svg?branch=master)](https://travis-ci.org/square/go-jose) [![coverage](https://coveralls.io/repos/github/square/go-jose/badge.svg?branch=master)](https://coveralls.io/r/square/go-jose)
|
||||||
|
|
||||||
|
Package jose aims to provide an implementation of the Javascript Object Signing
|
||||||
|
and Encryption set of standards. For the moment, it mainly focuses on encryption
|
||||||
|
and signing based on the JSON Web Encryption and JSON Web Signature standards.
|
||||||
|
|
||||||
|
**Disclaimer**: This library contains encryption software that is subject to
|
||||||
|
the U.S. Export Administration Regulations. You may not export, re-export,
|
||||||
|
transfer or download this code or any part of it in violation of any United
|
||||||
|
States law, directive or regulation. In particular this software may not be
|
||||||
|
exported or re-exported in any form or on any media to Iran, North Sudan,
|
||||||
|
Syria, Cuba, or North Korea, or to denied persons or entities mentioned on any
|
||||||
|
US maintained blocked list.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The implementation follows the
|
||||||
|
[JSON Web Encryption](http://dx.doi.org/10.17487/RFC7516)
|
||||||
|
standard (RFC 7516) and
|
||||||
|
[JSON Web Signature](http://dx.doi.org/10.17487/RFC7515)
|
||||||
|
standard (RFC 7515). Tables of supported algorithms are shown below.
|
||||||
|
The library supports both the compact and full serialization formats, and has
|
||||||
|
optional support for multiple recipients. It also comes with a small
|
||||||
|
command-line utility
|
||||||
|
([`jose-util`](https://github.com/square/go-jose/tree/master/jose-util))
|
||||||
|
for dealing with JOSE messages in a shell.
|
||||||
|
|
||||||
|
**Note**: We use a forked version of the `encoding/json` package from the Go
|
||||||
|
standard library which uses case-sensitive matching for member names (instead
|
||||||
|
of [case-insensitive matching](https://www.ietf.org/mail-archive/web/json/current/msg03763.html)).
|
||||||
|
This is to avoid differences in interpretation of messages between go-jose and
|
||||||
|
libraries in other languages. If you do not like this behavior, you can use the
|
||||||
|
`std_json` build tag to disable it (though we do not recommend doing so).
|
||||||
|
|
||||||
|
### Versions
|
||||||
|
|
||||||
|
We use [gopkg.in](https://gopkg.in) for versioning.
|
||||||
|
|
||||||
|
[Version 1](https://gopkg.in/square/go-jose.v1) is the current stable version:
|
||||||
|
|
||||||
|
import "gopkg.in/square/go-jose.v1"
|
||||||
|
|
||||||
|
The interface for [go-jose.v1](https://gopkg.in/square/go-jose.v1) will remain
|
||||||
|
backwards compatible. We're currently sketching out ideas for a new version, to
|
||||||
|
clean up the interface a bit. If you have ideas or feature requests [please let
|
||||||
|
us know](https://github.com/square/go-jose/issues/64)!
|
||||||
|
|
||||||
|
### Supported algorithms
|
||||||
|
|
||||||
|
See below for a table of supported algorithms. Algorithm identifiers match
|
||||||
|
the names in the
|
||||||
|
[JSON Web Algorithms](http://dx.doi.org/10.17487/RFC7518)
|
||||||
|
standard where possible. The
|
||||||
|
[Godoc reference](https://godoc.org/github.com/square/go-jose#pkg-constants)
|
||||||
|
has a list of constants.
|
||||||
|
|
||||||
|
Key encryption | Algorithm identifier(s)
|
||||||
|
:------------------------- | :------------------------------
|
||||||
|
RSA-PKCS#1v1.5 | RSA1_5
|
||||||
|
RSA-OAEP | RSA-OAEP, RSA-OAEP-256
|
||||||
|
AES key wrap | A128KW, A192KW, A256KW
|
||||||
|
AES-GCM key wrap | A128GCMKW, A192GCMKW, A256GCMKW
|
||||||
|
ECDH-ES + AES key wrap | ECDH-ES+A128KW, ECDH-ES+A192KW, ECDH-ES+A256KW
|
||||||
|
ECDH-ES (direct) | ECDH-ES<sup>1</sup>
|
||||||
|
Direct encryption | dir<sup>1</sup>
|
||||||
|
|
||||||
|
<sup>1. Not supported in multi-recipient mode</sup>
|
||||||
|
|
||||||
|
Signing / MAC | Algorithm identifier(s)
|
||||||
|
:------------------------- | :------------------------------
|
||||||
|
RSASSA-PKCS#1v1.5 | RS256, RS384, RS512
|
||||||
|
RSASSA-PSS | PS256, PS384, PS512
|
||||||
|
HMAC | HS256, HS384, HS512
|
||||||
|
ECDSA | ES256, ES384, ES512
|
||||||
|
|
||||||
|
Content encryption | Algorithm identifier(s)
|
||||||
|
:------------------------- | :------------------------------
|
||||||
|
AES-CBC+HMAC | A128CBC-HS256, A192CBC-HS384, A256CBC-HS512
|
||||||
|
AES-GCM | A128GCM, A192GCM, A256GCM
|
||||||
|
|
||||||
|
Compression | Algorithm identifiers(s)
|
||||||
|
:------------------------- | -------------------------------
|
||||||
|
DEFLATE (RFC 1951) | DEF
|
||||||
|
|
||||||
|
### Supported key types
|
||||||
|
|
||||||
|
See below for a table of supported key types. These are understood by the
|
||||||
|
library, and can be passed to corresponding functions such as `NewEncrypter` or
|
||||||
|
`NewSigner`. Note that if you are creating a new encrypter or signer with a
|
||||||
|
JsonWebKey, the key id of the JsonWebKey (if present) will be added to any
|
||||||
|
resulting messages.
|
||||||
|
|
||||||
|
Algorithm(s) | Corresponding types
|
||||||
|
:------------------------- | -------------------------------
|
||||||
|
RSA | *[rsa.PublicKey](http://golang.org/pkg/crypto/rsa/#PublicKey), *[rsa.PrivateKey](http://golang.org/pkg/crypto/rsa/#PrivateKey), *[jose.JsonWebKey](https://godoc.org/github.com/square/go-jose#JsonWebKey)
|
||||||
|
ECDH, ECDSA | *[ecdsa.PublicKey](http://golang.org/pkg/crypto/ecdsa/#PublicKey), *[ecdsa.PrivateKey](http://golang.org/pkg/crypto/ecdsa/#PrivateKey), *[jose.JsonWebKey](https://godoc.org/github.com/square/go-jose#JsonWebKey)
|
||||||
|
AES, HMAC | []byte, *[jose.JsonWebKey](https://godoc.org/github.com/square/go-jose#JsonWebKey)
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
Encryption/decryption example using RSA:
|
||||||
|
|
||||||
|
```Go
|
||||||
|
// Generate a public/private key pair to use for this example. The library
|
||||||
|
// also provides two utility functions (LoadPublicKey and LoadPrivateKey)
|
||||||
|
// that can be used to load keys from PEM/DER-encoded data.
|
||||||
|
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Instantiate an encrypter using RSA-OAEP with AES128-GCM. An error would
|
||||||
|
// indicate that the selected algorithm(s) are not currently supported.
|
||||||
|
publicKey := &privateKey.PublicKey
|
||||||
|
encrypter, err := NewEncrypter(RSA_OAEP, A128GCM, publicKey)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Encrypt a sample plaintext. Calling the encrypter returns an encrypted
|
||||||
|
// JWE object, which can then be serialized for output afterwards. An error
|
||||||
|
// would indicate a problem in an underlying cryptographic primitive.
|
||||||
|
var plaintext = []byte("Lorem ipsum dolor sit amet")
|
||||||
|
object, err := encrypter.Encrypt(plaintext)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Serialize the encrypted object using the full serialization format.
|
||||||
|
// Alternatively you can also use the compact format here by calling
|
||||||
|
// object.CompactSerialize() instead.
|
||||||
|
serialized := object.FullSerialize()
|
||||||
|
|
||||||
|
// Parse the serialized, encrypted JWE object. An error would indicate that
|
||||||
|
// the given input did not represent a valid message.
|
||||||
|
object, err = ParseEncrypted(serialized)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now we can decrypt and get back our original plaintext. An error here
|
||||||
|
// would indicate the the message failed to decrypt, e.g. because the auth
|
||||||
|
// tag was broken or the message was tampered with.
|
||||||
|
decrypted, err := object.Decrypt(privateKey)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf(string(decrypted))
|
||||||
|
// output: Lorem ipsum dolor sit amet
|
||||||
|
```
|
||||||
|
|
||||||
|
Signing/verification example using RSA:
|
||||||
|
|
||||||
|
```Go
|
||||||
|
// Generate a public/private key pair to use for this example. The library
|
||||||
|
// also provides two utility functions (LoadPublicKey and LoadPrivateKey)
|
||||||
|
// that can be used to load keys from PEM/DER-encoded data.
|
||||||
|
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Instantiate a signer using RSASSA-PSS (SHA512) with the given private key.
|
||||||
|
signer, err := NewSigner(PS512, privateKey)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sign a sample payload. Calling the signer returns a protected JWS object,
|
||||||
|
// which can then be serialized for output afterwards. An error would
|
||||||
|
// indicate a problem in an underlying cryptographic primitive.
|
||||||
|
var payload = []byte("Lorem ipsum dolor sit amet")
|
||||||
|
object, err := signer.Sign(payload)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Serialize the encrypted object using the full serialization format.
|
||||||
|
// Alternatively you can also use the compact format here by calling
|
||||||
|
// object.CompactSerialize() instead.
|
||||||
|
serialized := object.FullSerialize()
|
||||||
|
|
||||||
|
// Parse the serialized, protected JWS object. An error would indicate that
|
||||||
|
// the given input did not represent a valid message.
|
||||||
|
object, err = ParseSigned(serialized)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now we can verify the signature on the payload. An error here would
|
||||||
|
// indicate the the message failed to verify, e.g. because the signature was
|
||||||
|
// broken or the message was tampered with.
|
||||||
|
output, err := object.Verify(&privateKey.PublicKey)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf(string(output))
|
||||||
|
// output: Lorem ipsum dolor sit amet
|
||||||
|
```
|
||||||
|
|
||||||
|
More examples can be found in the [Godoc
|
||||||
|
reference](https://godoc.org/github.com/square/go-jose) for this package. The
|
||||||
|
[`jose-util`](https://github.com/square/go-jose/tree/master/jose-util)
|
||||||
|
subdirectory also contains a small command-line utility which might
|
||||||
|
be useful as an example.
|
13
vendor/gopkg.in/square/go-jose.v1/json/README.md
generated
vendored
Normal file
13
vendor/gopkg.in/square/go-jose.v1/json/README.md
generated
vendored
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
# Safe JSON
|
||||||
|
|
||||||
|
This repository contains a fork of the `encoding/json` package from Go 1.6.
|
||||||
|
|
||||||
|
The following changes were made:
|
||||||
|
|
||||||
|
* Object deserialization uses case-sensitive member name matching instead of
|
||||||
|
[case-insensitive matching](https://www.ietf.org/mail-archive/web/json/current/msg03763.html).
|
||||||
|
This is to avoid differences in the interpretation of JOSE messages between
|
||||||
|
go-jose and libraries written in other languages.
|
||||||
|
* When deserializing a JSON object, we check for duplicate keys and reject the
|
||||||
|
input whenever we detect a duplicate. Rather than trying to work with malformed
|
||||||
|
data, we prefer to reject it right away.
|
31
vendor/gopkg.in/yaml.v2/LICENSE.libyaml
generated
vendored
Normal file
31
vendor/gopkg.in/yaml.v2/LICENSE.libyaml
generated
vendored
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
The following files were ported to Go from C files of libyaml, and thus
|
||||||
|
are still covered by their original copyright and license:
|
||||||
|
|
||||||
|
apic.go
|
||||||
|
emitterc.go
|
||||||
|
parserc.go
|
||||||
|
readerc.go
|
||||||
|
scannerc.go
|
||||||
|
writerc.go
|
||||||
|
yamlh.go
|
||||||
|
yamlprivateh.go
|
||||||
|
|
||||||
|
Copyright (c) 2006 Kirill Simonov
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
|
so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
128
vendor/gopkg.in/yaml.v2/README.md
generated
vendored
Normal file
128
vendor/gopkg.in/yaml.v2/README.md
generated
vendored
Normal file
|
@ -0,0 +1,128 @@
|
||||||
|
# YAML support for the Go language
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
------------
|
||||||
|
|
||||||
|
The yaml package enables Go programs to comfortably encode and decode YAML
|
||||||
|
values. It was developed within [Canonical](https://www.canonical.com) as
|
||||||
|
part of the [juju](https://juju.ubuntu.com) project, and is based on a
|
||||||
|
pure Go port of the well-known [libyaml](http://pyyaml.org/wiki/LibYAML)
|
||||||
|
C library to parse and generate YAML data quickly and reliably.
|
||||||
|
|
||||||
|
Compatibility
|
||||||
|
-------------
|
||||||
|
|
||||||
|
The yaml package supports most of YAML 1.1 and 1.2, including support for
|
||||||
|
anchors, tags, map merging, etc. Multi-document unmarshalling is not yet
|
||||||
|
implemented, and base-60 floats from YAML 1.1 are purposefully not
|
||||||
|
supported since they're a poor design and are gone in YAML 1.2.
|
||||||
|
|
||||||
|
Installation and usage
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
The import path for the package is *gopkg.in/yaml.v2*.
|
||||||
|
|
||||||
|
To install it, run:
|
||||||
|
|
||||||
|
go get gopkg.in/yaml.v2
|
||||||
|
|
||||||
|
API documentation
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
If opened in a browser, the import path itself leads to the API documentation:
|
||||||
|
|
||||||
|
* [https://gopkg.in/yaml.v2](https://gopkg.in/yaml.v2)
|
||||||
|
|
||||||
|
API stability
|
||||||
|
-------------
|
||||||
|
|
||||||
|
The package API for yaml v2 will remain stable as described in [gopkg.in](https://gopkg.in).
|
||||||
|
|
||||||
|
|
||||||
|
License
|
||||||
|
-------
|
||||||
|
|
||||||
|
The yaml package is licensed under the LGPL with an exception that allows it to be linked statically. Please see the LICENSE file for details.
|
||||||
|
|
||||||
|
|
||||||
|
Example
|
||||||
|
-------
|
||||||
|
|
||||||
|
```Go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"gopkg.in/yaml.v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
var data = `
|
||||||
|
a: Easy!
|
||||||
|
b:
|
||||||
|
c: 2
|
||||||
|
d: [3, 4]
|
||||||
|
`
|
||||||
|
|
||||||
|
type T struct {
|
||||||
|
A string
|
||||||
|
B struct{C int; D []int ",flow"}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
t := T{}
|
||||||
|
|
||||||
|
err := yaml.Unmarshal([]byte(data), &t)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("error: %v", err)
|
||||||
|
}
|
||||||
|
fmt.Printf("--- t:\n%v\n\n", t)
|
||||||
|
|
||||||
|
d, err := yaml.Marshal(&t)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("error: %v", err)
|
||||||
|
}
|
||||||
|
fmt.Printf("--- t dump:\n%s\n\n", string(d))
|
||||||
|
|
||||||
|
m := make(map[interface{}]interface{})
|
||||||
|
|
||||||
|
err = yaml.Unmarshal([]byte(data), &m)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("error: %v", err)
|
||||||
|
}
|
||||||
|
fmt.Printf("--- m:\n%v\n\n", m)
|
||||||
|
|
||||||
|
d, err = yaml.Marshal(&m)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("error: %v", err)
|
||||||
|
}
|
||||||
|
fmt.Printf("--- m dump:\n%s\n\n", string(d))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This example will generate the following output:
|
||||||
|
|
||||||
|
```
|
||||||
|
--- t:
|
||||||
|
{Easy! {2 [3 4]}}
|
||||||
|
|
||||||
|
--- t dump:
|
||||||
|
a: Easy!
|
||||||
|
b:
|
||||||
|
c: 2
|
||||||
|
d: [3, 4]
|
||||||
|
|
||||||
|
|
||||||
|
--- m:
|
||||||
|
map[a:Easy! b:map[c:2 d:[3 4]]]
|
||||||
|
|
||||||
|
--- m dump:
|
||||||
|
a: Easy!
|
||||||
|
b:
|
||||||
|
c: 2
|
||||||
|
d:
|
||||||
|
- 3
|
||||||
|
- 4
|
||||||
|
```
|
||||||
|
|
177
vendor/rsc.io/letsencrypt/README
generated
vendored
Normal file
177
vendor/rsc.io/letsencrypt/README
generated
vendored
Normal file
|
@ -0,0 +1,177 @@
|
||||||
|
package letsencrypt // import "rsc.io/letsencrypt"
|
||||||
|
|
||||||
|
Package letsencrypt obtains TLS certificates from LetsEncrypt.org.
|
||||||
|
|
||||||
|
LetsEncrypt.org is a service that issues free SSL/TLS certificates to
|
||||||
|
servers that can prove control over the given domain's DNS records or the
|
||||||
|
servers pointed at by those records.
|
||||||
|
|
||||||
|
|
||||||
|
Warning
|
||||||
|
|
||||||
|
Like any other random code you find on the internet, this package should not
|
||||||
|
be relied upon in important, production systems without thorough testing to
|
||||||
|
ensure that it meets your needs.
|
||||||
|
|
||||||
|
In the long term you should be using
|
||||||
|
https://golang.org/x/crypto/acme/autocert instead of this package. Send
|
||||||
|
improvements there, not here.
|
||||||
|
|
||||||
|
This is a package that I wrote for my own personal web sites (swtch.com,
|
||||||
|
rsc.io) in a hurry when my paid-for SSL certificate was expiring. It has no
|
||||||
|
tests, has barely been used, and there is some anecdotal evidence that it
|
||||||
|
does not properly renew certificates in a timely fashion, so servers that
|
||||||
|
run for more than 3 months may run into trouble. I don't run this code
|
||||||
|
anymore: to simplify maintenance, I moved the sites off of Ubuntu VMs and
|
||||||
|
onto Google App Engine, configured with inexpensive long-term certificates
|
||||||
|
purchased from cheapsslsecurity.com.
|
||||||
|
|
||||||
|
This package was interesting primarily as an example of how simple the API
|
||||||
|
for using LetsEncrypt.org could be made, in contrast to the low-level
|
||||||
|
implementations that existed at the time. In that respect, it helped inform
|
||||||
|
the design of the golang.org/x/crypto/acme/autocert package.
|
||||||
|
|
||||||
|
|
||||||
|
Quick Start
|
||||||
|
|
||||||
|
A complete HTTP/HTTPS web server using TLS certificates from
|
||||||
|
LetsEncrypt.org, redirecting all HTTP access to HTTPS, and maintaining TLS
|
||||||
|
certificates in a file letsencrypt.cache across server restarts.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"rsc.io/letsencrypt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
fmt.Fprintf(w, "Hello, TLS!\n")
|
||||||
|
})
|
||||||
|
var m letsencrypt.Manager
|
||||||
|
if err := m.CacheFile("letsencrypt.cache"); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
log.Fatal(m.Serve())
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Overview
|
||||||
|
|
||||||
|
The fundamental type in this package is the Manager, which manages obtaining
|
||||||
|
and refreshing a collection of TLS certificates, typically for use by an
|
||||||
|
HTTPS server. The example above shows the most basic use of a Manager. The
|
||||||
|
use can be customized by calling additional methods of the Manager.
|
||||||
|
|
||||||
|
|
||||||
|
Registration
|
||||||
|
|
||||||
|
A Manager m registers anonymously with LetsEncrypt.org, including agreeing
|
||||||
|
to the letsencrypt.org terms of service, the first time it needs to obtain a
|
||||||
|
certificate. To register with a particular email address and with the option
|
||||||
|
of a prompt for agreement with the terms of service, call m.Register.
|
||||||
|
|
||||||
|
|
||||||
|
GetCertificate
|
||||||
|
|
||||||
|
The Manager's GetCertificate method returns certificates from the Manager's
|
||||||
|
cache, filling the cache by requesting certificates from LetsEncrypt.org. In
|
||||||
|
this way, a server with a tls.Config.GetCertificate set to m.GetCertificate
|
||||||
|
will demand load a certificate for any host name it serves. To force loading
|
||||||
|
of certificates ahead of time, install m.GetCertificate as before but then
|
||||||
|
call m.Cert for each host name.
|
||||||
|
|
||||||
|
A Manager can only obtain a certificate for a given host name if it can
|
||||||
|
prove control of that host name to LetsEncrypt.org. By default it proves
|
||||||
|
control by answering an HTTPS-based challenge: when the LetsEncrypt.org
|
||||||
|
servers connect to the named host on port 443 (HTTPS), the TLS SNI handshake
|
||||||
|
must use m.GetCertificate to obtain a per-host certificate. The most common
|
||||||
|
way to satisfy this requirement is for the host name to resolve to the IP
|
||||||
|
address of a (single) computer running m.ServeHTTPS, or at least running a
|
||||||
|
Go TLS server with tls.Config.GetCertificate set to m.GetCertificate.
|
||||||
|
However, other configurations are possible. For example, a group of machines
|
||||||
|
could use an implementation of tls.Config.GetCertificate that cached
|
||||||
|
certificates but handled cache misses by making RPCs to a Manager m on an
|
||||||
|
elected leader machine.
|
||||||
|
|
||||||
|
In typical usage, then, the setting of tls.Config.GetCertificate to
|
||||||
|
m.GetCertificate serves two purposes: it provides certificates to the TLS
|
||||||
|
server for ordinary serving, and it also answers challenges to prove
|
||||||
|
ownership of the domains in order to obtain those certificates.
|
||||||
|
|
||||||
|
To force the loading of a certificate for a given host into the Manager's
|
||||||
|
cache, use m.Cert.
|
||||||
|
|
||||||
|
|
||||||
|
Persistent Storage
|
||||||
|
|
||||||
|
If a server always starts with a zero Manager m, the server effectively
|
||||||
|
fetches a new certificate for each of its host name from LetsEncrypt.org on
|
||||||
|
each restart. This is unfortunate both because the server cannot start if
|
||||||
|
LetsEncrypt.org is unavailable and because LetsEncrypt.org limits how often
|
||||||
|
it will issue a certificate for a given host name (at time of writing, the
|
||||||
|
limit is 5 per week for a given host name). To save server state proactively
|
||||||
|
to a cache file and to reload the server state from that same file when
|
||||||
|
creating a new manager, call m.CacheFile with the name of the file to use.
|
||||||
|
|
||||||
|
For alternate storage uses, m.Marshal returns the current state of the
|
||||||
|
Manager as an opaque string, m.Unmarshal sets the state of the Manager using
|
||||||
|
a string previously returned by m.Marshal (usually a different m), and
|
||||||
|
m.Watch returns a channel that receives notifications about state changes.
|
||||||
|
|
||||||
|
|
||||||
|
Limits
|
||||||
|
|
||||||
|
To avoid hitting basic rate limits on LetsEncrypt.org, a given Manager
|
||||||
|
limits all its interactions to at most one request every minute, with an
|
||||||
|
initial allowed burst of 20 requests.
|
||||||
|
|
||||||
|
By default, if GetCertificate is asked for a certificate it does not have,
|
||||||
|
it will in turn ask LetsEncrypt.org for that certificate. This opens a
|
||||||
|
potential attack where attackers connect to a server by IP address and
|
||||||
|
pretend to be asking for an incorrect host name. Then GetCertificate will
|
||||||
|
attempt to obtain a certificate for that host, incorrectly, eventually
|
||||||
|
hitting LetsEncrypt.org's rate limit for certificate requests and making it
|
||||||
|
impossible to obtain actual certificates. Because servers hold certificates
|
||||||
|
for months at a time, however, an attack would need to be sustained over a
|
||||||
|
time period of at least a month in order to cause real problems.
|
||||||
|
|
||||||
|
To mitigate this kind of attack, a given Manager limits itself to an average
|
||||||
|
of one certificate request for a new host every three hours, with an initial
|
||||||
|
allowed burst of up to 20 requests. Long-running servers will therefore stay
|
||||||
|
within the LetsEncrypt.org limit of 300 failed requests per month.
|
||||||
|
Certificate refreshes are not subject to this limit.
|
||||||
|
|
||||||
|
To eliminate the attack entirely, call m.SetHosts to enumerate the exact set
|
||||||
|
of hosts that are allowed in certificate requests.
|
||||||
|
|
||||||
|
|
||||||
|
Web Servers
|
||||||
|
|
||||||
|
The basic requirement for use of a Manager is that there be an HTTPS server
|
||||||
|
running on port 443 and calling m.GetCertificate to obtain TLS certificates.
|
||||||
|
Using standard primitives, the way to do this is:
|
||||||
|
|
||||||
|
srv := &http.Server{
|
||||||
|
Addr: ":https",
|
||||||
|
TLSConfig: &tls.Config{
|
||||||
|
GetCertificate: m.GetCertificate,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
srv.ListenAndServeTLS("", "")
|
||||||
|
|
||||||
|
However, this pattern of serving HTTPS with demand-loaded TLS certificates
|
||||||
|
comes up enough to wrap into a single method m.ServeHTTPS.
|
||||||
|
|
||||||
|
Similarly, many HTTPS servers prefer to redirect HTTP clients to the HTTPS
|
||||||
|
URLs. That functionality is provided by RedirectHTTP.
|
||||||
|
|
||||||
|
The combination of serving HTTPS with demand-loaded TLS certificates and
|
||||||
|
serving HTTPS redirects to HTTP clients is provided by m.Serve, as used in
|
||||||
|
the original example above.
|
||||||
|
|
||||||
|
func RedirectHTTP(w http.ResponseWriter, r *http.Request)
|
||||||
|
type Manager struct { ... }
|
Loading…
Reference in a new issue