Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 16 additions & 7 deletions core/routers/router.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,15 @@
change_user_status as change_user_status_on_server,
delete_user_on_server,
download_ovpn_file,
get_users_usage
)
from core.setting.core import change_config


router = APIRouter(prefix="/sync", tags=["node_sync"])


@router.post("/get-status", response_model=ResponseModel)
@router.get("/status", response_model=ResponseModel)
async def get_status(request: SetSettingsModel, api_key: str = Depends(check_api_key)):
"""Get the current status of the node and set ovpn settings"""
if request.set_new_setting:
Expand All @@ -36,8 +37,16 @@ async def get_status(request: SetSettingsModel, api_key: str = Depends(check_api
success=True, msg="Node status retrieved successfully", data=status
)

@router.get("/usage", response_model=ResponseModel)
async def get_all_user_usage(api_key: str = Depends(check_api_key)):
usages = get_users_usage()
if usages:
return ResponseModel(success=True, msg="Latest user usage received", data=usages)
return ResponseModel(success=True, msg="No user is using it.",)

@router.post("/create-user", response_model=ResponseModel)


@router.post("/user", response_model=ResponseModel)
async def create_user(user: User, api_key: str = Depends(check_api_key)):
success = create_user_on_server(user.name)
if success:
Expand All @@ -49,19 +58,19 @@ async def create_user(user: User, api_key: str = Depends(check_api_key)):
return ResponseModel(success=False, msg="Failed to create user")


@router.post("/delete-user", response_model=ResponseModel)
async def delete_user(user: User, api_key: str = Depends(check_api_key)):
result = delete_user_on_server(user.name)
@router.delete("/user/{name}", response_model=ResponseModel)
async def delete_user(name: str, api_key: str = Depends(check_api_key)):
result = delete_user_on_server(name)
if result:
return ResponseModel(
success=True,
msg="User deleted successfully",
data={"client_name": user.name},
data={"client_name": name},
)
return ResponseModel(success=False, msg="Failed to delete user")


@router.post("/change-user-status", response_model=ResponseModel)
@router.put("/user", response_model=ResponseModel)
async def change_user_status(user: User, api_key: str = Depends(check_api_key)):
result = change_user_status_on_server(user.name, user.status)
if result:
Expand Down
5 changes: 4 additions & 1 deletion core/schema/all_schemas.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from pydantic import BaseModel
from typing import Any, Optional
from typing import Any, Optional, Dict


class User(BaseModel):
Expand All @@ -18,3 +18,6 @@ class SetSettingsModel(BaseModel):
protocol: str
ovpn_port: int
set_new_setting: bool

class UsersUsage(BaseModel):
users: Dict[str, float]
25 changes: 25 additions & 0 deletions core/service/user_managment.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import os

from core.logger import logger
from core.schema.all_schemas import UsersUsage


script_path = "/root/openvpn-install.sh"
Expand Down Expand Up @@ -174,3 +175,27 @@ async def download_ovpn_file(name: str) -> str | None:
else:
create_user_on_server(name)
return await download_ovpn_file(name)


def get_users_usage() -> UsersUsage | None:
users = {}
file_path = "/var/log/openvpn-status.log"
with open(file_path) as f:
lines = f.readlines()

for line in lines:
line = line.strip()
if line.startswith("CLIENT_LIST") and not line.startswith(
"CLIENT_LIST,Common Name"
):
parts = line.split(",")
username = parts[1]
bytes_received = int(parts[5])
bytes_sent = int(parts[6])
total_bytes = bytes_received + bytes_sent
users[username] = total_bytes

if users:
return UsersUsage(users=users)
else:
return None
12 changes: 10 additions & 2 deletions installer.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,17 @@ def create_ccd() -> None:

ccd_line = f"client-config-dir {ccd_dir}\n"
ccd_exclusive_line = "ccd-exclusive\n"
statuses = "status /var/log/openvpn-status.log 10"

if ccd_line not in lines:
lines.append("\n" + ccd_line)

if ccd_exclusive_line not in lines:
lines.append(ccd_exclusive_line)

if statuses not in lines:
lines.append(statuses)

with open(server_conf, "w") as f:
f.writelines(lines)

Expand All @@ -41,7 +46,8 @@ def install_ovnode():
menu()
try:
subprocess.run(
["wget", "https://git.io/vpn", "-O", "/root/openvpn-install.sh"], check=True
["wget", "-4", "https://git.io/vpn", "-O", "/root/openvpn-install.sh"],
check=True,
) # thanks to Nyr for ovpn installation script <3 https://github.com/Nyr/openvpn-install

bash = pexpect.spawn(
Expand Down Expand Up @@ -100,7 +106,9 @@ def install_ovnode():
f.writelines(lines)

run_ovnode()
input("Successfully installed, Press Enter to return to the menu...")
input(
f"Successfully installed,\nApi key= {API_KEY}\nPort= {SERVICE_PORT}\nPress Enter to return to the menu..."
)
menu()

except Exception as e:
Expand Down
9 changes: 0 additions & 9 deletions requirements.txt

This file was deleted.