Ground-Zerro / Phobos Public
Code Issues Pull requests Actions Releases View on GitHub ↗
4.9 KB plaintext
<template>
  <main v-if="data">
    <FormElement @submit.prevent="submit">
      <FormGroup>
        <FormNumberField
          id="mtu"
          v-model="data.mtu"
          :label="$t('general.mtu')"
          :description="$t('admin.interface.mtuDesc')"
        />
        <FormTextField
          id="device"
          v-model="data.device"
          :label="$t('admin.interface.device')"
          :description="$t('admin.interface.deviceDesc')"
        />
      </FormGroup>
      <FormGroup>
        <FormHeading>{{ $t('admin.interface.firewall') }}</FormHeading>
        <FormSwitchField
          id="firewallEnabled"
          v-model="data.firewallEnabled"
          :label="$t('admin.interface.firewallEnabled')"
          :description="$t('admin.interface.firewallEnabledDesc')"
        />
      </FormGroup>
      <FormGroup>
        <FormHeading>{{ $t('admin.interface.egress') }}</FormHeading>
        <FormSwitchField
          id="egressWarp"
          v-model="warpEgress"
          :label="$t('admin.interface.egressWarp')"
          :description="$t('admin.interface.egressWarpDesc')"
        />
      </FormGroup>
      <FormGroup>
        <FormHeading>{{ $t('admin.interface.subnet') }}</FormHeading>
        <FormTextField
          id="ipv4Cidr"
          :model-value="data.ipv4Cidr"
          :on-update:model-value="() => {}"
          :disabled="true"
          :label="$t('admin.interface.ipv4Cidr')"
          :description="$t('admin.interface.ipv4CidrDesc')"
        />
        <FormTextField
          id="ipv6Cidr"
          :model-value="data.ipv6Cidr"
          :on-update:model-value="() => {}"
          :disabled="true"
          :label="$t('admin.interface.ipv6Cidr')"
          :description="$t('admin.interface.ipv6CidrDesc')"
        />
        <AdminCidrDialog
          trigger-class="col-span-2"
          :ipv4-cidr="data.ipv4Cidr"
          :ipv6-cidr="data.ipv6Cidr"
          @change="changeCidr"
        >
          <FormSecondaryActionField
            :label="$t('admin.interface.changeCidr')"
            class="w-full"
            tabindex="-1"
          />
        </AdminCidrDialog>
      </FormGroup>
      <FormGroup>
        <FormHeading>{{ $t('admin.interface.publicAddress') }}</FormHeading>
        <FormTextField
          id="serverPublicIpV4"
          v-model="data.serverPublicIpV4"
          :disabled="!!data.serverPublicDomain"
          :label="$t('admin.interface.publicIpV4')"
          :description="$t('admin.interface.publicIpV4Desc')"
        />
        <FormNullTextField
          id="serverPublicIpV6"
          v-model="data.serverPublicIpV6"
          :disabled="!!data.serverPublicDomain"
          :label="$t('admin.interface.publicIpV6')"
          :description="$t('admin.interface.publicIpV6Desc')"
        />
        <FormNullTextField
          id="serverPublicDomain"
          v-model="data.serverPublicDomain"
          :label="$t('admin.interface.publicDomain')"
          :description="$t('admin.interface.publicDomainDesc')"
        />
      </FormGroup>
      <FormGroup>
        <FormHeading>{{ $t('form.actions') }}</FormHeading>
        <FormPrimaryActionField type="submit" :label="$t('form.save')" />
        <FormSecondaryActionField :label="$t('form.revert')" @click="revert" />
        <AdminRestartInterfaceDialog
          trigger-class="col-span-2"
          @restart="restartInterface"
        >
          <FormSecondaryActionField
            :label="$t('admin.interface.restart')"
            class="w-full"
            tabindex="-1"
          />
        </AdminRestartInterfaceDialog>
      </FormGroup>
    </FormElement>
  </main>
</template>

<script setup lang="ts">
const globalStore = useGlobalStore();
const { t } = useI18n();

const { data: _data, refresh } = await useFetch(`/api/admin/interface`, {
  method: 'get',
});

const data = toRef(_data.value);

const warpEgress = computed({
  get: () => data.value?.egressMode === 'warp',
  set: (value) => {
    if (data.value) {
      data.value.egressMode = value ? 'warp' : 'wan';
    }
  },
});

const _submit = useSubmit(
  `/api/admin/interface`,
  {
    method: 'post',
  },
  {
    revert: async (success) => {
      await revert();
      if (success) {
        await globalStore.refreshInformation();
      }
    },
  }
);

function submit() {
  return _submit(data.value);
}

async function revert() {
  await refresh();
  data.value = toRef(_data.value).value;
}

const _changeCidr = useSubmit(
  `/api/admin/interface/cidr`,
  {
    method: 'post',
  },
  {
    revert,
    successMsg: t('admin.interface.cidrSuccess'),
  }
);

async function changeCidr(ipv4Cidr: string, ipv6Cidr: string) {
  await _changeCidr({ ipv4Cidr, ipv6Cidr });
}

const _restartInterface = useSubmit(
  `/api/admin/interface/restart`,
  {
    method: 'post',
  },
  {
    revert,
    successMsg: t('admin.interface.restartSuccess'),
  }
);

async function restartInterface() {
  await _restartInterface(undefined);
}
</script>