shill: vpn: Setup OpenVPN management channel options and open/close channel.

BUG=chromium-os:26994
TEST=unit tests

Change-Id: I9da18c7aa2f93671dc2134f531d72d626b34443e
Reviewed-on: https://gerrit.chromium.org/gerrit/19290
Tested-by: Darin Petkov <petkov@chromium.org>
Reviewed-by: Paul Stewart <pstew@chromium.org>
Commit-Ready: Darin Petkov <petkov@chromium.org>
diff --git a/openvpn_management_server.cc b/openvpn_management_server.cc
index cf06d10..06c9576 100644
--- a/openvpn_management_server.cc
+++ b/openvpn_management_server.cc
@@ -4,10 +4,12 @@
 
 #include "shill/openvpn_management_server.h"
 
+#include <arpa/inet.h>
 #include <netinet/in.h>
 
 #include <base/bind.h>
 #include <base/logging.h>
+#include <base/string_number_conversions.h>
 #include <base/string_split.h>
 #include <base/string_util.h>
 #include <base/stringprintf.h>
@@ -19,6 +21,7 @@
 #include "shill/sockets.h"
 
 using base::Bind;
+using base::IntToString;
 using base::SplitString;
 using base::StringPrintf;
 using std::string;
@@ -41,11 +44,12 @@
       connected_socket_(-1) {}
 
 OpenVPNManagementServer::~OpenVPNManagementServer() {
-  Stop();
+  OpenVPNManagementServer::Stop();
 }
 
 bool OpenVPNManagementServer::Start(EventDispatcher *dispatcher,
-                                    Sockets *sockets) {
+                                    Sockets *sockets,
+                                    vector<string> *options) {
   VLOG(2) << __func__;
   if (sockets_) {
     return true;
@@ -79,6 +83,20 @@
       dispatcher->CreateReadyHandler(
           socket, IOHandler::kModeInput, ready_callback_));
   dispatcher_ = dispatcher;
+
+  // Append openvpn management API options.
+  options->push_back("--management");
+  options->push_back(inet_ntoa(addr.sin_addr));
+  options->push_back(IntToString(ntohs(addr.sin_port)));
+  options->push_back("--management-client");
+  options->push_back("--management-query-passwords");
+  driver_->AppendFlag(
+      flimflam::kOpenVPNAuthUserPassProperty, "--auth-user-pass", options);
+  if (driver_->AppendValueOption(flimflam::kOpenVPNStaticChallengeProperty,
+                                 "--static-challenge",
+                                 options)) {
+    options->push_back("1");  // Force echo.
+  }
   return true;
 }