File Master.csv trong thư mục /var/log/asterisk/cdr-csv/Master.csv
là một phần của hệ thống CDR (Call Detail Records) của Asterisk. CDR là một cơ chế quan trọng trong hệ thống VoIP (Voice over Internet Protocol) như Asterisk, giúp ghi lại thông tin chi tiết về các cuộc gọi đi và đến.
Dưới đây là một số thông tin về file Master.csv và cách nó hoạt động:
- Mục đích của Master.csv: File Master.csv chứa thông tin chi tiết về các cuộc gọi đã xảy ra trong hệ thống Asterisk. Nó là một phần quan trọng của việc ghi lại và theo dõi cuộc gọi và cung cấp thông tin về các cuộc gọi, như nguồn, đích, thời gian bắt đầu, thời gian kết thúc, thời lượng, kết quả, và nhiều thông tin khác.
- Định dạng file CSV: File Master.csv sử dụng định dạng CSV (Comma-Separated Values), trong đó mỗi dòng chứa các giá trị tương ứng với các trường dữ liệu cụ thể và các giá trị được phân tách bằng dấu phẩy (,). Các dòng này sau đó có thể được đọc và phân tích để truy xuất thông tin về các cuộc gọi.
- Thông tin chi tiết: Mỗi cuộc gọi được ghi lại trong file Master.csv bao gồm nhiều trường thông tin chi tiết như số điện thoại nguồn (src), số điện thoại đích (dst), ngữ cảnh của cuộc gọi (dcontext), kênh nguồn (source channel), kênh đích (destination channel), ứng dụng cuối cùng được sử dụng (lastapp), thời gian bắt đầu (start), thời gian cuộc gọi được trả lời (answer), thời gian kết thúc (end), thời lượng (duration), và nhiều trường thông tin khác.
- Quản lý cuộc gọi: File Master.csv giúp quản lý các cuộc gọi trong hệ thống Asterisk, theo dõi cuộc gọi đã được trả lời, cuộc gọi không được trả lời, cuộc gọi thất bại, và nhiều tình huống khác. Thông tin này có thể được sử dụng cho mục đích theo dõi, thống kê, và tính toán cước phí.
- Tùy chỉnh và cấu hình: Asterisk cho phép người quản trị tùy chỉnh các cài đặt liên quan đến ghi lại CDR, bao gồm việc xác định các trường thông tin cụ thể nào sẽ được ghi lại và nơi lưu trữ file Master.csv.
- Xử lý dữ liệu CDR: Thông tin trong file Master.csv có thể được sử dụng cho nhiều mục đích, như phân tích dữ liệu cuộc gọi, tạo báo cáo, tính toán cước phí cho dịch vụ cuộc gọi, và đối với các hệ thống quản lý cuộc gọi lớn hơn, quản lý chất lượng dịch vụ (QoS) và hiệu suất.
Tùy thuộc vào cài đặt cụ thể của hệ thống Asterisk và quản lý file, thư mục và quyền truy cập mặc định của file Master.csv có thể khác nhau. Dưới đây là một ví dụ về quyền truy cập và vị trí mặc định cho file Master.csv trên một hệ thống Linux thông thường:
Vị trí mặc định: Thường, file Master.csv được lưu trữ trong thư mục /var/log/asterisk/cdr-csv/ trên hệ thống Linux.
Quyền truy cập mặc định: Quyền truy cập cho file Master.csv có thể được cấu hình trong file cấu hình Asterisk. Tùy thuộc vào cài đặt, quyền truy cập mặc định có thể là:
- Chủ sở hữu: Thường là người dùng hoặc nhóm liên quan đến dịch vụ Asterisk.
- Quyền đọc (read): Chủ sở hữu có quyền đọc file, cho phép Asterisk ghi dữ liệu vào file.
- Quyền ghi (write): Chủ sở hữu có quyền ghi file, cho phép Asterisk ghi dữ liệu vào file.
- Quyền thực thi (execute): Thường không cần thiết cho file CSV.
Lưu ý rằng quyền truy cập cụ thể có thể được cấu hình bởi người quản trị hệ thống khi cài đặt Asterisk. Điều này có thể dựa trên yêu cầu và hạn chế bảo mật của hệ thống.
Thư mục chứa file: File Master.csv thường được lưu trữ trong thư mục /var/log/asterisk/cdr-csv/ hoặc một thư mục tương tự. Thư mục này có thể yêu cầu quyền ghi cho người dùng hoặc nhóm Asterisk để có thể tạo và ghi file.
Lưu ý rằng quyền truy cập và vị trí cụ thể của file Master.csv có thể thay đổi dựa trên cài đặt cụ thể của hệ thống Asterisk và hệ điều hành mà bạn đang sử dụng. Để biết thông tin chi tiết về quyền truy cập và vị trí của file này trong hệ thống của bạn, bạn nên xem xét tài liệu hướng dẫn hoặc tương tác với người quản trị hệ thống.
Nội dung file Master.csv thường như thế này.
"","2000","s","presskey0","""admin"" <2000>","SIP/2000-00000000","","Playback","agent-loginok","2023-09-13 16:13:11","2023-09-13 16:13:13","2023-09-13 16:13:13",2,0,"ANSWERED","DOCUMENTATION","1694621591.0",""
"","2000","JOINEMPTY","Transfer","""admin"" <2000>","SIP/2000-00000000","","Hangup","","2023-09-13 16:15:12","2023-09-13 16:15:14","2023-09-13 16:15:15",3,1,"ANSWERED","DOCUMENTATION","1694621712.0",""
"","2000","JOINEMPTY","Transfer","""admin"" <2000>","SIP/2000-00000001","","Hangup","","2023-09-13 16:24:54","2023-09-13 16:24:56","2023-09-13 16:24:57",3,1,"ANSWERED","DOCUMENTATION","1694622294.1",""
"","2000","s","Transfer","""admin"" <2000>","SIP/2000-00000002","SIP/2001-00000003","Queue","Operator,tTmc,,,3","2023-09-13 16:25:56","2023-09-13 16:25:58","2023-09-13 16:26:05",9,7,"ANSWERED","DOCUMENTATION","1694622356.2",""
"","2000","s","Transfer","""admin"" <2000>","SIP/2000-00000004","","Queue","Operator,tTmc,,,3","2023-09-13 16:26:09","2023-09-13 16:26:11","2023-09-13 16:26:14",5,3,"ANSWERED","DOCUMENTATION","1694622369.4",""
Ví dụ phân tích dòng log sau.
"","2000","s","Transfer","""admin"" <2000>","SIP/2000-00000004","","Queue","Operator,tTmc,,,3","2023-09-13 16:26:09","2023-09-13 16:26:11","2023-09-13 16:26:14",5,3,"ANSWERED","DOCUMENTATION","1694622369.4",""
Dòng dữ liệu bạn cung cấp là một mẫu ghi chú chi tiết cuộc gọi (CDR – Call Detail Record) từ file Master.csv trong Asterisk. Dưới đây là phân tích ý nghĩa của các trường trong dòng dữ liệu này:
""
: Trường này rỗng, không chứa giá trị nào."2000"
: Đây là số điện thoại nguồn (source) của cuộc gọi. Trong trường hợp này, nguồn cuộc gọi là số 2000."s"
: Đây là số điện thoại đích (destination) của cuộc gọi. Trong trường hợp này, đích cuộc gọi là “s”. Thường, “s” được sử dụng để chỉ cuộc gọi được chuyển tiếp hoặc cuộc gọi đến một trạng thái cuối cùng trong một ngữ cảnh cụ thể."Transfer"
: Đây là ngữ cảnh của cuộc gọi. Ngữ cảnh này mô tả trạng thái hoặc tình huống cụ thể của cuộc gọi, trong trường hợp này là “Transfer”."admin" <2000>
: Trường này chứa thông tin về người gọi (caller) hoặc người được gọi (callee). Trong trường hợp này, “admin” là tên người gọi và “2000” là số mở rộng (extension) của người gọi."SIP/2000-00000004"
: Đây là kênh nguồn (source channel) của cuộc gọi. Trong Asterisk, các cuộc gọi thường được liên kết với các kênh để theo dõi và quản lý.""
: Trường này rỗng, không chứa giá trị nào."Queue"
: Trường này cho biết ứng dụng cuối cùng được sử dụng trong cuộc gọi. Trong trường hợp này, cuộc gọi đã được đưa vào hàng đợi (Queue)."Operator,tTmc,,,3"
: Đây là dữ liệu của ứng dụng cuối cùng. Trong trường hợp này, dữ liệu này có nghĩa là cuộc gọi đã được chuyển đến hàng đợi với các thông số cụ thể (Operator, tTmc,,,3)."2023-09-13 16:26:09"
: Đây là thời gian bắt đầu của cuộc gọi, với định dạng “YYYY-MM-DD HH:MM:SS”."2023-09-13 16:26:11"
: Đây là thời gian cuộc gọi được trả lời."2023-09-13 16:26:14"
: Đây là thời gian kết thúc của cuộc gọi.5
: Trường này cho biết tổng thời lượng của cuộc gọi (tính bằng giây).3
: Trường này cho biết thời gian thực sự của cuộc gọi (tính bằng giây). Thời gian này thường được sử dụng để tính toán cước phí."ANSWERED"
: Đây là kết quả xử lý cuộc gọi. Trong trường hợp này, cuộc gọi đã được trả lời."DOCUMENTATION"
: Loại CDR (Call Detail Record) được sử dụng. Loại này có thể được sử dụng để xác định cách CDR được ghi lại và xử lý."1694622369.4"
: Đây là ID duy nhất của cuộc gọi, có thể được sử dụng để theo dõi cuộc gọi trong hệ thống.""
: Trường này rỗng, không chứa giá trị nào.
Dòng dữ liệu này cung cấp thông tin chi tiết về một cuộc gọi trong Asterisk, bao gồm thông tin về nguồn, đích, thời gian, trạng thái cuộc gọi, và nhiều thông tin khác để theo dõi và phân tích cuộc gọi này.
Sử dụng Python để phân tích Master.csv.
Bạn có thể sử dụng Python để phân tích các trường trong file Master.csv sử dụng với mục đích tạo các report.
import csv, json
from datetime import datetime
file_path = '/var/log/asterisk/cdr-csv/Master.csv'
def parse_cdr_csv_lines(file_path):
with open(file_path, 'r') as csv_file:
csv_reader = csv.reader(csv_file)
next(csv_reader) # Bỏ qua dòng tiêu đề
cdr_data = [] # Danh sách lưu trữ các đối tượng JSON
for row in csv_reader:
cdr_entry = {
"accountcode": row[0],
"src": row[1],
"dst": row[2],
"dcontext": row[3],
"channel": row[5],
"dstchannel": row[6],
"lastapp": row[7],
"lastdata": row[8],
"username": "admin",
"exten": "2000",
"disposition": row[14],
"amaflags": row[15],
"uniqueid": row[16],
"linkedid": "",
}
# Tách thời gian và ngày tháng thành thành phần riêng biệt
start_datetime = datetime.strptime(row[9], '%Y-%m-%d %H:%M:%S')
cdr_entry["start_date"] = start_datetime.strftime('%Y-%m-%d')
cdr_entry["start_time"] = start_datetime.strftime('%H:%M:%S')
answer_datetime = datetime.strptime(row[10], '%Y-%m-%d %H:%M:%S')
cdr_entry["answer_date"] = answer_datetime.strftime('%Y-%m-%d')
cdr_entry["answer_time"] = answer_datetime.strftime('%H:%M:%S')
end_datetime = datetime.strptime(row[11], '%Y-%m-%d %H:%M:%S')
cdr_entry["end_date"] = end_datetime.strftime('%Y-%m-%d')
cdr_entry["end_time"] = end_datetime.strftime('%H:%M:%S')
cdr_entry["duration"] = row[12]
cdr_entry["billsec"] = row[13]
cdr_data.append(cdr_entry)
# Chuyển đổi danh sách các đối tượng thành chuỗi JSON
json_data = json.dumps(cdr_data, indent=4, ensure_ascii=False)
# In ra kết quả
print(json_data)
return json_data
Khi bạn chạy hàm bạn sẽ có kết quả.
[
{
"accountcode": "",
"src": "2000",
"dst": "JOINEMPTY",
"dcontext": "Transfer",
"channel": "SIP/2000-00000000",
"dstchannel": "",
"lastapp": "Hangup",
"lastdata": "",
"username": "admin",
"exten": "2000",
"disposition": "ANSWERED",
"amaflags": "DOCUMENTATION",
"uniqueid": "1694621712.0",
"linkedid": "",
"start_date": "2023-09-13",
"start_time": "16:15:12",
"answer_date": "2023-09-13",
"answer_time": "16:15:14",
"end_date": "2023-09-13",
"end_time": "16:15:15",
"duration": "3",
"billsec": "1"
},
{
"accountcode": "",
"src": "2000",
"dst": "s",
"dcontext": "Transfer",
"channel": "SIP/2000-00000004",
"dstchannel": "",
"lastapp": "Queue",
"lastdata": "Operator,tTmc,,,3",
"username": "admin",
"exten": "2000",
"disposition": "ANSWERED",
"amaflags": "DOCUMENTATION",
"uniqueid": "1694622369.4",
"linkedid": "",
"start_date": "2023-09-13",
"start_time": "16:26:09",
"answer_date": "2023-09-13",
"answer_time": "16:26:11",
"end_date": "2023-09-13",
"end_time": "16:26:14",
"duration": "5",
"billsec": "3"
}
]
Ý nghĩa từng trường trong dữ liệu CDR trên:
- “accountcode”: Trường này thường được sử dụng để lưu trữ mã tài khoản hoặc mã khách hàng. Trong trường hợp này, nó không được sử dụng và để trống.
- “src”: Đây là số điện thoại nguồn (source) của cuộc gọi, trong trường hợp này là “2000”.
- “dst”: Đây là số điện thoại đích (destination) của cuộc gọi, trong trường hợp này là “s”.
- “dcontext”: Đây là ngữ cảnh (context) của cuộc gọi, có thể xác định quy tắc xử lý cuộc gọi. Trong trường hợp này, nó là “Transfer”.
- “channel”: Kênh nguồn (source channel) của cuộc gọi, trong trường hợp này là “SIP/2000-00000004”.
- “dstchannel”: Kênh đích (destination channel) của cuộc gọi, trong trường hợp này để trống.
- “lastapp”: Là ứng dụng cuối cùng được sử dụng trong cuộc gọi, trong trường hợp này là “Queue”.
- “lastdata”: Dữ liệu của ứng dụng cuối cùng, trong trường hợp này là “Operator,tTmc,,,3”.
- “username”: Tên người dùng liên quan đến cuộc gọi, trong trường hợp này là “admin”.
- “exten”: Số mở rộng (extension) liên quan đến cuộc gọi, trong trường hợp này là “2000”.
- “disposition”: Kết quả xử lý cuộc gọi, trong trường hợp này là “ANSWERED,” cho biết cuộc gọi đã được trả lời.
- “amaflags”: Loại CDR (Call Detail Record) được sử dụng, trong trường hợp này là “DOCUMENTATION.”
- “uniqueid”: ID duy nhất của cuộc gọi, có thể được sử dụng để theo dõi cuộc gọi trong hệ thống.
- “linkedid”: ID liên kết với cuộc gọi, trong trường hợp này để trống.
- “start_date” và “start_time”: Ngày và giờ bắt đầu cuộc gọi.
- “answer_date” và “answer_time”: Ngày và giờ cuộc gọi được trả lời.
- “end_date” và “end_time”: Ngày và giờ kết thúc cuộc gọi.
- “duration”: Thời gian tổng cộng của cuộc gọi (tính bằng giây).
- “billsec”: Thời gian thực sự của cuộc gọi (tính bằng giây) trong trường hợp này là “3” giây. Thời gian này thường được sử dụng để tính toán cước phí.