]> git.stg.codes - stg.git/blob - projects/stargazer/plugins/other/radius/radius.cpp
Radius (#7)
[stg.git] / projects / stargazer / plugins / other / radius / radius.cpp
1 #include "radius.h"
2 #include "server.h"
3 #include "radproto/error.h"
4
5 #include "stg/common.h"
6
7 #include <boost/asio.hpp>
8 #include <string>
9 #include <iostream>
10 #include <cstdint> //uint8_t, uint32_t
11
12 using STG::RADIUS;
13
14 extern "C" STG::Plugin* GetPlugin()
15 {
16     static RADIUS plugin;
17     return &plugin;
18 }
19
20 std::string RADIUS::GetVersion() const
21 {
22     return "Radius v.1.0";
23 }
24
25 RADIUS::RADIUS()
26     : m_logger(PluginLogger::get("radius")),
27       m_running(false)
28 {
29 }
30
31 int RADIUS::Start()
32 {
33     m_thread = std::jthread([this](auto token){ Run(std::move(token)); });
34     return 0;
35 }
36
37 int RADIUS::Stop()
38 {
39     if (!m_thread.joinable())
40         return 0;
41
42     m_thread.request_stop();
43
44     m_thread.join();
45     return 0;
46 }
47
48 void RADIUS::SetRunning(bool val)
49 {
50     const std::lock_guard lock(m_mutex);
51     m_running = val;
52 }
53
54 bool RADIUS::IsRunning()
55 {
56     const std::lock_guard lock(m_mutex);
57     return m_running;
58 }
59
60 int RADIUS::Run(std::stop_token token)
61 {
62     SetRunning(true);
63
64     try
65     {
66         boost::asio::io_service ioService;
67         Server server(ioService, "secret", 1812, "/usr/share/freeradius/dictionary");
68         ioService.run();
69     }
70     catch (const std::exception& e)
71     {
72         m_errorStr = "Exception in RADIUS::Run(): " + std::string(e.what());
73         m_logger("Exception in RADIUS:: Run(): %s", e.what());
74         printfd(__FILE__, "Exception in RADIUS:: Run(). Message: '%s'\n", e.what());
75     }
76
77     SetRunning(false);
78     return 0;
79 }