maatma: distinct add/update/delete fonctions

This commit is contained in:
nemunaire 2019-03-19 14:00:33 +01:00
parent 748939c3b4
commit b8179583e6
3 changed files with 405 additions and 135 deletions

View file

@ -1,6 +1,10 @@
package main package main
import ( import (
"crypto/sha256"
"encoding/base64"
"encoding/binary"
"encoding/hex"
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
@ -43,10 +47,21 @@ func init() {
if err := json.Unmarshal(body, &ue); err != nil { if err := json.Unmarshal(body, &ue); err != nil {
return nil, err return nil, err
} }
return true, student.UpdateNSDelegatedDomain(ps.ByName("dn"), ue.TTL, ue.Values[0]) return true, student.AddNSDelegatedDomain(ps.ByName("dn"), ue.TTL, ue.Values[0])
}))
router.PATCH("/api/ddomains/:dn/NS", apiAuthHandler(func (student Student, ps httprouter.Params, body []byte) (interface{}, error) {
var ue Entry
if err := json.Unmarshal(body, &ue); err != nil {
return nil, err
}
return true, student.UpdateNSDelegatedDomain(ps.ByName("dn"), ue.TTL, ue.ValuesFrom[0], ue.Values[0])
})) }))
router.DELETE("/api/ddomains/:dn/NS", apiAuthHandler(func (student Student, ps httprouter.Params, body []byte) (interface{}, error) { router.DELETE("/api/ddomains/:dn/NS", apiAuthHandler(func (student Student, ps httprouter.Params, body []byte) (interface{}, error) {
return true, student.DeleteRRDelegatedDomain(ps.ByName("dn"), "NS") var ue Entry
if err := json.Unmarshal(body, &ue); err != nil {
return nil, err
}
return true, student.DeleteRRDelegatedDomain(ps.ByName("dn"), "NS", ue.Values...)
})) }))
router.GET("/api/ddomains/:dn/GLUE", apiAuthHandler(func (student Student, ps httprouter.Params, body []byte) (interface{}, error) { router.GET("/api/ddomains/:dn/GLUE", apiAuthHandler(func (student Student, ps httprouter.Params, body []byte) (interface{}, error) {
return student.getRRDelegatedDomain(ps.ByName("dn"), "AAAA") return student.getRRDelegatedDomain(ps.ByName("dn"), "AAAA")
@ -56,17 +71,28 @@ func init() {
if err := json.Unmarshal(body, &ue); err != nil { if err := json.Unmarshal(body, &ue); err != nil {
return nil, err return nil, err
} }
return true, student.UpdateGLUEDelegatedDomain(ps.ByName("dn"), ue.TTL, ue.Values[0]) return true, student.AddGLUEDelegatedDomain(ps.ByName("dn"), ue.TTL, ue.Values[0])
}))
router.PATCH("/api/ddomains/:dn/AAAA", apiAuthHandler(func (student Student, ps httprouter.Params, body []byte) (interface{}, error) {
var ue Entry
if err := json.Unmarshal(body, &ue); err != nil {
return nil, err
}
return true, student.UpdateGLUEDelegatedDomain(ps.ByName("dn"), ue.TTL, ue.ValuesFrom[0], ue.Values[0])
})) }))
router.POST("/api/ddomains/:dn/GLUE", apiAuthHandler(func (student Student, ps httprouter.Params, body []byte) (interface{}, error) { router.POST("/api/ddomains/:dn/GLUE", apiAuthHandler(func (student Student, ps httprouter.Params, body []byte) (interface{}, error) {
var ue Entry var ue Entry
if err := json.Unmarshal(body, &ue); err != nil { if err := json.Unmarshal(body, &ue); err != nil {
return nil, err return nil, err
} }
return true, student.UpdateGLUEDelegatedDomain(ps.ByName("dn"), ue.TTL, ue.Values[0]) return true, student.UpdateGLUEDelegatedDomain(ps.ByName("dn"), ue.TTL, ue.ValuesFrom[0], ue.Values[0])
})) }))
router.DELETE("/api/ddomains/:dn/AAAA", apiAuthHandler(func (student Student, ps httprouter.Params, body []byte) (interface{}, error) { router.DELETE("/api/ddomains/:dn/AAAA", apiAuthHandler(func (student Student, ps httprouter.Params, body []byte) (interface{}, error) {
return true, student.DeleteRRDelegatedDomain(ps.ByName("dn"), "AAAA") var ue Entry
if err := json.Unmarshal(body, &ue); err != nil {
return nil, err
}
return true, student.DeleteRRDelegatedDomain(ps.ByName("dn"), "AAAA", ue.Values...)
})) }))
router.GET("/api/ddomains/:dn/DS", apiAuthHandler(func (student Student, ps httprouter.Params, body []byte) (interface{}, error) { router.GET("/api/ddomains/:dn/DS", apiAuthHandler(func (student Student, ps httprouter.Params, body []byte) (interface{}, error) {
return student.getRRDelegatedDomain(ps.ByName("dn"), "DS") return student.getRRDelegatedDomain(ps.ByName("dn"), "DS")
@ -76,18 +102,30 @@ func init() {
if err := json.Unmarshal(body, &ue); err != nil { if err := json.Unmarshal(body, &ue); err != nil {
return nil, err return nil, err
} }
return true, student.UpdateDSDelegatedDomain(ps.ByName("dn"), ue.TTL, ue.Values) return true, student.AddDSDelegatedDomain(ps.ByName("dn"), ue.TTL, ue.Values)
}))
router.PATCH("/api/ddomains/:dn/DS", apiAuthHandler(func (student Student, ps httprouter.Params, body []byte) (interface{}, error) {
var ue Entry
if err := json.Unmarshal(body, &ue); err != nil {
return nil, err
}
return true, student.UpdateDSDelegatedDomain(ps.ByName("dn"), ue.TTL, ue.ValuesFrom, ue.Values)
})) }))
router.DELETE("/api/ddomains/:dn/DS", apiAuthHandler(func (student Student, ps httprouter.Params, body []byte) (interface{}, error) { router.DELETE("/api/ddomains/:dn/DS", apiAuthHandler(func (student Student, ps httprouter.Params, body []byte) (interface{}, error) {
return true, student.DeleteRRDelegatedDomain(ps.ByName("dn"), "DS") var ue Entry
if err := json.Unmarshal(body, &ue); err != nil {
return nil, err
}
return true, student.DeleteRRDelegatedDomain(ps.ByName("dn"), "DS", ue.Values...)
})) }))
} }
type Entry struct { type Entry struct {
Domain string `json:"domain"` Domain string `json:"domain"`
TTL uint64 `json:"ttl"` TTL uint64 `json:"ttl"`
RR string `json:"rr"` RR string `json:"rr"`
Values []string `json:"values"` ValuesFrom []string `json:"valuesfrom,omitempty"`
Values []string `json:"values"`
} }
func runKnotc(args ...string) (out []byte, err error) { func runKnotc(args ...string) (out []byte, err error) {
@ -113,7 +151,7 @@ func parseKnotZoneRead(args ...string) (rr []Entry, err error) {
return return
} }
rr = append(rr, Entry{cols[1], ttl, cols[3], cols[4:]}) rr = append(rr, Entry{cols[1], ttl, cols[3], nil, cols[4:]})
} }
} }
@ -197,11 +235,32 @@ func (student Student) getRRDelegatedDomain(dn string, rr string) (rrs []Entry,
return return
} }
func (student Student) UpdateNSDelegatedDomain(dn string, ttl uint64, ns string) (err error) { func (student Student) AddNSDelegatedDomain(dn string, ttl uint64, ns string) (err error) {
for _, d := range []string{student.MyDelegatedDomain()} { for _, d := range []string{student.MyDelegatedDomain()} {
for _, cmd := range [][]string{ for _, cmd := range [][]string{
[]string{"zone-begin", DelegatedDomainSuffix}, []string{"zone-begin", DelegatedDomainSuffix},
[]string{"zone-unset", DelegatedDomainSuffix, d, "NS"}, []string{"zone-set", DelegatedDomainSuffix, d, fmt.Sprintf("%d", ttl), "NS", ns},
[]string{"zone-commit", DelegatedDomainSuffix},
} {
var out []byte
out, err = runKnotc(cmd...)
if err != nil && cmd[0] != "zone-unset" {
err = errors.New(fmt.Sprintf("An error occurs on command '%s': %s", strings.Join(cmd, " "), err.Error()))
log.Println(string(out))
runKnotc("zone-abort", DelegatedDomainSuffix)
return
}
}
}
return
}
func (student Student) UpdateNSDelegatedDomain(dn string, ttl uint64, oldns string, ns string) (err error) {
for _, d := range []string{student.MyDelegatedDomain()} {
for _, cmd := range [][]string{
[]string{"zone-begin", DelegatedDomainSuffix},
[]string{"zone-unset", DelegatedDomainSuffix, d, "NS", oldns},
[]string{"zone-set", DelegatedDomainSuffix, d, fmt.Sprintf("%d", ttl), "NS", ns}, []string{"zone-set", DelegatedDomainSuffix, d, fmt.Sprintf("%d", ttl), "NS", ns},
[]string{"zone-commit", DelegatedDomainSuffix}, []string{"zone-commit", DelegatedDomainSuffix},
} { } {
@ -220,7 +279,7 @@ func (student Student) UpdateNSDelegatedDomain(dn string, ttl uint64, ns string)
} }
func (student Student) UpdateGLUEDelegatedDomain(dn string, ttl uint64, aaaa string) (err error) { func (student Student) AddGLUEDelegatedDomain(dn string, ttl uint64, aaaa string) (err error) {
domains := []string{student.MyDelegatedDomain()} domains := []string{student.MyDelegatedDomain()}
found := false found := false
for _, d := range domains { for _, d := range domains {
@ -236,8 +295,40 @@ func (student Student) UpdateGLUEDelegatedDomain(dn string, ttl uint64, aaaa str
for _, cmd := range [][]string{ for _, cmd := range [][]string{
[]string{"zone-begin", DelegatedDomainSuffix}, []string{"zone-begin", DelegatedDomainSuffix},
[]string{"zone-unset", DelegatedDomainSuffix, student.MyDelegatedDomain(), "AAAA"}, []string{"zone-set", DelegatedDomainSuffix, dn, fmt.Sprintf("%d", ttl), "AAAA", aaaa},
[]string{"zone-unset", DelegatedDomainSuffix, dn, "AAAA"}, []string{"zone-commit", DelegatedDomainSuffix},
} {
var out []byte
out, err = runKnotc(cmd...)
if err != nil && cmd[0] != "zone-unset" {
err = errors.New(fmt.Sprintf("An error occurs on command '%s': %s", strings.Join(cmd, " "), err.Error()))
log.Println(string(out))
runKnotc("zone-abort", DelegatedDomainSuffix)
return
}
}
return
}
func (student Student) UpdateGLUEDelegatedDomain(dn string, ttl uint64, oldaaaa string, aaaa string) (err error) {
domains := []string{student.MyDelegatedDomain()}
found := false
for _, d := range domains {
if strings.HasSuffix(dn, d) {
found = true
}
}
if !found {
err = errors.New(fmt.Sprintf("Unable to find domain %q in your whitelist.", dn))
return
}
for _, cmd := range [][]string{
[]string{"zone-begin", DelegatedDomainSuffix},
[]string{"zone-unset", DelegatedDomainSuffix, student.MyDelegatedDomain(), "AAAA", oldaaaa},
[]string{"zone-unset", DelegatedDomainSuffix, dn, "AAAA", oldaaaa},
[]string{"zone-set", DelegatedDomainSuffix, dn, fmt.Sprintf("%d", ttl), "AAAA", aaaa}, []string{"zone-set", DelegatedDomainSuffix, dn, fmt.Sprintf("%d", ttl), "AAAA", aaaa},
[]string{"zone-commit", DelegatedDomainSuffix}, []string{"zone-commit", DelegatedDomainSuffix},
} { } {
@ -255,11 +346,60 @@ func (student Student) UpdateGLUEDelegatedDomain(dn string, ttl uint64, aaaa str
} }
func (student Student) UpdateDSDelegatedDomain(dn string, ttl uint64, ds []string) (err error) { func (student Student) AddDSDelegatedDomain(dn string, ttl uint64, dnskey []string) (err error) {
if len(dnskey) != 4 {
return errors.New("Wrong number of value for this record")
}
dshash := sha256.New()
dshash.Write([]byte("nemunai.re"))
var flag uint64
if flag, err = strconv.ParseUint(dnskey[1], 10, 16); err != nil {
return
}
binary.Write(dshash, binary.BigEndian, flag)
var proto uint8 = 3
dshash.Write([]byte{proto})
var alg uint64
if alg, err = strconv.ParseUint(dnskey[2], 10, 8); err != nil {
return
}
dshash.Write([]byte{uint8(alg)})
var pubkey []byte
if pubkey, err = base64.StdEncoding.DecodeString(strings.Replace(dnskey[3], " ", "", -1)); err != nil {
return
}
dshash.Write(pubkey)
for _, d := range []string{student.MyDelegatedDomain()} { for _, d := range []string{student.MyDelegatedDomain()} {
for _, cmd := range [][]string{ for _, cmd := range [][]string{
[]string{"zone-begin", DelegatedDomainSuffix}, []string{"zone-begin", DelegatedDomainSuffix},
[]string{"zone-unset", DelegatedDomainSuffix, d, "DS"}, []string{"zone-set", DelegatedDomainSuffix, d, fmt.Sprintf("%d", ttl), "DS", dnskey[0], dnskey[2], hex.EncodeToString(dshash.Sum(nil))},
[]string{"zone-commit", DelegatedDomainSuffix},
} {
var out []byte
out, err = runKnotc(cmd...)
if err != nil && cmd[0] != "zone-unset" {
err = errors.New(fmt.Sprintf("An error occurs on command '%s': %s", strings.Join(cmd, " "), err.Error()))
log.Println(string(out))
runKnotc("zone-abort", DelegatedDomainSuffix)
return
}
}
}
return
}
func (student Student) UpdateDSDelegatedDomain(dn string, ttl uint64, oldds []string, ds []string) (err error) {
for _, d := range []string{student.MyDelegatedDomain()} {
for _, cmd := range [][]string{
[]string{"zone-begin", DelegatedDomainSuffix},
[]string{"zone-unset", DelegatedDomainSuffix, d, "DS", strings.Join(oldds, " ")},
[]string{"zone-set", DelegatedDomainSuffix, d, fmt.Sprintf("%d", ttl), "DS", strings.Join(ds, " ")}, []string{"zone-set", DelegatedDomainSuffix, d, fmt.Sprintf("%d", ttl), "DS", strings.Join(ds, " ")},
[]string{"zone-commit", DelegatedDomainSuffix}, []string{"zone-commit", DelegatedDomainSuffix},
} { } {
@ -278,7 +418,7 @@ func (student Student) UpdateDSDelegatedDomain(dn string, ttl uint64, ds []strin
} }
func (student Student) DeleteRRDelegatedDomain(dn string, rr string) (err error) { func (student Student) DeleteRRDelegatedDomain(dn string, rr string, values ...string) (err error) {
domains := []string{student.MyDelegatedDomain()} domains := []string{student.MyDelegatedDomain()}
found := false found := false
for _, d := range domains { for _, d := range domains {
@ -292,9 +432,12 @@ func (student Student) DeleteRRDelegatedDomain(dn string, rr string) (err error)
return return
} }
zu := []string{"zone-unset", DelegatedDomainSuffix, dn, rr}
zu = append(zu, values...)
for _, cmd := range [][]string{ for _, cmd := range [][]string{
[]string{"zone-begin", DelegatedDomainSuffix}, []string{"zone-begin", DelegatedDomainSuffix},
[]string{"zone-unset", DelegatedDomainSuffix, dn, rr}, zu,
[]string{"zone-commit", DelegatedDomainSuffix}, []string{"zone-commit", DelegatedDomainSuffix},
} { } {
var out []byte var out []byte

View file

@ -155,6 +155,17 @@ angular.module("AdLinApp")
}) })
.controller("DomainsController", function($scope, $http, $interval, $location) { .controller("DomainsController", function($scope, $http, $interval, $location) {
var onUpdateEvt = [];
var callOnUpdateEvt = function() {
angular.forEach(onUpdateEvt, function(cb) {
cb();
});
}
$scope.addOnUpdateEvent = function(cb) {
onUpdateEvt.push(cb);
}
$scope.updateAssociationD = function() { $scope.updateAssociationD = function() {
$http({ $http({
method: 'GET', method: 'GET',
@ -218,25 +229,45 @@ angular.module("AdLinApp")
}); });
} }
$scope.updateNS = function(domain) { $scope.addNS = function(domain) {
$scope.nsrr = { $scope.nsrr = {
"domain": domain, "domain": domain,
"ttl": 900, "ttl": 900,
"rr": "NS", "rr": "NS",
"value": "", "values": [""],
} }
$('#NSModal').modal('show'); $('#NSModal').modal('show');
} }
$scope.updateGLUE = function(domain) { $scope.updateNS = function(domain, rr) {
$scope.nsrr = {
"domain": domain,
"ttl": 900,
"rr": "NS",
"valuesfrom": rr.values,
"values": rr.values,
}
$('#NSModal').modal('show');
}
$scope.addGLUE = function(domain) {
$scope.nsrr = { $scope.nsrr = {
"domain": domain, "domain": domain,
"ttl": 900, "ttl": 900,
"rr": "AAAA", "rr": "AAAA",
"value": "", "values": [""],
} }
$('#NSModal').modal('show'); $('#NSModal').modal('show');
} }
$scope.updateDS = function(domain) { $scope.updateGLUE = function(domain, rr) {
$scope.nsrr = {
"domain": domain,
"ttl": 900,
"rr": "AAAA",
"valuesfrom": rr.values,
"values": rr.values,
}
$('#NSModal').modal('show');
}
$scope.addDS = function(domain) {
$scope.nsrr = { $scope.nsrr = {
"domain": domain, "domain": domain,
"ttl": 900, "ttl": 900,
@ -246,13 +277,21 @@ angular.module("AdLinApp")
} }
$('#NSModal').modal('show'); $('#NSModal').modal('show');
} }
$scope.updateDS = function(domain, rr) {
$scope.nsrr = {
"domain": domain,
"ttl": 900,
"rr": "DS",
"labels": ["Key Tag", "Algo clef", "Algo hash", "Hash (hex)"],
"valuesfrom": rr.values,
"values": rr.values,
}
$('#NSModal').modal('show');
}
$scope.saveNSRR = function(nsrr) { $scope.saveNSRR = function(nsrr) {
if (nsrr.values === undefined)
nsrr.values = [nsrr.value];
$http({ $http({
method: 'POST', method: (nsrr.valuesfrom !== undefined)?'PATCH':'POST',
url: "/api/ddomains/" + nsrr.domain + "/" + nsrr.rr, url: "/api/ddomains/" + nsrr.domain + "/" + nsrr.rr,
headers: { headers: {
'Authorization': "Bearer " + sessionStorage.token 'Authorization': "Bearer " + sessionStorage.token
@ -260,62 +299,75 @@ angular.module("AdLinApp")
data: nsrr, data: nsrr,
}).then(function(response) { }).then(function(response) {
$('#NSModal').modal('hide'); $('#NSModal').modal('hide');
$location.url("./domains"); callOnUpdateEvt();
}, function(response) { }, function(response) {
alert(response.data.errmsg); alert(response.data.errmsg);
}); });
} }
$scope.delNSRR = function(nsrr) { $scope.deleteRR = function(domain, rr) {
rr["pleaseWait" + rr.rr + "del"] = true;
$http({ $http({
method: 'DELETE', method: 'DELETE',
url: "/api/ddomains/" + nsrr.domain + "/" + nsrr.rr, url: "/api/ddomains/" + domain + "/" + rr.rr,
headers: { headers: {
'Authorization': "Bearer " + sessionStorage.token 'Authorization': "Bearer " + sessionStorage.token
}, },
data: rr,
}).then(function(response) { }).then(function(response) {
$('#NSModal').modal('hide'); callOnUpdateEvt();
$location.url("./domains"); rr["pleaseWait" + rr.rr + "del"] = false;
}, function(response) { }, function(response) {
rr["pleaseWait" + rr.rr + "del"] = false;
alert(response.data.errmsg); alert(response.data.errmsg);
}); });
} }
}) })
.controller("NSDomainsController", function($scope, $http) { .controller("NSDomainsController", function($scope, $http) {
$http({ var updateNS = function() {
method: 'GET', $http({
url: "/api/ddomains/" + $scope.domain + "/NS", method: 'GET',
headers: { url: "/api/ddomains/" + $scope.domain + "/NS",
'Authorization': "Bearer " + sessionStorage.token headers: {
}, 'Authorization': "Bearer " + sessionStorage.token
}).then(function(response) { },
$scope.domainNS = response.data; }).then(function(response) {
}); $scope.domainNS = response.data;
});
}
updateNS();
$scope.addOnUpdateEvent(updateNS);
}) })
.controller("GLUEDomainsController", function($scope, $http) { .controller("GLUEDomainsController", function($scope, $http) {
$http({ var updateGLUE = function() {
method: 'GET', $http({
url: "/api/ddomains/" + $scope.domain + "/GLUE", method: 'GET',
headers: { url: "/api/ddomains/" + $scope.domain + "/GLUE",
'Authorization': "Bearer " + sessionStorage.token headers: {
}, 'Authorization': "Bearer " + sessionStorage.token
}).then(function(response) { },
$scope.domainGLUE = response.data; }).then(function(response) {
}); $scope.domainGLUE = response.data;
});
}
updateGLUE();
$scope.addOnUpdateEvent(updateGLUE);
}) })
.controller("DSDomainsController", function($scope, $http) { .controller("DSDomainsController", function($scope, $http) {
$http({ var updateDS = function() {
method: 'GET', $http({
url: "/api/ddomains/" + $scope.domain + "/DS", method: 'GET',
headers: { url: "/api/ddomains/" + $scope.domain + "/DS",
'Authorization': "Bearer " + sessionStorage.token headers: {
}, 'Authorization': "Bearer " + sessionStorage.token
}).then(function(response) { },
$scope.domainDS = response.data; }).then(function(response) {
}); $scope.domainDS = response.data;
});
}
updateDS();
$scope.addOnUpdateEvent(updateDS);
}) })

View file

@ -37,69 +37,150 @@
<h3>Délégation</h3> <h3>Délégation</h3>
<table class="table table-striped table-hover"> <ul class="nav nav-tabs" id="ddomainTabs" role="tablist">
<thead> <li class="nav-item">
<tr> <a class="nav-link active" data-toggle="tab" data-target="#NS" role="tab" aria-controls="ns" aria-selected="true">Serveurs de nom</a>
<th>Domaine</th> </li>
<th>NS</th> <li class="nav-item">
<th>GLUE</th> <a class="nav-link" data-toggle="tab" data-target="#GLUE" role="tab" aria-controls="glue" aria-selected="false">GLUE</a>
<th>DNSSEC</th> </li>
</tr> <li class="nav-item">
</thead> <a class="nav-link" data-toggle="tab" data-target="#DNSSEC" role="tab" aria-controls="dnssec" aria-selected="false">DNSSEC</a>
<tbody style="font-family: monospace"> </li>
<tr ng-repeat="domain in ddomains"> </ul>
<td>{{ domain }}</td> <div class="tab-content" id="myTabContent">
<td ng-controller="NSDomainsController"> <div class="tab-pane fade show active" id="NS" role="tabpanel" aria-labelledby="ns-tab">
<span ng-if="!domainNS" class="badge badge-pill badge-danger">Non défini</span>
<div ng-repeat="rr in domainNS"> <div ng-repeat="domain in ddomains">
{{ rr.domain }} <h4 class="text-muted">{{ domain }}</h4>
{{ rr.ttl }}
{{ rr.rr }} <table class="table table-striped table-hover" ng-controller="NSDomainsController">
<span ng-repeat="val in rr.values">{{ val }} </span> <thead>
</div> <tr>
<button class="btn btn-primary" ng-click="updateNS(domain)"> <th>Serveur DNS</th>
Mettre à jour <th>Joignable</th>
</button> </tr>
</td> </thead>
<td ng-controller="GLUEDomainsController"> <tbody style="font-family: monospace" ng-if="domainNS">
<span ng-if="!domainGLUE" class="badge badge-pill badge-danger">Non défini</span> <tr ng-repeat="rr in domainNS">
<div ng-repeat="rr in domainGLUE"> <td><span ng-repeat="val in rr.values">{{ val }} </span></td>
{{ rr.domain }} <td>
{{ rr.ttl }} <span class="badge badge-pill badge-secondary">Not implemented yet</span>
{{ rr.rr }} </td>
<span ng-repeat="val in rr.values">{{ val }} </span> <td>
</div> <button class="btn btn-warning" ng-click="updateNS(domain, rr)">Modifier</button>
<br> <button class="btn btn-danger" ng-click="deleteRR(domain, rr)">
<button class="btn btn-primary" ng-click="updateGLUE(domain)"> <span class="spinner-border spinner-border-sm" role="status" aria-hidden="true" ng-show="rr.pleaseWaitNSdel"></span>
Mettre à jour Supprimer
</button> </button>
</td> </td>
<td ng-controller="DSDomainsController"> </tr>
<span class="badge badge-pill badge-danger" ng-show="!domainDS">Non configuré</span> </tbody>
<div ng-repeat="rr in domainDS"> <tbody style="font-family: monospace" ng-if="!domainNS">
{{ rr.domain }} <tr>
{{ rr.ttl }} <td colspan="4">Vous n'avez défini aucun serveur de noms pour l'instant</td>
{{ rr.rr }} </tr>
<span ng-repeat="val in rr.values">{{ val }} </span> </tbody>
</div> <tfoot>
<br> <tr>
<button class="btn btn-primary" ng-click="updateDS(domain)"> <td colspan="3">
Mettre à jour <button class="btn btn-primary" ng-click="addNS(domain)">Ajouter un nouveau serveur de noms</button>
</button> </td>
</td> </tr>
</tr> </tfoot>
</tbody> </table>
<tfoot> </div>
<tr>
<td colspan="4"> </div>
<button class="btn btn-primary" ng-click="newDelegation()" disabled> <div class="tab-pane fade" id="GLUE" role="tabpanel" aria-labelledby="glue-tab">
<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true" ng-show="pleaseWaitNewDelegation"></span>
Demander un nouveau nom de domaine <div ng-repeat="domain in ddomains">
</button> <h4 class="text-muted">{{ domain }}</h4>
</td>
</tr> <table class="table table-striped table-hover" ng-controller="GLUEDomainsController">
</tfoot> <thead>
</table> <tr>
<th>Domaine DNS</th>
<th>IP</th>
<th>Joignable</th>
</tr>
</thead>
<tbody style="font-family: monospace" ng-if="domainGLUE">
<tr ng-repeat="rr in domainGLUE">
<td>{{ domain }}</td>
<td><span ng-repeat="val in rr.values">{{ val }} </span></td>
<td>
<span class="badge badge-pill badge-secondary">Not implemented yet</span>
</td>
<td>
<button class="btn btn-warning" ng-click="updateGLUE(domain, rr)">Modifier</button>
<button class="btn btn-danger" ng-click="deleteRR(domain, rr)">
<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true" ng-show="rr.pleaseWaitAAAAdel"></span>
Supprimer
</button>
</td>
</tr>
</tbody>
<tbody style="font-family: monospace" ng-if="!domainGLUE">
<tr>
<td colspan="4">Vous n'avez défini aucun enregistrement glue pour l'instant</td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="4">
<button class="btn btn-primary" ng-click="addGLUE(domain)">Ajouter un enregistrement glue</button>
</td>
</tr>
</tfoot>
</table>
</div>
</div>
<div class="tab-pane fade" id="DNSSEC" role="tabpanel" aria-labelledby="dnssec-tab">
<div ng-repeat="domain in ddomains">
<h4 class="text-muted">{{ domain }}</h4>
<table class="table table-striped table-hover" ng-controller="DSDomainsController">
<thead>
<tr>
<th>Key Tag</th>
<th>Algorithme de la clef</th>
<th>Algorithme de hash</th>
<th>Hash (hex)</th>
</tr>
</thead>
<tbody style="font-family: monospace" ng-if="domainDS">
<tr ng-repeat="rr in domainDS">
<td ng-repeat="val in rr.values">{{ val }}</td>
<td>
<button class="btn btn-warning" ng-click="updateDS(domain, rr)">Modifier</button>
<button class="btn btn-danger" ng-click="deleteRR(domain, rr)">
<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true" ng-show="rr.pleaseWaitDSdel"></span>
Supprimer
</button>
</td>
</tr>
</tbody>
<tbody style="font-family: monospace" ng-if="!domainDS">
<tr>
<td colspan="4">Vous n'avez défini aucun enregistrement DS pour l'instant</td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="5">
<button class="btn btn-primary" ng-click="addDS(domain)">Ajouter un enregistrement DS</button>
</td>
</tr>
</tfoot>
</table>
</div>
</div>
</div>
<div class="modal" id="NSModal" tabindex="-1" role="dialog"> <div class="modal" id="NSModal" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document"> <div class="modal-dialog" role="document">
@ -133,14 +214,9 @@
<input class="form-control-plaintext" ng-model="nsrr.rr" readonly> <input class="form-control-plaintext" ng-model="nsrr.rr" readonly>
</div> </div>
</div> </div>
<div class="form-group row" ng-if="nsrr.value !== undefined">
<label for="value" class="col-sm-2 col-form-label">Valeur</label>
<div class="col-sm-10">
<input class="form-control" id="value" ng-model="nsrr.value" autofocus>
</div>
</div>
<div class="form-group row" ng-repeat="v in nsrr.values track by $index"> <div class="form-group row" ng-repeat="v in nsrr.values track by $index">
<label for="value{{$index}}" class="col-sm-2 col-form-label">{{ nsrr.labels[$index] }}</label> <label for="value{{$index}}" class="col-sm-2 col-form-label" ng-if="nsrr.labels">{{ nsrr.labels[$index] }}</label>
<label for="value{{$index}}" class="col-sm-2 col-form-label" ng-if="!nsrr.labels">Valeur</label>
<div class="col-sm-10"> <div class="col-sm-10">
<input class="form-control" id="value{{$index}}" ng-model="nsrr.values[$index]"> <input class="form-control" id="value{{$index}}" ng-model="nsrr.values[$index]">
</div> </div>
@ -150,7 +226,6 @@
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Annuler</button> <button type="button" class="btn btn-secondary" data-dismiss="modal">Annuler</button>
<button type="button" class="btn btn-primary" ng-click="saveNSRR(nsrr)">Enregistrer</button> <button type="button" class="btn btn-primary" ng-click="saveNSRR(nsrr)">Enregistrer</button>
<button type="button" class="btn btn-danger" ng-click="delNSRR(nsrr)">Supprimer</button>
</div> </div>
</div> </div>
</div> </div>