diff --git a/examples/osal/coredns/example.vsh b/examples/osal/coredns/example.vsh index 20106952..c11a8855 100755 --- a/examples/osal/coredns/example.vsh +++ b/examples/osal/coredns/example.vsh @@ -1,4 +1,4 @@ -#!/usr/bin/env -S v -n -w -gc none -cc tcc -d use_openssl -enable-globals run +#!/usr/bin/env -S v -n -w -cg -d use_openssl -enable-globals run import freeflowuniverse.herolib.installers.infra.coredns as coredns_installer import freeflowuniverse.herolib.osal.coredns @@ -11,10 +11,36 @@ installer.start()! // TODO: create heroscript and run it to add dns records mut script := ' -dns.a_record - name: "a_rec1" - ip: "1.1.1.1" -' +!!dns.a_record + name: "host1" + ip: "1.1.1.1" + +!!dns.aaaa_record + name: "host2" + ip: "2001:db8::1" + ttl: 300 + +!!dns.mx_record + host: "mail.heroexample.com" + preference: 10 + ttl: 300 + +!!dns.txt_record + text: "v=spf1 mx ~all" + ttl: 300 + +!!dns.srv_record + target: "sip.heroexample.com" + port: 5060 + priority: 10 + weight: 100 + ttl: 300 + +!!dns.ns_record + host: "ns1.heroexample.com" + ttl: 300 + ' mut plbook := playbook.new(text: script)! -coredns.play_dns(mut plbook)! +rec := coredns.play_dns(mut plbook)! +rec.set('heroexample.com')! diff --git a/install_v.sh b/install_v.sh index 32c28f4f..6f0a462e 100755 --- a/install_v.sh +++ b/install_v.sh @@ -181,7 +181,7 @@ function os_update { fi #apt install apt-transport-https ca-certificates curl software-properties-common -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" --force-yes package_install "apt-transport-https ca-certificates curl wget software-properties-common tmux" - package_install "rclone rsync mc redis-server screen net-tools git dnsutils htop ca-certificates screen lsb-release binutils pkg-config" + package_install "rclone rsync mc redis-server screen net-tools git dnsutils htop ca-certificates screen lsb-release binutils pkg-config libssl-dev iproute2" elif [[ "${OSNAME}" == "darwin"* ]]; then if command -v brew >/dev/null 2>&1; then diff --git a/lib/installers/infra/coredns/coredns_actions.v b/lib/installers/infra/coredns/coredns_actions.v index 9b6bcc5d..f7f46c0c 100644 --- a/lib/installers/infra/coredns/coredns_actions.v +++ b/lib/installers/infra/coredns/coredns_actions.v @@ -132,10 +132,7 @@ fn build() ! { mut path := pathlib.get_file(path: '${gitpath}/plugin.cfg', create: true)! path.write(pluginsfile)! - cmd := ' - cd ${gitpath} - make - ' + cmd := 'bash -c "cd ${gitpath} && make"' osal.execute_stdout(cmd)! // now copy to the default bin path diff --git a/lib/osal/coredns/populator.v b/lib/osal/coredns/populator.v index b5a3707b..b785994c 100644 --- a/lib/osal/coredns/populator.v +++ b/lib/osal/coredns/populator.v @@ -1,6 +1,5 @@ module coredns -import json import freeflowuniverse.herolib.core.redisclient import x.json2 @@ -85,13 +84,14 @@ pub fn (mut rs DNSRecordSet) set_soa(args SOARecord) { // populate_redis populates Redis with the DNS records // domain e.g. example.com. (not sure the . is at end) -pub fn (rs DNSRecordSet) set(domain string) ! { +pub fn (rs DNSRecordSet) set(domain_ string) ! { + domain := '_dns:${domain_}' mut redis := rs.redis or { redisclient.core_get()! } - + println('setting: ${rs}') // Store SRV records for srv in rs.srv { key := '_ssh._tcp.host1' - value := json.encode({ + value := json2.encode({ 'srv': { 'ttl': '${srv.ttl}' 'target': '${srv.target}' @@ -119,23 +119,26 @@ pub fn (rs DNSRecordSet) set(domain string) ! { 'ttl': rs.mx[0].ttl } } - redis.hset(domain, '*', json.encode(records))! + redis.hset(domain, '*', json2.encode(records))! } // Store A records for a in rs.a { - value := json.encode({ + value := json2.encode({ 'a': { 'ip4': a.ip 'ttl': '${a.ttl}' } }) + println('redis: ${redis}') + println('domain: ${domain}') + println('value: ${value}') redis.hset(domain, a.name, value)! } // Store AAAA records for aaaa in rs.aaaa { - value := json.encode({ + value := json2.encode({ 'aaaa': { 'ip6': aaaa.ip 'ttl': '${aaaa.ttl}' @@ -146,14 +149,14 @@ pub fn (rs DNSRecordSet) set(domain string) ! { // Store NS records if rs.ns.len > 0 { - mut ns_records := []map[string]string{} + mut ns_records := []json2.Any{} for ns in rs.ns { - ns_records << { + ns_records << json2.raw_decode(json2.encode({ 'host': ns.host 'ttl': '${ns.ttl}' - } + }))! } - value := json.encode({ + value := json2.encode({ 'ns': ns_records }) redis.hset(domain, 'subdel', value)! @@ -162,7 +165,7 @@ pub fn (rs DNSRecordSet) set(domain string) ! { // Store SOA and root NS records at @ if soa := rs.soa { mut root_records := map[string]json2.Any{} - root_records['soa'] = json2.Any(json2.map_from({ + root_records['soa'] = json2.raw_decode(json2.encode({ 'ttl': '${soa.ttl}' 'minttl': '${soa.minttl}' 'mbox': '${soa.mbox}' @@ -170,20 +173,20 @@ pub fn (rs DNSRecordSet) set(domain string) ! { 'refresh': '${soa.refresh}' 'retry': '${soa.retry}' 'expire': '${soa.expire}' - })) + }))! if rs.ns.len > 0 { - mut ns_records := []map[string]string{} + mut ns_records := []json2.Any{} for ns in rs.ns { - ns_records << { + ns_records << json2.raw_decode(json2.encode({ 'host': ns.host 'ttl': '${ns.ttl}' - } + }))! } - root_records['ns'] = json2.Any(json2.map_from(ns_records)) + root_records['ns'] = json2.raw_decode(ns_records.str())! } - redis.hset(domain, '@', json.encode(root_records))! + redis.hset(domain, '@', json2.encode(root_records))! } } diff --git a/lib/osal/net.v b/lib/osal/net.v index 2414271a..27491802 100644 --- a/lib/osal/net.v +++ b/lib/osal/net.v @@ -113,7 +113,7 @@ pub fn ipaddr_pub_get() !string { //also check the address is on local interface pub fn ipaddr_pub_get_check() !string { // Check if the public IP matches any local interface - public_ip := ipaddr_pub_get_check()! + public_ip := ipaddr_pub_get()! if !is_ip_on_local_interface(public_ip)! { return error('Public IP ${public_ip} is NOT bound to any local interface (possibly behind a NAT firewall).') } @@ -123,7 +123,7 @@ pub fn ipaddr_pub_get_check() !string { // Check if the public IP matches any of the local network interfaces pub fn is_ip_on_local_interface(public_ip string) !bool { interfaces := exec(cmd: 'ip addr show', stdout: false) or { - return error('Failed to enumerate network interfaces.') + return error('Failed to enumerate network interfaces: ${err}') } lines := interfaces.output.split('\n')