Code Monkey home page Code Monkey logo

cli's Introduction

Scalingo-CLI v1.32.0

publish workflow

This repository contains the command line utility for the public PaaS Scalingo.

Visit our website.

How to Build?

The project is using Go, then you need a running Go environment: Official documentation

Once that's done, all you have to do is to go get the project, with the following command:

go get github.com/Scalingo/cli/scalingo

That's it, you've build the latest version of the Scalingo CLI (the binary will be present in $GOPATH/bin/scalingo)

How to Upgrade?

go get -u github.com/Scalingo/cli/scalingo

Run Behind a Proxy

You have to setup the following environment variables:

HTTP_PROXY=http://<proxy host>:<proxy port>
HTTPS_PROXY=https://<proxy host>:<proxy port>

Disable Update Checking

By default the CLI is making an HTTP request to learn if a newer version is available. To disable this feature, define the environment variable:

DISABLE_UPDATE_CHECKER=true

Command Help

NAME:
   Scalingo Client - Manage your apps and containers

USAGE:
   scalingo [global options] command [command options] [arguments...]

VERSION:
   1.32.0

AUTHOR:
   Scalingo Team <[email protected]>

COMMANDS:
     help  Shows a list of commands or help for one command

   Addons:
     addons                    List used add-ons
     addons-add                Provision an add-on for your application
     addons-remove             Remove an existing addon from your app
     addons-upgrade            Upgrade or downgrade an add-on attached to your app
     addons-info               Display information about an add-on attached to your app
     backups-config            Configure the periodic backups of a database
     database-enable-feature   Enable a togglable feature from a database
     database-disable-feature  Enable a togglable feature from a database
     backups                   List backups for an addon
     backups-create            Ask for a new backup
     backups-download          Download a backup
     backup-download           Download a backup

   Addons - Global:
     addons-list   List all addons
     addons-plans  List plans

   Alerts:
     alerts          List the alerts of an application
     alerts-add      Add an alert to an application metric
     alerts-update   Update an alert
     alerts-enable   Enable an alert
     alerts-disable  Disable an alert
     alerts-remove   Remove an alert from an application

   App Management:
     destroy                 Destroy an app /!\
     rename                  Rename an application
     apps-info               Display the application information
     open                    Open app on default web browser
     dashboard               Open app dashboard on default web browser
     logs, l                 Get the logs of your applications
     logs-archives, la       Get the logs archives of your applications and databases
     run, r                  Run any command for your app
     one-off-stop            Stop a running one-off container
     ps                      Display your application containers
     scale, s                Scale your application instantly
     restart                 Restart processes of your app
     send-signal, kill       Send SIGUSR1 or SIGUSR2 to your application containers
     force-https             Enable/Disable automatic redirection of traffic to HTTPS for your application
     sticky-session          Enable/Disable sticky sessions for your application
     router-logs             Enable/disable router logs for your application
     set-canonical-domain    Set a canonical domain.
     unset-canonical-domain  Unset a canonical domain.
     db-tunnel               Create an encrypted connection to access your database

   Autoscalers:
     autoscalers          List the autoscalers of an application
     autoscalers-add      Add an autoscaler to an application
     autoscalers-remove   Remove an autoscaler from an application
     autoscalers-update   Update an autoscaler
     autoscalers-disable  Disable an autoscaler
     autoscalers-enable   Enable an autoscaler

   CLI Internals:
     update     Update 'scalingo' SDK client
     changelog  Show the Scalingo CLI changelog from last version

   Collaborators:
     collaborators         List the collaborators of an application
     collaborators-add     Invite someone to work on an application
     collaborators-remove  Revoke permission to collaborate on an application

   Cron Tasks:
     cron-tasks  List the cron tasks of an application

   Custom Domains:
     domains         List the domains of an application
     domains-add     Add a custom domain to an application
     domains-remove  Remove a custom domain from an application
     domains-ssl     Enable or disable SSL for your custom domains

   Databases:
     redis-console                                    Run an interactive console with your Redis addon
     mongo-console, mongodb-console                   Run an interactive console with your MongoDB addon
     mysql-console                                    Run an interactive console with your MySQL addon
     pgsql-console, psql-console, postgresql-console  Run an interactive console with your PostgreSQL addon
     influxdb-console, influx-console                 Run an interactive console with your InfluxDB addon

   Deployment:
     deployments                                       List app deployments
     deployment-logs                                   View deployment logs
     deployment-follow                                 Follow deployment event stream
     deploy                                            Trigger a deployment by archive
     deployment-delete-cache, deployment-cache-delete  Reset deployment cache

   Display metrics of the running containers:
     stats  Display metrics of the currently running containers

   Environment:
     env        Display the environment variables of your apps
     env-get    Get the requested environment variable from your app
     env-set    Set the environment variables of your apps
     env-unset  Unset environment variables of your apps

   Events:
     user-timeline  List the events you have done on the platform
     timeline       List the actions related to a given app

   Git:
     git-setup  Configure the Git remote for this application
     git-show   Display the Git remote URL for this application

   Global:
     apps          List your apps
     create, c     Create a new app
     login         Login to Scalingo platform
     logout        Logout from Scalingo
     regions       List available regions
     config        Configure the CLI
     self, whoami  Get the logged in profile

   Integration Link:
     integration-link                    Show integration link of your app
     integration-link-create             Link your Scalingo application to an integration
     integration-link-update             Update the integration link parameters
     integration-link-delete             Delete the link between your Scalingo application and the integration
     integration-link-manual-deploy      Trigger a manual deployment of the specified branch
     integration-link-manual-review-app  Trigger a review app creation of the pull/merge request ID specified

   Integrations:
     integrations              List your integrations
     integrations-add          Link your Scalingo account with your account on a tool such as github.com
     integrations-delete       Unlink your Scalingo account and your account on a tool such as github.com
     integrations-import-keys  Import public SSH keys from integration account

   Log drains:
     log-drains-add     Add a log drain to an application
     log-drains         List the log drains of an application
     log-drains-remove  Remove a log drain from an application and its associated addons

   Notifiers:
     notifiers          List your notifiers
     notifiers-details  Show details of a notifier
     notifiers-add      Add a notifier for your application
     notifiers-update   Update a notifier
     notifiers-remove   Remove an existing notifier from your app

   Notifiers - Global:
     notification-platforms  List all notification platforms

   Public SSH Keys:
     keys         List your SSH public keys
     keys-add     Add a public SSH key to deploy your apps
     keys-remove  Remove a public SSH key

   Region migrations:
     migration-create  Start migrating an app to another region
     migration-run     Run a specific migration step
     migration-abort   Abort a migration
     migrations        List all migrations linked to an app
     migration-follow  Follow a running migration

   Review Apps:
     review-apps  Show review apps of the parent application

   Runtime Stacks:
     stacks      List the available runtime stacks
     stacks-set  Set the runtime stack of an app

