Xây dựng ứng dụng quản lý hosts đa nền tảng bằng Electron và Node.js

Ứng dụng quản lý tập tin hosts là công cụ thiết yếu cho nhà phát triển khi cần mô phỏng môi trường mạng, định tuyến tên miền về máy cục bộ hoặc chặn nội dung không mong muốn. Thay vì chỉnh sửa thủ công qua trình soạn thảo hệ thống, một giải pháp hiện đại nên tích hợp phát hiện tự động hệ điều hành, kiểm tra cú pháp thời gian thực, sao lưu linh hoạt và hỗ trợ đa nền tảng.

Cấu trúc kiến trúc chính

  • Giao diện người dùng: Xây dựng bằng HTML/CSS/JavaScript với bố cục chia hai khung — bên trái hiển thị cây thư mục các đường dẫn tiêu chuẩn của hosts trên Windows (C:\Windows\System32\drivers\etc\hosts), macOS/Linux (/etc/hosts); bên phải là vùng soạn thảo có highlight cú pháp và gợi ý lỗi.
  • Mã nền (Node.js): Sử dụng module os để xác định nền tảng, fs.promises để đọc/ghi an toàn, và child_process để thực thi lệnh làm mới DNS (ví dụ: ipconfig /flushdns trên Windows hoặc sudo dscacheutil -flushcache trên macOS).
  • Tính năng nâng cao: Hàm validateHostsEntry() kiểm tra từng dòng theo mẫu IP_ADDRESS[whitespace]DOMAIN_NAME, loại bỏ dòng trống hoặc comment không hợp lệ; nút "Chặn quảng cáo nhanh" chèn danh sách tiền định gồm 0.0.0.0 adservice.google.com, 127.0.0.1 doubleclick.net

Mẫu mã xử lý hệ điều hành

const os = require('os');
const path = require('path');

function getHostsPath() {
  const platform = os.platform();
  switch (platform) {
    case 'win32':
      return path.join(process.env.SystemRoot || 'C:\\Windows', 'System32', 'drivers', 'etc', 'hosts');
    case 'darwin':
    case 'linux':
      return '/etc/hosts';
    default:
      throw new Error(`Hệ điều hành ${platform} chưa được hỗ trợ`);
  }
}

Xử lý quyền hệ thống

Trên macOS và Linux, việc ghi vào /etc/hosts yêu cầu đặc quyền root. Ứng dụng sử dụng sudo-prompt để yêu cầu mật khẩu người dùng qua hộp thoại hệ thống thay vì chạy toàn bộ Electron dưới sudo — đảm bảo an toàn và tuân thủ nguyên tắc least privilege.

Tích hợp làm mới DNS

function flushDnsCache() {
  const platform = os.platform();
  const commands = {
    win32: ['ipconfig', '/flushdns'],
    darwin: ['dscacheutil', '-flushcache'],
    linux: ['systemd-resolve', '--flush-caches']
  };

  const [cmd, ...args] = commands[platform] || [];
  if (!cmd) return Promise.reject(new Error('Không hỗ trợ làm mới DNS trên nền tảng này'));

  return spawn(cmd, args, { stdio: 'ignore' })
    .then(() => console.log('Bộ nhớ đệm DNS đã được làm mới'))
    .catch(err => console.error('Lỗi khi làm mới DNS:', err));
}

Quy trình triển khai

Sau khi phát triển xong, ứng dụng có thể đóng gói thành tệp cài đặt độc lập cho từng nền tảng bằng electron-builder. Ngoài ra, nhờ khả năng render giao diện web trong Electron, phần giao diện cũng có thể xuất ra dạng SPA (Single Page Application) để thử nghiệm nhanh trên trình duyệt mà không cần cài đặt.

Thẻ: electron nodejs hosts dns desktop-app

Đăng vào ngày 10 tháng 6 lúc 06:04