Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

certbot: shutdown cancels an in-flight ACME order and skips DNS-01 TXT cleanup

Đang mở
#1,013 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

Chưa có ai nhận issue này.

Đánh giá

Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức phù hợp với người mới
52/100
Loại issue
Lỗi
Độ rõ ràng
Khá rõ ràng
Mức độ hoạt động
Ít trao đổi
Công nghệ
rust
Lĩnh vực
backend, cli, security

Hướng nghiên cứu

Đọc dstack/certbot/cli/src/main.rs và dstack/certbot/src/acme_client.rs, đặc biệt là shutdown select, luồng renew_inner và phần dọn dẹp DNS-01 gần dòng 185. Theo dõi hành vi renew_timeout hiện có và chạy các bài kiểm tra certbot hoặc các kiểm tra liên quan đến shutdown. Được coi là hoàn thành khi shutdown xử lý cả các lần gia hạn đang ở trạng thái chờ và đang diễn ra trong một thời hạn có giới hạn, mà không để lại bản ghi TXT hoặc trạng thái ủy quyền.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

rust

Follow-up to #924.

The shutdown path added in #924 cancels the daemon future rather than letting it unwind:

// dstack/certbot/cli/src/main.rs
tokio::select! {
    _ = bot.run() => unreachable!("certbot daemon returned"),
    result = shutdown_signal() => result?,
}

If the signal lands while renew_inner is mid-ACME-order, bot.run() is dropped at its current await point and the cleanup at the end of the DNS-01 flow never runs:

// dstack/certbot/src/acme_client.rs:185
if let Err(err) = self.dns01_client.remove_record(&challenge.id).await {
    error!("failed to remove dns record {}: {err}", challenge.id);
}

Result: a stale _acme-challenge TXT record left in the DNS zone, plus a pending authorization at the CA.

This is not a regression — before #924 the default SIGTERM disposition killed the process at the same point with the same effect — and it is self-healing, because set_txt_records calls remove_txt_records(&acme_domain) before publishing new ones on the next attempt. But "stop the daemon cleanly" currently means "stop promptly", not "stop without leaving state behind", and the gap is worth closing.

Proposal

Give the loop a cancellation token instead of dropping the future:

  • check the token at the top of each iteration and in the interval wait (select! between sleep(renew_interval) and cancellation) — this covers the idle case, which is the overwhelmingly common one and is already instant today;
  • for the in-flight case, either let the current renewal run to completion under a bounded grace period before exiting, or make the DNS-01 challenge cleanup drop-safe (scope guard) so cancellation at any await point still removes the TXT record.

The grace period must stay bounded — renew_timeout already caps a single renewal, so reusing it as the shutdown deadline is a reasonable ceiling.

Ngôn ngữ chính
Rust
Star
551
Fork
97
Merge trung bình
1 ngày 8 giờ
Pull request đã merge (30 ngày)
182

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của Dstack-TEE/dstack

Tất cả issue của Dstack-TEE/dstack

Issue tương tự

Thêm issue về Rust

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.