mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2024-05-11 05:55:12 +00:00
MSDNS Fix pssession; Allow alternative credentials (#1140)
* Add options for PSCredentials * UTF-8 encoded reading * Fix cred comparison for session based PSRemoting * Better conditional * Fix failing test Co-authored-by: Tom Limoncelli <tlimoncelli@stackoverflow.com>
This commit is contained in:
@ -12,9 +12,11 @@ import (
|
|||||||
|
|
||||||
// This is the struct that matches either (or both) of the Registrar and/or DNSProvider interfaces:
|
// This is the struct that matches either (or both) of the Registrar and/or DNSProvider interfaces:
|
||||||
type msdnsProvider struct {
|
type msdnsProvider struct {
|
||||||
dnsserver string // Which DNS Server to update
|
dnsserver string // Which DNS Server to update
|
||||||
pssession string // Remote machine to PSSession to
|
pssession string // Remote machine to PSSession to
|
||||||
shell DNSAccessor // Handle for
|
psusername string // Remote username for PSSession
|
||||||
|
pspassword string // Remote password for PSSession
|
||||||
|
shell DNSAccessor // Handle for
|
||||||
}
|
}
|
||||||
|
|
||||||
var features = providers.DocumentationNotes{
|
var features = providers.DocumentationNotes{
|
||||||
@ -34,7 +36,7 @@ var features = providers.DocumentationNotes{
|
|||||||
// This establishes the name (all caps), and the function to call to initialize it.
|
// This establishes the name (all caps), and the function to call to initialize it.
|
||||||
func init() {
|
func init() {
|
||||||
fns := providers.DspFuncs{
|
fns := providers.DspFuncs{
|
||||||
Initializer: newDNS,
|
Initializer: newDNS,
|
||||||
RecordAuditor: AuditRecords,
|
RecordAuditor: AuditRecords,
|
||||||
}
|
}
|
||||||
providers.RegisterDomainServiceProviderType("MSDNS", fns, features)
|
providers.RegisterDomainServiceProviderType("MSDNS", fns, features)
|
||||||
@ -50,7 +52,10 @@ func newDNS(config map[string]string, metadata json.RawMessage) (providers.DNSSe
|
|||||||
var err error
|
var err error
|
||||||
|
|
||||||
p := &msdnsProvider{
|
p := &msdnsProvider{
|
||||||
dnsserver: config["dnsserver"],
|
dnsserver: config["dnsserver"],
|
||||||
|
pssession: config["pssession"],
|
||||||
|
psusername: config["psusername"],
|
||||||
|
pspassword: config["pspassword"],
|
||||||
}
|
}
|
||||||
p.shell, err = newPowerShell(config)
|
p.shell, err = newPowerShell(config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -35,6 +35,14 @@ func newPowerShell(config map[string]string) (*psHandle, error) {
|
|||||||
mconfig := middleware.NewSessionConfig()
|
mconfig := middleware.NewSessionConfig()
|
||||||
mconfig.ComputerName = pssession
|
mconfig.ComputerName = pssession
|
||||||
|
|
||||||
|
cred := &middleware.UserPasswordCredential{
|
||||||
|
Username: config["psusername"],
|
||||||
|
Password: config["pspassword"],
|
||||||
|
}
|
||||||
|
if cred.Password != "" && cred.Username != "" {
|
||||||
|
mconfig.Credential = cred
|
||||||
|
}
|
||||||
|
|
||||||
session, err := middleware.NewSession(sh, mconfig)
|
session, err := middleware.NewSession(sh, mconfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
@ -95,19 +103,20 @@ func (psh *psHandle) GetDNSZoneRecords(dnsserver, domain string) ([]nativeRecord
|
|||||||
}
|
}
|
||||||
tmpfile.Close()
|
tmpfile.Close()
|
||||||
|
|
||||||
stdout, stderr, err := psh.shell.Execute(generatePSZoneDump(dnsserver, domain, tmpfile.Name()))
|
stdout, stderr, err := psh.shell.Execute(generatePSZoneDump(dnsserver, domain))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if stdout != "" {
|
if stdout != "" {
|
||||||
fmt.Printf("STDOUT = %q\n", stderr)
|
//writing all stdout from powershell to file
|
||||||
|
ioutil.WriteFile(tmpfile.Name(), []byte(stdout), 0)
|
||||||
}
|
}
|
||||||
if stderr != "" {
|
if stderr != "" {
|
||||||
fmt.Printf("STDERROR = %q\n", stderr)
|
fmt.Printf("STDERROR = %q\n", stderr)
|
||||||
return nil, fmt.Errorf("unexpected stderr from PSZoneDump: %q", stderr)
|
return nil, fmt.Errorf("unexpected stderr from PSZoneDump: %q", stderr)
|
||||||
}
|
}
|
||||||
|
|
||||||
contents, err := utfutil.ReadFile(tmpfile.Name(), utfutil.WINDOWS)
|
contents, err := utfutil.ReadFile(tmpfile.Name(), utfutil.UTF8)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -120,7 +129,7 @@ func (psh *psHandle) GetDNSZoneRecords(dnsserver, domain string) ([]nativeRecord
|
|||||||
}
|
}
|
||||||
|
|
||||||
// powerShellDump runs a PowerShell command to get a dump of all records in a DNS zone.
|
// powerShellDump runs a PowerShell command to get a dump of all records in a DNS zone.
|
||||||
func generatePSZoneDump(dnsserver, domainname string, filename string) string {
|
func generatePSZoneDump(dnsserver, domainname string) string {
|
||||||
var b bytes.Buffer
|
var b bytes.Buffer
|
||||||
fmt.Fprintf(&b, `Get-DnsServerResourceRecord`)
|
fmt.Fprintf(&b, `Get-DnsServerResourceRecord`)
|
||||||
if dnsserver != "" {
|
if dnsserver != "" {
|
||||||
@ -129,7 +138,8 @@ func generatePSZoneDump(dnsserver, domainname string, filename string) string {
|
|||||||
fmt.Fprintf(&b, ` -ZoneName "%v"`, domainname)
|
fmt.Fprintf(&b, ` -ZoneName "%v"`, domainname)
|
||||||
fmt.Fprintf(&b, ` | `)
|
fmt.Fprintf(&b, ` | `)
|
||||||
fmt.Fprintf(&b, `ConvertTo-Json -depth 4`) // Tested with 3 (causes errors). 4 and larger work.
|
fmt.Fprintf(&b, `ConvertTo-Json -depth 4`) // Tested with 3 (causes errors). 4 and larger work.
|
||||||
fmt.Fprintf(&b, ` > %s`, filename)
|
// All file writing via dnsserver or pssession should be handled outside this function
|
||||||
|
//fmt.Fprintf(&b, ` > %s`, filename)
|
||||||
//fmt.Printf("DEBUG PSZoneDump CMD = (\n%s\n)\n", b.String())
|
//fmt.Printf("DEBUG PSZoneDump CMD = (\n%s\n)\n", b.String())
|
||||||
return b.String()
|
return b.String()
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,6 @@ import (
|
|||||||
func Test_generatePSZoneAll(t *testing.T) {
|
func Test_generatePSZoneAll(t *testing.T) {
|
||||||
type args struct {
|
type args struct {
|
||||||
dnsserver string
|
dnsserver string
|
||||||
domain string
|
|
||||||
}
|
}
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
@ -50,17 +49,17 @@ func Test_generatePSZoneDump(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "local",
|
name: "local",
|
||||||
args: args{domainname: "example.com"},
|
args: args{domainname: "example.com"},
|
||||||
want: `Get-DnsServerResourceRecord -ZoneName "example.com" | ConvertTo-Json -depth 4 > mytemp.json`,
|
want: `Get-DnsServerResourceRecord -ZoneName "example.com" | ConvertTo-Json -depth 4`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "remote",
|
name: "remote",
|
||||||
args: args{domainname: "example.com", dnsserver: "mydnsserver"},
|
args: args{domainname: "example.com", dnsserver: "mydnsserver"},
|
||||||
want: `Get-DnsServerResourceRecord -ComputerName "mydnsserver" -ZoneName "example.com" | ConvertTo-Json -depth 4 > mytemp.json`,
|
want: `Get-DnsServerResourceRecord -ComputerName "mydnsserver" -ZoneName "example.com" | ConvertTo-Json -depth 4`,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
if got := generatePSZoneDump(tt.args.dnsserver, tt.args.domainname, "mytemp.json"); got != tt.want {
|
if got := generatePSZoneDump(tt.args.dnsserver, tt.args.domainname); got != tt.want {
|
||||||
t.Errorf("generatePSZoneDump() = got=(\n%s\n) want=(\n%s\n)", got, tt.want)
|
t.Errorf("generatePSZoneDump() = got=(\n%s\n) want=(\n%s\n)", got, tt.want)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
Reference in New Issue
Block a user