Experimenting with listing containers
This commit is contained in:
commit
ac8d4f546c
119
main.vala
Normal file
119
main.vala
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
namespace Docker {
|
||||||
|
public class Container: Object {}
|
||||||
|
|
||||||
|
public class Connection: Object {
|
||||||
|
public string socket {
|
||||||
|
get;
|
||||||
|
set;
|
||||||
|
default = "/var/run/docker.sock";
|
||||||
|
}
|
||||||
|
|
||||||
|
private GLib.UnixSocketAddress address;
|
||||||
|
private GLib.SocketClient client;
|
||||||
|
private GLib.SocketConnection conn;
|
||||||
|
|
||||||
|
private int status = 0;
|
||||||
|
private string? status_message = null;
|
||||||
|
private int content_length = 0;
|
||||||
|
private bool headers_received = false;
|
||||||
|
private string? contents = null;
|
||||||
|
|
||||||
|
public Connection(string socket = "/var/run/docker.sock") {
|
||||||
|
Object(socket: socket);
|
||||||
|
|
||||||
|
address = new GLib.UnixSocketAddress(socket);
|
||||||
|
client = new SocketClient();
|
||||||
|
conn = client.connect(address);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async List<Container>
|
||||||
|
list_containers() {
|
||||||
|
var message = "GET /containers/json HTTP/1.1\r\nHost: v1.27\r\n\r\n";
|
||||||
|
yield conn.output_stream.write_async(message.data,
|
||||||
|
Priority.DEFAULT);
|
||||||
|
|
||||||
|
var input = new DataInputStream(conn.input_stream);
|
||||||
|
input.set_newline_type(GLib.DataStreamNewlineType.CR_LF);
|
||||||
|
|
||||||
|
while (!headers_received) {
|
||||||
|
message = input.read_line(null).strip();
|
||||||
|
|
||||||
|
if ((status == 0) && (message.has_prefix("HTTP/1.1 "))) {
|
||||||
|
status = message.slice(9, 12).to_int();
|
||||||
|
status_message = message.slice(13, message.length);
|
||||||
|
// Reset some variables
|
||||||
|
headers_received = false;
|
||||||
|
content_length = 0;
|
||||||
|
contents = null;
|
||||||
|
|
||||||
|
// TODO: Handle error codes
|
||||||
|
} else if (message.down().has_prefix("content-length: ")) {
|
||||||
|
content_length = message.slice(16, message.length).to_int();
|
||||||
|
} else if (message.length == 0) {
|
||||||
|
headers_received = true;
|
||||||
|
contents = "";
|
||||||
|
} else {
|
||||||
|
// TODO: Handle other headers
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stdout.printf("Got headers\n");
|
||||||
|
yield;
|
||||||
|
|
||||||
|
input.set_newline_type(GLib.DataStreamNewlineType.LF);
|
||||||
|
|
||||||
|
while (content_length > 0) {
|
||||||
|
size_t read_len;
|
||||||
|
var line = input.read_line_utf8(out read_len);
|
||||||
|
// read_len doesn’t contain the newline at the end of the line
|
||||||
|
read_len++;
|
||||||
|
contents += line;
|
||||||
|
|
||||||
|
if (read_len == content_length) {
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
content_length -= (int)read_len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stdout.printf("Got contents\n");
|
||||||
|
yield;
|
||||||
|
|
||||||
|
var parser = new Json.Parser();
|
||||||
|
parser.load_from_data(contents, -1);
|
||||||
|
stdout.printf("Parsing done\n");
|
||||||
|
yield;
|
||||||
|
|
||||||
|
var root_array = parser.get_root().get_array();
|
||||||
|
var result = new List<Container>();
|
||||||
|
|
||||||
|
foreach (var data in root_array.get_elements()) {
|
||||||
|
var container = new Container();
|
||||||
|
result.prepend(container);
|
||||||
|
|
||||||
|
stdout.printf("A container!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
stdout.printf("Yielding…\n");
|
||||||
|
yield;
|
||||||
|
stdout.printf("Returning…\n");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int
|
||||||
|
main(string[] args) {
|
||||||
|
var loop = new MainLoop();
|
||||||
|
var docker = new Docker.Connection();
|
||||||
|
|
||||||
|
docker.list_containers.begin((obj, res) => {
|
||||||
|
stdout.printf("Done!\n");
|
||||||
|
var containers = docker.list_containers.end(res);
|
||||||
|
|
||||||
|
stdout.printf("Done!\n");
|
||||||
|
});
|
||||||
|
|
||||||
|
loop.run();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user