diff --git a/cmd/a_main-packr.go b/cmd/a_main-packr.go index 8435336d..2223d749 100644 --- a/cmd/a_main-packr.go +++ b/cmd/a_main-packr.go @@ -7,5 +7,5 @@ import "github.com/gobuffalo/packr" // You can use the "packr clean" command to clean up this, // and any other packr generated files. func init() { - packr.PackJSONBytes("static", "default-config.toml", "\"IyMgQVRURU5USU9OCiMgaXQgaXMgZXhhbXBsZSBmaWxlIG9ubHkuIEl0IGJ1aWx0aW4gaW4gYmluYXJ5IGFuZCBkb24ndCByZWFkIGZyb20gZmlsZSBzeXN0ZW0uCiMgY2hhbmdlcyBpbiBjb25maWdfZGVmYXVsdC50b21sIGhhdmUgbm8gcmVhbCBlZmZlY3QuCgpbR2VuZXJhbF0KCiMgU2Vjb25kcyBmb3IgaXNzdWUgZXZlcnkgY2VydGlmaWNhdGUuIENhbmNlbCBpc3N1ZSBhbmQgcmV0dXJuIGVycm9yIGlmIHRpbWVvdXQuCklzc3VlVGltZW91dCA9IDMwMAoKIyBQYXRoIHRvIGRpciwgd2hpY2ggd2lsbCBzdG9yZSBzdGF0ZSBhbmQgY2VydGlmaWNhdGVzClN0b3JhZ2VEaXIgPSAic3RvcmFnZSIKCiMgU3RvcmUgLmpzb24gaW5mbyB3aXRoIGNlcnRpZmljYXRlIG1ldGFkYXRhIG5lYXIgY2VydGlmaWNhdGUuClN0b3JlSlNPTk1ldGFkYXRhID0gdHJ1ZQoKIyBTdWJkb21haW5zLCBhdXRvLWluY2x1ZGVkIHdpdGhpbiBjZXJ0aWZpY2F0ZSBvZiBtYWluIGRvbWFpbiBuYW1lClN1YmRvbWFpbnMgPSBbInd3dy4iXQoKIyBEaXJlY3RvcnkgdXJsIG9mIGFjbWUgc2VydmVyLgojVGVzdCBzZXJ2ZXI6IGh0dHBzOi8vYWNtZS1zdGFnaW5nLXYwMi5hcGkubGV0c2VuY3J5cHQub3JnL2RpcmVjdG9yeQpBY21lU2VydmVyID0gImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9kaXJlY3RvcnkiCgojIEluY2x1ZGUgb3RoZXIgY29uZmlnIGZpbGVzCiMgSXQgc3VwcG9ydCBnbG9iIHN5bnRheAojIElmIGl0IGhhcyBwYXRoIHdpdGhvdXQgdGVtcGxhdGUgLSB0aGUgZmlsZSBtdXN0IGV4aXN0LgojIEZvciBhbGxvdyBvcHRpb25hbCBpbmNsdWRlIGZpbGUgLSBpdCBjYW4gY29udGFpbiBzb21lIGdsb2Igc3ltYm9sCiMgSW5jbHVkZWQgY29uZmlncyBtZXJnZSB3aXRoIGN1cnJlbnQgcmVhZGVkIHN0YXRlLgojIGV4YW1wbGU9WyAiY29uZmlnLnRvbVtsXSIgXQpJbmNsdWRlQ29uZmlncyA9IFtdCgojIEZvciBwcmV2ZW50IGluZmluaXRlIGxvb3AgYW5kIGNvbnN1bWUgYWxsIG1lbW9yeSBpZiBjeWNsZSBpbiBpbmNsdWRlcwpNYXhDb25maWdGaWxlc1JlYWQgPSAxMDAwMAoKQWxsb3dSU0FDZXJ0ID0gdHJ1ZQpBbGxvd0VDRFNBQ2VydCA9IHRydWUKCltMb2ddCkVuYWJsZUxvZ1RvRmlsZSA9IHRydWUKRW5hYmxlTG9nVG9TdGRFcnIgPSB0cnVlCgojIHZlcmJvc2UgbGV2ZWwgb2YgbG9nLCBvbmUgb2Y6IGRlYnVnLCBpbmZvLCB3YXJuaW5nLCBlcnJvciwgZmF0YWwKTG9nTGV2ZWwgPSAiaW5mbyIKCiMgRW5hYmxlIHNlbGYgbG9nIHJvdGF0aW5nCkVuYWJsZVJvdGF0ZSA9IHRydWUKCiMgRW5hYmxlIGRldmVsb3BlciBtb2RlOiBtb3JlIHN0YWNrdHJhY2VzIGFuZCBwYW5pYyAoc3RvcCBwcm9ncmFtKSBvbiBzb21lIGludGVybmFsIGVycm9ycy4KRGV2ZWxvcGVyTW9kZSA9IGZhbHNlCgojIFBhdGggdG8gbG9nIGZpbGUKRmlsZSA9ICJsZXRzLXByb3h5LmxvZyIKCiMgUm90YXRlIGxvZyBpZiBjdXJyZW50IGZpbGUgc2l6ZSBtb3JlIHRoYW4gWCBNQgpSb3RhdGVCeVNpemVNQiA9IDEwMAoKIyBDb21wcmVzcyBvbGQgbG9nIHdpdGggZ3ppcCBhZnRlciByb3RhdGUKQ29tcHJlc3NSb3RhdGVkID0gZmFsc2UKCiMgRGVsZXRlIG9sZCBiYWNrdXBzIGFmdGVyIFggZGF5cy4gMCBmb3IgZGlzYWJsZS4KTWF4RGF5cyA9IDEwCgojIERlbGV0ZSBvbGQgYmFja3VwcyBpZiBvbGQgZmlsZSBudW1iZXIgbW9yZSB0aGVuIFguIDAgZm9yIGRpc2FibGUuCk1heENvdW50ID0gMTAKCltQcm94eV0KCiMgRGVmYXVsdCBydWxlIG9mIHNlbGVjdCBkZXN0aW5hdGlvbiBhZGRyZXNzLgojIEl0IGNhbiBiZTogSVAgKHdpdGggZGVmYXVsdCBwb3J0IDgwKSwgOlBvcnQgKGRlZmF1bHQgLSBzYW1lIElQIGFzIHJlY2VpdmUgY29ubmVjdGlvbiksIElQdjQ6UG9ydCBvciBbSVB2Nl06UG9ydAojIE11c3QgZGVmaW5lIHBvcnQgZm9yY2UgaWYgSFRUUFNCYWNrZW5kIGlzIHRydWUKRGVmYXVsdFRhcmdldCA9ICI6ODAiCgojIEFmdGVyIEtlZXBBbGl2ZVRpbWVvdXRTZWNvbmRzIG9mIGluYWN0aXZlIGluY29taW5nIGNvbm5lY3Rpb24gd2lsbCBjbG9zZS4KS2VlcEFsaXZlVGltZW91dFNlY29uZHMgPSA5MDAKCiMgQXJyYXkgb2YgJy0nIHNlcGFyYXRlZCBwYWlycyBvciBJUDpQb3J0LiBGb3IgZXhhbXBsZToKIyBbCiMgICAiMS4yLjMuNDo0NDMtMi4yLjIuMjoxMjM0IiwKIyAgICIzLjMuMy4zOjMzMy1bOjoxXTo5NCIKIyAiXQojIE1lYW46IGNvbm5lY3Rpb25zLCBhY2NlcHRlZCBvbiAxLjIuMy40OjQ0MyBzZW5kIHRvIHNlcnZlciAyLjIuMi4yOjEyMzQKIyBhbmQgY29ubmVjdGlvbnMgYWNjZXB0ZWQgb24gMy4zLjMuMzozMzMgc2VuZCB0byBpcHY2IDo6MSBwb3J0IDk0ClRhcmdldE1hcCA9IFtdCgojIEFycmF5IG9mIGNvbG9uIHNlcGFyYXRlZCBIZWFkZXJOYW1lOkhlYWRlclZhbHVlIGZvciBhZGQgdG8gcmVxdWVzdCBmb3IgYmFja2VuZC4ge3tWYWx1ZX19IGlzIHNwZWNpYWwgZm9ybXMsIHdoaWNoIGNhbgojIGludGVybmFsbHkgcGFyc2luZy4gTm93IGl0IHN1cHBvcnQgb25seSBzcGVjaWFsIHZhbHVlczoKIyB7e0NPTk5FQ1RJT05fSUR9fSAtIElkIG9mIGFjY2VwdGVkIGNvbm5lY3Rpb24sIGdlbmVyYXRlZCBieSBsZXRzLXByb3h5CiMge3tIVFRQX1BST1RPfX0gLSBzZXQgdG8gaHR0cC9odHRwcyBkZXBlbmRlbmNlIGluY29taW5nIGNvbm5lY3Rpb25zIGhhbmRsZWQKIyB7e1NPVVJDRV9JUH19IC0gUmVtb3RlIElQIG9mIGluY29taW5nIGNvbm5lY3Rpb24KIyB7e1NPVVJDRV9QT1JUfX0gLSBSZW1vdGUgcG9ydCBvZiBpbmNvbWluZyBjb25uZWN0aW9uCiMge3tTT1VSQ0VfSVB9fTp7e1NPVVJDRV9QT1JUfX0gLSBSZW1vdGUgSVA6UG9ydCBvZiBpbmNvbWluZyBjb25uZWN0aW9uLgojIE5vdyBpdCBhY2NlcHRlZCBvbmx5IHRoaXMgc3BlY2lhbCB2YWx1ZXMsIHdoaWNoIG11c3QgYmUgZXhheGx0eSBlcXVhbCB0byBleGFtcGxlcy4gQWxsIG90aGVyIHZhbHVlcyBzZW5kIGFzIGlzLgojIEJ1dCBpdCBjYW4gY2hhbmdlIGFuZCBleHRlbmQgaW4gZnV0dXJlLiBEb2Vzbid0IHVzZSB7ey4uLn19IGFzIG93biB2YWx1ZXMuCiMgRXhhbXBsZToKIyBbIklQOnt7U09VUkNFX0lQfX0iLCAiUHJveHk6bGV0cy1wcm94eSIsICJQcm90b2NvbDp7e0hUVFBfUFJPVE99fSIgXQpIZWFkZXJzID0gWyAiWC1Gb3J3YXJkZWQtUHJvdG86e3tIVFRQX1BST1RPfX0iLCAiWC1Gb3J3YXJkZWQtRm9yOnt7U09VUkNFX0lQfX0iIF0KCiMgVXNlIGh0dHBzIHJlcXVlc3RzIHRvIGJhY2tlbmQgaW5zdGVhZCBvZiBodHRwCkhUVFBTQmFja2VuZCA9IGZhbHNlCgojIElnbm9yZSBiYWNrZW5kIGh0dHBzIGNlcnRpZmljYXRlIHZhbGlkYXRpb25zIGlmIEhUVFBTQmFja2VuZCBpcyB0cnVlCkhUVFBTQmFja2VuZElnbm9yZUNlcnQgPSB0cnVlCgpbQ2hlY2tEb21haW5zXQoKIyBBbGxvdyBkb21haW4gaWYgaXQgcmVzb2x2ZXIgZm9yIG9uZSBvZiBwdWJsaWMgSVBzIG9mIHRoaXMgc2VydmVyLgpJUFNlbGYgPSB0cnVlCgojIEhvdyBkZXRlY3QgcHVibGljIGlwcyBvZiB0aGUgc2VydmVyLgojIGl0IHVzZSBpZiBJUFNlbGYgaXMgdHJ1ZQojIGF1dG8gfCBsb2NhbCB8IGF3cyAgfCB5YW5kZXgKIyBhdXRvIC0gYmVzdCBlZmZvcnQgZm9yIGRldGVjdCBJUC4gQWxnb3JpdG0gbWF5IGNoYW5nZSBmcm9tIHRpbWUgdG8gdGltZS4KIyAgICAgICAgaXQgZ29vZCBmb3IgZGVmYXVsdC4KIyBiaW5kIC0gZGV0ZWN0IHB1YmxpYyBJUCBiaW5kZWQgdG8gbG9jYWwgaW50ZXJmYWNlcwojIGF3cyAtIGRldGVjdCBwdWJsaWMgSVBzIGJ5IHF1ZXJ5IHRvIEFXUyBFQzIgbWV0YWRhdGEKIyBleHRlcm5hbCAtIGRldGVjdCBzZWxmIGlwIGJ5IHJlcXVlc3QgdG8gZXh0ZXJuYWwgc2VydmVyIElQU2VsZkV4dGVybmFsRGV0ZWN0b3IKIyB5YW5kZXggLSBkZXRlY3QgcHVibGljIElQcyBieSBxdWVyeSB0byBZYW5kZXggY2xvdWQgbWV0YWRhdGEgKG5vdyBhbGlhcyBmb3IgYXdzKQpJUFNlbGZEZXRlY3RNZXRob2QgPSAiYXV0byIKCiMgU2VydmVyIGZvciB1c2UgYXMgZXh0ZXJuYWwgZGV0ZWN0b3Igb2Ygc2VydmVyIElQIChuZWVkIGZvciBkZXRlY3QgSVAgYmVoaW5kIE5BVAojIFNlcnZlciBtdXN0IHJlc3BvbnNlIGFzIHBsYWluIHRleHQgSVAgYWRkcmVzcy4KIyBGb3IgZXZlcnkgZGV0ZWN0IGxldHMtcHJveHkgbWFrZSB0d28gcmVxdWVzdHM6IGJ5IGlwdjQgYW5kIGlwdjYgbmV0d29ya3MKSVBTZWxmRXh0ZXJuYWxEZXRlY3RvclVSTD0iaHR0cDovL2lmY29uZmlnLmlvL2lwIgoKIyBBbGxvdyBkb21haW4gaWYgaXQgcmVzb2x2ZXIgZm9yIG9uZSBvZiB0aGUgaXBzLgpJUFdoaXRlTGlzdCA9ICIiCgojIFJlZ2V4cCBpbiBnb2xhbmcgc3ludGF4IG9mIGJsYWNrbGlzdGVkIGRvbWFpbiBmb3IgaXNzdWUgY2VydGlmaWNhdGUuCiNUaGlzIGxpc3Qgb3ZlcnJpZGVkIGJ5IHdoaXRlbGlzdC4KQmxhY2tMaXN0ID0gIiIKCiMgUmVnZXhwIGluIGdvbGFuZyBzeW50YXggb2Ygd2hpdGVsaXN0IGRvbWFpbnMgZm9yIGlzc3VlIGNlcnRpZmljYXRlLgojV2hpdGVsaXN0IG5lZWQgZm9yIGFsbG93IHBhcnQgb2YgZG9tYWlucywgd2hpY2ggZXhjbHVkZWQgYnkgYmxhY2tsaXN0LgojCldoaXRlTGlzdCA9ICIiCgojIENvbW1hIHNlcGFyYXRlZCBkbnMgc2VydmVyLCB1c2VkIGZvciByZXNvbHZlIGlwOnBvcnQgYWRkcmVzcyBvZiBkb21haW5zIHdoaWxlIGNoZWNrIGl0LgojIGlmIGVtcHR5IC0gdXNlIHN5c3RlbSBkbnMgcmVzb2x2ZXIgKHVzdWFsbHkgaW5jbHVkZSBob3N0cyBmaWxlLCBjYWNoZSwgZXRjKQojIGlmIHNldCAtIHVzZSBkaXJlY3QgZG5zIHF1ZXJpZXMgZm9yIHNlcnZlcnMsIHdpdGhvdXQgc2VsZiBjYWNoZS4KIyBpZiBzZXQgbW9yZSwgdGhhbiBvbmUgZG5zIHNlcnZlciAtIHNlbmQgcXVlcmllcyBpbiBwYXJhbGxlbCB0byBhbGwgc2VydmVycy4KIyBlcnJvciByZXN1bHRzIGZyb20gcGFydCBvZiBzZXJ2ZXJzIC0gaWdub3JlLiBOZWVkIG1pbmltdW0gb25lIGFuc3dlci4KIyBpZiBkaWZmZXJlbnQgZG5zIHNlcnZlcnMgcmV0dXJuIGRpZmZlcmVudCBpcCBhZGRyZXNzZXMgLSBhbGwgb2YgdGhlbSB1c2UgZm9yIGNoZWNrCiMgRXhhbXBsZTogIjguOC44Ljg6NTMsMS4xLjEuMTo1Myw3Ny44OC44Ljg6NTMsWzJhMDI6NmI4OjpmZWVkOjBmZl06NTMsWzIwMDE6NDg2MDo0ODYwOjo4ODg4XTo1MyIKUmVzb2x2ZXIgPSAiIgoKCgpbTGlzdGVuXQoKIyBCaW5kIGFkZHJlc3NlcyBmb3IgVExTIGxpc3RlbmVycwpUTFNBZGRyZXNzZXMgPSBbIjo0NDMiXQoKIyBCaW5kIGFkZHJlc3NlcyB3aXRob3V0IFRMUyBzZWN1cmUgKGZvciBIVFRQIHJldmVyc2UgcHJveHkgYW5kIGh0dHAtMDEgdmFsaWRhdGlvbiB3aXRob3V0IHJlZGlyZWN0IHRvIGh0dHBzKQpUQ1BBZGRyZXNzZXMgPSBbXQoKCltNZXRyaWNzXQojIEVuYWJsZSBtZXRyaWNzIGluIHByb21ldGhlb3VzIGZvcm1hdGggYnkgaHR0cC4KRW5hYmxlID0gZmFsc2UKCiMgQmluZCBhZGRyZXNzZXMgZm9yIGdldCBieSBodHRwcwpUTFNBZGRyZXNzZXMgPSBbICJbOjpdOjYyMTAxIiBdCgojIEJpbmQgYWRkcmVzc2VzIHdpdGhvdXQgVExTIHNlY3VyZSAoZm9yIEhUVFAgcmV2ZXJzZSBwcm94eSBhbmQgaHR0cC0wMSB2YWxpZGF0aW9uIHdpdGhvdXQgcmVkaXJlY3QgdG8gaHR0cHMpClRDUEFkZHJlc3NlcyA9IFsgIls6Ol06NjIxMDAiIF0KCiMgSVAgbmV0d29ya3MgZm9yIGFsbG93IHRvIGdldCBtZXRyaWNzLgojIERlZmF1bHQgLSBhbGxvdyBmcm9tIGFsbC4KIyBFeGFtcGxlOgojIFsgIjEuMi4zLjQvMzIiLCAiMTkyLjE2OC4wLjAvMjQiLCAiOjoxLzEyOCIgXQpBbGxvd2VkTmV0d29ya3MgPSBbXQoKIyBQYXNzd29yZCBmb3IgZ2V0IG1ldHJpY3MsIGFkZCBhcyBnZXQgcGFyYW0gP3Bhc3N3b3JkPS4uLgpQYXNzd29yZCAgICAgICAgPSAiIgoKIyBBbGxvdyBzZXQgcGFzc3dvcmQgdG8gZW1wdHkgc3RyaW5nCkFsbG93RW1wdHlQYXNzd29yZCAgPSBmYWxzZQoKCgpbUHJvZmlsZXJdCkVuYWJsZSA9IGZhbHNlCgojIElQIG5ldHdvcmtzIGZvciBhbGxvdyB0byB1c2UgcHJvZmlsZXIuCiMgRGVmYXVsdCAtIGFsbG93IGZyb20gYWxsLgojIEV4YW1wbGU6CiMgWyAiMS4yLjMuNC8zMiIsICIxOTIuMTY4LjAuMC8yNCIsICI6OjEvMTI4IiBdCkFsbG93ZWROZXR3b3JrcyA9IFtdCkJpbmRBZGRyZXNzID0gImxvY2FsaG9zdDozMTM0NCIKUGFzc3dvcmQgICAgICAgID0gIiIKQWxsb3dFbXB0eVBhc3N3b3JkICA9IGZhbHNlCg==\"") + packr.PackJSONBytes("static", "default-config.toml", "\"IyMgQVRURU5USU9OCiMgaXQgaXMgZXhhbXBsZSBmaWxlIG9ubHkuIEl0IGJ1aWx0aW4gaW4gYmluYXJ5IGFuZCBkb24ndCByZWFkIGZyb20gZmlsZSBzeXN0ZW0uCiMgY2hhbmdlcyBpbiBjb25maWdfZGVmYXVsdC50b21sIGhhdmUgbm8gcmVhbCBlZmZlY3QuCgpbR2VuZXJhbF0KCiMgU2Vjb25kcyBmb3IgaXNzdWUgZXZlcnkgY2VydGlmaWNhdGUuIENhbmNlbCBpc3N1ZSBhbmQgcmV0dXJuIGVycm9yIGlmIHRpbWVvdXQuCklzc3VlVGltZW91dCA9IDMwMAoKIyBQYXRoIHRvIGRpciwgd2hpY2ggd2lsbCBzdG9yZSBzdGF0ZSBhbmQgY2VydGlmaWNhdGVzClN0b3JhZ2VEaXIgPSAic3RvcmFnZSIKCiMgU3RvcmUgLmpzb24gaW5mbyB3aXRoIGNlcnRpZmljYXRlIG1ldGFkYXRhIG5lYXIgY2VydGlmaWNhdGUuClN0b3JlSlNPTk1ldGFkYXRhID0gdHJ1ZQoKIyBTdWJkb21haW5zLCBhdXRvLWluY2x1ZGVkIHdpdGhpbiBjZXJ0aWZpY2F0ZSBvZiBtYWluIGRvbWFpbiBuYW1lClN1YmRvbWFpbnMgPSBbInd3dy4iXQoKIyBEaXJlY3RvcnkgdXJsIG9mIGFjbWUgc2VydmVyLgojVGVzdCBzZXJ2ZXI6IGh0dHBzOi8vYWNtZS1zdGFnaW5nLXYwMi5hcGkubGV0c2VuY3J5cHQub3JnL2RpcmVjdG9yeQpBY21lU2VydmVyID0gImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9kaXJlY3RvcnkiCgojIEluY2x1ZGUgb3RoZXIgY29uZmlnIGZpbGVzCiMgSXQgc3VwcG9ydCBnbG9iIHN5bnRheAojIElmIGl0IGhhcyBwYXRoIHdpdGhvdXQgdGVtcGxhdGUgLSB0aGUgZmlsZSBtdXN0IGV4aXN0LgojIEZvciBhbGxvdyBvcHRpb25hbCBpbmNsdWRlIGZpbGUgLSBpdCBjYW4gY29udGFpbiBzb21lIGdsb2Igc3ltYm9sCiMgSW5jbHVkZWQgY29uZmlncyBtZXJnZSB3aXRoIGN1cnJlbnQgcmVhZGVkIHN0YXRlLgojIGV4YW1wbGU9WyAiY29uZmlnLnRvbVtsXSIgXQpJbmNsdWRlQ29uZmlncyA9IFtdCgojIEZvciBwcmV2ZW50IGluZmluaXRlIGxvb3AgYW5kIGNvbnN1bWUgYWxsIG1lbW9yeSBpZiBjeWNsZSBpbiBpbmNsdWRlcwpNYXhDb25maWdGaWxlc1JlYWQgPSAxMDAwMAoKQWxsb3dSU0FDZXJ0ID0gdHJ1ZQpBbGxvd0VDRFNBQ2VydCA9IHRydWUKCltMb2ddCkVuYWJsZUxvZ1RvRmlsZSA9IHRydWUKRW5hYmxlTG9nVG9TdGRFcnIgPSB0cnVlCgojIHZlcmJvc2UgbGV2ZWwgb2YgbG9nLCBvbmUgb2Y6IGRlYnVnLCBpbmZvLCB3YXJuaW5nLCBlcnJvciwgZmF0YWwKTG9nTGV2ZWwgPSAiaW5mbyIKCiMgRW5hYmxlIHdyaXRlIGluZm8gYWJvdXQgZXZlcnkgaHR0cCByZXF1ZXN0IChidXQgd3JpdGUgaW5mbyBhYm91dCBjb25uZWN0aW9ucyBpZiBuZWVkIGJ5IGxldmVsKQpFbmFibGVBY2Nlc3NMb2cgPSB0cnVlCgojIEVuYWJsZSBzZWxmIGxvZyByb3RhdGluZwpFbmFibGVSb3RhdGUgPSB0cnVlCgojIEVuYWJsZSBkZXZlbG9wZXIgbW9kZTogbW9yZSBzdGFja3RyYWNlcyBhbmQgcGFuaWMgKHN0b3AgcHJvZ3JhbSkgb24gc29tZSBpbnRlcm5hbCBlcnJvcnMuCkRldmVsb3Blck1vZGUgPSBmYWxzZQoKIyBQYXRoIHRvIGxvZyBmaWxlCkZpbGUgPSAibGV0cy1wcm94eS5sb2ciCgojIFJvdGF0ZSBsb2cgaWYgY3VycmVudCBmaWxlIHNpemUgbW9yZSB0aGFuIFggTUIKUm90YXRlQnlTaXplTUIgPSAxMDAKCiMgQ29tcHJlc3Mgb2xkIGxvZyB3aXRoIGd6aXAgYWZ0ZXIgcm90YXRlCkNvbXByZXNzUm90YXRlZCA9IGZhbHNlCgojIERlbGV0ZSBvbGQgYmFja3VwcyBhZnRlciBYIGRheXMuIDAgZm9yIGRpc2FibGUuCk1heERheXMgPSAxMAoKIyBEZWxldGUgb2xkIGJhY2t1cHMgaWYgb2xkIGZpbGUgbnVtYmVyIG1vcmUgdGhlbiBYLiAwIGZvciBkaXNhYmxlLgpNYXhDb3VudCA9IDEwCgpbUHJveHldCgojIERlZmF1bHQgcnVsZSBvZiBzZWxlY3QgZGVzdGluYXRpb24gYWRkcmVzcy4KIyBJdCBjYW4gYmU6IElQICh3aXRoIGRlZmF1bHQgcG9ydCA4MCksIDpQb3J0IChkZWZhdWx0IC0gc2FtZSBJUCBhcyByZWNlaXZlIGNvbm5lY3Rpb24pLCBJUHY0OlBvcnQgb3IgW0lQdjZdOlBvcnQKIyBNdXN0IGRlZmluZSBwb3J0IGZvcmNlIGlmIEhUVFBTQmFja2VuZCBpcyB0cnVlCkRlZmF1bHRUYXJnZXQgPSAiOjgwIgoKIyBBZnRlciBLZWVwQWxpdmVUaW1lb3V0U2Vjb25kcyBvZiBpbmFjdGl2ZSBpbmNvbWluZyBjb25uZWN0aW9uIHdpbGwgY2xvc2UuCktlZXBBbGl2ZVRpbWVvdXRTZWNvbmRzID0gOTAwCgojIEFycmF5IG9mICctJyBzZXBhcmF0ZWQgcGFpcnMgb3IgSVA6UG9ydC4gRm9yIGV4YW1wbGU6CiMgWwojICAgIjEuMi4zLjQ6NDQzLTIuMi4yLjI6MTIzNCIsCiMgICAiMy4zLjMuMzozMzMtWzo6MV06OTQiCiMgIl0KIyBNZWFuOiBjb25uZWN0aW9ucywgYWNjZXB0ZWQgb24gMS4yLjMuNDo0NDMgc2VuZCB0byBzZXJ2ZXIgMi4yLjIuMjoxMjM0CiMgYW5kIGNvbm5lY3Rpb25zIGFjY2VwdGVkIG9uIDMuMy4zLjM6MzMzIHNlbmQgdG8gaXB2NiA6OjEgcG9ydCA5NApUYXJnZXRNYXAgPSBbXQoKIyBBcnJheSBvZiBjb2xvbiBzZXBhcmF0ZWQgSGVhZGVyTmFtZTpIZWFkZXJWYWx1ZSBmb3IgYWRkIHRvIHJlcXVlc3QgZm9yIGJhY2tlbmQuIHt7VmFsdWV9fSBpcyBzcGVjaWFsIGZvcm1zLCB3aGljaCBjYW4KIyBpbnRlcm5hbGx5IHBhcnNpbmcuIE5vdyBpdCBzdXBwb3J0IG9ubHkgc3BlY2lhbCB2YWx1ZXM6CiMge3tDT05ORUNUSU9OX0lEfX0gLSBJZCBvZiBhY2NlcHRlZCBjb25uZWN0aW9uLCBnZW5lcmF0ZWQgYnkgbGV0cy1wcm94eQojIHt7SFRUUF9QUk9UT319IC0gc2V0IHRvIGh0dHAvaHR0cHMgZGVwZW5kZW5jZSBpbmNvbWluZyBjb25uZWN0aW9ucyBoYW5kbGVkCiMge3tTT1VSQ0VfSVB9fSAtIFJlbW90ZSBJUCBvZiBpbmNvbWluZyBjb25uZWN0aW9uCiMge3tTT1VSQ0VfUE9SVH19IC0gUmVtb3RlIHBvcnQgb2YgaW5jb21pbmcgY29ubmVjdGlvbgojIHt7U09VUkNFX0lQfX06e3tTT1VSQ0VfUE9SVH19IC0gUmVtb3RlIElQOlBvcnQgb2YgaW5jb21pbmcgY29ubmVjdGlvbi4KIyBOb3cgaXQgYWNjZXB0ZWQgb25seSB0aGlzIHNwZWNpYWwgdmFsdWVzLCB3aGljaCBtdXN0IGJlIGV4YXhsdHkgZXF1YWwgdG8gZXhhbXBsZXMuIEFsbCBvdGhlciB2YWx1ZXMgc2VuZCBhcyBpcy4KIyBCdXQgaXQgY2FuIGNoYW5nZSBhbmQgZXh0ZW5kIGluIGZ1dHVyZS4gRG9lc24ndCB1c2Uge3suLi59fSBhcyBvd24gdmFsdWVzLgojIEV4YW1wbGU6CiMgWyJJUDp7e1NPVVJDRV9JUH19IiwgIlByb3h5OmxldHMtcHJveHkiLCAiUHJvdG9jb2w6e3tIVFRQX1BST1RPfX0iIF0KSGVhZGVycyA9IFsgIlgtRm9yd2FyZGVkLVByb3RvOnt7SFRUUF9QUk9UT319IiwgIlgtRm9yd2FyZGVkLUZvcjp7e1NPVVJDRV9JUH19IiBdCgojIFVzZSBodHRwcyByZXF1ZXN0cyB0byBiYWNrZW5kIGluc3RlYWQgb2YgaHR0cApIVFRQU0JhY2tlbmQgPSBmYWxzZQoKIyBJZ25vcmUgYmFja2VuZCBodHRwcyBjZXJ0aWZpY2F0ZSB2YWxpZGF0aW9ucyBpZiBIVFRQU0JhY2tlbmQgaXMgdHJ1ZQpIVFRQU0JhY2tlbmRJZ25vcmVDZXJ0ID0gdHJ1ZQoKW0NoZWNrRG9tYWluc10KCiMgQWxsb3cgZG9tYWluIGlmIGl0IHJlc29sdmVyIGZvciBvbmUgb2YgcHVibGljIElQcyBvZiB0aGlzIHNlcnZlci4KSVBTZWxmID0gdHJ1ZQoKIyBIb3cgZGV0ZWN0IHB1YmxpYyBpcHMgb2YgdGhlIHNlcnZlci4KIyBpdCB1c2UgaWYgSVBTZWxmIGlzIHRydWUKIyBhdXRvIHwgbG9jYWwgfCBhd3MgIHwgeWFuZGV4CiMgYXV0byAtIGJlc3QgZWZmb3J0IGZvciBkZXRlY3QgSVAuIEFsZ29yaXRtIG1heSBjaGFuZ2UgZnJvbSB0aW1lIHRvIHRpbWUuCiMgICAgICAgIGl0IGdvb2QgZm9yIGRlZmF1bHQuCiMgYmluZCAtIGRldGVjdCBwdWJsaWMgSVAgYmluZGVkIHRvIGxvY2FsIGludGVyZmFjZXMKIyBhd3MgLSBkZXRlY3QgcHVibGljIElQcyBieSBxdWVyeSB0byBBV1MgRUMyIG1ldGFkYXRhCiMgZXh0ZXJuYWwgLSBkZXRlY3Qgc2VsZiBpcCBieSByZXF1ZXN0IHRvIGV4dGVybmFsIHNlcnZlciBJUFNlbGZFeHRlcm5hbERldGVjdG9yCiMgeWFuZGV4IC0gZGV0ZWN0IHB1YmxpYyBJUHMgYnkgcXVlcnkgdG8gWWFuZGV4IGNsb3VkIG1ldGFkYXRhIChub3cgYWxpYXMgZm9yIGF3cykKSVBTZWxmRGV0ZWN0TWV0aG9kID0gImF1dG8iCgojIFNlcnZlciBmb3IgdXNlIGFzIGV4dGVybmFsIGRldGVjdG9yIG9mIHNlcnZlciBJUCAobmVlZCBmb3IgZGV0ZWN0IElQIGJlaGluZCBOQVQKIyBTZXJ2ZXIgbXVzdCByZXNwb25zZSBhcyBwbGFpbiB0ZXh0IElQIGFkZHJlc3MuCiMgRm9yIGV2ZXJ5IGRldGVjdCBsZXRzLXByb3h5IG1ha2UgdHdvIHJlcXVlc3RzOiBieSBpcHY0IGFuZCBpcHY2IG5ldHdvcmtzCklQU2VsZkV4dGVybmFsRGV0ZWN0b3JVUkw9Imh0dHA6Ly9pZmNvbmZpZy5pby9pcCIKCiMgQWxsb3cgZG9tYWluIGlmIGl0IHJlc29sdmVyIGZvciBvbmUgb2YgdGhlIGlwcy4KSVBXaGl0ZUxpc3QgPSAiIgoKIyBSZWdleHAgaW4gZ29sYW5nIHN5bnRheCBvZiBibGFja2xpc3RlZCBkb21haW4gZm9yIGlzc3VlIGNlcnRpZmljYXRlLgojVGhpcyBsaXN0IG92ZXJyaWRlZCBieSB3aGl0ZWxpc3QuCkJsYWNrTGlzdCA9ICIiCgojIFJlZ2V4cCBpbiBnb2xhbmcgc3ludGF4IG9mIHdoaXRlbGlzdCBkb21haW5zIGZvciBpc3N1ZSBjZXJ0aWZpY2F0ZS4KI1doaXRlbGlzdCBuZWVkIGZvciBhbGxvdyBwYXJ0IG9mIGRvbWFpbnMsIHdoaWNoIGV4Y2x1ZGVkIGJ5IGJsYWNrbGlzdC4KIwpXaGl0ZUxpc3QgPSAiIgoKIyBDb21tYSBzZXBhcmF0ZWQgZG5zIHNlcnZlciwgdXNlZCBmb3IgcmVzb2x2ZSBpcDpwb3J0IGFkZHJlc3Mgb2YgZG9tYWlucyB3aGlsZSBjaGVjayBpdC4KIyBpZiBlbXB0eSAtIHVzZSBzeXN0ZW0gZG5zIHJlc29sdmVyICh1c3VhbGx5IGluY2x1ZGUgaG9zdHMgZmlsZSwgY2FjaGUsIGV0YykKIyBpZiBzZXQgLSB1c2UgZGlyZWN0IGRucyBxdWVyaWVzIGZvciBzZXJ2ZXJzLCB3aXRob3V0IHNlbGYgY2FjaGUuCiMgaWYgc2V0IG1vcmUsIHRoYW4gb25lIGRucyBzZXJ2ZXIgLSBzZW5kIHF1ZXJpZXMgaW4gcGFyYWxsZWwgdG8gYWxsIHNlcnZlcnMuCiMgZXJyb3IgcmVzdWx0cyBmcm9tIHBhcnQgb2Ygc2VydmVycyAtIGlnbm9yZS4gTmVlZCBtaW5pbXVtIG9uZSBhbnN3ZXIuCiMgaWYgZGlmZmVyZW50IGRucyBzZXJ2ZXJzIHJldHVybiBkaWZmZXJlbnQgaXAgYWRkcmVzc2VzIC0gYWxsIG9mIHRoZW0gdXNlIGZvciBjaGVjawojIEV4YW1wbGU6ICI4LjguOC44OjUzLDEuMS4xLjE6NTMsNzcuODguOC44OjUzLFsyYTAyOjZiODo6ZmVlZDowZmZdOjUzLFsyMDAxOjQ4NjA6NDg2MDo6ODg4OF06NTMiClJlc29sdmVyID0gIiIKCgoKW0xpc3Rlbl0KCiMgQmluZCBhZGRyZXNzZXMgZm9yIFRMUyBsaXN0ZW5lcnMKVExTQWRkcmVzc2VzID0gWyI6NDQzIl0KCiMgQmluZCBhZGRyZXNzZXMgd2l0aG91dCBUTFMgc2VjdXJlIChmb3IgSFRUUCByZXZlcnNlIHByb3h5IGFuZCBodHRwLTAxIHZhbGlkYXRpb24gd2l0aG91dCByZWRpcmVjdCB0byBodHRwcykKVENQQWRkcmVzc2VzID0gW10KCgpbTWV0cmljc10KIyBFbmFibGUgbWV0cmljcyBpbiBwcm9tZXRoZW91cyBmb3JtYXRoIGJ5IGh0dHAuCkVuYWJsZSA9IGZhbHNlCgojIEJpbmQgYWRkcmVzc2VzIGZvciBnZXQgYnkgaHR0cHMKVExTQWRkcmVzc2VzID0gWyAiWzo6XTo2MjEwMSIgXQoKIyBCaW5kIGFkZHJlc3NlcyB3aXRob3V0IFRMUyBzZWN1cmUgKGZvciBIVFRQIHJldmVyc2UgcHJveHkgYW5kIGh0dHAtMDEgdmFsaWRhdGlvbiB3aXRob3V0IHJlZGlyZWN0IHRvIGh0dHBzKQpUQ1BBZGRyZXNzZXMgPSBbICJbOjpdOjYyMTAwIiBdCgojIElQIG5ldHdvcmtzIGZvciBhbGxvdyB0byBnZXQgbWV0cmljcy4KIyBEZWZhdWx0IC0gYWxsb3cgZnJvbSBhbGwuCiMgRXhhbXBsZToKIyBbICIxLjIuMy40LzMyIiwgIjE5Mi4xNjguMC4wLzI0IiwgIjo6MS8xMjgiIF0KQWxsb3dlZE5ldHdvcmtzID0gW10KCiMgUGFzc3dvcmQgZm9yIGdldCBtZXRyaWNzLCBhZGQgYXMgZ2V0IHBhcmFtID9wYXNzd29yZD0uLi4KUGFzc3dvcmQgICAgICAgID0gIiIKCiMgQWxsb3cgc2V0IHBhc3N3b3JkIHRvIGVtcHR5IHN0cmluZwpBbGxvd0VtcHR5UGFzc3dvcmQgID0gZmFsc2UKCgoKW1Byb2ZpbGVyXQpFbmFibGUgPSBmYWxzZQoKIyBJUCBuZXR3b3JrcyBmb3IgYWxsb3cgdG8gdXNlIHByb2ZpbGVyLgojIERlZmF1bHQgLSBhbGxvdyBmcm9tIGFsbC4KIyBFeGFtcGxlOgojIFsgIjEuMi4zLjQvMzIiLCAiMTkyLjE2OC4wLjAvMjQiLCAiOjoxLzEyOCIgXQpBbGxvd2VkTmV0d29ya3MgPSBbXQpCaW5kQWRkcmVzcyA9ICJsb2NhbGhvc3Q6MzEzNDQiClBhc3N3b3JkICAgICAgICA9ICIiCkFsbG93RW1wdHlQYXNzd29yZCAgPSBmYWxzZQo=\"") } diff --git a/cmd/config.go b/cmd/config.go index 0bea7676..5d39e925 100644 --- a/cmd/config.go +++ b/cmd/config.go @@ -55,6 +55,7 @@ type logConfig struct { EnableLogToFile bool EnableLogToStdErr bool LogLevel string + EnableAccessLog bool EnableRotate bool DeveloperMode bool File string diff --git a/cmd/main.go b/cmd/main.go index d2fd4283..9d2f185e 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -153,6 +153,7 @@ func startProgram(config *configType) { err = tlsListener.Start(ctx, registry) log.DebugFatal(logger, err, "StartAutoRenew tls listener") + config.Proxy.EnableAccessLog = config.Log.EnableAccessLog p := proxy.NewHTTPProxy(ctx, tlsListener) p.GetContext = func(req *http.Request) (i context.Context, e error) { localAddr := req.Context().Value(http.LocalAddrContextKey).(net.Addr) diff --git a/cmd/static/default-config.toml b/cmd/static/default-config.toml index ff7fc835..10e25372 100644 --- a/cmd/static/default-config.toml +++ b/cmd/static/default-config.toml @@ -41,6 +41,9 @@ EnableLogToStdErr = true # verbose level of log, one of: debug, info, warning, error, fatal LogLevel = "info" +# Enable write info about every http request (but write info about connections if need by level) +EnableAccessLog = true + # Enable self log rotating EnableRotate = true diff --git a/internal/proxy/config.go b/internal/proxy/config.go index 6a7071fd..c76bcd21 100644 --- a/internal/proxy/config.go +++ b/internal/proxy/config.go @@ -25,6 +25,7 @@ type Config struct { KeepAliveTimeoutSeconds int HTTPSBackend bool HTTPSBackendIgnoreCert bool + EnableAccessLog bool } func (c *Config) Apply(ctx context.Context, p *HTTPProxy) error { @@ -45,7 +46,8 @@ func (c *Config) Apply(ctx context.Context, p *HTTPProxy) error { appendDirector(c.getMapDirector) appendDirector(c.getHeadersDirector) appendDirector(c.getSchemaDirector) - p.httpReverseProxy.Transport = Transport{c.HTTPSBackendIgnoreCert} + p.HTTPTransport = Transport{c.HTTPSBackendIgnoreCert} + p.EnableAccessLog = c.EnableAccessLog if resErr != nil { zc.L(ctx).Error("Can't parse proxy config", zap.Error(resErr)) diff --git a/internal/proxy/config_test.go b/internal/proxy/config_test.go index f54d089b..ec03ddba 100644 --- a/internal/proxy/config_test.go +++ b/internal/proxy/config_test.go @@ -281,12 +281,12 @@ func TestConfig_Apply(t *testing.T) { c = Config{HTTPSBackendIgnoreCert: false} p = &HTTPProxy{} _ = c.Apply(ctx, p) - transport := p.httpReverseProxy.Transport.(Transport) + transport := p.HTTPTransport.(Transport) transport.IgnoreHTTPSCertificate = false c = Config{HTTPSBackendIgnoreCert: true} p = &HTTPProxy{} _ = c.Apply(ctx, p) - transport = p.httpReverseProxy.Transport.(Transport) + transport = p.HTTPTransport.(Transport) transport.IgnoreHTTPSCertificate = true } diff --git a/internal/proxy/http-proxy.go b/internal/proxy/http-proxy.go index f55e82f0..5aacaf8a 100644 --- a/internal/proxy/http-proxy.go +++ b/internal/proxy/http-proxy.go @@ -28,6 +28,7 @@ type HTTPProxy struct { HandleHTTPValidation func(w http.ResponseWriter, r *http.Request) bool Director Director // modify requests to backend. HTTPTransport http.RoundTripper + EnableAccessLog bool logger *zap.Logger listener net.Listener @@ -61,9 +62,15 @@ func (p *HTTPProxy) Close() error { // Any public fields must not change after Start called func (p *HTTPProxy) Start() error { if p.HTTPTransport != nil { + p.logger.Info("Set transport to reverse proxy") p.httpReverseProxy.Transport = p.HTTPTransport } + if p.EnableAccessLog { + p.httpReverseProxy.Transport = NewTransportLogger(p.httpReverseProxy.Transport) + } + p.logger.Info("Access log", zap.Bool("enabled", p.EnableAccessLog)) + mux := &http.ServeMux{} mux.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) { if !p.HandleHTTPValidation(writer, request) { diff --git a/internal/proxy/transport_logger.go b/internal/proxy/transport_logger.go new file mode 100644 index 00000000..c5eaa21c --- /dev/null +++ b/internal/proxy/transport_logger.go @@ -0,0 +1,41 @@ +package proxy + +import ( + "net/http" + "time" + + "go.uber.org/zap" + + "github.com/rekby/lets-proxy2/internal/log" +) + +type TransportLogger struct { + Transport http.RoundTripper +} + +func (t TransportLogger) RoundTrip(request *http.Request) (resp *http.Response, err error) { + start := time.Now() + + defer func() { + log.InfoErrorCtx(request.Context(), err, "Request", + zap.Duration("duration_without_body", time.Since(start)), + zap.String("initiator_addr", request.RemoteAddr), + zap.String("metod", request.Method), + zap.String("host", request.Host), + zap.String("path", request.URL.Path), + zap.String("query", request.URL.RawQuery), + zap.Int("status_code", resp.StatusCode), + zap.Int64("request_content_length", request.ContentLength), + zap.Int64("resp_content_length", resp.ContentLength), + ) + }() + + return t.Transport.RoundTrip(request) +} + +func NewTransportLogger(transport http.RoundTripper) TransportLogger { + if transport == nil { + return TransportLogger{Transport: http.DefaultTransport} + } + return TransportLogger{Transport: transport} +} diff --git a/internal/proxy/transport_logger_test.go b/internal/proxy/transport_logger_test.go new file mode 100644 index 00000000..c65db40b --- /dev/null +++ b/internal/proxy/transport_logger_test.go @@ -0,0 +1,7 @@ +package proxy + +import ( + "net/http" +) + +var _ http.RoundTripper = TransportLogger{}