GLOBAL OPTIONS:
   --addon value             ID of the current addon (default: "<addon_id>") [$SCALINGO_ADDON]
   --app value, -a value     Name of the app (default: "<name>") [$SCALINGO_APP]
   --remote value, -r value  Name of the remote (default: "scalingo")
   --region value            Name of the region to use
   --version, -v             print the version

Development Setup

In order to build the current development version and use it against the development services:

cd scalingo
go build .
SCALINGO_API_URL=http://172.17.0.1:3001 SCALINGO_AUTH_URL=http://172.17.0.1:1234 ./scalingo login --api-token <admin user API token>

Release a New Version

Get the latest version of the CLI:

git switch master
git pull origin master

(optional) Cherry Pick Commits Included in the Release

You may want to cherry pick the commits to include in the release. You first need to get the commit ID of the previous release (let's call it base commit ID). Then create a new branch and cherry pick all the commits you need, from the oldest to the most recent. Use the commit ID of the merge of every pull request you want to include in your release. Don't forget to also cherry pick the commit for the version bump.

git checkout <base commit ID>
git checkout -b v1.32.0
git cherry-pick -m 1 <commit ID number 1>
git cherry-pick -m 1 <commit ID number 2>
...
git cherry-pick -m 1 <commit ID number X>
git push --set-upstream origin v1.32.0

New Version Bump

Bump new version number in:

And commit these changes:

version="1.32.0"

git switch --create release/${version}
git add .
git commit -m "Bump version ${version}"
git push --set-upstream origin release/${version}
gh pr create --reviewer=EtienneM --title "$(git log -1 --pretty=%B)" --fill-first --base master

Once the pull request merged, you can tag the new release.

Tag the New Release

git tag ${version}
git push origin master ${version}

Pushing the tag triggers a GitHub Action which builds the cross-platform binaries and create a new release.

When the GitHub Action finished, restart the Scalingo application cli-download-service:

scalingo restart --region osc-fr1 --app cli-download-service

It serves as cache between GitHub and our customers for a more efficient check of what is the new CLI version.

You can now update the changelog and tweet about it!

[Changelog] CLI - Release of version 1.32.0 https://cli.scalingo.com - More news at https://changelog.scalingo.com #cli #paas #changelog #bugfix

Add in a tweets thread the changelog of this new version.

cli's People

Contributors

abelards avatar aurelien-reeves-scalingo avatar bragagia avatar brandon-welsch avatar cbliard avatar curzolapierre avatar cyrillec avatar dependabot[bot] avatar etiennem avatar francois2metz avatar github-actions[bot] avatar iamoric avatar ipfaze avatar john-scalingo avatar johnsudaar avatar leo-scalingo avatar moursemotte avatar mrunichs avatar mryawe avatar quentinescudierscalingo avatar sc-zenokerr avatar scedricthomas avatar sihamais avatar soulou avatar stopostit avatar theoeb avatar tititestscalingo avatar utay avatar yohann-bacha avatar zyko0 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cli's Issues

Panic when streaming logs

 "posetonflow-staging"
panic: runtime error: index out of range

goroutine 1 [running]:
runtime.panic(0x2ada00, 0x63bed7)
    /opt/go-1.2.1/src/pkg/runtime/panic.c:266 +0xb6
appsdeck/apps.streamLogs(0x2107ab6c0, 0x5f, 0x22108ca901)
    /run/media/leo/0a408ca7-d449-4157-9b44-8692a40edd7b/Appsdeck/appsdeck/src/appsdeck/apps/logs.go:54 +0x2b8
appsdeck/apps.Logs(0x2107bddc0, 0x13, 0x1, 0x14, 0x0, ...)
    /run/media/leo/0a408ca7-d449-4157-9b44-8692a40edd7b/Appsdeck/appsdeck/src/appsdeck/apps/logs.go:41 +0x590
appsdeck/cmd.func·005(0x2107bdd00)
    /run/media/leo/0a408ca7-d449-4157-9b44-8692a40edd7b/Appsdeck/appsdeck/src/appsdeck/cmd/logs.go:27 +0x167
github.com/codegangsta/cli.Command.Run(0x314320, 0x4, 0x3135c0, 0x1, 0x366830, ...)
    /run/media/leo/0a408ca7-d449-4157-9b44-8692a40edd7b/Appsdeck/appsdeck/src/github.com/codegangsta/cli/command.go:73 +0x994
github.com/codegangsta/cli.(*App).Run(0x210802210, 0x210763000, 0x5, 0x5, 0x6, ...)
    /run/media/leo/0a408ca7-d449-4157-9b44-8692a40edd7b/Appsdeck/appsdeck/src/github.com/codegangsta/cli/app.go:111 +0x855
main.main()
    /run/media/leo/0a408ca7-d449-4157-9b44-8692a40edd7b/Appsdeck/appsdeck/src/appsdeck/main.go:29 +0x2c1

goroutine 3 [syscall]:
os/signal.loop()
    /opt/go-1.2.1/src/pkg/os/signal/signal_unix.go:21 +0x1e
created by os/signal.init·1
    /opt/go-1.2.1/src/pkg/os/signal/signal_unix.go:27 +0x31

goroutine 6 [finalizer wait]:
runtime.park(0xbe10, 0x63f7e0, 0x63dd48)
    /opt/go-1.2.1/src/pkg/runtime/proc.c:1342 +0x66
runfinq()
    /opt/go-1.2.1/src/pkg/runtime/mgc0.c:2279 +0x84
runtime.goexit()
    /opt/go-1.2.1/src/pkg/runtime/proc.c:1394

goroutine 7 [runnable]:
net/http.(*persistConn).readLoop(0x2107bf800)
    /opt/go-1.2.1/src/pkg/net/http/transport.go:778 +0x68f
created by net/http.(*Transport).dialConn
    /opt/go-1.2.1/src/pkg/net/http/transport.go:528 +0x607

goroutine 8 [select]:
net/http.(*persistConn).writeLoop(0x2107bf800)
    /opt/go-1.2.1/src/pkg/net/http/transport.go:791 +0x271
created by net/http.(*Transport).dialConn
    /opt/go-1.2.1/src/pkg/net/http/transport.go:529 +0x61e

goroutine 10 [chan receive]:
net/http.(*persistConn).readLoop(0x2107bf680)
    /opt/go-1.2.1/src/pkg/net/http/transport.go:778 +0x68f
created by net/http.(*Transport).dialConn
    /opt/go-1.2.1/src/pkg/net/http/transport.go:528 +0x607

goroutine 11 [select]:
net/http.(*persistConn).writeLoop(0x2107bf680)
    /opt/go-1.2.1/src/pkg/net/http/transport.go:791 +0x271
created by net/http.(*Transport).dialConn
    /opt/go-1.2.1/src/pkg/net/http/transport.go:529 +0x61e

Sign in problem

I just tried to list the apps available and got an error

$ scalingo a
You need to be authenticated to use Scalingo client.
No account ? → https://my.scalingo.com/users/signup
Username or email: geoffroy@***
Password: 
Hello Geoffroy, nice to see you !

[Error] unexpected end of JSON input

For information, $? = 1

Minor problems - version in 1.0.0-alpha2 and logging

Hello,

I just installed scalingo and here are the first problems I encountered:

Fail to open log file: /home/geoffroy/.config/scalingo/local.log, disabling logging.

Fixed with mkdir ~/.config/scalingo

Your Scalingo client (1.0.0-alpha1) is obsolete, some feature may not work correctly, please update to '1.0.0-alpha2'

But I downloaded (and re-downloaded) version 1.0.0-alpha2, the version must not have been updated in the binary.

1.0.0-beta1: runtime error on db-tunnel

  • Windows7-64bit
  • tried 32bit and 64bit precompiled binaries
  • tried ZOC, mobaXterm and ssh CLI
  • as soon as the password is entered "scalingo db-tunnel" (running in a git-bash terminal) crashes

Here's the full stack trace:

Building tunnel to
You can access your database on '127.0.0.1:50888'
Connect to [1]
Connect to [2]
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x14 pc=0x474d0f]

