first commit

This commit is contained in:
unknown
2025-12-08 21:35:55 +09:00
commit f343f405f7
5357 changed files with 923703 additions and 0 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

71
app/schemas/admin.py Normal file
View File

@@ -0,0 +1,71 @@
from pydantic import BaseModel, EmailStr
from typing import Optional, List
from datetime import datetime
# 사용자 관리
class UserCreate(BaseModel):
username: str
email: EmailStr
password: str
full_name: Optional[str] = None
role: str = "user" # admin or user
class UserUpdate(BaseModel):
email: Optional[EmailStr] = None
password: Optional[str] = None
full_name: Optional[str] = None
role: Optional[str] = None
is_active: Optional[bool] = None
class UserInfo(BaseModel):
id: int
username: str
email: str
full_name: Optional[str]
role: str
is_active: bool
created_at: datetime
last_login: Optional[datetime]
class UserListResponse(BaseModel):
total: int
users: List[UserInfo]
# VM 접근 권한 관리
class VMAccessCreate(BaseModel):
user_id: int
vm_id: int
node: str
static_ip: Optional[str] = None
rdp_username: Optional[str] = None
rdp_password: Optional[str] = None
rdp_port: int = 3389
class VMAccessUpdate(BaseModel):
static_ip: Optional[str] = None
rdp_username: Optional[str] = None
rdp_password: Optional[str] = None
rdp_port: Optional[int] = None
is_active: Optional[bool] = None
class VMAccessInfo(BaseModel):
id: int
user_id: int
username: str # 조인해서 가져옴
vm_id: int
node: str
vm_name: Optional[str]
static_ip: Optional[str]
rdp_username: Optional[str]
rdp_port: int
is_active: bool
created_at: datetime
class VMAccessListResponse(BaseModel):
total: int
accesses: List[VMAccessInfo]
# 공통 응답
class AdminResponse(BaseModel):
success: bool
message: str

51
app/schemas/auth.py Normal file
View File

@@ -0,0 +1,51 @@
from pydantic import BaseModel, EmailStr, Field
from typing import Optional
from datetime import datetime
from app.models.user import UserRole
# 회원가입 요청
class UserRegister(BaseModel):
username: str = Field(..., min_length=3, max_length=50)
email: EmailStr
password: str = Field(..., min_length=6)
full_name: Optional[str] = None
# 로그인 요청
class UserLogin(BaseModel):
username: str
password: str
# 토큰 응답
class Token(BaseModel):
access_token: str
refresh_token: str
token_type: str = "bearer"
expires_in: int
# 토큰 페이로드
class TokenPayload(BaseModel):
sub: str # user_id
exp: datetime
role: UserRole
# 사용자 응답
class UserResponse(BaseModel):
id: int
username: str
email: str
full_name: Optional[str]
role: UserRole
is_active: bool
created_at: datetime
last_login: Optional[datetime]
class Config:
from_attributes = True
# 현재 사용자 정보
class CurrentUser(BaseModel):
id: int
username: str
email: str
role: UserRole
is_active: bool

44
app/schemas/tunnel.py Normal file
View File

@@ -0,0 +1,44 @@
from pydantic import BaseModel
from typing import Optional
from datetime import datetime
# 터널 생성 요청
class TunnelCreateRequest(BaseModel):
vm_id: int
node: str
vm_ip: Optional[str] = None # Guest Agent 없이 수동으로 IP 지정 가능
# 터널 생성 응답
class TunnelCreateResponse(BaseModel):
success: bool
message: str
session_id: str
tunnel_info: Optional['TunnelInfo'] = None
# 터널 정보
class TunnelInfo(BaseModel):
session_id: str
local_port: int
remote_host: str
remote_port: int
vm_id: int
vm_name: Optional[str] = None
rdp_username: Optional[str] = None
is_active: bool
created_at: Optional[datetime] = None
class Config:
from_attributes = True
# 터널 상태 응답
class TunnelStatusResponse(BaseModel):
session_id: str
is_active: bool
uptime_seconds: Optional[int] = None
created_at: datetime
# 터널 종료 응답
class TunnelCloseResponse(BaseModel):
success: bool
message: str
session_id: str

52
app/schemas/vm.py Normal file
View File

@@ -0,0 +1,52 @@
from pydantic import BaseModel
from typing import Optional
from datetime import datetime
# VM 정보 응답
class VMInfo(BaseModel):
vm_id: int
node: str
name: str
status: str
ip_address: Optional[str] = None
cpus: int
memory: int # MB
memory_usage: Optional[int] = None
cpu_usage: Optional[float] = None
uptime: Optional[int] = None
# 접근 권한 정보
can_start: bool = True
can_stop: bool = True
can_reboot: bool = True
can_connect: bool = True
# RDP 연결 정보 (VMAccess에서 가져옴)
rdp_username: Optional[str] = None
rdp_password: Optional[str] = None
rdp_port: int = 3389
# VM 목록 응답
class VMListResponse(BaseModel):
total: int
vms: list[VMInfo]
# VM 상세 정보
class VMDetail(VMInfo):
rdp_port: int = 3389
rdp_username: Optional[str] = None
has_guest_agent: bool = False
class Config:
from_attributes = True
# VM 제어 요청
class VMControlRequest(BaseModel):
action: str # "start", "stop", "reboot"
# VM 제어 응답
class VMControlResponse(BaseModel):
success: bool
message: str
vm_id: int
action: str