remoteRF-server 0.1.58__tar.gz → 0.1.59__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/PKG-INFO +60 -2
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/README.md +59 -1
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/pyproject.toml +1 -1
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/server/grpc_server.py +6 -1
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/server/user_group_cli.py +140 -1
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server.egg-info/PKG-INFO +60 -2
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/setup.cfg +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/__init__.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/common/__init__.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/common/grpc/__init__.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/common/grpc/grpc_host_pb2.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/common/grpc/grpc_host_pb2_grpc.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/common/grpc/grpc_pb2.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/common/grpc/grpc_pb2_grpc.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/common/utils/__init__.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/common/utils/ansi_codes.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/common/utils/api_token.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/common/utils/db_connection.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/common/utils/db_location.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/common/utils/list_string.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/common/utils/process_arg.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/drivers/__init__.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/drivers/adalm_pluto/__init__.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/drivers/adalm_pluto/pluto_remote_server.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/host/__init__.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/host/host_directory_store.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/host/host_tunnel_server.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/server/__init__.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/server/acc_perms.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/server/cert_provider.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/server/device_manager.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/server/reservation.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/server/rpc_manager.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/server/user_group_handler.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/serverrf_cli.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/tools/__init__.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/tools/gen_certs.py +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server.egg-info/SOURCES.txt +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server.egg-info/dependency_links.txt +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server.egg-info/entry_points.txt +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server.egg-info/requires.txt +0 -0
- {remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: remoteRF-server
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.59
|
|
4
4
|
Description-Content-Type: text/markdown
|
|
5
5
|
Requires-Dist: grpcio
|
|
6
6
|
Requires-Dist: protobuf
|
|
@@ -281,10 +281,66 @@ Note that all device and server config parameters need a 'restart' to take affec
|
|
|
281
281
|
|
|
282
282
|
## Server Runtime Configuration
|
|
283
283
|
|
|
284
|
-
After running
|
|
284
|
+
After running `serverrf --serve`, you’ll enter the **RemoteRF Server Shell**. This interactive shell is used for runtime administration: managing users, devices, reservations, user groups, and enrollment codes.
|
|
285
285
|
|
|
286
|
+
> Tip: Legacy commands (e.g. `show a`, `rm db`) may still work if enabled, but the commands below are the canonical interface.
|
|
286
287
|
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
#### Server
|
|
291
|
+
|
|
292
|
+
* `help` / `?` — Show help
|
|
293
|
+
* `clear` — Clear the screen
|
|
294
|
+
* `status` — Show server status (uptime / bind info)
|
|
295
|
+
* `quit` / `exit` — Exit the server shell
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
#### Users
|
|
300
|
+
|
|
301
|
+
* `users list` — List all accounts
|
|
302
|
+
* `users manage` — Manage a specific user (permissions / deletion / reservations) *(interactive)*
|
|
303
|
+
* `users purge` — Remove **all** users
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
#### Devices
|
|
308
|
+
|
|
309
|
+
* `devices list` — List all devices
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
#### Reservations
|
|
314
|
+
|
|
315
|
+
* `reservations list` — List all reservations
|
|
316
|
+
* `reservations purge` — Remove **all** reservations
|
|
287
317
|
|
|
318
|
+
---
|
|
319
|
+
|
|
320
|
+
#### Groups
|
|
321
|
+
|
|
322
|
+
* `groups list` — List user groups
|
|
323
|
+
* `groups create` — Create a user group *(interactive)*
|
|
324
|
+
* `groups edit` — Edit a user group *(interactive)*
|
|
325
|
+
* `groups delete` — Delete a user group *(interactive)*
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
#### Enrollment Codes
|
|
330
|
+
|
|
331
|
+
* `codes list` — List enrollment codes
|
|
332
|
+
* `codes create` — Create enrollment codes *(interactive)*
|
|
333
|
+
* `codes delete` — Delete an enrollment code *(interactive)*
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
#### Database
|
|
338
|
+
|
|
339
|
+
* `db reset` — Remove all database entries
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
##
|
|
288
344
|
todo:
|
|
289
345
|
<!-- Adding plutos via the CLI -->
|
|
290
346
|
<!-- Testing functionality (disregarding Host pipeline) -->
|
|
@@ -295,6 +351,8 @@ Ability to remotely manage groups and codes as admin.
|
|
|
295
351
|
|
|
296
352
|
HostRF integration -> Host directory, device routing, dynamic reservation pulling, with activity/status (online, offline, etc.)
|
|
297
353
|
|
|
354
|
+
Cleanup code comments.
|
|
355
|
+
|
|
298
356
|
Update Ian with installation demo (try myself first on the NUC once!) for both server and host.
|
|
299
357
|
|
|
300
358
|
|
|
@@ -270,10 +270,66 @@ Note that all device and server config parameters need a 'restart' to take affec
|
|
|
270
270
|
|
|
271
271
|
## Server Runtime Configuration
|
|
272
272
|
|
|
273
|
-
After running
|
|
273
|
+
After running `serverrf --serve`, you’ll enter the **RemoteRF Server Shell**. This interactive shell is used for runtime administration: managing users, devices, reservations, user groups, and enrollment codes.
|
|
274
274
|
|
|
275
|
+
> Tip: Legacy commands (e.g. `show a`, `rm db`) may still work if enabled, but the commands below are the canonical interface.
|
|
275
276
|
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
#### Server
|
|
280
|
+
|
|
281
|
+
* `help` / `?` — Show help
|
|
282
|
+
* `clear` — Clear the screen
|
|
283
|
+
* `status` — Show server status (uptime / bind info)
|
|
284
|
+
* `quit` / `exit` — Exit the server shell
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
#### Users
|
|
289
|
+
|
|
290
|
+
* `users list` — List all accounts
|
|
291
|
+
* `users manage` — Manage a specific user (permissions / deletion / reservations) *(interactive)*
|
|
292
|
+
* `users purge` — Remove **all** users
|
|
293
|
+
|
|
294
|
+
---
|
|
295
|
+
|
|
296
|
+
#### Devices
|
|
297
|
+
|
|
298
|
+
* `devices list` — List all devices
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
#### Reservations
|
|
303
|
+
|
|
304
|
+
* `reservations list` — List all reservations
|
|
305
|
+
* `reservations purge` — Remove **all** reservations
|
|
276
306
|
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
#### Groups
|
|
310
|
+
|
|
311
|
+
* `groups list` — List user groups
|
|
312
|
+
* `groups create` — Create a user group *(interactive)*
|
|
313
|
+
* `groups edit` — Edit a user group *(interactive)*
|
|
314
|
+
* `groups delete` — Delete a user group *(interactive)*
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
#### Enrollment Codes
|
|
319
|
+
|
|
320
|
+
* `codes list` — List enrollment codes
|
|
321
|
+
* `codes create` — Create enrollment codes *(interactive)*
|
|
322
|
+
* `codes delete` — Delete an enrollment code *(interactive)*
|
|
323
|
+
|
|
324
|
+
---
|
|
325
|
+
|
|
326
|
+
#### Database
|
|
327
|
+
|
|
328
|
+
* `db reset` — Remove all database entries
|
|
329
|
+
|
|
330
|
+
---
|
|
331
|
+
|
|
332
|
+
##
|
|
277
333
|
todo:
|
|
278
334
|
<!-- Adding plutos via the CLI -->
|
|
279
335
|
<!-- Testing functionality (disregarding Host pipeline) -->
|
|
@@ -284,6 +340,8 @@ Ability to remotely manage groups and codes as admin.
|
|
|
284
340
|
|
|
285
341
|
HostRF integration -> Host directory, device routing, dynamic reservation pulling, with activity/status (online, offline, etc.)
|
|
286
342
|
|
|
343
|
+
Cleanup code comments.
|
|
344
|
+
|
|
287
345
|
Update Ian with installation demo (try myself first on the NUC once!) for both server and host.
|
|
288
346
|
|
|
289
347
|
|
|
@@ -28,7 +28,7 @@ from .rpc_manager import rpc_manager
|
|
|
28
28
|
from .acc_perms import perms
|
|
29
29
|
from ..common.utils import *
|
|
30
30
|
from .device_manager import get_all_devices, get_all_devices_str
|
|
31
|
-
from .user_group_cli import make_user_group_local, edit_user_group_local, list_user_groups_local, remove_user_group_local, make_enrollment_codes_local, remove_enrollment_code_local, list_enrollment_codes_local
|
|
31
|
+
from .user_group_cli import make_user_group_local, edit_user_group_local, list_user_groups_local, remove_user_group_local, make_enrollment_codes_local, remove_enrollment_code_local, list_enrollment_codes_local, export_user_groups_csv_local, export_enrollment_codes_csv_local
|
|
32
32
|
from .user_group_handler import user_group_handler, start_usergroup_cleanup_loop
|
|
33
33
|
|
|
34
34
|
from pathlib import Path
|
|
@@ -479,12 +479,14 @@ def help() -> None:
|
|
|
479
479
|
printf(" groups create ", Sty.MAGENTA, "- Create a user group (interactive)", Sty.DEFAULT)
|
|
480
480
|
printf(" groups edit ", Sty.MAGENTA, "- Edit a user group (interactive)", Sty.DEFAULT)
|
|
481
481
|
printf(" groups delete ", Sty.MAGENTA, "- Delete a user group (interactive)", Sty.DEFAULT)
|
|
482
|
+
printf("'groups csv' ", Sty.MAGENTA, " - Export ALL user groups as CSV to Downloads", Sty.DEFAULT)
|
|
482
483
|
print()
|
|
483
484
|
|
|
484
485
|
printf("Enrollment Codes:", Sty.BOLD)
|
|
485
486
|
printf(" codes list ", Sty.MAGENTA, "- List enrollment codes", Sty.DEFAULT)
|
|
486
487
|
printf(" codes create ", Sty.MAGENTA, "- Create enrollment codes (interactive)", Sty.DEFAULT)
|
|
487
488
|
printf(" codes delete ", Sty.MAGENTA, "- Delete an enrollment code (interactive)", Sty.DEFAULT)
|
|
489
|
+
printf("'codes csv' ", Sty.MAGENTA, " - Export ALL enrollment codes as CSV to Downloads", Sty.DEFAULT)
|
|
488
490
|
print()
|
|
489
491
|
|
|
490
492
|
printf("Database:", Sty.BOLD)
|
|
@@ -563,6 +565,7 @@ def server_input(inpu: str) -> bool:
|
|
|
563
565
|
"groups list": lambda: _stay(lambda: list_user_groups_local(session)),
|
|
564
566
|
"show g": lambda: _stay(lambda: list_user_groups_local(session)), # old
|
|
565
567
|
"show groups": lambda: _stay(lambda: list_user_groups_local(session)), # old
|
|
568
|
+
"groups csv": lambda: _stay(export_user_groups_csv_local),
|
|
566
569
|
|
|
567
570
|
# ---- enrollment codes ----
|
|
568
571
|
"codes create": lambda: _stay(lambda: make_enrollment_codes_local(session)),
|
|
@@ -577,6 +580,8 @@ def server_input(inpu: str) -> bool:
|
|
|
577
580
|
"rm codes": lambda: _stay(lambda: remove_enrollment_code_local(session)), # old
|
|
578
581
|
"rm code": lambda: _stay(lambda: remove_enrollment_code_local(session)), # old
|
|
579
582
|
"rm c": lambda: _stay(lambda: remove_enrollment_code_local(session)), # old
|
|
583
|
+
|
|
584
|
+
"codes csv": lambda: _stay(export_enrollment_codes_csv_local),
|
|
580
585
|
}
|
|
581
586
|
|
|
582
587
|
fn = DISPATCH.get(cmd)
|
{remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/server/user_group_cli.py
RENAMED
|
@@ -586,4 +586,143 @@ def list_enrollment_codes_local(session) -> None:
|
|
|
586
586
|
print(header)
|
|
587
587
|
print(sep)
|
|
588
588
|
for row in table:
|
|
589
|
-
print(" ".join(row[i].ljust(widths[cols[i]]) for i in range(len(cols))))
|
|
589
|
+
print(" ".join(row[i].ljust(widths[cols[i]]) for i in range(len(cols))))
|
|
590
|
+
|
|
591
|
+
from __future__ import annotations
|
|
592
|
+
|
|
593
|
+
import csv
|
|
594
|
+
import json
|
|
595
|
+
import os
|
|
596
|
+
import re
|
|
597
|
+
from datetime import datetime
|
|
598
|
+
from pathlib import Path
|
|
599
|
+
from typing import Any, Dict, List, Optional
|
|
600
|
+
|
|
601
|
+
from .user_group_handler import user_group_handler
|
|
602
|
+
|
|
603
|
+
|
|
604
|
+
def _resolve_download_dir() -> Path:
|
|
605
|
+
"""
|
|
606
|
+
Best-effort Downloads folder resolution:
|
|
607
|
+
1) XDG_DOWNLOAD_DIR env (if set)
|
|
608
|
+
2) ~/.config/user-dirs.dirs XDG_DOWNLOAD_DIR (Linux desktops)
|
|
609
|
+
3) ~/Downloads
|
|
610
|
+
4) fallback: cwd
|
|
611
|
+
"""
|
|
612
|
+
# 1) Env override (rare, but cheap to support)
|
|
613
|
+
xdg_env = os.getenv("XDG_DOWNLOAD_DIR")
|
|
614
|
+
if xdg_env:
|
|
615
|
+
p = Path(os.path.expandvars(xdg_env)).expanduser()
|
|
616
|
+
return p
|
|
617
|
+
|
|
618
|
+
# 2) user-dirs.dirs (common on Linux w/ xdg-user-dirs)
|
|
619
|
+
try:
|
|
620
|
+
user_dirs = Path.home() / ".config" / "user-dirs.dirs"
|
|
621
|
+
if user_dirs.exists():
|
|
622
|
+
txt = user_dirs.read_text(encoding="utf-8", errors="ignore")
|
|
623
|
+
m = re.search(r'^XDG_DOWNLOAD_DIR\s*=\s*"(.*)"\s*$', txt, flags=re.MULTILINE)
|
|
624
|
+
if m:
|
|
625
|
+
raw = m.group(1)
|
|
626
|
+
raw = raw.replace("$HOME", str(Path.home()))
|
|
627
|
+
p = Path(os.path.expandvars(raw)).expanduser()
|
|
628
|
+
return p
|
|
629
|
+
except Exception:
|
|
630
|
+
pass
|
|
631
|
+
|
|
632
|
+
# 3) Default
|
|
633
|
+
p = Path.home() / "Downloads"
|
|
634
|
+
return p
|
|
635
|
+
|
|
636
|
+
|
|
637
|
+
def _coerce_csv_cell(v: Any) -> str:
|
|
638
|
+
if v is None:
|
|
639
|
+
return ""
|
|
640
|
+
if isinstance(v, (dict, list, tuple)):
|
|
641
|
+
# stable, readable cell content
|
|
642
|
+
return json.dumps(v, ensure_ascii=False, separators=(",", ":"))
|
|
643
|
+
return str(v)
|
|
644
|
+
|
|
645
|
+
|
|
646
|
+
def _write_csv(
|
|
647
|
+
rows: List[Dict[str, Any]],
|
|
648
|
+
out_path: Path,
|
|
649
|
+
*,
|
|
650
|
+
preferred_columns: Optional[List[str]] = None,
|
|
651
|
+
) -> None:
|
|
652
|
+
if not rows:
|
|
653
|
+
raise ValueError("No rows to write.")
|
|
654
|
+
|
|
655
|
+
preferred_columns = preferred_columns or []
|
|
656
|
+
|
|
657
|
+
present = set().union(*(r.keys() for r in rows))
|
|
658
|
+
columns = [c for c in preferred_columns if c in present]
|
|
659
|
+
columns += [c for c in sorted(present) if c not in columns]
|
|
660
|
+
|
|
661
|
+
out_path.parent.mkdir(parents=True, exist_ok=True)
|
|
662
|
+
|
|
663
|
+
with out_path.open("w", newline="", encoding="utf-8") as f:
|
|
664
|
+
w = csv.DictWriter(f, fieldnames=columns, extrasaction="ignore")
|
|
665
|
+
w.writeheader()
|
|
666
|
+
for r in rows:
|
|
667
|
+
w.writerow({c: _coerce_csv_cell(r.get(c)) for c in columns})
|
|
668
|
+
|
|
669
|
+
|
|
670
|
+
def export_user_groups_csv_local() -> Optional[Path]:
|
|
671
|
+
# include_users=True so CSV truly contains "everything"
|
|
672
|
+
groups: List[Dict[str, Any]] = user_group_handler.get_all_user_groups(include_users=True) or []
|
|
673
|
+
if not groups:
|
|
674
|
+
print("No user groups found.")
|
|
675
|
+
return None
|
|
676
|
+
|
|
677
|
+
ts = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
678
|
+
out_dir = _resolve_download_dir()
|
|
679
|
+
out_path = out_dir / f"remoterf_user_groups_{ts}.csv"
|
|
680
|
+
|
|
681
|
+
preferred = [
|
|
682
|
+
"group_id", "id",
|
|
683
|
+
"group_name", "name",
|
|
684
|
+
"devices_whitelist",
|
|
685
|
+
"max_reservation_time_sec",
|
|
686
|
+
"max_reservations",
|
|
687
|
+
"lifetime_sec",
|
|
688
|
+
"created_at",
|
|
689
|
+
"users",
|
|
690
|
+
]
|
|
691
|
+
|
|
692
|
+
try:
|
|
693
|
+
_write_csv(groups, out_path, preferred_columns=preferred)
|
|
694
|
+
print(f"Exported user groups CSV -> {out_path}")
|
|
695
|
+
return out_path
|
|
696
|
+
except Exception as e:
|
|
697
|
+
print(f"Failed to export user groups CSV: {e}")
|
|
698
|
+
return None
|
|
699
|
+
|
|
700
|
+
|
|
701
|
+
def export_enrollment_codes_csv_local() -> Optional[Path]:
|
|
702
|
+
rows: List[Dict[str, Any]] = user_group_handler.get_all_enrollment_codes() or []
|
|
703
|
+
if not rows:
|
|
704
|
+
print("No enrollment codes found.")
|
|
705
|
+
return None
|
|
706
|
+
|
|
707
|
+
ts = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
708
|
+
out_dir = _resolve_download_dir()
|
|
709
|
+
out_path = out_dir / f"remoterf_enrollment_codes_{ts}.csv"
|
|
710
|
+
|
|
711
|
+
preferred = [
|
|
712
|
+
"code_name",
|
|
713
|
+
"group_id",
|
|
714
|
+
"uses",
|
|
715
|
+
"uses_left",
|
|
716
|
+
"remaining_uses",
|
|
717
|
+
"duration_sec",
|
|
718
|
+
"expires_at",
|
|
719
|
+
"created_at",
|
|
720
|
+
]
|
|
721
|
+
|
|
722
|
+
try:
|
|
723
|
+
_write_csv(rows, out_path, preferred_columns=preferred)
|
|
724
|
+
print(f"Exported enrollment codes CSV -> {out_path}")
|
|
725
|
+
return out_path
|
|
726
|
+
except Exception as e:
|
|
727
|
+
print(f"Failed to export enrollment codes CSV: {e}")
|
|
728
|
+
return None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: remoteRF-server
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.59
|
|
4
4
|
Description-Content-Type: text/markdown
|
|
5
5
|
Requires-Dist: grpcio
|
|
6
6
|
Requires-Dist: protobuf
|
|
@@ -281,10 +281,66 @@ Note that all device and server config parameters need a 'restart' to take affec
|
|
|
281
281
|
|
|
282
282
|
## Server Runtime Configuration
|
|
283
283
|
|
|
284
|
-
After running
|
|
284
|
+
After running `serverrf --serve`, you’ll enter the **RemoteRF Server Shell**. This interactive shell is used for runtime administration: managing users, devices, reservations, user groups, and enrollment codes.
|
|
285
285
|
|
|
286
|
+
> Tip: Legacy commands (e.g. `show a`, `rm db`) may still work if enabled, but the commands below are the canonical interface.
|
|
286
287
|
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
#### Server
|
|
291
|
+
|
|
292
|
+
* `help` / `?` — Show help
|
|
293
|
+
* `clear` — Clear the screen
|
|
294
|
+
* `status` — Show server status (uptime / bind info)
|
|
295
|
+
* `quit` / `exit` — Exit the server shell
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
#### Users
|
|
300
|
+
|
|
301
|
+
* `users list` — List all accounts
|
|
302
|
+
* `users manage` — Manage a specific user (permissions / deletion / reservations) *(interactive)*
|
|
303
|
+
* `users purge` — Remove **all** users
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
#### Devices
|
|
308
|
+
|
|
309
|
+
* `devices list` — List all devices
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
#### Reservations
|
|
314
|
+
|
|
315
|
+
* `reservations list` — List all reservations
|
|
316
|
+
* `reservations purge` — Remove **all** reservations
|
|
287
317
|
|
|
318
|
+
---
|
|
319
|
+
|
|
320
|
+
#### Groups
|
|
321
|
+
|
|
322
|
+
* `groups list` — List user groups
|
|
323
|
+
* `groups create` — Create a user group *(interactive)*
|
|
324
|
+
* `groups edit` — Edit a user group *(interactive)*
|
|
325
|
+
* `groups delete` — Delete a user group *(interactive)*
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
#### Enrollment Codes
|
|
330
|
+
|
|
331
|
+
* `codes list` — List enrollment codes
|
|
332
|
+
* `codes create` — Create enrollment codes *(interactive)*
|
|
333
|
+
* `codes delete` — Delete an enrollment code *(interactive)*
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
#### Database
|
|
338
|
+
|
|
339
|
+
* `db reset` — Remove all database entries
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
##
|
|
288
344
|
todo:
|
|
289
345
|
<!-- Adding plutos via the CLI -->
|
|
290
346
|
<!-- Testing functionality (disregarding Host pipeline) -->
|
|
@@ -295,6 +351,8 @@ Ability to remotely manage groups and codes as admin.
|
|
|
295
351
|
|
|
296
352
|
HostRF integration -> Host directory, device routing, dynamic reservation pulling, with activity/status (online, offline, etc.)
|
|
297
353
|
|
|
354
|
+
Cleanup code comments.
|
|
355
|
+
|
|
298
356
|
Update Ian with installation demo (try myself first on the NUC once!) for both server and host.
|
|
299
357
|
|
|
300
358
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/common/grpc/__init__.py
RENAMED
|
File without changes
|
{remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/common/grpc/grpc_host_pb2.py
RENAMED
|
File without changes
|
|
File without changes
|
{remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/common/grpc/grpc_pb2.py
RENAMED
|
File without changes
|
{remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/common/grpc/grpc_pb2_grpc.py
RENAMED
|
File without changes
|
{remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/common/utils/__init__.py
RENAMED
|
File without changes
|
{remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/common/utils/ansi_codes.py
RENAMED
|
File without changes
|
{remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/common/utils/api_token.py
RENAMED
|
File without changes
|
{remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/common/utils/db_connection.py
RENAMED
|
File without changes
|
{remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/common/utils/db_location.py
RENAMED
|
File without changes
|
{remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/common/utils/list_string.py
RENAMED
|
File without changes
|
{remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/common/utils/process_arg.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/host/host_directory_store.py
RENAMED
|
File without changes
|
{remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/host/host_tunnel_server.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/server/cert_provider.py
RENAMED
|
File without changes
|
{remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/server/device_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server/server/user_group_handler.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server.egg-info/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|
{remoterf_server-0.1.58 → remoterf_server-0.1.59}/src/remoteRF_server.egg-info/top_level.txt
RENAMED
|
File without changes
|