명령어 API
엔드포인트: /api/events/commands/
원격 서버에서 명령어를 실행하고 관리합니다.
명령어 목록 조회
명령어 목록을 페이지네이션으로 조회합니다.
GET /api/events/commands/
쿼리 파라미터
| 파라미터 | 타입 | 설명 |
|---|---|---|
server | UUID | 서버 ID로 필터링 (정확히 일치) |
shell | string | 셸 타입으로 필터링 (정확히 일치) |
requested_by | integer | 요청자 사용자 ID로 필터링 (정확히 일치) |
requested_by_isnull | boolean | 요청자가 없는 명령어 필터링 |
is_scheduled | boolean | true: 미래 예약, false: 과거/즉시 실행 |
search | string | 서버 이름, 명령어 줄, 요청자 이름으로 검색 |
ordering | string | 정렬 필드 (기본값: -scheduled_at). 옵션: added_at, scheduled_at, delivered_at, acked_at, handled_at |
page | integer | 페이지 번호 |
page_size | integer | 페이지당 결과 수 (기본값: 15, 최대: 100) |
응답
{
"count": 85,
"next": "https://your-workspace.us1.alpacon.io/api/events/commands/?page=2",
"previous": null,
"results": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"shell": "system",
"line": "df -h",
"success": true,
"result": "Filesystem Size Used Avail Use% Mounted on\n/dev/xvda1 20G 8.5G 11G 46% /",
"status": {
"text": "Success",
"color": "success",
"cancellable": false,
"message": "Finished at 2024-01-15 10:30:45"
},
"response_delay": 0.125,
"elapsed_time": 0.023,
"added_at": "2024-01-15T10:30:44Z",
"server": "7e3984de-49ab-4cc6-bcdf-21fbd35858b8",
"username": "ubuntu",
"groupname": "alpacon",
"requested_by": {
"id": 1,
"username": "admin",
"email": "admin@example.com"
},
"scheduled_at": "2024-01-15T10:30:44Z"
}
]
}
명령어 실행
하나 또는 여러 서버에서 명령어를 실행합니다. server(단일) 또는 servers(다중) 중 하나만 제공합니다.
POST /api/events/commands/
요청 파라미터
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
server | UUID | Yes* | 대상 서버 ID |
servers | array[UUID] | Yes* | 대상 서버 ID 목록 (쓰기 전용, 서버당 하나의 명령어 생성) |
line | string | Yes | 실행할 명령어 (최대 512자) |
username | string | No | 실행할 OS 사용자 (기본값: 현재 사용자) |
groupname | string | No | 실행할 OS 그룹 (기본값: alpacon) |
env | object | No | 환경 변수 |
data | string | No | 명령어에 대한 추가 데이터 |
scheduled_at | datetime | No | 예약 실행 시각 (기본값: 즉시) |
run_after | array[UUID] | No | 먼저 완료되어야 하는 명령어 ID |
* server 또는 servers 중 하나는 반드시 제공해야 합니다.
root사용자로 명령어를 실행하려면 MFA 인증이 필요합니다.
요청 본문
{
"server": "7e3984de-49ab-4cc6-bcdf-21fbd35858b8",
"line": "df -h",
"username": "ubuntu",
"groupname": "alpacon",
"env": {
"CUSTOM_VAR": "value"
}
}
요청 본문 (다중 서버)
{
"servers": [
"7e3984de-49ab-4cc6-bcdf-21fbd35858b8",
"8f4985df-50bc-42e5-b827-32fcc6655111"
],
"line": "apt update",
"username": "root"
}
응답
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"line": "df -h",
"env": null,
"data": null,
"username": "ubuntu",
"groupname": "alpacon",
"added_at": "2024-01-15T10:30:44Z",
"scheduled_at": "2024-01-15T10:30:44Z",
"server": "7e3984de-49ab-4cc6-bcdf-21fbd35858b8",
"requested_by": {
"id": 1,
"username": "admin",
"email": "admin@example.com"
},
"run_after": []
}
명령어 상세 조회
특정 명령어의 전체 세부 정보와 결과를 조회합니다.
GET /api/events/commands/{command_id}/
경로 파라미터
| 파라미터 | 타입 | 설명 |
|---|---|---|
command_id | UUID | 명령어 ID |
응답
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"shell": "system",
"line": "df -h",
"env": null,
"data": null,
"success": true,
"result": "Filesystem Size Used Avail Use% Mounted on\n/dev/xvda1 20G 8.5G 11G 46% /",
"status": {
"text": "Success",
"color": "success",
"cancellable": false,
"message": "Finished at 2024-01-15 10:30:45"
},
"response_delay": 0.125,
"elapsed_time": 0.023,
"added_at": "2024-01-15T10:30:44Z",
"scheduled_at": "2024-01-15T10:30:44Z",
"delivered_at": "2024-01-15T10:30:44.500Z",
"acked_at": "2024-01-15T10:30:44.625Z",
"handled_at": "2024-01-15T10:30:44.648Z",
"server": {
"id": "7e3984de-49ab-4cc6-bcdf-21fbd35858b8",
"name": "web-server-01"
},
"requested_by": {
"id": 1,
"username": "admin",
"email": "admin@example.com"
}
}
명령어 취소
아직 서버로 전달되지 않은 명령어(delivered_at이 null)만 취소할 수 있습니다.
DELETE /api/events/commands/{command_id}/
경로 파라미터
| 파라미터 | 타입 | 설명 |
|---|---|---|
command_id | UUID | 취소할 명령어 ID |
응답
204 No Content
명령어 상태
각 명령어는 다음 타임스탬프를 순서대로 거칩니다:
| 필드 | 설명 |
|---|---|
added_at | 명령어 생성 시각 |
scheduled_at | 예약 실행 시각 |
delivered_at | 서버로 전달된 시각 |
acked_at | 서버가 수신을 확인하고 실행을 시작한 시각 |
handled_at | 실행 완료 시각 |
status 객체는 text, color, cancellable, message 필드로 사람이 읽을 수 있는 상태 요약을 제공합니다.
오류 코드
| 상태 | 오류 코드 | 설명 |
|---|---|---|
| 400 | INVALID_COMMAND | 유효하지 않은 명령어 |
| 403 | API_TOKEN_ACL_NOT_ALLOWED | 토큰 ACL에 의해 명령어가 허용되지 않음 |
| 404 | COMMAND_NOT_FOUND | 명령어를 찾을 수 없음 |
| 409 | EVENT_COMMAND_ALREADY_SENT | 취소 불가 (이미 서버로 전달됨) |
| 503 | SERVER_NOT_CONNECTED | 서버가 오프라인 상태 |