feat: DNS A/PTR with Cloudflare

This commit is contained in:
2025-03-03 19:19:17 +00:00
parent 80ae12b33f
commit 4aa96020a6
20 changed files with 560 additions and 332 deletions

View File

@ -104,6 +104,9 @@ pub trait LNVpsDb: Sync + Send {
/// List VM ip assignments
async fn insert_vm_ip_assignment(&self, ip_assignment: &VmIpAssignment) -> Result<u64>;
/// Update VM ip assignments
async fn update_vm_ip_assignment(&self, ip_assignment: &VmIpAssignment) -> Result<()>;
/// List VM ip assignments
async fn list_vm_ip_assignments(&self, vm_id: u64) -> Result<Vec<VmIpAssignment>>;

View File

@ -226,11 +226,26 @@ pub struct Vm {
#[derive(FromRow, Clone, Debug, Default)]
pub struct VmIpAssignment {
/// Unique id of this assignment
pub id: u64,
/// VM id this IP is assigned to
pub vm_id: u64,
/// IP range id
pub ip_range_id: u64,
/// The IP address (v4/v6)
pub ip: String,
/// If this record was freed
pub deleted: bool,
/// External ID pointing to a static arp entry on the router
pub arp_ref: Option<String>,
/// Forward DNS FQDN
pub dns_forward: Option<String>,
/// External ID pointing to the forward DNS entry for this IP
pub dns_forward_ref: Option<String>,
/// Reverse DNS FQDN
pub dns_reverse: Option<String>,
/// External ID pointing to the reverse DNS entry for this IP
pub dns_reverse_ref: Option<String>,
}
impl Display for VmIpAssignment {

View File

@ -290,17 +290,38 @@ impl LNVpsDb for LNVpsDbMysql {
async fn insert_vm_ip_assignment(&self, ip_assignment: &VmIpAssignment) -> Result<u64> {
Ok(sqlx::query(
"insert into vm_ip_assignment(vm_id,ip_range_id,ip) values(?, ?, ?) returning id",
"insert into vm_ip_assignment(vm_id,ip_range_id,ip,arp_ref,dns_forward,dns_forward_ref,dns_reverse,dns_reverse_ref) values(?,?,?,?,?,?,?,?) returning id",
)
.bind(ip_assignment.vm_id)
.bind(ip_assignment.ip_range_id)
.bind(&ip_assignment.ip)
.bind(&ip_assignment.arp_ref)
.bind(&ip_assignment.dns_forward)
.bind(&ip_assignment.dns_forward_ref)
.bind(&ip_assignment.dns_reverse)
.bind(&ip_assignment.dns_reverse_ref)
.fetch_one(&self.db)
.await
.map_err(Error::new)?
.try_get(0)?)
}
async fn update_vm_ip_assignment(&self, ip_assignment: &VmIpAssignment) -> Result<()> {
sqlx::query(
"update vm_ip_assignment set arp_ref = ?, dns_forward = ?, dns_forward_ref = ?, dns_reverse = ?, dns_reverse_ref = ? where id = ?",
)
.bind(&ip_assignment.arp_ref)
.bind(&ip_assignment.dns_forward)
.bind(&ip_assignment.dns_forward_ref)
.bind(&ip_assignment.dns_reverse)
.bind(&ip_assignment.dns_reverse_ref)
.bind(&ip_assignment.id)
.execute(&self.db)
.await
.map_err(Error::new)?;
Ok(())
}
async fn list_vm_ip_assignments(&self, vm_id: u64) -> Result<Vec<VmIpAssignment>> {
sqlx::query_as("select * from vm_ip_assignment where vm_id = ? and deleted = 0")
.bind(vm_id)