From: Tobias Brunner Date: Wed, 24 Apr 2019 14:05:12 +0000 (+0200) Subject: vici: Refactor how commands are called in the Ruby bindings X-Git-Tag: 5.8.0rc1~22^2~4 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fstrongswan.git;a=commitdiff_plain;h=3b3944455665d8ad3bd348a1dcb43c8ce4be3566 vici: Refactor how commands are called in the Ruby bindings Also expose a method to call arbitrary commands, which allows calling not yet wrapped commands. Exceptions are raised for all commands if the response includes a negative "success" key (similar to how it's done in the Python bindings). --- diff --git a/src/libcharon/plugins/vici/ruby/lib/vici.rb b/src/libcharon/plugins/vici/ruby/lib/vici.rb index 61de99a1f7..8dd4366129 100644 --- a/src/libcharon/plugins/vici/ruby/lib/vici.rb +++ b/src/libcharon/plugins/vici/ruby/lib/vici.rb @@ -3,6 +3,9 @@ # strongSwan VICI protocol. The Connection class provides a high-level # interface to issue requests or listen for events. # +# Copyright (C) 2019 Tobias Brunner +# HSR Hochschule fuer Technik Rapperswil +# # Copyright (C) 2014 Martin Willi # Copyright (C) 2014 revosec AG # @@ -25,7 +28,6 @@ # THE SOFTWARE. module Vici - ## # Vici specific exception all others inherit from class Error < StandardError @@ -433,117 +435,115 @@ module Vici ## # Load a connection into the daemon. def load_conn(conn) - check_success(@transp.request("load-conn", Message.new(conn))) + call("load-conn", Message.new(conn)) end ## # Unload a connection from the daemon. def unload_conn(conn) - check_success(@transp.request("unload-conn", Message.new(conn))) + call("unload-conn", Message.new(conn)) end ## # Get the names of connections managed by vici. def get_conns() - @transp.request("get-conns").root + call("get-conns") end ## # Flush credential cache. def flush_certs(match = nil) - check_success(@transp.request("flush-certs", Message.new(match))) + call("flush-certs", Message.new(match)) end ## # Clear all loaded credentials. def clear_creds() - check_success(@transp.request("clear-creds")) + call("clear-creds") end ## # Load a certificate into the daemon. def load_cert(cert) - check_success(@transp.request("load-cert", Message.new(cert))) + call("load-cert", Message.new(cert)) end ## # Load a private key into the daemon. def load_key(key) - check_success(@transp.request("load-key", Message.new(key))) + call("load-key", Message.new(key)) end ## # Load a shared key into the daemon. def load_shared(shared) - check_success(@transp.request("load-shared", Message.new(shared))) + call("load-shared", Message.new(shared)) end ## # Load a virtual IP / attribute pool def load_pool(pool) - check_success(@transp.request("load-pool", Message.new(pool))) + call("load-pool", Message.new(pool)) end ## # Unload a virtual IP / attribute pool def unload_pool(pool) - check_success(@transp.request("unload-pool", Message.new(pool))) + call("unload-pool", Message.new(pool)) end ## # Get the currently loaded pools. def get_pools(options) - @transp.request("get-pools", Message.new(options)).root + call("get-pools", Message.new(options)) end ## # Initiate a connection. The provided closure is invoked for each log line. def initiate(options, &block) - check_success(call_with_event("initiate", Message.new(options), - "control-log", &block)) + call_with_event("initiate", Message.new(options), "control-log", &block) end ## # Terminate a connection. The provided closure is invoked for each log line. def terminate(options, &block) - check_success(call_with_event("terminate", Message.new(options), - "control-log", &block)) + call_with_event("terminate", Message.new(options), "control-log", &block) end ## # Redirect an IKE_SA. def redirect(options) - check_success(@transp.request("redirect", Message.new(options))) + call("redirect", Message.new(options)) end ## # Install a shunt/route policy. def install(policy) - check_success(@transp.request("install", Message.new(policy))) + call("install", Message.new(policy)) end ## # Uninstall a shunt/route policy. def uninstall(policy) - check_success(@transp.request("uninstall", Message.new(policy))) + call("uninstall", Message.new(policy)) end ## # Reload strongswan.conf settings. def reload_settings - check_success(@transp.request("reload-settings", nil)) + call("reload-settings") end ## # Get daemon statistics and information. def stats - @transp.request("stats", nil).root + call("stats") end ## # Get daemon version information def version - @transp.request("version", nil).root + call("version") end ## @@ -573,6 +573,13 @@ module Vici end end + ## + # Issue a command request. Checks if the reply of a command indicates + # "success", otherwise raises a CommandExecError exception. + def call(command, request = nil) + check_success(@transp.request(command, request)) + end + ## # Issue a command request, but register for a specific event while the # command is active. VICI uses this mechanism to stream potentially large @@ -590,7 +597,7 @@ module Vici ensure @transp.unregister(event, method(:call_event)) end - reply + check_success(reply) end ## @@ -598,7 +605,7 @@ module Vici # CommandExecError exception def check_success(reply) root = reply.root - if root["success"] != "yes" + if root.key?("success") && root["success"] != "yes" raise CommandExecError, root["errmsg"] end root