Skip to content

Commit

Permalink
linting only
Browse files Browse the repository at this point in the history
  • Loading branch information
bostrt committed Feb 6, 2024
1 parent ddce50e commit 1dd04d3
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 20 deletions.
4 changes: 2 additions & 2 deletions src/palworld_exporter/collectors/rcon_collector.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import csv
import logging
import re
from typing import Iterable
Expand Down Expand Up @@ -50,6 +49,7 @@ def collect(self) -> Iterable[Metric]:
except Exception as e:
logging.exception(e)
finally:
up_metric = GaugeMetricFamily('palworld_up', 'Was the last scrape of RCON successful', int(success))
up_metric = GaugeMetricFamily(
'palworld_up', 'Was the last scrape of RCON successful', int(success))
result.append(up_metric)
return result
7 changes: 3 additions & 4 deletions src/palworld_exporter/collectors/save_collector.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from glob import glob
import os
import logging
from typing import Iterable

from prometheus_client import CollectorRegistry, Metric
Expand All @@ -18,5 +17,5 @@ def collect(self) -> Iterable[Metric]:
save_count_metric = GaugeMetricFamily('palworld_save_count', 'Number of player save files',
save_count)
yield save_count_metric
except:
pass
except Exception as e:
logging.warn(e)
9 changes: 6 additions & 3 deletions src/palworld_exporter/main.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import logging
from threading import Event

import click
from click_loglevel import LogLevel
from prometheus_client import start_http_server, REGISTRY, PROCESS_COLLECTOR, GC_COLLECTOR, PLATFORM_COLLECTOR
from prometheus_client import (GC_COLLECTOR, PLATFORM_COLLECTOR,
PROCESS_COLLECTOR, REGISTRY, start_http_server)

from palworld_exporter.collectors.rcon_collector import (RCONCollector,
RCONContext)
from palworld_exporter.collectors.save_collector import SaveCollector
from palworld_exporter.collectors.rcon_collector import RCONContext, RCONCollector


# Unregister default/built-in Python collectors
# https://prometheus.github.io/client_python/collector/#disabling-default-collector-metrics
Expand Down Expand Up @@ -46,6 +48,7 @@ def main(rcon_host: str,
# Wait forever
Event().wait()


if __name__ == "__main__":
try:
main()
Expand Down
20 changes: 14 additions & 6 deletions src/palworld_exporter/providers/rcon.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
from abc import ABC, abstractmethod
import csv
import logging
import re
from typing import Generic, List, TypeVar, ContextManager
from abc import ABC, abstractmethod
from typing import ContextManager, Generic, List, TypeVar

from rcon import Console

from palworld_exporter.collectors.data import Player, ServerInfo


class RCONContext(ContextManager):
"""
A context aware class that returns an instance of a RCON Console.
Expand All @@ -16,14 +17,15 @@ class RCONContext(ContextManager):
myctx = RCONContext('localhost', 25575, 'mypassword')
with myctx as c:
c.command('ShowPlayers')
c.command('ShowPlayers')
"""

def __init__(self, host, port, password, timeout=10):
self._host = host
self._port = port
self._password = password
self._timeout = timeout

def _get_console(self):
return Console(self._host, self._password, self._port, self._timeout)

Expand All @@ -37,25 +39,29 @@ def __exit__(self, exc_type, exc_value, exc_traceback):
self._console.close()
logging.debug('RCON collector closed connection')


T = TypeVar('T')


class RCONProvider(ABC, Generic[T]):
@abstractmethod
def fetch(self) -> T:
raise NotImplementedError


class PlayersProvider(RCONProvider[List[Player]]):
"""
Get active Player information.
"""

def __init__(self, rcon_ctx: RCONContext, ignore_logging_in: bool):
self._rcon_ctx = rcon_ctx
self._ignore_logging_in = ignore_logging_in

def _cmd_showplayers(self):
with self._rcon_ctx as conn:
return conn.command("ShowPlayers")

def fetch(self) -> List[Player]:
player_resp = self._cmd_showplayers()
if player_resp:
Expand Down Expand Up @@ -87,10 +93,12 @@ def fetch(self) -> List[Player]:
logging.warning('Empty or null response from ShowPlayers')
return []


class ServerInfoProvider(RCONProvider[ServerInfo]):
"""
Get Server information including name and version.
"""

def __init__(self, rcon_ctx: RCONContext):
self._rcon_ctx = rcon_ctx
self._info_re = re.compile(r"\[v(?P<version>.*?)\](?P<name>.*$)")
Expand Down
6 changes: 4 additions & 2 deletions src/palworld_exporter/providers/save.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
import os
from glob import glob
from glob import glob


class SaveCountProvider:
"""
Get the number of save files on disk in the Players save directory.
"""

def __init__(self, save_directory: str):
self._save_directory = save_directory

def fetch(self) -> int:
players_save_path = os.path.join(self._save_directory, "Players")
# Ensure Players directory exists
Expand Down
12 changes: 9 additions & 3 deletions src/test/providers/test_rcon_proviers.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
from rcon import Console
from palworld_exporter.providers.rcon import PlayersProvider, RCONContext, ServerInfoProvider
from unittest.mock import patch

from palworld_exporter.providers.rcon import (PlayersProvider, RCONContext,
ServerInfoProvider)


class FakeRCONContext(RCONContext):
def __init__(self):
pass

from unittest.mock import patch

@patch('palworld_exporter.providers.rcon.PlayersProvider._cmd_showplayers')
def test_PlayersProvider(mock_showplayers):
Expand All @@ -14,13 +16,15 @@ def test_PlayersProvider(mock_showplayers):
players = pp.fetch()
assert len(players) == 1


@patch('palworld_exporter.providers.rcon.PlayersProvider._cmd_showplayers')
def test_PlayersProvider_NoPlayers(mock_showplayers):
mock_showplayers.return_value = 'name,steamid,playerUid\n\n'
pp = PlayersProvider(FakeRCONContext(), True)
players = pp.fetch()
assert len(players) == 0


@patch('palworld_exporter.providers.rcon.PlayersProvider._cmd_showplayers')
def test_PlayersProvider_Korean(mock_showplayers):
# I don't know Korean :( I'm sorry if this is stupid
Expand All @@ -31,13 +35,15 @@ def test_PlayersProvider_Korean(mock_showplayers):
assert len(players) == 1
assert name == players[0].name


@patch('palworld_exporter.providers.rcon.PlayersProvider._cmd_showplayers')
def test_PlayersProvider_EmptyResponse(mock_showplayers):
mock_showplayers.return_value = None
pp = PlayersProvider(FakeRCONContext(), True)
players = pp.fetch()
assert len(players) == 0


@patch('palworld_exporter.providers.rcon.ServerInfoProvider._cmd_info')
def test_ServerInfoProvider(mock_info):
mock_info.return_value = 'Welcome to Pal Server[v0.1.4.0] http://palworld.lol 1 | OPEN 24/7 Dedicated'
Expand Down

0 comments on commit 1dd04d3

Please sign in to comment.