Bỏ qua VPN tại nhà bằng systemd ExecCondition
Bỏ qua có chủ đích và một lệnh chuẩn bị hỏng là hai kết quả khác nhau. Xác định mã thoát của trình trợ giúp, rồi kiểm tra việc chuyển giữa các mạng.
VPN của mạng gia đình không có việc gì phải làm khi máy tính xách tay đã ở trên mạng đó. Lối tắt hấp dẫn là một lệnh chuẩn bị thoát với mã khác không; điều đó làm unit thất bại và khiến mọi bảng điều khiển trông như bị hỏng. systemd có một chỉ thị dành riêng cho kiểu quyết định này, và nó tách việc bỏ qua có chủ đích khỏi một lỗi thực sự. Làm đúng việc này chủ yếu là ghi lại ý nghĩa của từng mã thoát.
Vì sao một điều kiện tiên quyết thất bại là hình dạng sai
ExecStartPre coi việc thoát với mã khác không là lỗi khởi động, điều này đúng với một lệnh chuẩn bị dịch vụ. Dùng nó làm điều kiện khiến một quyết định chính sách không thể phân biệt với một phụ thuộc bị hỏng. ExecCondition tồn tại để một unit có thể từ chối khởi động mà không bị đánh dấu là thất bại.
Sự khác biệt đó quan trọng vào ba giờ sáng, khi không ai muốn phân tích một unit đỏ đang hành xử đúng như thiết kế. Một unit thất bại cũng che giấu những lỗi thật giữa những lỗi có chủ đích.
Viết hợp đồng mã thoát trước
Viết hợp đồng trước khi viết script. Thoát với số không nghĩa là tiếp tục, thoát với số một nghĩa là bỏ qua các lệnh khởi động còn lại, và thoát với 255 nghĩa là bản thân điều kiện không chạy được. Các mã từ hai đến 254 thường cũng có nghĩa là bỏ qua, điều dễ quên khi trình trợ giúp trả về một mã lỗi ngẫu nhiên. Tệp drop-in bên dưới gắn trình trợ giúp với tên unit thật.
[Service]
ExecCondition=/usr/local/libexec/should-start-home-vpnKiểm tra unit hiệu lực về các thiết lập SuccessExitStatus hoặc stop-post được kế thừa trước khi giả định ngữ nghĩa mặc định. Sau đó kiểm tra có chủ đích từng kết quả trong ba kết quả.
Gợi ý về mạng không phải bằng chứng về vị trí
Một địa chỉ router có thể truy cập hoặc một MAC đã biết có thể gợi ý đúng mạng, và cả hai đều không chứng minh điều đó. Một mạng khác có thể dùng lại cùng địa chỉ, dữ liệu ARP có thể đã cũ, và các định danh có thể bị giả mạo. Hãy coi việc thăm dò là một tối ưu phù hợp với chính sách, không phải kết quả xác thực.
Quyết định trước điều không chắc chắn có nghĩa là gì. Khởi động VPN khi không chắc chắn là an toàn với một máy khách vốn chỉ không kết nối được; bỏ qua nó khi không chắc chắn thì không an toàn. Hãy giới hạn việc thăm dò, và đọc giao diện đang hoạt động thay vì giả định giao diện đầu tiên trong danh sách. Một lần thăm dò bị treo tệ hơn một lần trả lời không, vì unit phải chờ nó.
Ghi lại những giả định đó bên cạnh tệp unit để người tiếp theo biết trình trợ giúp tin điều gì. Một chú thích ở đầu script là nơi rẻ nhất để giữ chúng.
Xử lý việc chuyển giữa các mạng
Điều kiện chạy khi dịch vụ khởi động và không được đánh giá lại sau đó. Một unit bị bỏ qua vẫn bị bỏ qua sau khi máy tính chuyển đến quán cà phê, và một đường hầm đang chạy vẫn được giữ sau khi máy tính về nhà. Liên kết vòng đời của thay đổi mạng với quyết định khởi động và dừng bằng một cơ chế riêng.
systemctl cat home-vpn.serviceKiểm tra bốn trường hợp: khởi động ở nhà, khởi động ở ngoài, một lần thăm dò không thể chạy, và việc chuyển giữa các mạng khi unit đang hoạt động. Giữ lý do bỏ qua hiển thị trong nhật ký để một quyết định có chủ đích không bao giờ trông giống như lỗi xác thực. Tài liệu tham chiếu dịch vụ ghi lại ngữ nghĩa thoát và phiên bản tối thiểu.