Compare commits

..

15 Commits
1.2.0 ... 1.2.2

Author SHA1 Message Date
Josiah Baldwin
f5c6e96597 Bumped version 2025-06-25 10:51:18 -07:00
Josiah Baldwin
428a1b31c7 Merge pull request #49 from DaanSelen/user_agent
Added user agent to ws connection.
2025-06-24 14:44:06 -07:00
DaanSelen
16f3f99427 Merge branch 'development' into user_agent 2025-06-24 22:51:10 +02:00
Josiah Baldwin
d21450e463 Merge pull request #48 from DaanSelen/increase_limit
Increase limit
2025-06-24 13:48:43 -07:00
Daan Selen
9e08a1af49 Minor corrections 2025-06-19 22:20:30 +02:00
Daan Selen
e9de43420e draft 2025-06-19 22:13:35 +02:00
Daan Selen
fcdf8add53 Just max_size 2025-06-19 21:59:54 +02:00
Josiah Baldwin
163b776dfc Fixed library __version__ var 2025-06-19 12:38:00 -07:00
Josiah Baldwin
04c8f622de Bumped version 2025-06-14 12:53:26 -07:00
Josiah Baldwin
ccb5f1eb40 Removed catch with print statement 2025-06-14 12:50:22 -07:00
Josiah Baldwin
ce2cf2bfe1 Merge branch 'fix/device-details' into development 2025-06-14 12:47:45 -07:00
Josiah Baldwin
a3b4962e7f Update timeout for WS download, becaule it takes a little longer than http 2025-06-14 12:45:36 -07:00
Josiah Baldwin
5947e48c5b modified node parsing to accept ony number of nested strings 2025-06-14 12:42:59 -07:00
Daan Selen
31a8f00cd0 syntax fix 2025-06-12 16:58:19 +02:00
Daan Selen
871d36b334 Added support for new MeshCentral response type.
2b4ab2b122
2025-06-12 16:35:08 +02:00
4 changed files with 37 additions and 7 deletions

View File

@@ -2,6 +2,22 @@
Changelog Changelog
========= =========
version 1.2.2
=============
Improvements:
* Added user agent to websocket headers
Bugs:
* Fixed library's __version__ implementation
* Fixed data from certain devices not showing up due to overloading websocket packet sizes
version 1.2.1
=============
Bugs:
* Fixed handling of meshcentral's list_devices return with details=True
version 1.2.0 version 1.2.0
============= =============

View File

@@ -8,7 +8,7 @@ else:
try: try:
# Change here if project is renamed and does not equal the package name # Change here if project is renamed and does not equal the package name
dist_name = "meshctrl" dist_name = "libmeshctrl"
__version__ = version(dist_name) __version__ = version(dist_name)
except PackageNotFoundError: # pragma: no cover except PackageNotFoundError: # pragma: no cover
__version__ = "unknown" __version__ = "unknown"
@@ -24,4 +24,4 @@ from . import files
from . import exceptions from . import exceptions
from . import device from . import device
from . import mesh from . import mesh
from . import user_group from . import user_group

View File

@@ -10,6 +10,8 @@ import io
import ssl import ssl
import urllib import urllib
from python_socks.async_.asyncio import Proxy from python_socks.async_.asyncio import Proxy
from platform import python_version
from . import __version__
from . import constants from . import constants
from . import exceptions from . import exceptions
from . import util from . import util
@@ -45,7 +47,8 @@ class Session(object):
closed (asyncio.Event): Event that occurs when the session closes permanently closed (asyncio.Event): Event that occurs when the session closes permanently
''' '''
def __init__(self, url, user=None, domain=None, password=None, loginkey=None, proxy=None, token=None, ignore_ssl=False, auto_reconnect=False): def __init__(self, url, user=None, domain=None, password=None, loginkey=None, proxy=None, token=None, ignore_ssl=False, auto_reconnect=False, user_agent_header=None):
default_user_agent_header = f"Python/{python_version()} websockets/{websockets.__version__} pylibmeshctrl/{__version__}"
parsed = urllib.parse.urlparse(url) parsed = urllib.parse.urlparse(url)
if parsed.scheme not in ("wss", "ws"): if parsed.scheme not in ("wss", "ws"):
@@ -106,6 +109,10 @@ class Session(object):
self._file_tunnels = {} self._file_tunnels = {}
self._ignore_ssl = ignore_ssl self._ignore_ssl = ignore_ssl
self.auto_reconnect = auto_reconnect self.auto_reconnect = auto_reconnect
if user_agent_header:
self.user_agent_header = user_agent_header
else:
self.user_agent_header = default_user_agent_header
self._eventer = util.Eventer() self._eventer = util.Eventer()
@@ -144,7 +151,7 @@ class Session(object):
options["additional_headers"] = headers options["additional_headers"] = headers
async for websocket in websockets.asyncio.client.connect(self.url, proxy=self._proxy, process_exception=util._process_websocket_exception, **options): async for websocket in websockets.asyncio.client.connect(self.url, proxy=self._proxy, process_exception=util._process_websocket_exception, max_size=None, user_agent_header=self.user_agent_header, **options):
self.alive = True self.alive = True
self._socket_open.set() self._socket_open.set()
try: try:
@@ -478,7 +485,14 @@ class Session(object):
if "result" in res0: if "result" in res0:
raise exceptions.ServerError(res0["result"]) raise exceptions.ServerError(res0["result"])
if details: if details:
nodes = json.loads(res0["data"]) nodes = res0["data"]
# Accept any number of nested strings, meshcentral is odd
while True:
try:
nodes = json.loads(nodes)
except TypeError:
break
for node in nodes: for node in nodes:
if node["node"].get("meshid", None): if node["node"].get("meshid", None):
node["node"]["mesh"] = mesh.Mesh(node["node"].get("meshid"), self) node["node"]["mesh"] = mesh.Mesh(node["node"].get("meshid"), self)
@@ -1969,4 +1983,4 @@ class _FileExplorerWrapper:
return await self._files.__aenter__() return await self._files.__aenter__()
async def __aexit__(self, exc_t, exc_v, exc_tb): async def __aexit__(self, exc_t, exc_v, exc_tb):
return await self._files.__aexit__(exc_t, exc_v, exc_tb) return await self._files.__aexit__(exc_t, exc_v, exc_tb)

View File

@@ -120,7 +120,7 @@ async def test_upload_download(env):
downfilestream.seek(0) downfilestream.seek(0)
start = time.perf_counter() start = time.perf_counter()
r = await files.download(f"{pwd}/test", downfilestream, skip_http_attempt=True, timeout=5) r = await files.download(f"{pwd}/test", downfilestream, skip_http_attempt=True, timeout=20)
print("\ninfo files_download: {}\n".format(r)) print("\ninfo files_download: {}\n".format(r))
assert r["result"] == True, "Download failed" assert r["result"] == True, "Download failed"
assert r["size"] == len(randdata), "Downloaded wrong number of bytes" assert r["size"] == len(randdata), "Downloaded wrong number of bytes"