feat: auto flag for dns
continuous-integration/drone/push Build is failing Details

This commit is contained in:
decentral1se 2021-12-22 20:46:50 +01:00
parent a07e71f7df
commit db453f0ab1
Signed by: decentral1se
GPG Key ID: 03789458B3D0C410
3 changed files with 112 additions and 1 deletions

View File

@ -410,6 +410,15 @@ var StdErrOnlyFlag = &cli.BoolFlag{
Destination: &StdErrOnly, Destination: &StdErrOnly,
} }
var AutoDNSRecord bool
var AutoDNSRecordFlag = &cli.BoolFlag{
Name: "auto",
Aliases: []string{"a"},
Value: false,
Usage: "Automatically configure DNS records",
Destination: &StdErrOnly,
}
// SSHFailMsg is a hopefully helpful SSH failure message // SSHFailMsg is a hopefully helpful SSH failure message
var SSHFailMsg = ` var SSHFailMsg = `
Woops, Abra is unable to connect to connect to %s. Woops, Abra is unable to connect to connect to %s.
@ -432,6 +441,10 @@ If your SSH private key loaded? You can check by running the following command:
ssh-add -L ssh-add -L
If, you can add it with:
ssh-add ~/.ssh/<private-key-part>
If you are using a non-default public/private key, you can configure this in If you are using a non-default public/private key, you can configure this in
your ~/.ssh/config file which Abra will read in order to figure out connection your ~/.ssh/config file which Abra will read in order to figure out connection
details: details:

View File

@ -7,6 +7,7 @@ import (
abraFormatter "coopcloud.tech/abra/cli/formatter" abraFormatter "coopcloud.tech/abra/cli/formatter"
"coopcloud.tech/abra/cli/internal" "coopcloud.tech/abra/cli/internal"
"coopcloud.tech/abra/pkg/dns"
gandiPkg "coopcloud.tech/abra/pkg/dns/gandi" gandiPkg "coopcloud.tech/abra/pkg/dns/gandi"
"github.com/libdns/gandi" "github.com/libdns/gandi"
"github.com/libdns/libdns" "github.com/libdns/libdns"
@ -27,6 +28,7 @@ var RecordNewCommand = &cli.Command{
internal.DNSValueFlag, internal.DNSValueFlag,
internal.DNSTTLFlag, internal.DNSTTLFlag,
internal.DNSPriorityFlag, internal.DNSPriorityFlag,
internal.AutoDNSRecordFlag,
}, },
Description: ` Description: `
This command creates a new domain name record for a specific zone. This command creates a new domain name record for a specific zone.
@ -38,6 +40,12 @@ Example:
abra record new foo.com -p gandi -t A -n myapp -v 192.168.178.44 abra record new foo.com -p gandi -t A -n myapp -v 192.168.178.44
Typically, you need two records, an A record which points at the zone (@.) and
a wildcard record for your apps (*.). Pass "--auto" to have Abra automatically
set this up.
abra record new --auto
You may also invoke this command in "wizard" mode and be prompted for input You may also invoke this command in "wizard" mode and be prompted for input
abra record new abra record new
@ -63,6 +71,14 @@ You may also invoke this command in "wizard" mode and be prompted for input
logrus.Fatalf("'%s' is not a supported DNS provider", internal.DNSProvider) logrus.Fatalf("'%s' is not a supported DNS provider", internal.DNSProvider)
} }
if internal.AutoDNSRecord {
logrus.Infof("automatically configuring @./*. A records for %s (--auto)", zone)
if err := autoConfigure(c, &provider, zone); err != nil {
logrus.Fatal(err)
}
return nil
}
if err := internal.EnsureDNSTypeFlag(c); err != nil { if err := internal.EnsureDNSTypeFlag(c); err != nil {
logrus.Fatal(err) logrus.Fatal(err)
} }
@ -95,7 +111,7 @@ You may also invoke this command in "wizard" mode and be prompted for input
if existingRecord.Type == record.Type && if existingRecord.Type == record.Type &&
existingRecord.Name == record.Name && existingRecord.Name == record.Name &&
existingRecord.Value == record.Value { existingRecord.Value == record.Value {
logrus.Fatal("provider library reports that this record already exists?") logrus.Fatalf("%s record for %s already exists?", record.Type, zone)
} }
} }
@ -104,6 +120,9 @@ You may also invoke this command in "wizard" mode and be prompted for input
zone, zone,
[]libdns.Record{record}, []libdns.Record{record},
) )
if err != nil {
logrus.Fatal(err)
}
if len(createdRecords) == 0 { if len(createdRecords) == 0 {
logrus.Fatal("provider library reports that no record was created?") logrus.Fatal("provider library reports that no record was created?")
@ -134,3 +153,79 @@ You may also invoke this command in "wizard" mode and be prompted for input
return nil return nil
}, },
} }
func autoConfigure(c *cli.Context, provider *gandi.Provider, zone string) error {
ipv4, err := dns.EnsureIPv4(zone)
if err != nil {
return err
}
atRecord := libdns.Record{
Type: "A",
Name: "@",
Value: ipv4,
TTL: time.Duration(internal.DNSTTL),
}
wildcardRecord := libdns.Record{
Type: "A",
Name: "*",
Value: ipv4,
TTL: time.Duration(internal.DNSTTL),
}
records := []libdns.Record{atRecord, wildcardRecord}
tableCol := []string{"type", "name", "value", "TTL", "priority"}
table := abraFormatter.CreateTable(tableCol)
for _, record := range records {
existingRecords, err := provider.GetRecords(c.Context, zone)
if err != nil {
return err
}
for _, existingRecord := range existingRecords {
if existingRecord.Type == record.Type &&
existingRecord.Name == record.Name &&
existingRecord.Value == record.Value {
logrus.Warnf("%s record for %s already exists?", record.Type, zone)
continue
}
}
createdRecords, err := provider.SetRecords(
c.Context,
zone,
[]libdns.Record{record},
)
if err != nil {
return err
}
if len(createdRecords) == 0 {
return fmt.Errorf("provider library reports that no record was created?")
}
createdRecord := createdRecords[0]
value := createdRecord.Value
if len(createdRecord.Value) > 30 {
value = fmt.Sprintf("%s...", createdRecord.Value[:30])
}
table.Append([]string{
createdRecord.Type,
createdRecord.Name,
value,
createdRecord.TTL.String(),
strconv.Itoa(createdRecord.Priority),
})
}
if table.NumLines() > 0 {
table.Render()
}
return nil
}

View File

@ -105,6 +105,9 @@ bar.example.com).
@ 1800 IN A %s @ 1800 IN A %s
* 1800 IN A %s * 1800 IN A %s
"abra record new --auto" can help you do this quickly if you use a supported
DNS provider.
`, `,
internal.HetznerCloudName, ip, rootPassword, internal.HetznerCloudName, ip, rootPassword,
ip, ip, ip, ip, ip, ip,