| nbd-proxy |
| ========= |
| |
| Prototype javascript+websocket NBD server; this code demonstrates a javascript |
| NBD implementation connected to the kernel nbd device over a websocket. |
| |
| There are two components here: |
| |
| nbd-proxy: a little binary to initialise a nbd client, connected to a |
| unix domain socket, then proxy data between that socket and |
| stdio. This can be used with a websocket proxy to expose |
| that stdio as a websocket. |
| |
| nbd.js: a javascript implementation of a NBD server. |
| |
| Running |
| ------- |
| |
| You'll need a websocket proxy This connects the nbd-proxy |
| component to a websocket endpoint. |
| |
| For experimentation, I use the `websocketd` infrastrcture to expose the |
| websocket endpoint, plus serve the static HTML+js client: |
| |
| git clone https://github.com/joewalnes/websocketd |
| (cd websocketd && make) |
| |
| sudo websocketd/websocketd --port=8000 --staticdir=web --binary ./nbd-proxy <config> |
| |
| - where <config> is a name of a configuration in the config.json file. |
| |
| Note that this type of invocation is very insecure, and intended just for |
| experimentation. See the Security section below. |
| |
| For real deployments, you want your websocket-enabled service to run |
| nbd-proxy, and connect its stdio to a websocket, running in binary mode. Your |
| web interface will interact with this using an instance of the NBDServer object |
| (defined in web/js/nbd.js): |
| |
| var server = NBDServer(endpoint, file); |
| server.start(); |
| |
| - where endpoint is the websocket URL (ws://...) and file is a File object. See |
| web/index.html for an example. |
| |
| Security |
| -------- |
| |
| This code allows potentially-untrusted clients to export arbitrary block |
| device data to your kernel. Therefore, you should ensure that only trusted |
| clients can connect as NBD servers. |
| |
| There is no authentication or authorisation implemented in the nbd proxy. Your |
| websocket proxy should implement proper authentication before nbd-proxy is |
| connected to the websocket endpoint. |
| |
| State hooks |
| ----------- |
| |
| The nbd-proxy has a facility to run hooks on state change. When a |
| nbd session is established or shut down, the proxy will run any executables |
| found under the hook path (by default, /etc/nbd-proxy/state.d/). |
| |
| These hooks are called with two arguments: the action ("start" or "stop"), |
| and the name of the configuration (as specified in the config.json file). |