Improved default peer handling (#674)
Some checks failed
Docker / Build and Push (push) Has been cancelled
github-pages / deploy (push) Has been cancelled
Docker / release (push) Has been cancelled

* create default peers for newly created interfaces (#666)

* allow to manually create default peers for an interface (#666)
This commit is contained in:
h44z
2026-04-16 21:55:41 +02:00
committed by GitHub
parent 51e4c0ebf1
commit 1c133b6f6e
31 changed files with 658 additions and 336 deletions

View File

@@ -53,6 +53,7 @@ const formData = ref(freshInterface())
const isSaving = ref(false)
const isDeleting = ref(false)
const isApplyingDefaults = ref(false)
const isCreatingDefaultPeers = ref(false)
const isBackendValid = computed(() => {
if (!props.visible || !selectedInterface.value) {
@@ -313,6 +314,39 @@ async function applyPeerDefaults() {
}
}
async function createDefaultPeers() {
if (props.interfaceId==='#NEW#') {
return; // do nothing for new interfaces
}
if (!formData.value.CreateDefaultPeer) {
return; // only allowed if the interface flag is set
}
if (isCreatingDefaultPeers.value) return
isCreatingDefaultPeers.value = true
try {
await interfaces.CreateDefaultPeers(selectedInterface.value.Identifier)
notify({
title: "Default Peers Created",
text: "Created default peers for all users on this interface.",
type: 'success',
})
await peers.LoadPeers(selectedInterface.value.Identifier) // reload peers list
} catch (e) {
console.log(e)
notify({
title: "Failed to create default peers!",
text: e.toString(),
type: 'error',
})
} finally {
isCreatingDefaultPeers.value = false
}
}
async function del() {
if (isDeleting.value) return
if (!confirm(t('modals.interface-edit.confirm-delete', {id: selectedInterface.value.Identifier}))) return
@@ -490,9 +524,15 @@ async function del() {
<input v-model="formData.Disabled" class="form-check-input" type="checkbox">
<label class="form-check-label">{{ $t('modals.interface-edit.disabled.label') }}</label>
</div>
<div class="form-check form-switch" v-if="formData.Mode==='server' && settings.Setting('CreateDefaultPeer')">
<input v-model="formData.CreateDefaultPeer" class="form-check-input" type="checkbox">
<label class="form-check-label">{{ $t('modals.interface-edit.create-default-peer.label') }}</label>
<div class="d-flex align-items-center justify-content-between" v-if="formData.Mode==='server' && settings.Setting('CreateDefaultPeer')">
<div class="form-check form-switch mb-0">
<input v-model="formData.CreateDefaultPeer" class="form-check-input" type="checkbox">
<label class="form-check-label">{{ $t('modals.interface-edit.create-default-peer.label') }}</label>
</div>
<button v-if="props.interfaceId!=='#NEW#'" class="btn btn-primary btn-sm" type="button" @click.prevent="createDefaultPeers" :disabled="!formData.CreateDefaultPeer || isCreatingDefaultPeers">
<span v-if="isCreatingDefaultPeers" class="spinner-border spinner-border-sm me-1" role="status" aria-hidden="true"></span>
{{ $t('modals.interface-edit.button-create-default-peers') }}
</button>
</div>
<div class="form-check form-switch" v-if="formData.Backend==='local'">
<input v-model="formData.SaveConfig" checked="" class="form-check-input" type="checkbox">

View File

@@ -505,6 +505,7 @@
}
},
"button-apply-defaults": "Peer-Standardeinstellungen anwenden",
"button-create-default-peers": "Standard-Peers erstellen",
"confirm-delete": "Interface '{id}' wirklich löschen?"
},
"peer-view": {

View File

@@ -505,6 +505,7 @@
}
},
"button-apply-defaults": "Apply Peer Defaults",
"button-create-default-peers": "Create Default Peers",
"confirm-delete": "Are you sure you want to delete interface '{id}'?"
},
"peer-view": {

View File

@@ -495,6 +495,7 @@
}
},
"button-apply-defaults": "Aplicar Valores Predeterminados de peers",
"button-create-default-peers": "Crear Peers Predeterminados",
"confirm-delete": "Seguro que desea eliminar la interfaz '{id}'?"
},
"peer-view": {

View File

@@ -377,6 +377,7 @@
}
},
"button-apply-defaults": "Appliquer les valeurs par défaut des pairs",
"button-create-default-peers": "Créer les pairs par défaut",
"confirm-delete": "Voulez-vous vraiment supprimer l'interface \"{id}\" ?"
},
"peer-view": {

View File

@@ -395,6 +395,7 @@
}
},
"button-apply-defaults": "피어 기본값 적용",
"button-create-default-peers": "기본 피어 생성",
"confirm-delete": "인터페이스 '{id}'를 삭제하시겠습니까?"
},
"peer-view": {

View File

@@ -415,6 +415,7 @@
}
},
"button-apply-defaults": "Aplicar Padrões de Peer",
"button-create-default-peers": "Criar Peers Padrão",
"confirm-delete": "Tem certeza que deseja excluir a interface '{id}'?"
},
"peer-view": {

View File

@@ -486,6 +486,7 @@
}
},
"button-apply-defaults": "Применить настройки пира по умолчанию",
"button-create-default-peers": "Создать пиров по умолчанию",
"confirm-delete": "Вы уверены, что хотите удалить интерфейс «{id}»?"
},
"peer-view": {

View File

@@ -377,6 +377,7 @@
}
},
"button-apply-defaults": "Застосувати значення за замовчуванням для пірів",
"button-create-default-peers": "Створити пірів за замовчуванням",
"confirm-delete": "Ви впевнені, що хочете видалити інтерфейс «{id}»?"
},
"peer-view": {

View File

@@ -355,6 +355,7 @@
}
},
"button-apply-defaults": "Áp dụng Cài đặt Mặc định của Peer",
"button-create-default-peers": "Tạo Peer Mặc định",
"confirm-delete": "Ban co chac muon xoa giao dien '{id}' khong?"
},
"peer-view": {

View File

@@ -355,6 +355,7 @@
}
},
"button-apply-defaults": "应用节点默认值",
"button-create-default-peers": "创建默认节点",
"confirm-delete": "确定要删除接口“{id}”吗?"
},
"peer-view": {

View File

@@ -148,6 +148,18 @@ export const interfaceStore = defineStore('interfaces', {
throw new Error(error)
})
},
async CreateDefaultPeers(id) {
this.fetching = true
return apiWrapper.post(`${baseUrl}/${base64_url_encode(id)}/create-default-peers`)
.then(() => {
this.fetching = false
})
.catch(error => {
this.fetching = false
console.log(error)
throw new Error(error)
})
},
async SaveConfiguration(id) {
this.fetching = true
return apiWrapper.post(`${baseUrl}/${base64_url_encode(id)}/save-config`)