15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/host/host_event_logger.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/weak_ptr.h"
95e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/ip_endpoint.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "remoting/host/host_status_monitor.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/host/host_status_observer.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/transport.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Included here, since the #define for LOG_USER in syslog.h conflicts with the
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// constants in base/logging.h, and this source file should use the version in
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// syslog.h.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <syslog.h>
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HostEventLoggerPosix : public HostEventLogger, public HostStatusObserver {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HostEventLoggerPosix(base::WeakPtr<HostStatusMonitor> monitor,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const std::string& application_name);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~HostEventLoggerPosix();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HostStatusObserver implementation.  These methods will be called from the
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // network thread.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnClientAuthenticated(const std::string& jid) OVERRIDE;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnClientDisconnected(const std::string& jid) OVERRIDE;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnAccessDenied(const std::string& jid) OVERRIDE;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnClientRouteChange(
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& jid,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& channel_name,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const protocol::TransportRoute& route) OVERRIDE;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnStart(const std::string& xmpp_login) OVERRIDE;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnShutdown() OVERRIDE;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Log(const std::string& message);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::WeakPtr<HostStatusMonitor> monitor_;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string application_name_;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(HostEventLoggerPosix);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} //namespace
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)HostEventLoggerPosix::HostEventLoggerPosix(
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::WeakPtr<HostStatusMonitor> monitor,
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& application_name)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : monitor_(monitor),
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      application_name_(application_name) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  openlog(application_name_.c_str(), 0, LOG_USER);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  monitor_->AddStatusObserver(this);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostEventLoggerPosix::~HostEventLoggerPosix() {
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (monitor_.get())
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    monitor_->RemoveStatusObserver(this);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  closelog();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostEventLoggerPosix::OnClientAuthenticated(const std::string& jid) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Log("Client connected: " + jid);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostEventLoggerPosix::OnClientDisconnected(const std::string& jid) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Log("Client disconnected: " + jid);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostEventLoggerPosix::OnAccessDenied(const std::string& jid) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Log("Access denied for client: " + jid);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostEventLoggerPosix::OnClientRouteChange(
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& jid,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& channel_name,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const protocol::TransportRoute& route) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Log(base::StringPrintf(
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Channel IP for client: %s ip='%s' host_ip='%s' channel='%s' "
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "connection='%s'",
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      jid.c_str(), route.remote_address.ToString().c_str(),
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      route.local_address.ToString().c_str(), channel_name.c_str(),
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      protocol::TransportRoute::GetTypeString(route.type).c_str()));
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostEventLoggerPosix::OnShutdown() {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(rmsousa): Fix host shutdown to actually call this, and add a log line.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostEventLoggerPosix::OnStart(const std::string& xmpp_login) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Log("Host started for user: " + xmpp_login);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostEventLoggerPosix::Log(const std::string& message) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syslog(LOG_USER | LOG_NOTICE, "%s", message.c_str());
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<HostEventLogger> HostEventLogger::Create(
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::WeakPtr<HostStatusMonitor> monitor,
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& application_name) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return scoped_ptr<HostEventLogger>(
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new HostEventLoggerPosix(monitor, application_name));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace remoting
114