goroutine 27 [running]:
io.Copy(0x314548, 0x1258d270, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
C:/Go/src/io/io.go:362 +0x17f
net.genericReadFrom(0x313658, 0x1258c3d0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
C:/Go/src/net/net.go:404 +0x92
net.(*TCPConn).ReadFrom(0x1258c3d0, 0x0, 0x0, 0x314530, 0x1258c3d0, 0x0, 0x0)
C:/Go/src/net/tcpsock_posix.go:72 +0xbc
io.Copy(0x313658, 0x1258c3d0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
C:/Go/src/io/io.go:358 +0xf4
github.com/Scalingo/cli/db.func┬À001()
C:/Gopath/src/github.com/Scalingo/cli/db/tunnel.go:127 +0x8c
created by github.com/Scalingo/cli/db.handleConnToTunnel
C:/Gopath/src/github.com/Scalingo/cli/db/tunnel.go:130 +0x2e2

goroutine 1 [semacquire]:
sync.(_WaitGroup).Wait(0x908630)
C:/Go/src/sync/waitgroup.go:132 +0x13e
github.com/Scalingo/cli/Godeps/_workspace/src/github.com/stvp/rollbar.Wait()
C:/Gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/github.com/stvp/rollbar/rollbar.go:161 +0x2a
github.com/Scalingo/cli/cmd.errorQuit(0x314478, 0x1260c060)
C:/Gopath/src/github.com/Scalingo/cli/cmd/error.go:71 +0x1cf
github.com/Scalingo/cli/cmd.func┬À009(0x12596460)
C:/Gopath/src/github.com/Scalingo/cli/cmd/db-tunnel.go:66 +0x1b8
github.com/Scalingo/cli/Godeps/_workspace/src/github.com/Scalingo/codegangsta-cli.Command.Run(0x7513f8, 0x9, 0x0, 0x0, 0x7b9388, 0x36, 0x7f8168, 0x533, 0x75b658, 0xe, ...)
C:/Gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/github.com/Scalingo/codegangsta-cli/command.go:105 +0xb4f
github.com/Scalingo/cli/Godeps/_workspace/src/github.com/Scalingo/codegangsta-cli.(_App).Run(0x12596000, 0x125742d0, 0x5, 0x5, 0x0, 0x0)
C:/Gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/github.com/Scalingo/codegangsta-cli/app.go:165 +0xbb1
main.main()
C:/Gopath/src/github.com/Scalingo/cli/scalingo/main.go:93 +0x75f

goroutine 5 [select]:
net/http.(_Transport).getConn(0x125961c0, 0x125f2930, 0x0, 0x79da88, 0x5, 0x125dec40, 0x13, 0x0, 0x0, 0x0)
C:/Go/src/net/http/transport.go:525 +0x4d2
net/http.(_Transport).RoundTrip(0x125961c0, 0x125f2930, 0x1260c780, 0x0, 0x0)
C:/Go/src/net/http/transport.go:228 +0x3bb
net/http.send(0x125f2930, 0x3120f0, 0x125961c0, 0x23, 0x0, 0x0)
C:/Go/src/net/http/client.go:219 +0x3b8
net/http.(_Client).send(0x908790, 0x125f2930, 0x23, 0x0, 0x0)
C:/Go/src/net/http/client.go:142 +0xf8
net/http.(_Client).doFollowingRedirects(0x908790, 0x125f2930, 0x7f11e0, 0x0, 0x0, 0x0)
C:/Go/src/net/http/client.go:367 +0x91f
net/http.(*Client).Post(0x908790, 0x79da88, 0x23, 0x76c598, 0x10, 0x3144f8, 0x125de2c0, 0x708f00, 0x0, 0x0)
C:/Go/src/net/http/client.go:441 +0xcb
net/http.Post(0x79da88, 0x23, 0x76c598, 0x10, 0x3144f8, 0x125de2c0, 0x0, 0x0, 0x0)
C:/Go/src/net/http/client.go:426 +0x6a
github.com/Scalingo/cli/Godeps/_workspace/src/github.com/stvp/rollbar.post(0x125ec880)
C:/Gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/github.com/stvp/rollbar/rollbar.go:296 +0x212
github.com/Scalingo/cli/Godeps/_workspace/src/github.com/stvp/rollbar.func┬À001()
C:/Gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/github.com/stvp/rollbar/rollbar.go:75 +0x63
created by github.com/Scalingo/cli/Godeps/_workspace/src/github.com/stvp/rollbar.init┬À1
C:/Gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/github.com/stvp/rollbar/rollbar.go:78 +0x59

goroutine 26 [chan send]:
github.com/Scalingo/cli/db.handleConnToTunnel(0x1260c030, 0x125be080, 0x3125b8, 0x1258c2c8, 0x125be440)
C:/Gopath/src/github.com/Scalingo/cli/db/tunnel.go:120 +0x1fe
created by github.com/Scalingo/cli/db.Tunnel
C:/Gopath/src/github.com/Scalingo/cli/db/tunnel.go:99 +0xcf0

goroutine 7 [syscall, 2 minutes]:
os/signal.loop()
C:/Go/src/os/signal/signal_unix.go:21 +0x21
created by os/signal.init┬À1
C:/Go/src/os/signal/signal_unix.go:27 +0x34

goroutine 8 [chan receive, 2 minutes]:
github.com/Scalingo/cli/signals.Handle()
C:/Gopath/src/github.com/Scalingo/cli/signals/handler.go:17 +0x1c3
created by main.main
C:/Gopath/src/github.com/Scalingo/cli/scalingo/main.go:81 +0x65a

goroutine 18 [IO wait]:
net.(_pollDesc).Wait(0x125a21b0, 0x72, 0x0, 0x0)
C:/Go/src/net/fd_poll_runtime.go:84 +0x42
net.(_ioSrv).ExecIO(0x1258c788, 0x125a2118, 0x742cf8, 0x7, 0x7f1164, 0x0, 0x0, 0x0)
C:/Go/src/net/fd_windows.go:188 +0x265
net.(_netFD).Read(0x125a20e0, 0x12608000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
C:/Go/src/net/fd_windows.go:470 +0x11a
net.(_conn).Read(0x1258c3a8, 0x12608000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
C:/Go/src/net/net.go:121 +0xba
bufio.(_Reader).fill(0x1260d410)
C:/Go/src/bufio/bufio.go:97 +0x15c
bufio.(_Reader).Read(0x1260d410, 0x12610490, 0x5, 0x5, 0x0, 0x0, 0x0)
C:/Go/src/bufio/bufio.go:174 +0x1c0
io.ReadAtLeast(0x3136f0, 0x1260d410, 0x12610490, 0x5, 0x5, 0x5, 0x0, 0x0, 0x0)
C:/Go/src/io/io.go:298 +0xb2
io.ReadFull(0x3136f0, 0x1260d410, 0x12610490, 0x5, 0x5, 0x300008, 0x0, 0x0)
C:/Go/src/io/io.go:316 +0x5c
github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh.(_streamPacketCipher).readPacket(0x12610480, 0x7, 0x3136f0, 0x1260d410, 0x0, 0x0, 0x0, 0x0, 0x0)
C:/Gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh/cipher.go:137 +0xbb
github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh.(_connectionState).readPacket(0x125926c0, 0x1260d410, 0x0, 0x0, 0x0, 0x0, 0x0)
C:/Gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh/transport.go:110 +0xbc
github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh.(_transport).readPacket(0x125926c0, 0x0, 0x0, 0x0, 0x0, 0x0)
C:/Gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh/transport.go:106 +0x5d
github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh.(_handshakeTransport).readOnePacket(0x12592750, 0x0, 0x0, 0x0, 0x0, 0x0)
C:/Gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh/handshake.go:153 +0xcc
github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh.(*handshakeTransport).readLoop(0x12592750)
C:/Gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh/handshake.go:133 +0x28
created by github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh.newClientTransport
C:/Gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh/handshake.go:101 +0xfb

goroutine 29 [runnable]:
net/http.func┬À019()
C:/Go/src/net/http/transport.go:519
created by net/http.(*Transport).getConn
C:/Go/src/net/http/transport.go:522 +0x298

goroutine 28 [runnable]:
github.com/Scalingo/cli/db.func┬À002()
C:/Gopath/src/github.com/Scalingo/cli/db/tunnel.go:132
created by github.com/Scalingo/cli/db.handleConnToTunnel
C:/Gopath/src/github.com/Scalingo/cli/db/tunnel.go:136 +0x36c

goroutine 19 [chan receive]:
github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh.(_handshakeTransport).readPacket(0x12592750, 0x0, 0x0, 0x0, 0x0, 0x0)
C:/Gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh/handshake.go:124 +0x7b
github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh.(_mux).onePacket(0x125be340, 0x0, 0x0)
C:/Gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh/mux.go:224 +0x51
github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh.(*mux).loop(0x125be340)
C:/Gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh/mux.go:199 +0x3b
created by github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh.newMux
C:/Gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh/mux.go:128 +0x173

goroutine 20 [chan receive]:
github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh.(*Client).handleGlobalRequests(0x1260c030, 0x125be240)
C:/Gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh/client.go:137 +0x48
created by github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh.NewClient
C:/Gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh/client.go:54 +0xef

goroutine 21 [chan receive]:
github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh.(*Client).handleChannelOpens(0x1260c030, 0x125be140)
C:/Gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh/client.go:146 +0x5a
created by github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh.NewClient
C:/Gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh/client.go:55 +0x10e

goroutine 22 [semacquire]:
sync.(_Cond).Wait(0x125ec1c0)
C:/Go/src/sync/cond.go:62 +0x88
github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh.(_mux).Wait(0x125be340, 0x0, 0x0)
C:/Gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh/mux.go:110 +0x9a
github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh.func┬À003()
C:/Gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh/client.go:57 +0x3f
created by github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh.NewClient
C:/Gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh/client.go:59 +0x150

goroutine 23 [chan receive]:
github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh.(*forwardList).handleChannels(0x1260c038, 0x125be380)
C:/Gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh/tcpip.go:178 +0x5a
created by github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh.NewClient
C:/Gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/golang.org/x/crypto/ssh/client.go:60 +0x194

goroutine 24 [chan send]:
github.com/Scalingo/cli/db.startIDGenerator()
C:/Gopath/src/github.com/Scalingo/cli/db/tunnel.go:145 +0x47
created by github.com/Scalingo/cli/db.Tunnel
C:/Gopath/src/github.com/Scalingo/cli/db/tunnel.go:86 +0xb69

goroutine 25 [semacquire]:
sync.(*WaitGroup).Wait(0x125ec940)
C:/Go/src/sync/waitgroup.go:132 +0x13e
github.com/Scalingo/cli/db.handleConnToTunnel(0x1260c030, 0x125be080, 0x3125b8, 0x1258c3d0, 0x125be440)
C:/Gopath/src/github.com/Scalingo/cli/db/tunnel.go:138 +0x37c
created by github.com/Scalingo/cli/db.Tunnel
C:/Gopath/src/github.com/Scalingo/cli/db/tunnel.go:99 +0xcf0

[Mac OS X] Panic when building tunnel

./scalingo -a <app> db-tunnel postgres://<rest of url>
Building tunnel to <db>
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x0 pc=0x529f0]
goroutine 1 [running]:
github.com/Scalingo/cli/cmd.newSysinfo(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
/Users/leo/gopath/src/github.com/Scalingo/cli/cmd/error.go:96 +0xa0
github.com/Scalingo/cli/cmd.newReportError(0x306a5cb8, 0x1069b2c0, 0x1069b2c0)
/Users/leo/gopath/src/github.com/Scalingo/cli/cmd/error.go:84 +0x7e
github.com/Scalingo/cli/cmd.errorQuit(0x306a5cb8, 0x1069b2c0)
/Users/leo/gopath/src/github.com/Scalingo/cli/cmd/error.go:70 +0x1b8
github.com/Scalingo/cli/cmd.func·009(0x106d88c0)
/Users/leo/gopath/src/github.com/Scalingo/cli/cmd/db-tunnel.go:66 +0x177
github.com/Scalingo/cli/Godeps/_workspace/src/github.com/Scalingo/codegangsta-cli.Command.Run(0x34a938, 0x9, 0x0, 0x0, 0x3b04e8, 0x36, 0x3f0508, 0x533, 0x354cf8, 0xe, ...)
/Users/leo/gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/github.com/Scalingo/codegangsta-cli/command.go:105 +0xb49
github.com/Scalingo/cli/Godeps/_workspace/src/github.com/Scalingo/codegangsta-cli.(*App).Run(0x106d8460, 0x1069a000, 0x5, 0x5, 0x0, 0x0)
/Users/leo/gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/github.com/Scalingo/codegangsta-cli/app.go:165 +0xbab
main.main()
/Users/leo/gopath/src/github.com/Scalingo/cli/scalingo/main.go:93 +0x759
goroutine 5 [chan receive]:
github.com/Scalingo/cli/Godeps/_workspace/src/github.com/stvp/rollbar.func·001()
/Users/leo/gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/github.com/stvp/rollbar/rollbar.go:74 +0x44
created by github.com/Scalingo/cli/Godeps/_workspace/src/github.com/stvp/rollbar.init·1
/Users/leo/gopath/src/github.com/Scalingo/cli/Godeps/_workspace/src/github.com/stvp/rollbar/rollbar.go:78 +0x53
goroutine 22 [select]:
net/http.(*persistConn).writeLoop(0x106ea9c0)
/usr/local/Cellar/go/1.4/libexec/src/net/http/transport.go:945 +0x314
created by net/http.(*Transport).dialConn
/usr/local/Cellar/go/1.4/libexec/src/net/http/transport.go:661 +0xa54
goroutine 7 [syscall]:
os/signal.loop()
/usr/local/Cellar/go/1.4/libexec/src/os/signal/signal_unix.go:21 +0x1b
created by os/signal.init·1
/usr/local/Cellar/go/1.4/libexec/src/os/signal/signal_unix.go:27 +0x2e
goroutine 21 [IO wait]:
net.(*pollDesc).Wait(0x1072ab38, 0x72, 0x0, 0x0)
/usr/local/Cellar/go/1.4/libexec/src/net/fd_poll_runtime.go:84 +0x3c
net.(*pollDesc).WaitRead(0x1072ab38, 0x0, 0x0)
/usr/local/Cellar/go/1.4/libexec/src/net/fd_poll_runtime.go:89 +0x3a
net.(*netFD).Read(0x1072ab00, 0x106d4800, 0x400, 0x400, 0x0, 0x306a3dd0, 0x10748688)
/usr/local/Cellar/go/1.4/libexec/src/net/fd_unix.go:242 +0x2ea
net.(*conn).Read(0x106ac9f8, 0x106d4800, 0x400, 0x400, 0x0, 0x0, 0x0)
/usr/local/Cellar/go/1.4/libexec/src/net/net.go:121 +0xb4
crypto/tls.(*block).readFromUntil(0x10729dc0, 0x306a5638, 0x106ac9f8, 0x5, 0x0, 0x0)
/usr/local/Cellar/go/1.4/libexec/src/crypto/tls/conn.go:454 +0xaf
crypto/tls.(*Conn).readRecord(0x1071a1a0, 0x17, 0x0, 0x0)
/usr/local/Cellar/go/1.4/libexec/src/crypto/tls/conn.go:539 +0x269
crypto/tls.(*Conn).Read(0x1071a1a0, 0x1074f000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
/usr/local/Cellar/go/1.4/libexec/src/crypto/tls/conn.go:904 +0x118
net/http.noteEOFReader.Read(0x306a5a08, 0x1071a1a0, 0x106ea9ec, 0x1074f000, 0x1000, 0x1000, 0x1072a500, 0x0, 0x0)
/usr/local/Cellar/go/1.4/libexec/src/net/http/transport.go:1270 +0x56
net/http.(*noteEOFReader).Read(0x10748360, 0x1074f000, 0x1000, 0x1000, 0x106d0c80, 0x0, 0x0)
<autogenerated>:125 +0x99
bufio.(*Reader).fill(0x1069af60)
/usr/local/Cellar/go/1.4/libexec/src/bufio/bufio.go:97 +0x156
bufio.(*Reader).Peek(0x1069af60, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0)
/usr/local/Cellar/go/1.4/libexec/src/bufio/bufio.go:132 +0xcc
net/http.(*persistConn).readLoop(0x106ea9c0)
/usr/local/Cellar/go/1.4/libexec/src/net/http/transport.go:842 +0x81
created by net/http.(*Transport).dialConn
/usr/local/Cellar/go/1.4/libexec/src/net/http/transport.go:660 +0xa3f
goroutine 13 [sleep]:
net.func·019()
/usr/local/Cellar/go/1.4/libexec/src/net/dnsclient_unix.go:240 +0x4e
created by net.loadConfig
/usr/local/Cellar/go/1.4/libexec/src/net/dnsclient_unix.go:269 +0x1a4
goroutine 14 [chan receive]:
github.com/Scalingo/cli/signals.Handle()
/Users/leo/gopath/src/github.com/Scalingo/cli/signals/handler.go:17 +0x1bd
created by main.main
/Users/leo/gopath/src/github.com/Scalingo/cli/scalingo/main.go:81 +0x654
goroutine 19 [select]:
net/http.(*persistConn).writeLoop(0x106ea240)
/usr/local/Cellar/go/1.4/libexec/src/net/http/transport.go:945 +0x314
created by net/http.(*Transport).dialConn
/usr/local/Cellar/go/1.4/libexec/src/net/http/transport.go:661 +0xa54
goroutine 18 [IO wait]:
net.(*pollDesc).Wait(0x1072a8f8, 0x72, 0x0, 0x0)
/usr/local/Cellar/go/1.4/libexec/src/net/fd_poll_runtime.go:84 +0x3c
net.(*pollDesc).WaitRead(0x1072a8f8, 0x0, 0x0)
/usr/local/Cellar/go/1.4/libexec/src/net/fd_poll_runtime.go:89 +0x3a
net.(*netFD).Read(0x1072a8c0, 0x106fb000, 0x1000, 0x1000, 0x0, 0x306a3dd0, 0x107486dc)
/usr/local/Cellar/go/1.4/libexec/src/net/fd_unix.go:242 +0x2ea
net.(*conn).Read(0x106ac978, 0x106fb000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
/usr/local/Cellar/go/1.4/libexec/src/net/net.go:121 +0xb4
net/http.noteEOFReaer.Read(0x306a5638, 0x106ac978, 0x106ea26c, 0x106fb000, 0x1000, 0x1000, 0x106de300, 0x0, 0x0)
/usr/local/Cellar/go/1.4/libexec/src/net/http/transport.go:1270 +0x56
net/http.(*noteEOFReader).Read(0x10748620, 0x106fb000, 0x1000, 0x1000, 0x10728ae0, 0x0, 0x0)
<autogenerated>:125 +0x99
bufio.(*Reader).fill(0x1069b020)
/usr/local/Cellar/go/1.4/libexec/src/bufio/bufio.go:97 +0x156
bufio.(*Reader).Peek(0x1069b020, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0)
/usr/local/Cellar/go/1.4/libexec/src/bufio/bufio.go:132 +0xcc
net/http.(*persistConn).readLoop(0x106ea240)
/usr/local/Cellar/go/1.4/libexec/src/net/http/transport.go:842 +0x81
created by net/http.(*Transport).dialConn

[run] Environment variables are badly parsed, resulting in a panic

└> scalingo -a app run -e rf bash

panic: runtime error: index out of range

goroutine 1 [running]:
github.com/Scalingo/cli/apps.buildEnv(0xc208028e50, 0x1, 0x1, 0x2, 0x0, 0x0)
    /home/leo/Projects/Go/src/github.com/Scalingo/cli/apps/run.go:143 +0x351
github.com/Scalingo/cli/apps.Run(0xc20802900a, 0x5, 0xc20800a060, 0x1, 0x1, 0xc208028e50, 0x1, 0x1, 0xab8810, 0x0, ...)
    /home/leo/Projects/Go/src/github.com/Scalingo/cli/apps/run.go:55 +0x152
github.com/Scalingo/cli/cmd.func·033(0xc208032820)
    /home/leo/Projects/Go/src/github.com/Scalingo/cli/cmd/run.go:52 +0x21b
github.com/Scalingo/cli/Godeps/_workspace/src/github.com/Scalingo/codegangsta-cli.Command.Run(0x886550, 0x3, 0x885cb0, 0x1, 0x8d2cb0, 0x1c, 0x959710, 0x3bb, 0x88e270, 0xe, ...)
    /home/leo/Projects/Go/src/github.com/Scalingo/cli/Godeps/_workspace/src/github.com/Scalingo/codegangsta-cli/command.go:105 +0xd6a
github.com/Scalingo/cli/Godeps/_workspace/src/github.com/Scalingo/codegangsta-cli.(*App).Run(0xc208054620, 0xc20800a000, 0x7, 0x7, 0x0, 0x0)
    /home/leo/Projects/Go/src/github.com/Scalingo/cli/Godeps/_workspace/src/github.com/Scalingo/codegangsta-cli/app.go:165 +0xe60
main.main()
    /home/leo/Projects/Go/src/github.com/Scalingo/cli/scalingo/main.go:102 +0xb13

goroutine 5 [chan receive]:
github.com/Scalingo/cli/Godeps/_workspace/src/github.com/stvp/rollbar.func·001()
    /home/leo/Projects/Go/src/github.com/Scalingo/cli/Godeps/_workspace/src/github.com/stvp/rollbar/rollbar.go:74 +0x53
created by github.com/Scalingo/cli/Godeps/_workspace/src/github.com/stvp/rollbar.init·1
    /home/leo/Projects/Go/src/github.com/Scalingo/cli/Godeps/_workspace/src/github.com/stvp/rollbar/rollbar.go:78 +0x5f

goroutine 7 [syscall]:
os/signal.loop()
    /opt/go/src/os/signal/signal_unix.go:21 +0x1f
created by os/signal.init·1
    /opt/go/src/os/signal/signal_unix.go:27 +0x35

goroutine 8 [chan receive]:
github.com/Scalingo/cli/signals.Handle()
    /home/leo/Projects/Go/src/github.com/Scalingo/cli/signals/handler.go:17 +0x265
created by main.main
    /home/leo/Projects/Go/src/github.com/Scalingo/cli/scalingo/main.go:90 +0x9d5

goroutine 12 [IO wait]:
net.(*pollDesc).Wait(0xc20800a300, 0x72, 0x0, 0x0)
    /opt/go/src/net/fd_poll_runtime.go:84 +0x47
net.(*pollDesc).WaitRead(0xc20800a300, 0x0, 0x0)
    /opt/go/src/net/fd_poll_runtime.go:89 +0x43
net.(*netFD).Read(0xc20800a2a0, 0xc20800f000, 0x1000, 0x1000, 0x0, 0x7f59a0c25cf0, 0xc208029258)
    /opt/go/src/net/fd_unix.go:242 +0x40f
net.(*conn).Read(0xc208038068, 0xc20800f000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /opt/go/src/net/net.go:121 +0xdc
net/http.noteEOFReader.Read(0x7f59a0c27560, 0xc208038068, 0xc208064108, 0xc20800f000, 0x1000, 0x1000, 0x7a89e0, 0x0, 0x0)
    /opt/go/src/net/http/transport.go:1270 +0x6e
net/http.(*noteEOFReader).Read(0xc20801cc80, 0xc20800f000, 0x1000, 0x1000, 0xc208010000, 0x0, 0x0)
    <autogenerated>:125 +0xd4
bufio.(*Reader).fill(0xc20805a7e0)
    /opt/go/src/bufio/bufio.go:97 +0x1ce
bufio.(*Reader).Peek(0xc20805a7e0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0)
    /opt/go/src/bufio/bufio.go:132 +0xf0
net/http.(*persistConn).readLoop(0xc2080640b0)
    /opt/go/src/net/http/transport.go:842 +0xa4
created by net/http.(*Transport).dialConn
    /opt/go/src/net/http/transport.go:660 +0xc9f

goroutine 17 [syscall, locked to thread]:
runtime.goexit()
    /opt/go/src/runtime/asm_amd64.s:2232 +0x1

goroutine 13 [select]:
net/http.(*persistConn).writeLoop(0xc2080640b0)
    /opt/go/src/net/http/transport.go:945 +0x41d
created by net/http.(*Transport).dialConn
    /opt/go/src/net/http/transport.go:661 +0xcbc

Adding custom domain

while adding custom domain using command-

"scalingo -a domains-add example.com"

gives error "open domain.crt: The system cannot find the file specified."

Error when trying appsdeck run

yannski@laptop:~$ appsdeck --app dashboard run bundle exec rails c
[Error] local error: record overflow
yannski@laptop:~$ DEBUG=1 appsdeck --app dashboard run bundle exec rails c
[DEBUG]2014/01/08 13:17:35 [AppDetect] App name is dashboard
[DEBUG]2014/01/08 13:17:35 [API] POST https://appsdeck.eu/api/apps/dashboard/run
[DEBUG]2014/01/08 13:17:35       Params : map[command:bundle exec rails c user_email:[email protected] user_token:1xkXzMtz8pnXJNm8YA7p]
[DEBUG]2014/01/08 13:17:37 [API Response] {
  "memory": 134217728,
  "type": "job",
  "state": "Starting",
  "attach": "https://run.appsdeck.eu:8080/2a96fb0a8fd8e4de06c81a25146f91d3177b729ffecf77a9330bb8d76fe17164",
  "app": {
    "fullname": "dashboard",
    "name": "dashboard",
    "git_url": "[email protected]:dashboard.git",
    "created_at": "2013-10-05T18:45:53.897+02:00",
    "updated_at": "2013-10-05T18:45:53.897+02:00",
    "id": "525042416edfe4edf0000004",
    "urls": [
      "https://dashboard.appsdeck.eu"
    ],
    "owner": {
      "email": "[email protected]",
      "id": "525041c46edfe47afd000002"
    }
  }
}
[Error] local error: record overflow

1.0.0-alpha4: Can't login from Windows

$ scalingo.exe login
You need to be authenticated to use Scalingo client.
No account ? → https://my.scalingo.com/users/signup
Username or email: ****
Password: <DISPLAYED-IN-PLAIN-TEXT!!!>
Fail to login (1/3): json: cannot unmarshal object into Go value of type string
Username or email:

scalingo_1.0.0-alpha4_windows_amd64.zip is being used.

Running a command between quotes does not work

scalingo -a jenvoiedulourd-production run rails runner "Product.all.map(&:save)"

does not work as expected. Output is:

/tmp/script-1426864596: line 2: syntax error near unexpected token `('
/tmp/script-1426864596: line 2: `rails runner Product.all.map(&:save);ProductCategory.all.map(&:save)'
WARN: Error when updating terminal size: Invalid error code from run server: 500 Internal Server Error

What's the correct syntax? Maybe write it down in the doc :)

Aborting a shell make my terminal a junk

Scalingo ~ $ rails dbconsole production < /tmp/dump.sql 
Password: interrupt catched, aborting…
yannski@laptop ~ $

And then I cannot type commands anymore in my local shell

Copy/paste on appsdeck run command line gives weird result

For exemple copy/pasting this line "ContAACt est un écosystème applicatif de Communication Améliorée et Alternative (CAA) destiné aux personnes présentant des troubles de la communication (autistes, aphasiques,...). L’idée est de se baser sur l’intelligence collective de l'ensemble des acteurs (patients, familles et professionnels de santé) afin de mieux suivre l’évolution du handicap et d’apporter des réponses plus personnalisées. " gives unexpected result.

Autocomplete git remotes

When having several remote on scalingo (for example, -staging and -production), it could be very handy for the CLI to autocomplete the name and complete on tab the name of the remotes :)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.