49 std::ostringstream
os;
50 os <<
"WinCommandAgent: transmitting bypass route to " << endpoint.
to_string() << std::endl;
53 Json::Value jreq(Json::objectValue);
56 jreq[
"ipv6"] = endpoint.
is_ipv6();
57 const std::string jtxt = jreq.toStyledString();
70 return ts->http_status_success();
74 struct Config :
public RC<thread_unsafe_refcount>
98 const std::string &client_exe,
103 hc->connect_timeout = 30;
104 hc->general_timeout = 60;
107 ts->host.host =
host;
108 ts->host.port =
"np";
109 ts->http_config = hc;
110 ts->debug_level = debug_level;
114 AsioPolySock::NamedPipe *np =
dynamic_cast<AsioPolySock::NamedPipe *
>(&sock);
118 const std::string server_exe = wstring::to_utf8(npinfo.
exe_path);
130 t->req.method =
"POST";
131 t->req.uri =
"/" + method;
132 t->ci.type =
"application/json";
134 ts->transactions.push_back(std::move(t));
141 Json::Value jreq(Json::objectValue);
144 jreq[
"allow_local_dns_resolvers"] =
config->allow_local_dns_resolvers;
145 const std::string jtxt = jreq.toStyledString();
152 [
this](HANDLE handle)
154 if (!service_process.is_open())
155 service_process.assign(handle); });
170 const std::string tap_handle_hex =
json::get_string(jres,
"tap_handle_hex");
171 os <<
"TAP handle: " << tap_handle_hex << std::endl;
172 const HANDLE h = BufHex::parse<HANDLE>(tap_handle_hex,
"TAP handle");
194 const std::wstring &openvpn_app_path,
199 os <<
"SetupClient: transmitting tun setup list to " <<
config->npserv << std::endl;
202 Json::Value jreq(Json::objectValue);
205 ring_buffer->serialize(jreq);
215 jreq[
"adapter_index"] = Json::Int(
tap_.
index);
219 jreq[
"allow_local_dns_resolvers"] =
config->allow_local_dns_resolvers;
220 jreq[
"tun_type"] =
config->tun_type;
221 jreq[
"tun"] = pull.to_json();
222 const std::string jtxt = jreq.toStyledString();
229 [
this](HANDLE handle)
231 if (!service_process.is_open())
232 service_process.assign(handle); });
247 const std::string tap_handle_hex =
json::get_string(jres,
"tap_handle_hex");
248 os <<
"TAP handle: " << tap_handle_hex << std::endl;
249 const HANDLE tap = BufHex::parse<HANDLE>(tap_handle_hex,
"TAP handle");
255 std::ostream &
os)
override
257 throw ovpnagent(
"l2_finish not implemented");
262 throw ovpnagent(
"l2_ready not implemented");
283 os <<
"SetupClient: signaling tun destroy event" << std::endl;
292 throw ovpnagent(
"unexpected transaction set size");
302 os <<
"connection timeout";
321 throw ovpnagent(
"unexpected content-type");
325 Json::CharReaderBuilder builder;
326 std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
329 if (!reader->parse(content.c_str(), content.c_str() + content.size(), &jres, &err))
352 return new TunWin::Setup(io_context, tun_type, allow_local_dns_resolvers);
static std::string named_pipe_path()
static bool valid_pipe(const std::string &client_exe, const std::string &server_exe)
std::string to_string() const
void reset() noexcept
Points this RCPtr<T> to nullptr safely.
Reference count base class for objects tracked by RCPtr. Disallows copying and assignment.
static void new_request_synchronous(const TransactionSet::Ptr ts, Stop *stop=nullptr, RandomAPI *prng=nullptr, const bool sps=false)
openvpn_io::windows::object_handle service_process
TunWin::Util::TapNameGuidPair tap_
void destroy(std::ostream &os) override
void l2_finish(const TunBuilderCapture &pull, Stop *stop, std::ostream &os) override
static WS::ClientSet::TransactionSet::Ptr new_transaction_set(const std::string &host, int debug_level, const std::string &client_exe, T cb)
TunWin::Util::TapNameGuidPair get_adapter_state() override
SetupClient(openvpn_io::io_context &io_context, const Config::Ptr &config_arg)
Win::DestroyEvent destroy_event
HANDLE establish(const TunBuilderCapture &pull, const std::wstring &openvpn_app_path, Stop *stop, std::ostream &os, TunWin::RingBuffer::Ptr ring_buffer) override
void set_adapter_state(const TunWin::Util::TapNameGuidPair &tap) override
static void make_transaction(const std::string &method, const std::string &content, WS::ClientSet::TransactionSet::Ptr ts)
bool l2_ready(const TunBuilderCapture &pull) override
void set_service_fail_handler(std::function< void()> &&handler) override
Json::Value get_json_result(std::ostream &os, WS::ClientSet::TransactionSet &ts)
HANDLE get_handle(std::ostream &os) override
TunWin::SetupBase::Ptr new_setup_obj(openvpn_io::io_context &io_context, TunWin::Type tun_type, bool allow_local_dns_resolvers) override
RCPtr< WinCommandAgent > Ptr
static bool add_bypass_route(IP::Addr endpoint)
static TunWin::SetupFactory::Ptr new_agent(const OptionList &opt)
WinCommandAgent(const OptionList &opt_parent)
OPENVPN_EXCEPTION(ovpnagent)
std::string duplicate_local()
static void handler(int signum)
#define OPENVPN_THROW(exc, stuff)
#define OPENVPN_LOG(args)
int ovpnagent(const char *sock_fn, const char *log_fn, const bool log_append, const char *pid_fn, const char *user, const char *group)
std::string module_name_utf8()
int get_int(const Json::Value &root, const NAME &name, const TITLE &title)
std::string get_string(const Json::Value &root, const NAME &name, const TITLE &title)
Frame::Ptr frame_init_simple(const size_t payload)
BufferPtr buf_from_string(const std::string &str)
std::string to_string() const
bool request_status_success() const
std::string format_status(const TransactionSet &ts) const
bool comm_status_success() const
bool comm_status_timeout() const
bool allow_local_dns_resolvers