Skip to content

Commit

Permalink
wip commit
Browse files Browse the repository at this point in the history
Signed-off-by: Rashesh Padia <[email protected]>
Change-Id: I848f853be8c14d3367f8501c603114a3e23a617b
  • Loading branch information
Rash419 committed Aug 30, 2024
1 parent bad83ee commit b1fdb13
Show file tree
Hide file tree
Showing 6 changed files with 136 additions and 9 deletions.
4 changes: 3 additions & 1 deletion docker/from-source-gh-action/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ FROM ubuntu:24.04 AS builder

ENV CORE_ASSETS https://github.com/CollaboraOnline/online/releases/download/for-code-assets/core-co-24.04-assets.tar.gz
ENV BUILDDIR /build
ENV ONLINE_EXTRA_BUILD_OPTIONS --enable-experimental
ENV ONLINE_EXTRA_BUILD_OPTIONS --enable-experimental --disable-werror
ENV COLLABORA_ONLINE_REPO https://github.com/Rash419/online.git
ENV COLLABORA_ONLINE_BRANCH live-cluster-upgrading

WORKDIR /build

Expand Down
45 changes: 44 additions & 1 deletion wsd/Admin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,14 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/

#include <Poco/JSON/Array.h>
#include <Poco/JSON/Object.h>
#include <config.h>

#include <chrono>
#include <cstddef>
#include <iomanip>
#include <string>
#include <sys/poll.h>
#include <unistd.h>

Expand Down Expand Up @@ -41,7 +45,6 @@

using namespace COOLProtocol;

using Poco::Net::HTTPResponse;
using Poco::Util::Application;

const int Admin::MinStatsIntervalMs = 50;
Expand Down Expand Up @@ -418,6 +421,10 @@ void AdminSocketHandler::handleMessage(const std::vector<char> &payload)
{
_admin->setCloseMonitorFlag();
}
else if (tokens.equals(0, "rollingupdate") && tokens.size() > 1)
{
_admin->setRollingUpdateInfo(tokens[1]);
}
}

AdminSocketHandler::AdminSocketHandler(Admin* adminManager,
Expand Down Expand Up @@ -1307,6 +1314,42 @@ void Admin::deleteMonitorSocket(const std::string& uriWithoutParam)
}
}

void Admin::setRollingUpdateInfo(const std::string& jsonString)
{
Poco::JSON::Object::Ptr object;
if (JsonUtil::parseJSON(jsonString, object))
{
bool status = JsonUtil::getJSONValue<bool>(object, "inprogress");
setRollingUpdateStatus(status);
Poco::JSON::Array::Ptr infoArray = object->getArray("serverinfo");
if (!infoArray.isNull())
{
for(size_t i=0; i < infoArray->size(); i++)
{
if (!infoArray->isObject(i))
{
return;
}
const auto serverInfoObject = infoArray->getObject(i);
const std::string gitHash = JsonUtil::getJSONValue<std::string>(serverInfoObject , "gitHash");
const std::string serverId = JsonUtil::getJSONValue<std::string>(serverInfoObject, "serverId");
const std::string routeToken = JsonUtil::getJSONValue<std::string>(serverInfoObject, "routeToken");
_rollingUpdateInfo.try_emplace(gitHash, RollingUpdateServerInfo(gitHash, serverId, routeToken));
}
}
}
}

std::string Admin::getBuddyServer(const std::string& gitHash)
{
auto iterator = _rollingUpdateInfo.find(gitHash);
if (iterator != _rollingUpdateInfo.end())
{
return iterator->second.getRouteToken();
}
return std::string();
}

void Admin::stop()
{
joinThread();
Expand Down
34 changes: 34 additions & 0 deletions wsd/Admin.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@

#include "net/WebSocketHandler.hpp"
#include "COOLWSD.hpp"
#include <string>
#include <vector>

class Admin;

Expand Down Expand Up @@ -187,6 +189,14 @@ class Admin : public SocketPoll

void setCloseMonitorFlag() { _closeMonitor = true; }

void setRollingUpdateInfo(const std::string& jsonString);

void setRollingUpdateStatus(bool status) { _rollingUpdateStatus = status; }

bool getRollingUpdateStatus() { return _rollingUpdateStatus; }

std::string getBuddyServer(const std::string& gitHash);

private:
/// Notify Forkit of changed settings.
void notifyForkit();
Expand Down Expand Up @@ -254,6 +264,30 @@ class Admin : public SocketPoll
std::map<std::string, std::shared_ptr<MonitorSocketHandler>> _monitorSockets;

std::atomic<bool> _closeMonitor = false;

class RollingUpdateServerInfo
{
public:
std::string getGitHash() { return _gitHash; }
std::string getServerId() { return _serverId; }
std::string getRouteToken() { return _routeToken; }

RollingUpdateServerInfo(const std::string& gitHash, const std::string& serverId,
const std::string& routeToken)
: _gitHash(gitHash)
, _serverId(serverId)
, _routeToken(routeToken)
{
}

private:
std::string _gitHash;
std::string _serverId;
std::string _routeToken;
};

std::map<std::string, RollingUpdateServerInfo> _rollingUpdateInfo;
std::atomic<bool> _rollingUpdateStatus;
};

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
53 changes: 48 additions & 5 deletions wsd/ClientRequestDispatcher.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
*/

