Giter Club home page Giter Club logo

Comments (8)

mkj avatar mkj commented on August 23, 2024

from dropbear.

M95D avatar M95D commented on August 23, 2024
$git config --system --get core.sshcommand
dbclient -v -y -o UseSyslog 2> /var/log/dbclient
$git clone [email protected]:openwrt/packages.git
Cloning into 'packages'...
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

I tried adding ipv6 in kernel. I still get the same "Protocol not available" in the debug log. You may be right, but - just to make sure it's not ipv6 - what else do I need to eliminate that error?

# zcat /proc/config.gz | grep -i ipv6
CONFIG_IPV6=y
# CONFIG_IPV6_ROUTER_PREF is not set
# CONFIG_IPV6_OPTIMISTIC_DAD is not set
# CONFIG_IPV6_MIP6 is not set
# CONFIG_IPV6_VTI is not set
# CONFIG_IPV6_SIT is not set
# CONFIG_IPV6_TUNNEL is not set
# CONFIG_IPV6_GRE is not set
CONFIG_IPV6_FOU=y
# CONFIG_IPV6_MULTIPLE_TABLES is not set
# CONFIG_IPV6_MROUTE is not set
# CONFIG_IPV6_SEG6_LWTUNNEL is not set
# CONFIG_IPV6_SEG6_HMAC is not set
# CONFIG_IPV6_RPL_LWTUNNEL is not set

from dropbear.

mkj avatar mkj commented on August 23, 2024

What do you get if you just run dbclient [email protected] ?

I get

Hi mkj! You've successfully authenticated, but GitHub does not provide shell access.

from dropbear.

M95D avatar M95D commented on August 23, 2024

dbclient: Connection to [email protected]:22 exited: Remote closed the connection

