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 }