Merge branch 'development' into LTS_development
# Conflicts: # src/controller/controller_api.cpp
This commit is contained in:
commit
a15b3c20f1
5 changed files with 52 additions and 28 deletions
|
@ -40,6 +40,9 @@ static Socket::Server *serv_sock_pointer = 0;
|
|||
uint32_t Util::Config::printDebugLevel = DEBUG; //
|
||||
std::string Util::Config::streamName;
|
||||
|
||||
std::string Util::listenInterface;
|
||||
uint32_t Util::listenPort = 0;
|
||||
|
||||
Util::Config::Config(){
|
||||
// global options here
|
||||
vals["debug"]["long"] = "debug";
|
||||
|
@ -370,6 +373,7 @@ int Util::Config::serveThreadedSocket(int (*callback)(Socket::Connection &)){
|
|||
DEVEL_MSG("Failure to open socket");
|
||||
return 1;
|
||||
}
|
||||
Socket::getSocketName(server_socket.getSocket(), Util::listenInterface, Util::listenPort);
|
||||
serv_sock_pointer = &server_socket;
|
||||
activate();
|
||||
if (server_socket.getSocket()){
|
||||
|
@ -397,6 +401,7 @@ int Util::Config::serveForkedSocket(int (*callback)(Socket::Connection &S)){
|
|||
DEVEL_MSG("Failure to open socket");
|
||||
return 1;
|
||||
}
|
||||
Socket::getSocketName(server_socket.getSocket(), Util::listenInterface, Util::listenPort);
|
||||
serv_sock_pointer = &server_socket;
|
||||
activate();
|
||||
if (server_socket.getSocket()){
|
||||
|
|
|
@ -49,6 +49,11 @@ namespace Util{
|
|||
void addConnectorOptions(int port, JSON::Value &capabilities);
|
||||
};
|
||||
|
||||
/// The interface address the current serveSocket function is listening on
|
||||
extern std::string listenInterface;
|
||||
/// The port the current serveSocket function is listening on
|
||||
extern uint32_t listenPort;
|
||||
|
||||
/// Gets directory the current executable is stored in.
|
||||
std::string getMyPath();
|
||||
|
||||
|
|
|
@ -270,6 +270,31 @@ std::string Socket::resolveHostToBestExternalAddrGuess(const std::string &host,
|
|||
return newaddr;
|
||||
}
|
||||
|
||||
/// Gets bound host and port for a socket and returns them by reference.
|
||||
/// Returns true on success and false on failure.
|
||||
bool Socket::getSocketName(int fd, std::string & host, uint32_t & port){
|
||||
struct sockaddr_in6 tmpaddr;
|
||||
socklen_t len = sizeof(tmpaddr);
|
||||
if (getsockname(fd, (sockaddr *)&tmpaddr, &len)){
|
||||
return false;
|
||||
}
|
||||
static char addrconv[INET6_ADDRSTRLEN];
|
||||
if (tmpaddr.sin6_family == AF_INET6){
|
||||
host = inet_ntop(AF_INET6, &(tmpaddr.sin6_addr), addrconv, INET6_ADDRSTRLEN);
|
||||
if (host.substr(0, 7) == "::ffff:"){host = host.substr(7);}
|
||||
port = ntohs(tmpaddr.sin6_port);
|
||||
HIGH_MSG("Local IPv6 addr [%s:%" PRIu32 "]", host.c_str(), port);
|
||||
return true;
|
||||
}
|
||||
if (tmpaddr.sin6_family == AF_INET){
|
||||
host = inet_ntop(AF_INET, &(((sockaddr_in *)&tmpaddr)->sin_addr), addrconv, INET6_ADDRSTRLEN);
|
||||
port = ntohs(((sockaddr_in *)&tmpaddr)->sin_port);
|
||||
HIGH_MSG("Local IPv4 addr [%s:%" PRIu32 "]", host.c_str(), port);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
std::string uint2string(unsigned int i){
|
||||
std::stringstream st;
|
||||
st << i;
|
||||
|
@ -457,20 +482,8 @@ void Socket::Connection::setBoundAddr(){
|
|||
return;
|
||||
}
|
||||
//Otherwise, read from socket pointer. Works for both SSL and non-SSL sockets, and real sockets passed as fd's, but not for non-sockets (duh)
|
||||
struct sockaddr_in6 tmpaddr;
|
||||
socklen_t len = sizeof(tmpaddr);
|
||||
if (!getsockname(getSocket(), (sockaddr *)&tmpaddr, &len)){
|
||||
static char addrconv[INET6_ADDRSTRLEN];
|
||||
if (tmpaddr.sin6_family == AF_INET6){
|
||||
boundaddr = inet_ntop(AF_INET6, &(tmpaddr.sin6_addr), addrconv, INET6_ADDRSTRLEN);
|
||||
if (boundaddr.substr(0, 7) == "::ffff:"){boundaddr = boundaddr.substr(7);}
|
||||
HIGH_MSG("Local IPv6 addr [%s]", boundaddr.c_str());
|
||||
}
|
||||
if (tmpaddr.sin6_family == AF_INET){
|
||||
boundaddr = inet_ntop(AF_INET, &(((sockaddr_in *)&tmpaddr)->sin_addr), addrconv, INET6_ADDRSTRLEN);
|
||||
HIGH_MSG("Local IPv4 addr [%s]", boundaddr.c_str());
|
||||
}
|
||||
}
|
||||
uint32_t boundport = 0;
|
||||
getSocketName(getSocket(), boundaddr, boundport);
|
||||
}
|
||||
|
||||
// Cleans up the socket by dropping the connection.
|
||||
|
@ -1741,21 +1754,9 @@ void Socket::UDPConnection::SendNow(const char *sdata, size_t len){
|
|||
}
|
||||
|
||||
std::string Socket::UDPConnection::getBoundAddress(){
|
||||
struct sockaddr_in6 tmpaddr;
|
||||
socklen_t len = sizeof(tmpaddr);
|
||||
std::string boundaddr;
|
||||
if (!getsockname(sock, (sockaddr *)&tmpaddr, &len)){
|
||||
static char addrconv[INET6_ADDRSTRLEN];
|
||||
if (tmpaddr.sin6_family == AF_INET6){
|
||||
boundaddr = inet_ntop(AF_INET6, &(tmpaddr.sin6_addr), addrconv, INET6_ADDRSTRLEN);
|
||||
if (boundaddr.substr(0, 7) == "::ffff:"){boundaddr = boundaddr.substr(7);}
|
||||
HIGH_MSG("Local IPv6 addr [%s]", boundaddr.c_str());
|
||||
}
|
||||
if (tmpaddr.sin6_family == AF_INET){
|
||||
boundaddr = inet_ntop(AF_INET, &(((sockaddr_in *)&tmpaddr)->sin_addr), addrconv, INET6_ADDRSTRLEN);
|
||||
HIGH_MSG("Local IPv4 addr [%s]", boundaddr.c_str());
|
||||
}
|
||||
}
|
||||
uint32_t boundport;
|
||||
Socket::getSocketName(sock, boundaddr, boundport);
|
||||
return boundaddr;
|
||||
}
|
||||
|
||||
|
|
|
@ -44,6 +44,7 @@ namespace Socket{
|
|||
bool checkTrueSocket(int sock);
|
||||
std::string resolveHostToBestExternalAddrGuess(const std::string &host, int family = AF_UNSPEC,
|
||||
const std::string &hint = "");
|
||||
bool getSocketName(int fd, std::string & host, uint32_t & port);
|
||||
|
||||
/// A buffer made out of std::string objects that can be efficiently read from and written to.
|
||||
class Buffer{
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#include <sys/stat.h> //for browse API call
|
||||
#include <fstream>
|
||||
#include <mist/http_parser.h>
|
||||
#include <mist/url.h>
|
||||
#include <mist/auth.h>
|
||||
#include <mist/stream.h>
|
||||
#include <mist/config.h>
|
||||
|
@ -444,6 +445,7 @@ void Controller::handleUDPAPI(void * np){
|
|||
return;
|
||||
}
|
||||
Util::Procs::socketList.insert(uSock.getSock());
|
||||
uSock.SetDestination(UDP_API_HOST, UDP_API_PORT);
|
||||
while (Controller::conf.is_active){
|
||||
if (uSock.Receive()){
|
||||
MEDIUM_MSG("UDP API: %s", uSock.data);
|
||||
|
@ -453,6 +455,7 @@ void Controller::handleUDPAPI(void * np){
|
|||
if (Request.isObject()){
|
||||
tthread::lock_guard<tthread::mutex> guard(configMutex);
|
||||
handleAPICommands(Request, Response);
|
||||
uSock.SendNow(Response.toString());
|
||||
}else{
|
||||
WARN_MSG("Invalid API command received over UDP: %s", uSock.data);
|
||||
}
|
||||
|
@ -941,6 +944,15 @@ void Controller::handleAPICommands(JSON::Value & Request, JSON::Value & Response
|
|||
Controller::fillActive(Request["stats_streams"], Response["stats_streams"]);
|
||||
}
|
||||
|
||||
if (Request.isMember("api_endpoint")){
|
||||
HTTP::URL url("http://localhost:4242");
|
||||
url.host = Util::listenInterface;
|
||||
if (url.host == "::"){url.host = "::1";}
|
||||
if (url.host == "0.0.0.0"){url.host = "127.0.0.1";}
|
||||
url.port = JSON::Value(Util::listenPort).asString();
|
||||
Response["api_endpoint"] = url.getUrl();
|
||||
}
|
||||
|
||||
if (Request.isMember("invalidate_sessions")){
|
||||
if (Request["invalidate_sessions"].isArray()){
|
||||
for (unsigned int i = 0; i < Request["invalidate_sessions"].size(); ++i){
|
||||
|
|
Loading…
Add table
Reference in a new issue