dbclient -v [email protected]
TRACE  (23209) 0.000000: host is: [email protected]
TRACE  (23209) 0.000195: loadidentityfile /home/marius95/.ssh/id_dropbear
TRACE  (23209) 0.000247: enter buf_get_ed25519_priv_key
TRACE  (23209) 0.000260: leave buf_get_ed25519_priv_key: success
TRACE  (23209) 0.000280: user='git' host='github.com' port='22' bind_address='(null)' bind_port='(null)'
TRACE  (23209) 0.012244: enter session_init
TRACE  (23209) 0.012349: update_channel_prio
TRACE  (23209) 0.012361: leave update_channel_prio: no socket
TRACE  (23209) 0.012402: setnonblocking: 3
TRACE  (23209) 0.012417: leave setnonblocking
TRACE  (23209) 0.012428: setnonblocking: 4
TRACE  (23209) 0.012519: leave setnonblocking
TRACE  (23209) 0.012608: leave session_init
TRACE  (23209) 0.012633: proxy command PID='0'
TRACE  (23209) 0.012646: kexinitialise()
TRACE  (23209) 0.012664: algolist add 225 'curve25519-sha256,[email protected],ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group14-sha256,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1,[email protected],ext-info-c'
TRACE  (23209) 0.012683: algolist add 100 'ssh-ed25519,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,rsa-sha2-256,ssh-rsa,ssh-dss'
TRACE  (23209) 0.012697: algolist add 97 '[email protected],[email protected],[email protected],aes128-ctr,aes256-ctr'
TRACE  (23209) 0.012711: algolist add 97 '[email protected],[email protected],[email protected],aes128-ctr,aes256-ctr'
TRACE  (23209) 0.012724: algolist add 23 'hmac-sha1,hmac-sha2-256'
TRACE  (23209) 0.012735: algolist add 23 'hmac-sha1,hmac-sha2-256'
TRACE  (23209) 0.012747: algolist add 26 '[email protected],zlib,none'
TRACE  (23209) 0.012758: algolist add 26 '[email protected],zlib,none'
TRACE  (23209) 0.012794: send_msg_kexdh_init()
TRACE  (23209) 0.021541: DATAALLOWED=0
TRACE  (23209) 0.021670: -> KEXINIT
TRACE  (23209) 0.021730: setnonblocking: 8
TRACE  (23209) 0.021745: leave setnonblocking
TRACE  (23209) 0.060835: maybe_empty_reply_queue - no data allowed
TRACE  (23209) 0.060942: handling github.com port 22 socket 8
TRACE  (23209) 0.060970: update_channel_prio
TRACE  (23209) 0.060982: update_channel_prio: not any
TRACE  (23209) 0.060992: Dropbear priority transitioning 10 -> 11
TRACE  (23209) 0.061017: Couldn't set IPV6_TCLASS (Protocol not available)
TRACE  (23209) 0.061040: leave handle_connect_fds - success
TRACE  (23209) 0.061198: empty queue dequeing
TRACE  (23209) 0.265833: enter ident_readln
TRACE  (23209) 0.266418: leave ident_readln: return 24
TRACE  (23209) 0.267674: remoteident: SSH-2.0-babeld-e37038b1
TRACE  (23209) 0.267782: maybe_empty_reply_queue - no data allowed
TRACE  (23209) 0.267857: process_packet: packet type = 20,  len 808
TRACE  (23209) 0.267873: got expected packet 20 during kexinit
TRACE  (23209) 0.267884: <- KEXINIT
TRACE  (23209) 0.267894: enter recv_msg_kexinit
TRACE  (23209) 0.268166: buf_match_algo: curve25519-sha256,[email protected],ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256
TRACE  (23209) 0.268185: kexguess2 0
TRACE  (23209) 0.268195: kex algo curve25519-sha256
TRACE  (23209) 0.268206: buf_match_algo: ssh-ed25519,ecdsa-sha2-nistp256,rsa-sha2-512,rsa-sha2-256,ssh-rsa
TRACE  (23209) 0.268218: signature algo ssh-ed25519
TRACE  (23209) 0.268228: buf_match_algo: [email protected],[email protected],[email protected],aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc
TRACE  (23209) 0.268242: enc c2s is  [email protected]
TRACE  (23209) 0.268253: buf_match_algo: [email protected],[email protected],[email protected],aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc
TRACE  (23209) 0.268267: enc s2c is  [email protected]
TRACE  (23209) 0.268277: buf_match_algo: [email protected],[email protected],hmac-sha2-512,hmac-sha2-256,[email protected],hmac-sha1
TRACE  (23209) 0.268291: hash c2s is  <implicit>
TRACE  (23209) 0.268302: buf_match_algo: [email protected],[email protected],hmac-sha2-512,hmac-sha2-256,[email protected],hmac-sha1
TRACE  (23209) 0.268315: hash s2c is  <implicit>
TRACE  (23209) 0.268325: buf_match_algo: none
TRACE  (23209) 0.268336: hash c2s is  none
TRACE  (23209) 0.268346: buf_match_algo: none
TRACE  (23209) 0.268356: hash s2c is  none
TRACE  (23209) 0.268366: our_first_follows_matches 1
TRACE  (23209) 0.268377: leave recv_msg_kexinit
TRACE  (23209) 0.268387: maybe_empty_reply_queue - no data allowed
TRACE  (23209) 0.268398: leave cli_sessionloop: done with KEXINIT_RCVD
TRACE  (23209) 0.268419: process_packet: packet type = 31,  len 184
TRACE  (23209) 0.268431: got expected packet 31 during kexinit
TRACE  (23209) 0.268441: enter recv_msg_kexdh_reply
TRACE  (23209) 0.268451: keytype is 5
TRACE  (23209) 0.268630: algo doesn't match
TRACE  (23209) 0.268682: checkpubkey: base64_decode success
TRACE  (23209) 0.268700: good matching key
TRACE  (23209) 0.268723: enter buf_get_ed25519_pub_key
TRACE  (23209) 0.268735: leave buf_get_ed25519_pub_key: success
TRACE  (23209) 0.276545: enter buf_put_ed25519_pub_key
TRACE  (23209) 0.276656: leave buf_put_ed25519_pub_key
TRACE  (23209) 0.276743: enter buf_verify
TRACE  (23209) 0.276756: enter buf_ed25519_verify
TRACE  (23209) 0.303832: leave buf_ed25519_verify: success!
TRACE  (23209) 0.303890: leave buf_ed25519_verify: ret 0
TRACE  (23209) 0.303906: enter send_msg_newkeys
TRACE  (23209) 0.303929: enter gen_new_keys
TRACE  (23209) 0.303999: leave gen_new_keys
TRACE  (23209) 0.304011: switch_keys trans
TRACE  (23209) 0.304231: leave send_msg_newkeys
TRACE  (23209) 0.304256: leave recv_msg_kexdh_init
TRACE  (23209) 0.304269: enter send_msg_service_request: servicename='ssh-userauth'
TRACE  (23209) 0.304314: leave send_msg_service_request
TRACE  (23209) 0.304326: enter cli_auth_getmethods
TRACE  (23209) 0.304344: leave cli_auth_getmethods
TRACE  (23209) 0.304354: leave cli_sessionloop: sent userauth methods req
TRACE  (23209) 0.304486: empty queue dequeing
TRACE  (23209) 0.304699: process_packet: packet type = 21,  len 6
TRACE  (23209) 0.304725: got expected packet 21 during kexinit
TRACE  (23209) 0.304736: enter recv_msg_newkeys
TRACE  (23209) 0.304746: switch_keys recv
TRACE  (23209) 0.304969: switch_keys done
TRACE  (23209) 0.305051: kexinitialise()
TRACE  (23209) 0.305067: leave recv_msg_newkeys
TRACE  (23209) 0.305079: leave cli_sessionloop: waiting, req_sent
TRACE  (23209) 0.423125: process_packet: packet type = 7,  len 570
TRACE  (23209) 0.423253: enter recv_msg_ext_info
TRACE  (23209) 0.423264: last 21, donefirst 1, donescond 0
TRACE  (23209) 0.423276: received SSH_MSG_EXT_INFO with 1 items
TRACE  (23209) 0.423288: extension 0 name 'server-sig-algs'
TRACE  (23209) 0.423303: leave recv_msg_ext_info
TRACE  (23209) 0.423315: leave cli_sessionloop: waiting, req_sent
TRACE  (23209) 0.423347: process_packet: packet type = 6,  len 22
TRACE  (23209) 0.423361: leave cli_sessionloop: waiting, req_sent
TRACE  (23209) 0.423390: process_packet: packet type = 51,  len 20
TRACE  (23209) 0.423473: <- MSG_USERAUTH_FAILURE
TRACE  (23209) 0.423492: enter recv_msg_userauth_failure
TRACE  (23209) 0.423502: Methods (len 9): 'publickey'
TRACE  (23209) 0.423513: auth method 'publickey'
TRACE  (23209) 0.423526: leave recv_msg_userauth_failure
TRACE  (23209) 0.423537: enter cli_auth_try
TRACE  (23209) 0.423547: enter cli_auth_pubkey
TRACE  (23209) 0.423566: server-sig-algs allows ssh-ed25519
TRACE  (23209) 0.423576: enter send_msg_userauth_pubkey sigtype 5
TRACE  (23209) 0.423592: enter buf_put_ed25519_pub_key
TRACE  (23209) 0.423602: leave buf_put_ed25519_pub_key
TRACE  (23209) 0.423626: leave send_msg_userauth_pubkey
TRACE  (23209) 0.423637: leave cli_auth_pubkey-success
TRACE  (23209) 0.423646: cli_auth_try lastauthtype 2
TRACE  (23209) 0.423656: leave cli_auth_try success
TRACE  (23209) 0.423665: leave cli_sessionloop: cli_auth_try
TRACE  (23209) 0.423715: empty queue dequeing
TRACE  (23209) 0.553169: process_packet: packet type = 60,  len 76
TRACE  (23209) 0.553316: enter recv_msg_userauth_pk_ok
TRACE  (23209) 0.553332: recv_msg_userauth_pk_ok: type 5
TRACE  (23209) 0.553349: enter buf_put_ed25519_pub_key
TRACE  (23209) 0.553360: leave buf_put_ed25519_pub_key
TRACE  (23209) 0.553371: matching key
TRACE  (23209) 0.554403: enter send_msg_userauth_pubkey sigtype 5
TRACE  (23209) 0.554462: enter buf_put_ed25519_pub_key
TRACE  (23209) 0.554474: leave buf_put_ed25519_pub_key
TRACE  (23209) 0.554486: realsign
TRACE  (23209) 0.554498: buf_put_sign type 5 ssh-ed25519
TRACE  (23209) 0.554509: enter buf_put_ed25519_sign
TRACE  (23209) 0.568104: leave buf_put_ed25519_sign
TRACE  (23209) 0.568156: leave send_msg_userauth_pubkey
TRACE  (23209) 0.568167: leave recv_msg_userauth_pk_ok
TRACE  (23209) 0.568178: leave cli_sessionloop: waiting, req_sent
TRACE  (23209) 0.568294: empty queue dequeing
TRACE  (23209) 0.690657: process_packet: packet type = 52,  len 6
TRACE  (23209) 0.690794: received msg_userauth_success
TRACE  (23209) 0.690815: enter cli_send_chansess_request
TRACE  (23209) 0.690826: enter send_msg_channel_open_init()
TRACE  (23209) 0.690837: enter newchannel
TRACE  (23209) 0.690849: leave newchannel
TRACE  (23209) 0.690859: setnonblocking: 0
TRACE  (23209) 0.690871: leave setnonblocking
TRACE  (23209) 0.690882: leave send_msg_channel_open_init()
TRACE  (23209) 0.690907: leave cli_send_chansess_request
TRACE  (23209) 0.691422: enter setup_localtcp
TRACE  (23209) 0.691439: leave setup_localtcp
TRACE  (23209) 0.691449: enter setup_remotetcp
TRACE  (23209) 0.691458: leave setup_remotetcp
TRACE  (23209) 0.691468: leave cli_sessionloop: running
TRACE  (23209) 0.691567: empty queue dequeing
TRACE  (23209) 0.692396: process_packet: packet type = 80,  len 478
TRACE  (23209) 0.692502: recv_msg_global_request_cli
TRACE  (23209) 0.692590: empty queue dequeing
TRACE  (23209) 0.810535: process_packet: packet type = 91,  len 22
TRACE  (23209) 0.810665: enter recv_msg_channel_open_confirmation
TRACE  (23209) 0.810678: new chan remote 43 local 0
TRACE  (23209) 0.810690: setnonblocking: 1
TRACE  (23209) 0.810702: leave setnonblocking
TRACE  (23209) 0.810712: setnonblocking: 0
TRACE  (23209) 0.810721: leave setnonblocking
TRACE  (23209) 0.810731: setnonblocking: 2
TRACE  (23209) 0.810741: leave setnonblocking
TRACE  (23209) 0.810751: enter send_chansess_pty_req
TRACE  (23209) 0.810783: enter put_termcodes
TRACE  (23209) 0.810803: leave put_termcodes
TRACE  (23209) 0.811416: leave send_chansess_pty_req
TRACE  (23209) 0.811434: enter send_chansess_shell_req
TRACE  (23209) 0.811452: leave send_chansess_shell_req
TRACE  (23209) 0.811463: enter cli_pty_setup
TRACE  (23209) 0.811489: leave cli_tty_setup
                                            TRACE  (23209) 0.811499: update_channel_prio
                                                                                        TRACE  (23209) 0.811508: update_channel_prio: lowdelay 0
                                                                                                                                                TRACE  (23209) 0.811518: leave recv_msg_channel_open_confirmation
           TRACE  (23209) 0.813176: empty queue dequeing
                                                        TRACE  (23209) 0.813338: process_packet: packet type = 96,  len 10
                                                                                                                          TRACE  (23209) 0.813353: enter recv_msg_channel_eof
                                                                                                                                                                             TRACE  (23209) 0.813363: CLOSE some fd 1
               TRACE  (23209) 0.813375: leave recv_msg_channel_eof
                                                                  TRACE  (23209) 0.813499: Exited, cleaning up: Remote closed the connection
                                                                                                                                            TRACE  (23209) 0.813517: enter session_cleanup
                                                                                                                                                                                          TRACE  (23209) 0.813526: enter chancleanup
                              TRACE  (23209) 0.813535: channel 0 closing
                                                                        TRACE  (23209) 0.813544: enter remove_channel
                                                                                                                     TRACE  (23209) 0.813553: channel index is 0
                                                                                                                                                                TRACE  (23209) 0.813562: CLOSE writefd -1
   TRACE  (23209) 0.813571: CLOSE readfd 0
                                          TRACE  (23209) 0.813580: CLOSE errfd 2

