From a2209e213323bc1edbe8320572247ad3014f8d13 Mon Sep 17 00:00:00 2001 From: Nico Esteves Date: Tue, 19 Jun 2018 22:03:07 +0200 Subject: [PATCH] Added --version to all but ecs-dashboard Due to the way kingpin handles arguments you need to pass required args to get the version at the moment. --- VERSION | 2 +- cloudwatch/put-metric-data/main.go | 2 ++ common/info.go | 35 ++++++++++++++++++++++++++++ ec2/ip-from-name/main.go | 2 ++ ecr/get-login/main.go | 6 +++-- ecs/dashboard/main.go | 2 +- ecs/deploy/main.go | 14 ++++++----- ecs/run-task/main.go | 2 ++ elb/resolve-alb-external-url/main.go | 2 ++ elb/resolve-elb-external-url/main.go | 2 ++ iam/public-ssh-keys/main.go | 10 ++++---- iam/session/main.go | 2 ++ kms/env/main.go | 2 ++ s3/download/main.go | 10 ++++---- scripts/build.sh | 6 +++-- 15 files changed, 79 insertions(+), 20 deletions(-) create mode 100644 common/info.go diff --git a/VERSION b/VERSION index 1bc788d..3b867cc 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.6.0 +5.7.0 \ No newline at end of file diff --git a/cloudwatch/put-metric-data/main.go b/cloudwatch/put-metric-data/main.go index 073a343..7f7211f 100644 --- a/cloudwatch/put-metric-data/main.go +++ b/cloudwatch/put-metric-data/main.go @@ -9,6 +9,7 @@ import ( var ( flags = common.KingpinSessionFlags() + infoFlags = common.KingpinInfoFlags() metricName = kingpin.Flag("metric-name", "Name of the Cloudwatch metric").Required().String() namespace = kingpin.Flag("namespace", "Name of the Cloudwatch namespace").Required().String() dimensions = kingpin.Flag("dimension", "Dimensions name=value").StringMap() @@ -19,6 +20,7 @@ func main() { kingpin.CommandLine.Name = "cloudwatch-put-metric-data" kingpin.CommandLine.Help = "Put a cloudwatch metric value." kingpin.Parse() + common.HandleInfoFlags(infoFlags) session, conf := common.OpenSession(flags) diff --git a/common/info.go b/common/info.go new file mode 100644 index 0000000..59e4fe2 --- /dev/null +++ b/common/info.go @@ -0,0 +1,35 @@ +package common + +import ( + "fmt" + "os" + + kingpin "gopkg.in/alecthomas/kingpin.v2" +) + +var ( + Version string = "???" + CommitHash string = "???" +) + +type InfoFlags struct { + Version *bool +} + +func VersionString() string { + return fmt.Sprintf("%s (%s)", Version, CommitHash) +} + +func HandleInfoFlags(flags *InfoFlags) { + if *flags.Version { + fmt.Println(VersionString()) + os.Exit(0) + } +} + +func KingpinInfoFlags() *InfoFlags { + + return &InfoFlags{ + Version: kingpin.Flag("version", "Display the version").Short('v').Bool(), + } +} diff --git a/ec2/ip-from-name/main.go b/ec2/ip-from-name/main.go index 8dc023d..9aca303 100644 --- a/ec2/ip-from-name/main.go +++ b/ec2/ip-from-name/main.go @@ -12,6 +12,7 @@ import ( var ( flags = common.KingpinSessionFlags() + infoFlags = common.KingpinInfoFlags() name = kingpin.Flag("name", "Name of the EC2 instance").Required().String() maxResults = kingpin.Flag("max-results", "Max number of IPs to return").Default("9").Int() ) @@ -20,6 +21,7 @@ func main() { kingpin.CommandLine.Name = "ec2-ip-from-name" kingpin.CommandLine.Help = "Returns a list of instances IP with a given name." kingpin.Parse() + common.HandleInfoFlags(infoFlags) session, conf := common.OpenSession(flags) diff --git a/ecr/get-login/main.go b/ecr/get-login/main.go index d6aa9ed..83fe7d9 100644 --- a/ecr/get-login/main.go +++ b/ecr/get-login/main.go @@ -11,14 +11,16 @@ import ( ) var ( - flags = common.KingpinSessionFlags() - output = kingpin.Flag("output", "Return the credentials instead of docker command").Default("shell").Enum("raw", "shell") + flags = common.KingpinSessionFlags() + infoFlags = common.KingpinInfoFlags() + output = kingpin.Flag("output", "Return the credentials instead of docker command").Default("shell").Enum("raw", "shell") ) func main() { kingpin.CommandLine.Name = "ecr-get-login" kingpin.CommandLine.Help = "Returns an authorization token from ECR." kingpin.Parse() + common.HandleInfoFlags(infoFlags) session, conf := common.OpenSession(flags) diff --git a/ecs/dashboard/main.go b/ecs/dashboard/main.go index 9f7e173..ea73dfb 100644 --- a/ecs/dashboard/main.go +++ b/ecs/dashboard/main.go @@ -10,9 +10,9 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" + "github.com/gobuffalo/packr" "github.com/gorilla/handlers" "github.com/gorilla/mux" - "github.com/gobuffalo/packr" kingpin "gopkg.in/alecthomas/kingpin.v2" ) diff --git a/ecs/deploy/main.go b/ecs/deploy/main.go index 8a6c304..0221583 100644 --- a/ecs/deploy/main.go +++ b/ecs/deploy/main.go @@ -13,18 +13,20 @@ import ( ) var ( - flags = common.KingpinSessionFlags() - taskName = kingpin.Flag("task-name", "ECS task name").Required().String() - cluster = kingpin.Flag("cluster", "ECS cluster").Required().String() - services = kingpin.Flag("service", "ECS services").Required().Strings() - images = kingpin.Flag("image", "Change the images to the new ones. Container name=image").StringMap() - timeout = kingpin.Flag("timeout", "Timeout when waiting for services to update").Default("300s").Duration() + flags = common.KingpinSessionFlags() + infoFlags = common.KingpinInfoFlags() + taskName = kingpin.Flag("task-name", "ECS task name").Required().String() + cluster = kingpin.Flag("cluster", "ECS cluster").Required().String() + services = kingpin.Flag("service", "ECS services").Required().Strings() + images = kingpin.Flag("image", "Change the images to the new ones. Container name=image").StringMap() + timeout = kingpin.Flag("timeout", "Timeout when waiting for services to update").Default("300s").Duration() ) func main() { kingpin.CommandLine.Name = "ecs-deploy" kingpin.CommandLine.Help = "Update a task definition on ECS." kingpin.Parse() + common.HandleInfoFlags(infoFlags) session, conf := common.OpenSession(flags) diff --git a/ecs/run-task/main.go b/ecs/run-task/main.go index 084f0f4..fe90695 100644 --- a/ecs/run-task/main.go +++ b/ecs/run-task/main.go @@ -9,6 +9,7 @@ import ( var ( flags = common.KingpinSessionFlags() + infoFlags = common.KingpinInfoFlags() taskDefinition = kingpin.Flag("task-definition", "ECS task definition").Required().String() cluster = kingpin.Flag("cluster", "ECS cluster").Required().String() ) @@ -17,6 +18,7 @@ func main() { kingpin.CommandLine.Name = "ecs-run-task" kingpin.CommandLine.Help = "Run a task on ECS." kingpin.Parse() + common.HandleInfoFlags(infoFlags) session, conf := common.OpenSession(flags) diff --git a/elb/resolve-alb-external-url/main.go b/elb/resolve-alb-external-url/main.go index a5205bd..7abc1d4 100644 --- a/elb/resolve-alb-external-url/main.go +++ b/elb/resolve-alb-external-url/main.go @@ -12,6 +12,7 @@ import ( var ( flags = common.KingpinSessionFlags() + infoFlags = common.KingpinInfoFlags() loadBalancerName = kingpin.Flag("name", "Name of the load balancer").Required().String() dnsPrefix = kingpin.Flag("dns-prefix", "Prefix to match on the DNS").String() ) @@ -20,6 +21,7 @@ func main() { kingpin.CommandLine.Name = "elb-resolve-alb-external-url" kingpin.CommandLine.Help = "Resolve the public URL of an ALB." kingpin.Parse() + common.HandleInfoFlags(infoFlags) session, conf := common.OpenSession(flags) diff --git a/elb/resolve-elb-external-url/main.go b/elb/resolve-elb-external-url/main.go index 56a7216..f25cf99 100644 --- a/elb/resolve-elb-external-url/main.go +++ b/elb/resolve-elb-external-url/main.go @@ -12,6 +12,7 @@ import ( var ( flags = common.KingpinSessionFlags() + infoFlags = common.KingpinInfoFlags() loadBalancerName = kingpin.Flag("name", "Name of the load balancer").Required().String() ) @@ -20,6 +21,7 @@ func main() { kingpin.CommandLine.Name = "elb-resolve-elb-external-url" kingpin.CommandLine.Help = "Resolve the public URL of an ELB." kingpin.Parse() + common.HandleInfoFlags(infoFlags) session, conf := common.OpenSession(flags) diff --git a/iam/public-ssh-keys/main.go b/iam/public-ssh-keys/main.go index 9f7d376..6dab1eb 100644 --- a/iam/public-ssh-keys/main.go +++ b/iam/public-ssh-keys/main.go @@ -14,16 +14,18 @@ import ( ) var ( - flags = common.KingpinSessionFlags() - username = kingpin.Flag("username", "Username to fetch the keys for, otherwise default to the logged in user.").Short('u').String() - encoding = kingpin.Flag("key-encoding", "Encoding of the key to return (SSH or PEM)").Default("SSH").Enum("PEM", "SSH") - groups = kingpin.Flag("allowed-group", "Fetch the keys only if the user is in this group. You can use --allowed-group multiple times.").Strings() + flags = common.KingpinSessionFlags() + infoFlags = common.KingpinInfoFlags() + username = kingpin.Flag("username", "Username to fetch the keys for, otherwise default to the logged in user.").Short('u').String() + encoding = kingpin.Flag("key-encoding", "Encoding of the key to return (SSH or PEM)").Default("SSH").Enum("PEM", "SSH") + groups = kingpin.Flag("allowed-group", "Fetch the keys only if the user is in this group. You can use --allowed-group multiple times.").Strings() ) func main() { kingpin.CommandLine.Name = "iam-public-ssh-keys" kingpin.CommandLine.Help = "Return public SSH keys for an IAM user." kingpin.Parse() + common.HandleInfoFlags(infoFlags) session := session.Must(session.NewSession()) conf := common.AssumeRoleConfig(flags, session) diff --git a/iam/session/main.go b/iam/session/main.go index a2373bb..f21d7f6 100644 --- a/iam/session/main.go +++ b/iam/session/main.go @@ -16,6 +16,7 @@ import ( var ( flags = common.KingpinSessionFlags() + infoFlags = common.KingpinInfoFlags() quiet = kingpin.Flag("quiet", "Do not output anything").Short('q').Default("false").Bool() saveProfileName = kingpin.Flag("save-profile", "Save the profile in the AWS credentials storage").Short('s').String() overwriteProfile = kingpin.Flag("overwrite-profile", "Overwrite the profile if it already exists").Default("false").Bool() @@ -26,6 +27,7 @@ func main() { kingpin.CommandLine.Name = "iam-session" kingpin.CommandLine.Help = "Start a new session under a different role." kingpin.Parse() + common.HandleInfoFlags(infoFlags) if len(*flags.RoleArn) == 0 && len(*saveProfileName) != 0 && len(*flags.MFASerialNumber) == 0 { common.Fatalln("--save-profile can only be used with --assume-role-arn or --mfa-serial-number") diff --git a/kms/env/main.go b/kms/env/main.go index 5861545..3945d3f 100644 --- a/kms/env/main.go +++ b/kms/env/main.go @@ -18,6 +18,7 @@ import ( var ( flags = common.KingpinSessionFlags() + infoFlags = common.KingpinInfoFlags() command = kingpin.Arg("command", "Command to run, prefix with -- to pass args").Required().Strings() kmsPrefix = kingpin.Flag("kms-prefix", "Prefix for the KMS environment variables").Default("KMS_").String() ssmPrefix = kingpin.Flag("ssm-prefix", "Prefix for the SSM environment variables").Default("SSM_").String() @@ -27,6 +28,7 @@ func main() { kingpin.CommandLine.Name = "kms_env" kingpin.CommandLine.Help = "Decrypt environment variables encrypted with KMS or SSM." kingpin.Parse() + common.HandleInfoFlags(infoFlags) session, conf := common.OpenSession(flags) kmsClient := kms.New(session, conf) diff --git a/s3/download/main.go b/s3/download/main.go index 5294bb3..60f4b21 100644 --- a/s3/download/main.go +++ b/s3/download/main.go @@ -10,16 +10,18 @@ import ( ) var ( - flags = common.KingpinSessionFlags() - bucket = kingpin.Flag("bucket", "Name of the bucket").Required().String() - key = kingpin.Flag("key", "Key to download").Required().String() - filename = kingpin.Flag("filename", "Output filename").Required().String() + flags = common.KingpinSessionFlags() + infoFlags = common.KingpinInfoFlags() + bucket = kingpin.Flag("bucket", "Name of the bucket").Required().String() + key = kingpin.Flag("key", "Key to download").Required().String() + filename = kingpin.Flag("filename", "Output filename").Required().String() ) func main() { kingpin.CommandLine.Name = "s3-download" kingpin.CommandLine.Help = "Download a file from S3." kingpin.Parse() + common.HandleInfoFlags(infoFlags) session, conf := common.OpenSession(flags) diff --git a/scripts/build.sh b/scripts/build.sh index 1133355..182bbc9 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -5,15 +5,17 @@ base=$(dirname $0)/.. mkdir -p ${base}/bin rm -f ${base}/bin/*.asc +version=$(cat ${base}/VERSION) +commit=$(git rev-parse --short HEAD) -echo "Building" +echo "Building ${version} (${commit})" find ${base} -name "main.go" | while read src; do src=$(realpath --relative-to=${base} ${src}) name=bin/$(echo ${src} | awk -F/ '{print $1"-"$2}') echo " ${name}" folder=`dirname ${src}` if [ ! -f ${folder}/Makefile ]; then - CGO_ENABLED=0 go build -installsuffix cgo -o ${base}/${name} -ldflags="-s -w" ${folder}/*.go + CGO_ENABLED=0 go build -installsuffix cgo -o ${base}/${name} -ldflags="-s -w -X github.com/hamstah/awstools/common.Version=${version} -X github.com/hamstah/awstools/common.CommitHash=${commit}" ${folder}/*.go gpg --armor --detach-sig ${base}/${name} else cd ${folder}