#include <config.h>
#include <config_version.h>

#include <ClientRequestDispatcher.hpp>

Expand Down Expand Up @@ -717,18 +718,30 @@ void ClientRequestDispatcher::handleIncomingMessage(SocketDisposition& dispositi
{
bool served = false;

std::string protocol = "http";
if (socket->sniffSSL())
protocol = "https";

Poco::URI requestUri(protocol + "://" + request.getHost() + request.getURI());
const std::string& path = requestUri.getPath();
bool versionMismatch = false;
if (path.find("browser/" COOLWSD_VERSION_HASH "/") == std::string::npos &&
path.find("admin/") == std::string::npos)
{
versionMismatch = true;
}

// File server
assert(socket && "Must have a valid socket");
constexpr auto ProxyRemote = "/remote/";
constexpr auto ProxyRemoteLen = sizeof(ProxyRemote) - 1;
constexpr auto ProxyRemoteStatic = "/remote/static/";
const auto uri = requestDetails.getURI();
const auto pos = uri.find(ProxyRemoteStatic);
const auto pos = path.find(ProxyRemoteStatic);
if (pos != std::string::npos)
{
if (uri.ends_with("lokit-extra-img.svg"))
if (path.ends_with("lokit-extra-img.svg"))
{
ProxyRequestHandler::handleRequest(uri.substr(pos + ProxyRemoteLen), socket,
ProxyRequestHandler::handleRequest(path.substr(pos + ProxyRemoteLen), socket,
ProxyRequestHandler::getProxyRatingServer());
served = true;
}
Expand All @@ -742,12 +755,42 @@ void ClientRequestDispatcher::handleIncomingMessage(SocketDisposition& dispositi
const std::string& serverUri =
unlockImageUri.getScheme() + "://" + unlockImageUri.getAuthority();
ProxyRequestHandler::handleRequest(
uri.substr(pos + sizeof("/remote/static") - 1), socket, serverUri);
path.substr(pos + sizeof("/remote/static") - 1), socket, serverUri);
served = true;
}
}
#endif
}
else if (COOLWSD::IndirectionServerEnabled && versionMismatch &&
Admin::instance().getRollingUpdateStatus())
{
std::string searchString = "/browser/";
size_t startHashPos = path.find(searchString);
if (startHashPos != std::string::npos)
{
startHashPos += searchString.length();
size_t endHashPos = path.find('/', startHashPos);

std::string gitHash;
if (endHashPos != std::string::npos)
{
gitHash = path.substr(startHashPos, endHashPos - startHashPos);
}
else
{
gitHash = path.substr(startHashPos);
}
std::string routeToken = Admin::instance().getBuddyServer(gitHash);
if (!routeToken.empty())
requestUri.addQueryParameter("RouteToken", routeToken);

LOG_DBG("proxyRequestUri: " << requestUri.toString());

ProxyRequestHandler::handleRequest(requestUri.getPath(), socket,
requestUri.getScheme() + "://" +
requestUri.getAuthority());
}
}
else
{
FileServerRequestHandler::ResourceAccessDetails accessDetails;
Expand Down
7 changes: 5 additions & 2 deletions wsd/ProxyRequestHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,11 @@ void ProxyRequestHandler::handleRequest(const std::string& relPath,
}

uriProxy.setPath(relPath);
auto sessionProxy = http::Session::create(uriProxy.getHost(),
http::Session::Protocol::HttpSsl,
LOG_DBG("proxyRequestUri: " << uriProxy.toString());
auto protocol = uriProxy.getScheme() == "https" ? http::Session::Protocol::HttpSsl
: http::Session::Protocol::HttpUnencrypted;

auto sessionProxy = http::Session::create(uriProxy.getHost(), protocol,
uriProxy.getPort());
sessionProxy->setTimeout(std::chrono::seconds(10));
http::Request requestProxy(uriProxy.getPathAndQuery());
Expand Down
2 changes: 2 additions & 0 deletions wsd/ProxyRequestHandler.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

#pragma once

#include <Poco/URI.h>
#include <string>
#include "Socket.hpp"

Expand All @@ -20,6 +21,7 @@ class ProxyRequestHandler
static void handleRequest(const std::string& relPath,
const std::shared_ptr<StreamSocket>& socket,
const std::string& serverUri);

static std::string getProxyRatingServer() { return ProxyRatingServer; }

private:
Expand Down

0 comments on commit b1fdb13

Please sign in to comment.