This is how it appears on screen. The console is unusable after this, but that's anonther issue.
It's not a key issue. The converted key works fine with openssh.

from dropbear.

mkj avatar mkj commented on August 23, 2024

I don't see why it wouldn't work, I've put in a GitHub ticket #1407998 (I can't CC you)

from dropbear.

M95D avatar M95D commented on August 23, 2024

If it helps, dropbear configure command was this:

./configure --prefix=/usr --build=x86_64-pc-linux-gnu --host=x86_64-pc-linux-gnu --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc --localstatedir=/var/lib --docdir=/usr/share/doc/dropbear-2020.81-r3 --htmldir=/usr/share/doc/dropbear-2020.81-r3/html --libdir=/usr/lib64 --disable-harden --disable-bundled-libtom --enable-zlib --disable-pam --enable-openpty --enable-shadow --disable-static --enable-syslog

and config file was this:

#ifndef DROPBEAR_DEFAULT_OPTIONS_H_
#define DROPBEAR_DEFAULT_OPTIONS_H_
#define DROPBEAR_DEFPORT "22"
#define DROPBEAR_DEFADDRESS ""
#define DSS_PRIV_FILENAME "/etc/dropbear/dropbear_dss_host_key"
#define RSA_PRIV_FILENAME "/etc/dropbear/dropbear_rsa_host_key"
#define ECDSA_PRIV_FILENAME "/etc/dropbear/dropbear_ecdsa_host_key"
#define ED25519_PRIV_FILENAME "/etc/dropbear/dropbear_ed25519_host_key"
#define NON_INETD_MODE 1
#define INETD_MODE 1
#define DEBUG_TRACE 1
#define DROPBEAR_SMALL_CODE 0
#define DROPBEAR_X11FWD 1
#define DROPBEAR_CLI_LOCALTCPFWD 1
#define DROPBEAR_CLI_REMOTETCPFWD 1
#define DROPBEAR_SVR_LOCALTCPFWD 1
#define DROPBEAR_SVR_REMOTETCPFWD 1
#define DROPBEAR_SVR_AGENTFWD 0
#define DROPBEAR_CLI_AGENTFWD 0
#define DROPBEAR_CLI_PROXYCMD 1
#define DROPBEAR_CLI_NETCAT 1
#define DROPBEAR_USER_ALGO_LIST 1
#define DROPBEAR_AES128 1
#define DROPBEAR_AES256 1
#define DROPBEAR_3DES 0
#define DROPBEAR_TWOFISH256 0
#define DROPBEAR_TWOFISH128 0
#define DROPBEAR_CHACHA20POLY1305 1
#define DROPBEAR_ENABLE_CTR_MODE 1
#define DROPBEAR_ENABLE_CBC_MODE 0
#define DROPBEAR_ENABLE_GCM_MODE 1
#define DROPBEAR_SHA1_HMAC 1
#define DROPBEAR_SHA2_256_HMAC 1
#define DROPBEAR_SHA1_96_HMAC 0
#define DROPBEAR_RSA 1
#define DROPBEAR_DSS 1
#define DROPBEAR_ECDSA 1
#define DROPBEAR_ED25519 1
#define DROPBEAR_DEFAULT_RSA_SIZE 2048
#define DROPBEAR_DELAY_HOSTKEY 1
#define DROPBEAR_DH_GROUP14_SHA1 1
#define DROPBEAR_DH_GROUP14_SHA256 1
#define DROPBEAR_DH_GROUP16 0
#define DROPBEAR_CURVE25519 1
#define DROPBEAR_ECDH 1
#define DROPBEAR_DH_GROUP1 1
#define DROPBEAR_DH_GROUP1_CLIENTONLY 1
#define DROPBEAR_ZLIB_WINDOW_BITS 15 
#define DO_HOST_LOOKUP 0
#define DO_MOTD 1
#define MOTD_FILENAME "/etc/motd"
#define DROPBEAR_SVR_PASSWORD_AUTH 1
#define DROPBEAR_SVR_PAM_AUTH 0
#define DROPBEAR_SVR_PUBKEY_AUTH 1
#define DROPBEAR_SVR_PUBKEY_OPTIONS 1
#define DROPBEAR_SVR_MULTIUSER 1
#define DROPBEAR_CLI_PASSWORD_AUTH 1
#define DROPBEAR_CLI_PUBKEY_AUTH 1
#define DROPBEAR_DEFAULT_CLI_AUTHKEY ".ssh/id_dropbear"
#define DROPBEAR_USE_PASSWORD_ENV 1
#define DROPBEAR_CLI_ASKPASS_HELPER 0
#define DROPBEAR_CLI_IMMEDIATE_AUTH 0
#define DROPBEAR_USE_PRNGD 0
#define DROPBEAR_PRNGD_SOCKET "/var/run/dropbear-rng"
#define MAX_UNAUTH_PER_IP 2
#define MAX_UNAUTH_CLIENTS 5
#define MAX_AUTH_TRIES 3
#define DROPBEAR_PIDFILE "/var/run/dropbear.pid"
#define XAUTH_COMMAND "/usr/bin/xauth -q"
#define DROPBEAR_SFTPSERVER 1
#define SFTPSERVER_PATH "/usr/lib/misc/sftp-server"
#define DROPBEAR_PATH_SSH_PROGRAM "/usr/bin/dbclient"
#define LOG_COMMANDS 0
#define DEFAULT_RECV_WINDOW 24576
#define RECV_MAX_PAYLOAD_LEN 32768
#define TRANS_MAX_PAYLOAD_LEN 16384
#define DEFAULT_KEEPALIVE 0
#define DEFAULT_KEEPALIVE_LIMIT 3
#define DEFAULT_IDLE_TIMEOUT 0
#define DEFAULT_PATH "/usr/bin:/bin"
#endif /* DROPBEAR_DEFAULT_OPTIONS_H_ */

from dropbear.

folliehiyuki avatar folliehiyuki commented on August 23, 2024

Hi. Sorry for adding noise! Is there any news from the ticket you sent?

I'm on Alpine with the dbclient shipped by the distro, and I think I've got the same problem with Github. My machine has both IPv6 and IPv4 though.

I tried ssh to other Git services (Gitea, Gitlab), they all work fine with the same key.

Here is the configuration from the Alpine build:

./configure --prefix=/usr --sysconfdir=/etc --mandir=/usr/share/man --infodir=/usr/share/info --localstatedir=/var --disable-wtmp --disable-lastlog

I will try to build a debug binary and get a trace in the next few days.

from dropbear.

mkj avatar mkj commented on August 23, 2024

I'll close this, if anyone has further information from Github support please reopen/reply.

from dropbear.

Related Issues (20)

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.