1 module unbind;
2 import std.stdio;
3 import std.string;
4 import std.getopt;
5 import std.exception;
6 import std.conv:to;
7 
8 import kaleidic.api.rabbitmq;
9 import kaleidic.api.rabbitmq.utils;
10 
11 struct Options
12 {
13 	string hostname;
14 	ushort port;
15 	string exchange;
16 	string bindingKey;
17 	string queue;
18 	string caCert;
19 	bool verifyPeer;
20 	bool verifyHostname;
21 	string keyFile;
22 	string certFile;
23 }
24 
25 int main(string[] args)
26 {
27 	Options options;
28 	int status;
29 	amqp_socket_t *socket;
30 	amqp_connection_state_t conn;
31 
32 	auto helpInformation = getopt(	args,
33 					std.getopt.config.required,
34 					"hostname",	&options.hostname,
35 					std.getopt.config.required,
36 					"port",		&options.port,
37 					std.getopt.config.required,
38 					"exchange",	&options.exchange,
39 					std.getopt.config.required,
40 					"binding-key",	&options.bindingKey,
41 					std.getopt.config.required,
42 					"queue",	&options.queue,
43 					"cacert",	&options.caCert,
44 					"verify-peer",	&options.verifyPeer,
45 					"verify-hostname", &options.verifyHostname,
46 					"key-file",	&options.keyFile,
47 					"cert-file",	&options.certFile,
48 	);
49 
50 	if (helpInformation.helpWanted)
51 	{
52 		defaultGetoptPrinter("unbind",helpInformation.options);
53 		return -1;
54 	}
55 
56 
57 	conn = amqp_new_connection();
58 	socket = amqp_ssl_socket_new(conn);
59 	enforce(socket !is null, "creating SSL/TLS socket");
60 
61 	amqp_ssl_socket_set_verify_peer(socket, options.verifyPeer ? 1 : 0);
62 	amqp_ssl_socket_set_verify_hostname(socket, options.verifyHostname ? 1 : 0);
63 
64 	if(options.caCert.length > 0)
65 	{
66 		enforce(amqp_ssl_socket_set_cacert(socket, options.caCert.toStringz) == 0, "setting CA cert");
67 	}
68 	
69 	if (options.keyFile.length > 0)
70 	{
71 		enforce(options.certFile.length > 0, "must specify a cert-file if you specify a key-file");
72 		enforce(amqp_ssl_socket_set_key(socket, options.certFile.toStringz, options.keyFile.toStringz) == 0, "setting client cert");
73 	}
74 	else
75 	{
76 		enforce(options.certFile.length == 0, "must specify a key-file if you specify a cert-file");
77 	}
78 
79 	enforce(amqp_socket_open(socket, options.hostname.toStringz, options.port) ==0, "opening SSL/TLS connection");
80 
81 	die_on_amqp_error(amqp_login(conn, "/".ptr, 0, 131072, 0, SaslMethod.plain, "guest".ptr, "guest".ptr), "Logging in");
82 	amqp_channel_open(conn, 1);
83 	die_on_amqp_error(amqp_get_rpc_reply(conn), "Opening channel");
84 
85 	amqp_queue_unbind(conn, 1,
86 		    amqp_string(options.queue),
87 		    amqp_string(options.exchange),
88 		    amqp_string(options.bindingKey),
89 		    cast(amqp_table_t) amqp_empty_table);
90 	die_on_amqp_error(amqp_get_rpc_reply(conn), "Unbinding");
91 
92 	die_on_amqp_error(amqp_channel_close(conn, 1, ReplySuccess), "Closing channel");
93 	die_on_amqp_error(amqp_connection_close(conn, ReplySuccess), "Closing connection");
94 	die_on_error(amqp_destroy_connection(conn), "Ending connection");
95 	return 0;
96 }