Compare commits

...

33 Commits

Author SHA1 Message Date
e3dfc3431d v.1.2.4 release 2026-06-21 13:29:42 +02:00
ae1f3cca1b v.1.2.3 released 2026-06-14 23:37:44 +02:00
8746058c79 Different GET API calls documented 2026-06-14 23:37:33 +02:00
4a1c6bde48 Progress update in release notes 2026-06-13 23:31:55 +02:00
e39e1a2c47 Update on PUT user API call 2026-06-13 23:31:30 +02:00
f7814d1935 typo in ofice fixed to office 2026-06-13 23:29:11 +02:00
f40f3b6c0b GET Stomp API call added 2026-06-13 23:28:48 +02:00
f4e4688543 v.1.2.3 progress update 2026-06-13 00:20:58 +02:00
7b0e80a952 v.1.2.3 progress update 2026-06-13 00:14:11 +02:00
9d2892ad1d More API documentation 2026-06-09 23:55:45 +02:00
a89d467930 added more API documentation 2026-06-09 00:11:47 +02:00
697f0cc1f9 More API call documentation 2026-06-08 22:30:58 +02:00
3e7f38c497 updated API documentation 2026-05-31 00:26:38 +02:00
e6e80590cc v.1.2.2 release 2026-05-29 23:37:31 +02:00
c88a23af79 added changes in 1.2.2 2026-05-17 22:00:12 +02:00
7ba55267d1 updated icon 2026-05-17 14:48:18 +02:00
d5c5502a3e v.1.2.1 docs update 2026-05-17 14:21:47 +02:00
Marco Mooij | DigiState
bed510364e Minor change to API getting started 2026-05-15 16:01:57 +02:00
Marco Mooij | DigiState
db2b6e62b8 Access control documented 2026-05-15 13:43:56 +02:00
Marco Mooij | DigiState
8e4ea9d4a0 Removed meta data and added explicit headers to files 2026-05-15 11:27:11 +02:00
Marco Mooij | DigiState
6cb842fa6d added meta tags to documents 2026-05-15 10:57:05 +02:00
Marco Mooij | DigiState
1ccbf651e7 minor changed to index 2026-05-15 10:14:17 +02:00
Marco Mooij | DigiState
b5e5ea5365 Settings documentation added 2026-05-15 10:14:05 +02:00
64f783efd1 release notes update 2026-05-13 23:15:45 +02:00
909cbf5aed moved some installation steps from getting started to the installation guide 2026-05-13 23:15:26 +02:00
36a58cded8 changed mkdocs syling 2026-05-13 23:14:53 +02:00
f4eccc7648 Moved pages to Setttings and Access control under Portal management 2026-05-13 23:14:38 +02:00
Marco Mooij | DigiState
9afeea906b changes to css styling 2026-05-13 16:02:29 +02:00
Marco Mooij | DigiState
50b325393f Portal management pages added 2026-05-13 15:18:19 +02:00
Marco Mooij | DigiState
4d31d6173a minor change to release notes 2026-05-13 15:18:05 +02:00
Marco Mooij | DigiState
fa16147847 index file updated with description of Sentri 2026-05-13 15:17:51 +02:00
Marco Mooij | DigiState
1dd1521919 Installation guide added 2026-05-13 15:17:14 +02:00
Marco Mooij | DigiState
e82c38f7e0 Getting started added 2026-05-13 15:16:53 +02:00
45 changed files with 2036 additions and 27 deletions

View File

@@ -1,10 +1,12 @@
# API Getting Started
This document will explain how to get started with the Sentri API. This document will explain how to get started with the Sentri API.
## Requirements ## Requirements
To connect to the Sentri API, you will need the following: To connect to the Sentri API, you will need the following:
- A basic understanding of how APIs work, along with some programming or scripting experience. - A basic understanding of how APIs work, along with some programming or scripting experience.
- The Sentri base URL. - The Sentri base URL.
- An API bearer token. - An API bearer token.
- Network access from the devices making API requests to the Sentri service on port 443. - HTTPS access from the devices making API requests to the Sentri.
## Creating a authentication bearer token ## Creating a authentication bearer token
Make sure you have the `user-apitoken-self` read/write permission, as this allows you to create an authentication bearer token. Make sure you have the `user-apitoken-self` read/write permission, as this allows you to create an authentication bearer token.
@@ -17,3 +19,8 @@ c8aaf11d-e10e-11f0-9b16-00155d00153f.83f0383262a4875f6c6d4bb5aa8577818ca7f71cb2b
When you encounter a problem with the API, you will most likely receive an HTTP status code in the response. This code can help indicate the nature of the issue. When you encounter a problem with the API, you will most likely receive an HTTP status code in the response. This code can help indicate the nature of the issue.
### Response codes ### Response codes
These are some of the response codes you may receive when making a call to the API: These are some of the response codes you may receive when making a call to the API:
## Method override
Some web servers (such as Nginx) may restrict direct use of PUT and DELETE requests, which can result in a 405 Method Not Allowed response.
To work around this limitation, you can send a POST request and include the `X-HTTP-Method-Override` header to indicate the intended HTTP method (e.g., PUT or DELETE). This will be reflected in the API request examples.

View File

@@ -0,0 +1,63 @@
# PUT Activate company
Companies are imported into Sentri from external systems. Before a company can be used within Sentri, it must be activated.
This API call activates a company by changing its status from inactive to active.
#### Location
```
/api/v1/customers/companies/activate/
```
#### Permissions required
`customers-companies` RW
#### Body parameters
| Parameter | Type | Required | Description |
| ------------- | ------ | -------- | ---------------------------------------------- |
| company_uuid | string | yes | Unique id of the company |
| company_state | enum | yes | The state of the company (active or imported). |
**imported** is the state of the company when its imported from the source.
### Example Body (json)
```json
{
"company_uuid": "e0a60eba-52f6-11f1-8bcc-bc2411125ba4",
"copmany_state": "active",
}
```
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $baseUrl . '/api/v1/customers/companies/activate/',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $json_payload,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
'X-HTTP-Method-Override: PUT'
],
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($response === false) {
echo curl_error($curl);
}
curl_close($curl);
```
### Example Response
```json
"company state successfully updated"
```
#### Known errors or issues.
None are known at the time
If you do encounter issues and get an http code in return, check the response codes on this page.

View File

@@ -0,0 +1,57 @@
# DELETE Stomp
This API call deletes a stomp from a user.
#### Location
```
/api/v1/office/stompjes/
```
#### Permissions required
`office-stompjes` RW
#### Body parameters
| Parameter | Type | Required | Description |
| ---------- | ---- | -------- | ---------------------- |
| stomp_uuid | uuid | yes | Unique id of the stomp |
### Example Body (json)
```json
{
"stomp_uuid": "e0a60eba-52f6-11f1-8bcc-bc2411125ba4",
}
```
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $baseUrl . '/api/v1/office/stompjes/',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $json_payload,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
'X-HTTP-Method-Override: DELETE'
],
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($response === false) {
echo curl_error($curl);
}
curl_close($curl);
```
### Example Response
```json
"Stomp removed."
```
#### Known errors or issues.
None are known at the time
If you do encounter issues and get an http code in return, check the response codes on this page.

View File

@@ -0,0 +1,63 @@
# GET Stomp
This will get stompjes from the database.
#### Location
```
/api/v1/office/stompjes/
```
#### Permissions required
`office-stompjes` RO
#### Body parameters
| Parameter | Type | Required | Description |
| -------------------- | ------ | -------- | ----------- |
| builder[0][where][0] | string | no | |
| builder[0][where][1] | string | no | |
### Example Body (json)
None.
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $baseUrl . '/api/v1/office/stompjes/' . '?builder[0][where][0]=user_uuid&builder[0][where][1]=5219edbb-512d-11f1-8bac-bc2411125ba4',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
],
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($response === false) {
echo curl_error($curl);
}
curl_close($curl);
```
### Example Response
```json
[
{
"stomp_uuid":"16b148da-5c76-11f1-8eb6-bc2411125ba4",
"user_uuid":"5219edbb-512d-11f1-8bac-bc2411125ba4",
"stomp_timestamp":1780179768,
"stomp_reason":null
},
{
"stomp_uuid":"ea5b47d6-5c75-11f1-8eb6-bc2411125ba4",
"user_uuid":"5219edbb-512d-11f1-8bac-bc2411125ba4",
"stomp_timestamp":1780179693,
"stomp_reason":null
}
]
```
#### Known errors or issues.
None are known at the time
If you do encounter issues and get an http code in return, check the response codes on this page.

View File

@@ -0,0 +1,56 @@
# POST Stomp user
This API call adds a stomp to a user.
#### Location
```
/api/v1/office/stompjes/
```
#### Permissions required
`office-stompjes-canstomp` RW
#### Body parameters
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------------------------------- |
| user_uuid | uuid | yes | Unique id of the user to be stomped |
### Example Body (json)
```json
{
"user_uuid": "5219edbb-512d-11f1-8bac-bc2411125ba4",
}
```
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $baseUrl . '/api/v1/office/stompjes/',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $json_payload,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($response === false) {
echo curl_error($curl);
}
curl_close($curl);
```
### Example Response
```json
"Stomp added."
```
#### Known errors or issues.
None are known at the time
If you do encounter issues and get an http code in return, check the response codes on this page.

View File

@@ -0,0 +1,68 @@
# GET Portal settings
This will get all the portal settings from the database except the `mail_smtp_pass`.
#### Location
```
/api/v1/portal-management/configure/
```
#### Permissions required
`admin-portalsettings` RO.
#### Body parameters
| Parameter | Type | Required | Description |
| -------------------- | ------ | -------- | ----------- |
| builder[0][where][0] | string | no | |
| builder[0][where][1] | string | no | |
### Example Body (json)
None.
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $baseUrl . '/api/v1/portal-management/configure/',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
],
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($response === false) {
echo curl_error($curl);
}
curl_close($curl);
```
### Example Response
```json
[
{
"portal_uuid":"effda0c0-0830-11f0-9300-7e99ed98b725",
"portal_name":"Sentri",
"portal_slugify":"sentri",
"portal_provider_name":"Mooij.me",
"portal_provider_slugify":"sentri",
"admin_auth_methods":"database_auth",
"cacert_url":"N\/A",
"autop_url":"N\/A",
"mail_from_name":"Sentri",
"mail_from_address":"sentri@mooij.me",
"mail_smtp_host":"smtp.mooij.me",
"mail_smtp_secure":"tls",
"mail_smtp_port":587,
"mail_smtp_auth":1,
"mail_smtp_user":"noreply"
}
]
```
#### Known errors or issues.
None are known at the time
If you do encounter issues and get an http code in return, check the response codes on this page.

View File

@@ -0,0 +1,63 @@
# PUT Portal settings
This PUT call configures the global Sentri settings.
#### Location
```
/api/v1/portal-management/configure/
```
#### Permissions required
`admin-portalsettings` RW
#### Body parameters
| Parameter | Type | Required | Description |
| -------------------- | ------ | -------- | ------------------------------------------------------------------ |
| portal_uuid | uuid | yes | Unique id of Sentri instance. |
| portal_name | string | yes | The name of the portal. |
| portal_provider_name | string | yes | The name of the Sentri provider |
| admin_auth_methods | string | yes | The authentication method. Currently supports only `database_auth` |
### Example Body (json)
```json
{
"portal_uuid": "5219edbb-512d-11f1-8bac-bc2411125ba4",
"portal_name": "Sentri",
"portal_provider_name": "Your company name",
"admin_auth_methods": "database_auth"
}
```
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $baseUrl . '/api/v1/portal-management/configure/',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $json_payload,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
'X-HTTP-Method-Override: PUT'
],
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($response === false) {
echo curl_error($curl);
}
curl_close($curl);
```
### Example Response
```json
"portal settings updated successfully."
```
#### Known errors or issues.
None are known at the time
If you do encounter issues and get an http code in return, check the response codes on this page.

View File

@@ -0,0 +1,64 @@
# GET Group permissions
This will get all the permissions assigned to user-groups.
#### Location
```
/api/v1/portal-management/group-permissions/
```
#### Permissions required
`admin-access-control-permissions` RO.
#### Body parameters
| Parameter | Type | Required | Description |
| -------------------- | ------ | -------- | ----------- |
| builder[0][where][0] | string | no | |
| builder[0][where][1] | string | no | |
### Example Body (json)
None.
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $baseUrl . '/api/v1/portal-management/group-permissions/' . '?builder[0][where][0]=user_group_uuid&builder[0][where][1]=0e1c6269-0da5-11f0-9300-7e99ed98b725',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
],
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($response === false) {
echo curl_error($curl);
}
curl_close($curl);
```
### Example Response
```json
[
{
"permission_uuid":"11abc93d-c265-11f0-95da-7e99ed98b725",
"user_group_uuid":"0e1c6269-0da5-11f0-9300-7e99ed98b725",
"permission_value":"RW",
"permission_restrict_to_tenant":0
},
{
"permission_uuid":"1425fa24-2b6b-11f0-9300-7e99ed98b725",
"user_group_uuid":"0e1c6269-0da5-11f0-9300-7e99ed98b725",
"permission_value":"RW",
"permission_restrict_to_tenant":0
},
...
]
```
#### Known errors or issues.
None are known at the time
If you do encounter issues and get an http code in return, check the response codes on this page.

View File

@@ -0,0 +1,63 @@
# PUT Group permissions
This PUT request updates the permissions of a user group.
You can only modify a group's permissions if your group's weight is equal to or higher than the weight of the group being modified.
#### Location
```
/api/v1/portal-management/group-permissions/
```
#### Permissions required
`admin-access-control-permissions` RW
#### Body parameters
| Parameter | Type | Required | Description |
| ---------------- | ---- | -------- | ----------------------------------------- |
| permission_uuid | uuid | yes | Unique id of the permission. |
| user_group_uuid | uuid | yes | Unique id of the user group. |
| permission_value | enum | yes | The permission value (`NA`, `RO` or `RW`) |
### Example Body (json)
```json
{
"permission_uuid": "11abc93d-c265-11f0-95da-7e99ed98b725",
"user_group_uuid": "5c1f0102-51ea-11f1-8bac-bc2411125ba4",
"permission_value": "RO"
}
```
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $baseUrl . '/api/v1/portal-management/group-permissions/',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $json_payload,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
'X-HTTP-Method-Override: PUT'
],
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($response === false) {
echo curl_error($curl);
}
curl_close($curl);
```
### Example Response
```json
"Access rights changed successfully."
```
#### Known errors or issues.
None are known at the time
If you do encounter issues and get an http code in return, check the response codes on this page.

View File

@@ -0,0 +1,73 @@
# PUT Mail settings
This PUT request updates the mail settings.
#### Location
```
/api/v1/portal-management/mail/configure/
```
#### Permissions required
`admin-mailsettings` RW
#### Body parameters
| Parameter | Type | Required | Description |
| ----------------- | ------- | -------- | ---------------------------------------------------- |
| portal_uuid | uuid | yes | Unique id of the portal. |
| mail_from_name | string | yes | Mail from name. |
| mail_from_address | email | yes | Mail from address. |
| mail_smtp_host | string | yes | SMTP FQDN hostname. |
| mail_smtp_secure | enum | yes | Secure connection type. Either `tls`, `ssl` or `no`. |
| mail_smtp_port | integer | yes | Mail server port number. Default `587` or `25`. |
| mail_smtp_auth | boolean | yes | Use SMTP authentication. |
| mail_smtp_user | string | yes | SMTP authentication user. |
| mail_smtp_pass | string | yes | SMTP authentication password. |
### Example Body (json)
```json
{
"portal_uuid": "11abc93d-c265-11f0-95da-7e99ed98b725",
"mail_from_name": "Sentri Company",
"mail_from_address": "sentri@company.com",
"mail_smtp_host": "smtp.company.com",
"mail_smtp_secure": "tls",
"mail_smtp_port": 587,
"mail_smtp_auth": true,
"mail_smtp_user": "smtpuser",
"mail_smtp_pass": "securepassword"
}
```
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $baseUrl . '/api/v1/portal-management/mail/configure/',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $json_payload,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
'X-HTTP-Method-Override: PUT'
],
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($response === false) {
echo curl_error($curl);
}
curl_close($curl);
```
### Example Response
```json
"mail settings updated successfully."
```
#### Known errors or issues.
None are known at the time
If you do encounter issues and get an http code in return, check the response codes on this page.

View File

@@ -0,0 +1,56 @@
# POST Send test mail
This API call will send an test email to the given mail address.
#### Location
```
/api/v1/portal-management/mail/test/
```
#### Permissions required
`ofice-stompjes-canstomp` RW
#### Body parameters
| Parameter | Type | Required | Description |
| --------- | ----- | -------- | -------------------------------------------- |
| mailt_to | email | yes | The mail address to send the test email to. |
### Example Body (json)
```json
{
"mail_to": "test@company.com",
}
```
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $baseUrl . '/api/v1/portal-management/mail/test/',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $json_payload,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($response === false) {
echo curl_error($curl);
}
curl_close($curl);
```
### Example Response
```json
"The test email was sent."
```
#### Known errors or issues.
None are known at the time
If you do encounter issues and get an http code in return, check the response codes on this page.

View File

@@ -0,0 +1,58 @@
# GET Modules
This call gets all the Sentri modules information.
#### Location
```
/api/v1/portal-management/modules/
```
#### Permissions required
`admin-modules` RO
#### Body parameters
| Parameter | Type | Required | Description |
| -------------------- | ------ | -------- | ----------- |
| builder[0][where][0] | string | no | |
| builder[0][where][1] | string | no | |
### Example Body (json)
None.
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $baseUrl . '/api/v1/portal-management/modules/' . '?builder[0][where][0]=module_uuid&builder[0][where][1]=0f044275-1744-444c-9627-736310d7997e',
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json'
]
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
```
### Example Response
```json
[
{
"module_uuid":"0f044275-1744-444c-9627-736310d7997e",
"module_name":"Portal Management",
"module_slugify":"portal-management",
"module_enabled":1,
"module_description":null,
"module_create_timestamp":1762695975,
"module_modified_timestamp":null
}
]
```
#### Known errors or issues.
None are known at the time
If you do encounter issues and get an http code in return, check the response codes on this page.

View File

@@ -0,0 +1,61 @@
# PUT Toggle module
This PUT request enables or disables an module.
#### Location
```
/api/v1/portal-management/modules/
```
#### Permissions required
`admin-modules` RW
#### Body parameters
| Parameter | Type | Required | Description |
| -------------- | ------- | -------- | ----------------------------- |
| module_uuid | uuid | yes | Unique id of the module. |
| module_enabled | boolean | yes | Enable or disable the module. |
### Example Body (json)
```json
{
"module_uuid": "247aa89e-2ffa-4cba-8672-3fef451255b7",
"module_enabled": true
}
```
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $baseUrl . '/api/v1/portal-management/modules/',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $json_payload,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
'X-HTTP-Method-Override: PUT'
],
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($response === false) {
echo curl_error($curl);
}
curl_close($curl);
```
### Example Response
```json
"Module enabled successfully."
```
#### Known errors or issues.
None are known at the time
If you do encounter issues and get an http code in return, check the response codes on this page.

View File

@@ -0,0 +1,57 @@
# DELETE Permission
This API call deletes a permission. This is only allowed by the superuser.
#### Location
```
/api/v1/portal-management/permissions/
```
#### Permissions required
being `superuser`.
#### Body parameters
| Parameter | Type | Required | Description |
| --------------- | ---- | -------- | ---------------------------- |
| permission_uuid | uuid | yes | Unique id of the permission, |
### Example Body (json)
```json
{
"permission_uuid": "e0a60eba-52f6-11f1-8bcc-bc2411125ba4",
}
```
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $baseUrl . '/api/v1/portal-management/permissions/',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $json_payload,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
'X-HTTP-Method-Override: DELETE'
],
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($response === false) {
echo curl_error($curl);
}
curl_close($curl);
```
### Example Response
```json
"Permission deleted successfully."
```
#### Known errors or issues.
None are known at the time
If you do encounter issues and get an http code in return, check the response codes on this page.

View File

@@ -0,0 +1,58 @@
# GET Permissions
This call gets all the permissions data.
#### Location
```
/api/v1/portal-management/permissions/
```
#### Permissions required
`admin-access-control-permissions` RO.
#### Body parameters
| Parameter | Type | Required | Description |
| -------------------- | ------ | -------- | ----------- |
| builder[0][where][0] | string | no | |
| builder[0][where][1] | string | no | |
### Example Body (json)
None.
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $baseUrl . '/api/v1/portal-management/permissions/' . '?builder[0][where][0]=permission_name&builder[0][where][1]=admin-portalsettings',
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json'
]
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
```
### Example Response
```json
[
{
"permission_uuid":"1d018159-3109-11f0-9300-7e99ed98b725",
"permission_name":"admin-portalsettings",
"permission_slugify":"admin-portalsettings",
"permission_description":"Grants access to modify the global settings. It is advisable to restrict this permission to only the highest-level administrators.",
"permission_create_timestamp":1749933229,
"permission_modified_timestamp":null,
"module_uuid":"0f044275-1744-444c-9627-736310d7997e"
}
]
```
#### Known errors or issues.
None are known at the time
If you do encounter issues and get an http code in return, check the response codes on this page.

View File

@@ -0,0 +1,62 @@
# POST Permission
This API call creates a new permission. This is only allowed by the superuser.
#### Location
```
/api/v1/portal-management/permissions/
```
#### Permissions required
Being `superuser`.
#### Body parameters
| Parameter | Type | Required | Description |
| ---------------------- | ------ | -------- | ------------------------------------------- |
| permission_name | string | yes | The name of the permission. |
| permission_slugify | string | yes | The slugify version of the permission name. |
| permission_description | string | yes | The description of the permission. |
| module_uuid | uuid | yes | The `module_uuid` linked to the permission. |
### Example Body (json)
```json
{
"permission_name": "admin-test",
"permission_slugify": "admin-test",
"permission_description": "test permission.",
"module_uuid": "0f044275-1744-444c-9627-736310d7997e"
}
```
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $baseUrl . '/api/v1/portal-management/permissions/',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $json_payload,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($response === false) {
echo curl_error($curl);
}
curl_close($curl);
```
### Example Response
```json
"<permission data>"
```
#### Known errors or issues.
None are known at the time
If you do encounter issues and get an http code in return, check the response codes on this page.

View File

@@ -0,0 +1,65 @@
# PUT Permission
This PUT request updates permission data. This can only be done by the superuser
#### Location
```
/api/v1/portal-management/permissions/
```
#### Permissions required
Being `superuser`.
#### Body parameters
| Parameter | Type | Required | Description |
| ---------------------- | ------ | -------- | ------------------------------------------- |
| permission_name | string | yes | The name of the permission. |
| permission_slugify | string | yes | The slugify version of the permission name. |
| permission_description | string | yes | The description of the permission. |
| module_uuid | uuid | yes | The `module_uuid` linked to the permission. |
### Example Body (json)
```json
{
"permission_name": "admin-test",
"permission_slugify": "admin-test",
"permission_description": "test permission.",
"module_uuid": "0f044275-1744-444c-9627-736310d7997e"
}
```
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $baseUrl . '/api/v1/portal-management/modules/',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $json_payload,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
'X-HTTP-Method-Override: PUT'
],
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($response === false) {
echo curl_error($curl);
}
curl_close($curl);
```
### Example Response
```json
"Permission updated successfully."
```
#### Known errors or issues.
None are known at the time
If you do encounter issues and get an http code in return, check the response codes on this page.

View File

@@ -0,0 +1,61 @@
# POST Configure Inserve
This API call updates the Inserve configuration.
More information about the Inserve source can be found [here](Portal%20Management/Settings/Sources/Inserve.md).
#### Location
```
/api/v1/portal-management/sources/inserve/
```
#### Permissions required
`admin-sources` RW
#### Body parameters
| Parameter | Type | Required | Description |
| ------------------ | ------ | -------- | -------------------------------------------------------------------------------------------------------------- |
| source_url | string | yes | The url of the inserve instance. |
| source_auth_token | string | yes | The API token from inserve |
| source_custom_data | json | yes | The custom JSON source data. See the [Inserve](Portal%20Management/Settings/Sources/Inserve.md) documentation. |
### Example Body (json)
```json
{
"source_url": "https://company.inserve.nl",
"source_auth_token": "8TtCFdogSJmDhJC0Ii4ZVKkHplMQikNqVnY7uRuBi84IRYONfuYv7UKOxDV0PYXV",
"source_custom_data": "[]"
}
```
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $baseUrl . '/api/v1/portal-management/sources/inserve/',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $json_payload,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($response === false) {
echo curl_error($curl);
}
curl_close($curl);
```
### Example Response
```json
"Information modified"
```
#### Known errors or issues.
None are known at the time
If you do encounter issues and get an http code in return, check the response codes on this page.

View File

@@ -0,0 +1,61 @@
# DELETE user group
This API call deletes a user-group.
#### Location
```
/api/v1/portal-management/user-groups/
```
#### Permissions required
`admin-access-control-user-groups` RW.
#### Body parameters
| Parameter | Type | Required | Description |
| --------------- | ---- | -------- | ---------------------------- |
| user_group_uuid | uuid | yes | Unique id of the user-group. |
### Example Body (json)
```json
{
"user_group_uuid": "d4cbf41b-6445-11f1-a54b-bc2411125ba4"
}
```
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $baseUrl . '/api/v1/portal-management/user-groups/',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $json_payload,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
'X-HTTP-Method-Override: DELETE'
],
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($response === false) {
echo curl_error($curl);
}
curl_close($curl);
```
### Example Response
```json
"Permission deleted successfully."
```
#### Known errors or issues.
```json
{
"error":"Cannot delete record: dependent data exists."
}
```
This means there is still a user linked to the user-group, first make there are no users linked to this group before deleting.

View File

@@ -0,0 +1,58 @@
# GET user group
This call gets all the user-groups data.
#### Location
```
/api/v1/portal-management/user-groups/
```
#### Permissions required
`admin-access-control-user-groups` RO.
#### Body parameters
| Parameter | Type | Required | Description |
| -------------------- | ------ | -------- | ----------- |
| builder[0][where][0] | string | no | |
| builder[0][where][1] | string | no | |
### Example Body (json)
None.
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $baseUrl . '/api/v1/portal-management/user-groups/' . '?builder[0][where][0]=user_group_uuid&builder[0][where][1]=0e1c6269-0da5-11f0-9300-7e99ed98b725',
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json'
]
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
```
### Example Response
```json
[
{
"user_group_uuid":"0e1c6269-0da5-11f0-9300-7e99ed98b725",
"user_group_name":"superuser",
"user_group_slugify":"superuser",
"user_group_type":"admin",
"user_group_weight":1,
"user_group_create_timestamp":1742680669,
"user_group_modified_timestamp":1749939827
}
]
```
#### Known errors or issues.
None are known at the time
If you do encounter issues and get an http code in return, check the response codes on this page.

View File

@@ -0,0 +1,65 @@
# POST user group
This API call creates a user group.
#### Location
```
/api/v1/portal-management/user-groups/
```
#### Permissions required
`admin-access-control-user-groups` RW.
#### Body parameters
| Parameter | Type | Required | Description |
| ------------------ | ------- | -------- | --------------------------------------------- |
| user_group_name | string | yes | the name of the group being created. |
| user_group_slugify | slugify | yes | The slugify version of the name of the group. |
| user_group_weight | integer | yes | The group weight of the group being created. |
| user_group_type | enum | yes | Either `admin` or `user`. |
>[!INFO]
>The `user_group_name` cannot be `superuser` since this name is reserved.
### Example Body (json)
```json
{
"user_group_name": "test group",
"user_group_slugify": "test-group",
"user_group_weight": 51,
"user_group_type": "admin"
}
```
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $baseUrl . '/api/v1/portal-management/user-groups/',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $json_payload,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
'X-HTTP-Method-Override: DELETE'
],
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($response === false) {
echo curl_error($curl);
}
curl_close($curl);
```
### Example Response
```json
"User group created successfully"
```
#### Known errors or issues.
None are known at the time
If you do encounter issues and get an http code in return, check the response codes on this page.

View File

@@ -0,0 +1,63 @@
# PUT user group
This PUT request updates user group data.
#### Location
```
/api/v1/portal-management/user-groups/
```
#### Permissions required
`admin-access-control-user-groups` RW.
#### Body parameters
| Parameter | Type | Required | Description |
| ----------------- | ------- | -------- | ------------------------------ |
| user_group_uuid | uuid | yes | Unique id of the user-group |
| user_group_name | string | yes | The name of the user-group. |
| user_group_weight | integer | yes | The group weight of the group. |
### Example Body (json)
```json
{
"user_group_uuid": "d4cbf41b-6445-11f1-a54b-bc2411125ba4",
"user_group_name": "test group",
"user_group_weight": 52
}
```
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $baseUrl . '/api/v1/portal-management/user-groups/',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $json_payload,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
'X-HTTP-Method-Override: PUT'
],
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($response === false) {
echo curl_error($curl);
}
curl_close($curl);
```
### Example Response
```json
"User group created updated"
```
#### Known errors or issues.
None are known at the time
If you do encounter issues and get an http code in return, check the response codes on this page.

View File

@@ -0,0 +1,57 @@
# DELETE User
This API call deletes a user.
#### Location
```
/api/v1/portal-management/users/
```
#### Permissions required
`admin-access-admins` RW.
#### Body parameters
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ---------------------- |
| user_uuid | uuid | yes | Unique id of the user. |
### Example Body (json)
```json
{
"user_uuid": "3b58843c-644b-11f1-a54b-bc2411125ba4"
}
```
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $baseUrl . '/api/v1/portal-management/users/',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $json_payload,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
'X-HTTP-Method-Override: DELETE'
],
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($response === false) {
echo curl_error($curl);
}
curl_close($curl);
```
### Example Response
```json
"User successfully deleted"
```
#### Known errors or issues.
None are known at the time
If you do encounter issues and get an http code in return, check the response codes on this page.

View File

@@ -0,0 +1,70 @@
# GET user
This call gets nearly all the users data.
It will not send back the hashed password, MFA secret and other sensitive data.
#### Location
```
/api/v1/portal-management/users/
```
#### Permissions required
`admin-access-admins` RO.
#### Body parameters
| Parameter | Type | Required | Description |
| -------------------- | ------ | -------- | ----------- |
| builder[0][where][0] | string | no | |
| builder[0][where][1] | string | no | |
### Example Body (json)
None.
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $baseUrl . '/api/v1/portal-management/users/' . '?builder[0][where][0]=user_uuid&builder[0][where][1]=0eda6269-0da5-11f0-9300-7e99ed98b725',
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json'
]
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
```
### Example Response
```json
[
{
"user_uuid":"481fc5c9-6834-11f1-a54b-bc2411125ba4",
"user_group_uuid":"d4cbf41b-6445-11f1-a54b-bc2411125ba4",
"user_email":"test@domain.name",
"user_first_name":"Pietje",
"user_last_name":"Bel",
"user_full_name":"Pietje Bel",
"user_phone_number":"",
"user_password_reset_expires":1781557318,
"user_two_factor_enabled":0,
"user_status":"pending",
"user_verified_email":0,
"user_verified_phone":0,
"user_create_timestamp":1781470918,
"user_modified_timestamp":null,
"user_last_login_timestamp":null,
"user_login_attempts":0,
"user_pref_language":"en",
"user_stompable":0
}
]
```
#### Known errors or issues.
None are known at the time
If you do encounter issues and get an http code in return, check the response codes on this page.

View File

@@ -0,0 +1,69 @@
# POST user group
This API call creates a user.
#### Location
```
/api/v1/portal-management/users/
```
#### Permissions required
`admin-access-admins` RW.
#### Body parameters
| Parameter | Type | Required | Description |
| ------------------ | ------ | -------- | ---------------------------------------------------------------------- |
| user_group_uuid | uuid | yes | The user-group uuid for the user. |
| user_email | email | yes | The email address of the user. |
| user_first_name | string | yes | The first name of the user. |
| user_last_name | string | yes | The last name of the user. |
| user_phone_number | string | yes | The phone number of the user. |
| user_status | enum | yes | The user status of the user. Either `inactive`, `banned` or `pending` |
| user_pref_language | enum | yes | Either `en` or `nl` |
### Example Body (json)
```json
{
"user_group_uuid": "d4cbf41b-6445-11f1-a54b-bc2411125ba4",
"user_email": "test@domain.name",
"user_first_name": "Pietje",
"user_last_name": "Bel",
"user_phone_number": "",
"user_status": "pending",
"user_pref_language": "en"
}
```
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $baseUrl . '/api/v1/portal-management/users/',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $json_payload,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
'X-HTTP-Method-Override: DELETE'
],
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($response === false) {
echo curl_error($curl);
}
curl_close($curl);
```
### Example Response
```json
"User created successfully. mail has been sent"
```
#### Known errors or issues.
None are known at the time
If you do encounter issues and get an http code in return, check the response codes on this page.

View File

@@ -0,0 +1,76 @@
# PUT User
This PUT request updates a user.
#### Location
```
/api/v1/portal-management/users/
```
#### Permissions required
`admin-access-admins` RW. If you are changing your own user you don't need any permissions.
#### Body parameters
| Parameter | Type | Required | Description |
| ------------------- | ------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| user_uuid | uuid | yes | The users unique id. |
| user_group_uuid | uuid | yes | The user-group unique id for the user. <br>*Not allowed when changing own user.* |
| user_email | email | yes | The email address of the user. |
| user_first_name | string | yes | The first name of the user. |
| user_last_name | string | yes | The last name of the user. |
| user_phone_number | string | no | The phone number of the user. |
| user_status | enum | yes | The user status of the user. Either `inactive`, `banned` or `pending`.<br>*Not allowed when changing own user.* |
| user_pref_language | enum | yes | Either `en` or `nl` |
| user_stompable | boolean | no | Makes the user stompable, related to the [stompjes](API/v1/office/stompjes/POST%20Stomp%20user.md) in the office module.<br>*Not allowed when changing own user.* |
| user_profile_change | boolean | no | Add this value to change your own profile. |
### Example Body (json)
```json
{
"user_uuid": "3b58843c-644b-11f1-a54b-bc2411125ba4",
"user_group_uuid": "d4cbf41b-6445-11f1-a54b-bc2411125ba4",
"user_email": "test@domain.name",
"user_first_name": "Pietje",
"user_last_name": "Bel",
"user_phone_number": "",
"user_status": "pending",
"user_pref_language": "en",
"user_stompable": true
}
```
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $baseUrl . '/api/v1/portal-management/user-groups/',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $json_payload,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
'X-HTTP-Method-Override: PUT'
],
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($response === false) {
echo curl_error($curl);
}
curl_close($curl);
```
### Example Response
```json
"User successfully updated."
```
#### Known errors or issues.
None are known at the time
If you do encounter issues and get an http code in return, check the response codes on this page.

View File

@@ -0,0 +1,73 @@
# GET Servers
This call gets all the servers data.
#### Location
```
/api/v1/servers/
```
#### Permissions required
`servers` RO.
#### Body parameters
| Parameter | Type | Required | Description |
| -------------------- | ------ | -------- | ----------- |
| builder[0][where][0] | string | no | |
| builder[0][where][1] | string | no | |
### Example Body (json)
None.
### Example Request
```php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $baseUrl . '/api/v1/servers/' . '?builder[0][where][0]=server_uuid&builder[0][where][1]=17779d2d-5223-11f1-8bcc-bc2411125ba4',
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json'
]
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
```
### Example Response
```json
[
{
"server_uuid":"17779d2d-5223-11f1-8bcc-bc2411125ba4",
"company_uuid":null,
"server_vm_id":"bc2411845cd4",
"server_vm_host_id":null,
"server_vm_host_name":"man01",
"server_vm_snapshot":0,
"server_vm_generation":null,
"server_power_state":"Running",
"server_state":"new",
"server_hostname":"man01.meteo.local",
"server_os":"AlmaLinux 10.1",
"server_cpu":2,
"server_memory":2048,
"server_memory_demand":2048,
"server_disks":"[{\"disk_name\":\"scsi0\",\"disk_space\":\"15\",\"disk_used\":\"15\",\"disk_location\":\"local-lvm:vm-100-disk-0\"}]",
"server_ipv4":"[\"10.0.0.30\"]",
"server_ipv6":"[\"\"]",
"server_licenses":"[]",
"server_backup":"[{\"proxmox\":\"yes\"}]",
"server_description":"",
"server_create_timestamp":1779044609,
"server_modified_timestamp":1781467630
}
]
```
#### Known errors or issues.
None are known at the time
If you do encounter issues and get an http code in return, check the response codes on this page.

View File

@@ -1,5 +1,5 @@
# POST Create or update server
This API call creates a server or updates it with the given information. This API call creates a server or updates it with the given information.
#### Location #### Location
``` ```
/api/v1/servers/ /api/v1/servers/
@@ -130,7 +130,7 @@ curl_setopt_array($curl, array(
"Authorization: Bearer <API your Bearer token>", "Authorization: Bearer <API your Bearer token>",
], ],
CURLOPT_POST => true, CURLOPT_POST => true,
CURLOPT_POSTFIELDS =>'<json payload body>', CURLOPT_POSTFIELDS => '<json payload body>',
)); ));
$response = curl_exec($curl); $response = curl_exec($curl);

View File

@@ -1,3 +1,4 @@
# GET Sync cloud distributor
This API call synchronizes active companies in Sentri with the corresponding cloud distributor companies in Inserve. These cloud distributor companies are required to associate Sentri server licenses with companies in Inserve. This API call synchronizes active companies in Sentri with the corresponding cloud distributor companies in Inserve. These cloud distributor companies are required to associate Sentri server licenses with companies in Inserve.
#### Location #### Location
``` ```

View File

@@ -1,3 +1,4 @@
# GET Sync companies
This API call retrieves all companies from Inserve and creates or updates them in Sentri. This API call retrieves all companies from Inserve and creates or updates them in Sentri.
#### Location #### Location
``` ```

View File

@@ -1,3 +1,4 @@
# GET Sync server licenses
This API call first executes the [[GET Sync cloud distributor|GET Sync cloud distributor]] action and then synchronizes all servers in an active, deleted, or trial state with Inserve licenses. It creates or updates server licenses in Inserve if they do not exist or if the license quantities differ from those in Sentri. This API call first executes the [[GET Sync cloud distributor|GET Sync cloud distributor]] action and then synchronizes all servers in an active, deleted, or trial state with Inserve licenses. It creates or updates server licenses in Inserve if they do not exist or if the license quantities differ from those in Sentri.
#### Location #### Location
``` ```

View File

@@ -1,3 +1,4 @@
# GET Sync server subscriptions
This API call first executes the [[GET Sync cloud distributor|GET Sync cloud distributor]] action and then synchronizes all servers in an active or trial state to Inserve subscriptions. It creates or updates server subscriptions in Inserve if they do not exist or if the subscription name differ from those in Sentri. For this action the correct inserve `product_codes` should be defined at Portal Management > Sources > Inserve > Custom source data. This API call first executes the [[GET Sync cloud distributor|GET Sync cloud distributor]] action and then synchronizes all servers in an active or trial state to Inserve subscriptions. It creates or updates server subscriptions in Inserve if they do not exist or if the subscription name differ from those in Sentri. For this action the correct inserve `product_codes` should be defined at Portal Management > Sources > Inserve > Custom source data.
#### Location #### Location
``` ```

2
Getting Started.md Normal file
View File

@@ -0,0 +1,2 @@
# Getting Started
After [[Installation|installing]] Sentri, it is recommended to review the initial configuration settings.

81
Installation.md Normal file
View File

@@ -0,0 +1,81 @@
# Installation
This guide explains how to install Sentri on a Linux server.
## Requirements
Before continuing, make sure your server meets the following requirements:
- A Linux server (Linux is officially tested and supported)
- Basic Linux and web hosting experience
- A web server of your choice (Apache, Nginx, etc.)
- MariaDB or MySQL
- PHP 8.3 or newer
- Git installed on the server
>[!info]
>This guide uses `/var/www/sentri/` as the installation directory. You can change this to any location you prefer.
## Installation
### Configure the document root
Sentri stores all publicly accessible files inside the `pub/` directory.
If your current virtual host document root is:
```
/var/www/sentri/
```
Change it to:
```
/var/www/sentri/pub/
```
After updating the document root, reload or restart your web server.
### Download the Sentri files
Run the following commands to download the latest version of Sentri:
```bash
cd /var/www/sentri/
git clone https://gitea.mooij.me/meteo/Sentri.git Sentri
mv Sentri/* .
mv Sentri/.[!.]* . 2>/dev/null
rmdir Sentri
```
### Database setup
Log in to MariaDB/MySQL and create the database and user:
```sql
CREATE DATABASE sentri;
CREATE USER 'sentri'@'localhost' IDENTIFIED BY 'your_secure_password_here';
GRANT ALL PRIVILEGES ON sentri.* TO 'sentri'@'localhost';
FLUSH PRIVILEGES;
```
Next, import the database schema:
```bash
mariadb -u sentri -p sentri < /var/www/sentri/install.sql
```
When prompted, enter the password for the `sentri` database user.
### Configuring
Copy the example configuration file:
```bash
cp /var/www/sentri/pub/config-sample.php /var/www/sentri/pub/config.php
```
Then edit the configuration file and update the database credentials:
```
/var/www/sentri/pub/config.php
```
#### First Login
Open your website in a browser and log in with the default credentials:
```
Username: superuser
Password: changethispassword
```
> [!WARNING]
> After logging in change the superuser password!
#### Global settings
Go to [[Global|Global]] under Portal Management and rename the portal to your preference.
Next, configure the SMTP connection in [[Mail|Mail]] under Portal Management so Sentri can send emails.
Finally, enable the [[index#Modules|modules]] you want to use in [[Portal Management/Settings/Modules|Modules]] under Portal Management.
#### Create users and check permissions
Go to the access control and create new users. If you want you could take a look at altering the permissions.
#### Getting started
After completing the installation, continue with the [[Getting Started]] guide to configure and begin using Sentri.

View File

@@ -0,0 +1,31 @@
# Admins
Admins are users who are not tied to specific companies and are responsible for administering Sentri.
## View admin
To view admins, you need the `admin-access-admins` RO permission.
In the admins list, click the **view** icon to open an admin and see additional details.
## Add admin
To create a new admin, you need the `admin-access-admins` RW permission.
Complete the form and click **Add admin**. The admin will be created in a **Pending** state.
After creation, an invitation email is sent. The recipient must verify their account and set a password. Once completed, the admin becomes **Active**.
## Modify admin
To manage admins, you need the `admin-access-admins` RW permission.
You can edit an admin by clicking the **edit** icon in the admin list or by selecting **Edit** while viewing the admin details.
### Send password reset email
To send a password reset email, you need the `admin-access-admins-resetpassword` RW permission.
Open the admin details and click **Send password reset email** in the user management section.
### Disable two factor authentication
To disable two-factor authentication for another admin, you need the `admin-access-admins-mfa` RW permission.
Open the admin details and click **Disable two-factor authentication** in the user management section.
# Admin status
An admin can have one of the following statuses:
- **Active** The admin is active and can log in.
- **Pending** The admin has been created but has not yet verified their account or set a password via the invitation email.
- **Banned** The admin is blocked due to suspicious or policy-violating behavior and cannot log in.
- **Inactive** The admin account is disabled and cannot log in.

View File

@@ -0,0 +1,19 @@
# Permissions
Many actions in Sentri require specific permissions. These permissions are configured per user group and can be set to one of the following levels:
- NA (Not Available)
- RO (Read Only)
- RW (Read Write)
> [!INFO]
> The **superuser** account has RW access to all permissions by default. This behavior is intentional and cannot be changed.
## Viewing or modifying permissions
To view permissions, you need the `admin-access-control-permissions` RO permission.
To modify permissions, you need the `admin-access-control-permissions` RW permission.
> [!warning] Group weight system
> Each [User Group](Portal%20Management/Access%20Control/User%20groups.md) has its own group weight. A lower weight value indicates a higher position in the hierarchy. Meaning that even if you have `admin-access-control-permissions` RW permissions you wont be able to modify the permissions of the higher group. For more information, see [User Group Weight](Portal%20Management/Access%20Control/User%20groups.md#User%20group%20weight).
Navigate to **Access control** > **Permissions** and click the **view** icon. You will see the permission set assigned to each user group.
If you want to view or modify all permissions for a specific user group, go to **Access control** > **User groups**, then click the **view icon** next to the user group you want to view or modify. This will display the full list of permissions configured on that group.

View File

@@ -0,0 +1,20 @@
# User groups
All users in Sentri are assigned to a user group. There are currently two types of user groups:
- **Administrator** Users not tied to specific companies. They are responsible for administering Sentri and are created [[Admins|here]].
- **User** Intended for future use for users linked to specific companies. This group type is not yet active in Sentri.
## User group weight
Each user group has an associated **weight**, which is used to enforce hierarchy and prevent privilege escalation.
For example, if your current user group has a weight of **10**, you cannot create or assign a user to a group with a lower weight (e.g. **1**) if that would result in higher permissions than your own. This ensures users cannot create accounts with greater access than their own.
## Adding a user group
To add a user group, you need the `admin-access-control-user-groups` RW permission.
Navigate to **Access Control** > **User groups** and click **Add user group**. Enter a name and select the group type.
After creation, you will be able to configure the groups [[Permissions|permissions]]. To modify permissions, you also need the `admin-access-control-permissions` **RW** permission.
## Viewing user groups
To view user groups, you need the `admin-access-control-user-groups` RO permission.
Go to **Access Control** > **User groups** and click the **view icon** next to a user group. This will show detailed information about the group, including all configured [[Permissions|permissions]].

View File

@@ -0,0 +1,14 @@
# Global
## Portal name
This setting allows you to change the name of the portal.
Currently, this setting has limited functionality, but it will be used in future versions to support white-labeling.
## Portal provider name
This setting allows you to change the provider name displayed by the portal.
Currently, this setting has limited functionality, but it will also be used in future versions to support white-labeling.
## Admin authentication methods
This setting will later support multiple administrator authentication methods.
Currently, the only available option is `database_auth`.
## CA certificate URL
This URL points to the Certificate Authority (CA) certificate used by the auto-provisioning module, which is currently under development.
## Autoprovisioning URL
This URL is used by the auto-provisioning system to retrieve configuration data by the auto-provisioning module, which is currently under development..

View File

@@ -0,0 +1,25 @@
# Mail
To allow Sentri to send emails, you must configure the mail settings.
Sentri sends emails in the following situations:
- When a new user is created, an invitation email is sent to the user.
- When a user requests a password reset.
- When an administrator sends a password reset email.
## From Name
This is the sender name displayed in emails sent by Sentri.
## From Address
This is the email address used by Sentri to send emails.
## SMTP Server Configuration
### Host
The hostname or IP address of your SMTP server.
### Secure
Configure the security protocol used by the SMTP server.
### SMTP Port
The port used by the SMTP server.
### SMTP Authentication
Enable or disable SMTP authentication, depending on whether your SMTP server requires authentication.
### SMTP Username
The username used for SMTP authentication.
### SMTP Password
The password used for SMTP authentication.

View File

@@ -0,0 +1,7 @@
# Modules
Sentri allows modules to be enabled or disabled. Each module provides its own functionality, which can be viewed [[../../index|here]].
## Enabling and Disabling Modules
To enable or disable modules, navigate to **Settings** > **Modules** and toggle the modules you want to enable or disable.
> [!Note]
> The **Portal Management** module is always enabled and cannot be disabled.

View File

@@ -1,3 +1,4 @@
# Inserve
Inserve is Dutch software that helps MSPs support their customers in a personal and structured way. The connection to Inserve gives the option to sync information between Sentri and Inserve. Inserve is Dutch software that helps MSPs support their customers in a personal and structured way. The connection to Inserve gives the option to sync information between Sentri and Inserve.
To configure the Inserve connection you need the `admin-sources` RW permissions. To configure the Inserve connection you need the `admin-sources` RW permissions.
@@ -79,7 +80,7 @@ These are the different actions available. These actions maybe not available wit
This API call retrieves all companies from Inserve and creates or updates them in Sentri. This API call retrieves all companies from Inserve and creates or updates them in Sentri.
API Call: [[../../API/v1/sources/inserve/GET Sync companies|GET Sync companies]] API Call: [[GET Sync companies|GET Sync companies]]
## Sync cloud distributor companies ## Sync cloud distributor companies
> [!Important] > [!Important]
> Requires the **Servers** module to be enabled. > Requires the **Servers** module to be enabled.
@@ -103,7 +104,7 @@ For example:
``` ```
The `cloud_distribution_id` is used to link licenses to the correct company during the **Sync Server Licenses** action. The `cloud_distribution_id` is used to link licenses to the correct company during the **Sync Server Licenses** action.
API Call: [[../../API/v1/sources/inserve/GET Sync cloud distributor|GET Sync cloud distributor]] API Call: [[GET Sync cloud distributor|GET Sync cloud distributor]]
## Sync servers licenses ## Sync servers licenses
> [!Important] > [!Important]
> Requires the **Servers** module to be enabled. > Requires the **Servers** module to be enabled.
@@ -112,7 +113,7 @@ API Call: [[../../API/v1/sources/inserve/GET Sync cloud distributor|GET Sync clo
This API call first executes the **Sync cloud distributor companies** action and then synchronizes all servers in an active, deleted, or trial state with Inserve licenses. It creates or updates server licenses in Inserve if they do not exist or if the license quantities differ from those in Sentri. This API call first executes the **Sync cloud distributor companies** action and then synchronizes all servers in an active, deleted, or trial state with Inserve licenses. It creates or updates server licenses in Inserve if they do not exist or if the license quantities differ from those in Sentri.
It will also only do this to server linked to an active company. It will also only do this to server linked to an active company.
API Call: [[../../API/v1/sources/inserve/GET Sync server licenses|GET Sync server licenses]] API Call: [[GET Sync server licenses|GET Sync server licenses]]
## Sync server subscriptions ## Sync server subscriptions
> [!Important] > [!Important]
> Requires the **Servers** module to be enabled. > Requires the **Servers** module to be enabled.
@@ -120,4 +121,4 @@ API Call: [[../../API/v1/sources/inserve/GET Sync server licenses|GET Sync serve
This API call first executes the **Sync cloud distributor** companies action and then creates a subscription if it does not exist, or updates the subscription description if it does. It also creates subscription lines with the correct product_code entered in the **custom source data** JSON field. This API call first executes the **Sync cloud distributor** companies action and then creates a subscription if it does not exist, or updates the subscription description if it does. It also creates subscription lines with the correct product_code entered in the **custom source data** JSON field.
API Call: [[../../API/v1/sources/inserve/GET Sync server subscriptions|GET Sync server subscriptions]] API Call: [[GET Sync server subscriptions|GET Sync server subscriptions]]

View File

@@ -1,3 +1,99 @@
# Release notes
## v.1.3
`to be announced`
### Changes
- Rename the servers module to Inventory so it supports other things as well.
- Added CSP headers to PHP code
### Features
- Hypervisor overview.
- Network devices overview.
## v.1.2.4
`21-06-2026`
### Changes
- [e96d6b9a70](https://gitea.mooij.me/meteo/Sentri/commit/e96d6b9a70986688bfd6f71cc30fb145598eb0bf) **‼ BREAKING !!** Changed the config.php file, look at the config-sample.php to update.
- [d781078c0d](https://gitea.mooij.me/meteo/Sentri/commit/d781078c0d4d037307caaf83bb9f5409b050d70e) A lot of code cleanup and code sanitation done.
- [0b76255cfa](https://gitea.mooij.me/meteo/Sentri/commit/0b76255cfaac109e86c071dcbd98de065705c16f) security.txt added and + PGP key.
- [8b742d997c](https://gitea.mooij.me/meteo/Sentri/commit/8b742d997c14bdd136877e5645a379e22980bbcc) [229d2b4a15](https://gitea.mooij.me/meteo/Sentri/commit/229d2b4a15476d7be5e2010efc87ac22f4d39fc5) Content Security Policy (CSP) compatibility
- [6682b974a3](https://gitea.mooij.me/meteo/Sentri/commit/6682b974a33410c220c836cd0b5c3315fcbcc5f9) Server overview now shows last modified date.
### Fixes
- [be392b8149](https://gitea.mooij.me/meteo/Sentri/commit/be392b81499de7c9a1161fe31c981b6f4f63f763) Validation added of the `portal_uuid` when configuring mail settings and portal settings.
- [89ea170798](https://gitea.mooij.me/meteo/Sentri/commit/89ea1707988e2da3c6b1d3ade8a3d85239928104) Fixed an issue where existing subscriptions wont be updated with new licenses.
## v.1.2.3
`14-06-2026`
### Changes
- [a60ebadd60](https://gitea.mooij.me/meteo/Sentri/commit/a60ebadd601f92d062f21d39d4447ab54b7944df) Added support for the HTTP_X_HTTP_METHOD_OVERRIDE header in the API.
- [3b200d30cb](https://gitea.mooij.me/meteo/Sentri/commit/3b200d30cb3d6fb76e80e0911edd27f60db29bbf) Changed all the frontend calls from `_method` to `X-HTTP-Method-Override`.
- [b088314c38](https://gitea.mooij.me/meteo/Sentri/commit/b088314c38f8ab3c4664b1d0b0c24e598096036d) Added GET API call for group-permissions.
- [b93f4d2e9c](https://gitea.mooij.me/meteo/Sentri/commit/b93f4d2e9c68a5e0742daa509e4a89ed54fbd46d) Added GET API call for portal-settings.
- [b7dcbaf290](https://gitea.mooij.me/meteo/Sentri/commit/b7dcbaf2908b8fa4035543e72addb150bd86b049) Added GET API call for user-groups.
- [db377bcc08](https://gitea.mooij.me/meteo/Sentri/commit/db377bcc08e18dcb0f6606e9578e1198cc323e38) Added GET API call for users.
- [b227cfb2c5](https://gitea.mooij.me/meteo/Sentri/commit/b227cfb2c59c63e96dc26f3cb178b132c68f4961) Added GET API call for servers.
### Fixes
- [d6079878c4](https://gitea.mooij.me/meteo/Sentri/commit/d6079878c4015358426f9612e80a1e2c7a977eab) When creating an user the `user_pref_language` value is not an enum but any string. And the the user creation `user_phone_number` is now optional.
- [bc8976c18e](https://gitea.mooij.me/meteo/Sentri/commit/bc8976c18e98ad6be637f24bd5e0ef3f52d64002) API user creation does not set the `user_full_name`.
- [1374ba2f13](https://gitea.mooij.me/meteo/Sentri/commit/1374ba2f1387c3b50dafcd3578c3bf4faa8f96f9) Module enablement toggle feedback is fixed.
- [aece25439b](https://gitea.mooij.me/meteo/Sentri/commit/aece25439be70cb801cda43ad288b67a9ea2bc97) Inserve configuration API call does not longer require the obsolete `source_name` field.
- [9de2fc0ad1](https://gitea.mooij.me/meteo/Sentri/commit/9de2fc0ad14aa32ed9e36940f1137b382d04bc4e) Users are not able to change their own name.
- [c408e43283](https://gitea.mooij.me/meteo/Sentri/commit/c408e4328366ffe5b699715dfd1e0b0fd47ce5d9) SQL-Injection vulnerability in GET function resolved.
- [98d5d1cb18](https://gitea.mooij.me/meteo/Sentri/commit/98d5d1cb18d043a735fefb66de053e399c27ef0b) GET stomp API call added.
- [a7e3c54a89](https://gitea.mooij.me/meteo/Sentri/commit/a7e3c54a89672b96391c3c5894a84f4b5de6b7d0) Fixed the `ofice` typo in the permission names to `office`
## v.1.2.2
`29-05-2026`
### Changes
- Modified the API folder structure so it is structured under each module
- Changed Servers module to inventory.
- moved /api/v1/access-rights/ to /api/v1/portal-management/group-permissions/
- moved /api/v1/mailsettings/ to /api/v1/portal-management/mail/configure/
- moved /api/v1/permissions/ to /api/v1/portal-management/permissions/
- moved /api/v1/portalsettings/ to /api/v1/portal-management/configure/
- moved /api/v1/user-groups to /api/v1/portal-management/user-groups/
- moved /api/v1/devices/ to /api/v1/autop/devices/
- moved /api/v1/platforms/ to /api/v1/autop/platforms/
- moved /api/v1/vendors/ to /api/v1/autop/vendors/
- moved /api/v1/users/ to /api/v1/portal-management/users/
- moved /api/v1/users/* to /api/v1/user/*
- The /login page is now the same style as the rest of Sentri.
- Add names to API tokens.
- Apply group weight system to API token modifications.
- Created an light theme and fixed a lot of CSS issues.
### Fixes
- Issue with the companies not showing in the server overview.
- Issue with new server licenses having "0" as name.
- Fixed all the CSS errors.
## v.1.2.1
`17-05-2026`
### Features
- Send test email feature added to email settings.
### Changes
- Changed portal management page to Settings and changed System in the sidebar to Portal management.
- Renamed different database tables.
- vc_api_tokens to system_api_tokens
- vc_devices to autop_devices
- vc_permissions to system_permissions
- vc_platforms to autop_platforms
- vc_portal_settings to system_settings
- vc_user_group_permissions_portal to system_user_group_permissions
- vc_user_groups to system_user_groups
- vc_users to system_users
- vc_vendors to autop_vendors
- Display user group weight in user groups view.
- Avatar upload button is not dark anymore.
- vc_feedback table dropped.
### Fixes
- Problem with creating a user-group, it does not create the permissions for the new user group and generates a 500 error.
- Users with `admin-access-control-permissions` RW permission were able to change superuser permissions.
- non-superuser admins cannot update the permission name and description anymore.
- email settings are now saving correctly.
- Severs page wont show an json error message but will show an empty table when no servers exist.
- Sidebar text is not anymore showing when sidebar is wrapped.
## v.1.2 ## v.1.2
`06-05-2026` `06-05-2026`
### Features ### Features
@@ -19,26 +115,19 @@
- Group view page added with the ability to view and change all the groups permissions. - Group view page added with the ability to view and change all the groups permissions.
- View companies with connected servers. - View companies with connected servers.
- Modified the Inserve source page so it shows all the Sync actions. - Modified the Inserve source page so it shows all the Sync actions.
- Created this KB website and moved the release notes and roadmap to this page. - Created this docs website and moved the release notes and roadmap to this page.
### Fixes ### Fixes
- Fixed an issue that allowed some disabled module content to be visible or accessible. - Fixed an issue that allowed some disabled module content to be visible or accessible.
## v1.0 ## v1.0
`21-12-2025` `21-12-2025`
### Known issues Initial release.
- Sidebar text is showing when sidebar is wrapped.
- Problem with sorting backups types in the server overview
## Roadmap ## Roadmap
- Be able to configure sources for certain tasks - Docker container.
- More configuration options for sources. - Use of CDN's for CSS and other static content.
- Make the /login page the same style as the rest of Sentri. ## Roadmap features
- Light mode theme.
- Travel cost page.
- VM hosts overview.
- Add name to API tokens.
- Loggin of actions to local storage or to things such as graylog.
- SSO/SAML/User provisioning. - SSO/SAML/User provisioning.
- Logging of actions with syslog.
- Travel cost page.
## v0.1 ## v0.1
`23-12-2024` `23-12-2024`
- Start of this project - Start of this project

BIN
assets/images/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -11,7 +11,7 @@
--md-default-fg-color--light: #EBDBB2; --md-default-fg-color--light: #EBDBB2;
--md-typeset-color: #D5C4A1; --md-typeset-color: #D5C4A1;
--md-typeset-a-color: #fe8019; --md-typeset-a-color: #83a598;
--md-code-fg-color: hsla(40, 38%, 73%, 1); --md-code-fg-color: hsla(40, 38%, 73%, 1);
@@ -50,6 +50,41 @@
} }
.md-typeset h1 {
color: #fb4934;
margin: 0.9em 0 0;
}
.md-typeset h2 {
color: #fe8019;
margin: 0.7em 0 0;
}
.md-typeset h3 {
color: #b8bb26;
margin: 0.5em 0 0;
}
.md-typeset h4 {
color: #689d6a;
margin: 0.3em 0 0;
}
.md-typeset h5{
color: #458588;
margin: 0.3em 0 0;
}
.md-typeset h6 {
color: #d3869b;
margin: 0.3em 0 0;
}
.md-typeset p {
margin-bottom: 0px;
margin-top: 0.4em;
}
.md-typeset .admonition.info, .md-typeset .admonition.info,
.md-typeset details.info { .md-typeset details.info {
border-color: #458588; border-color: #458588;

View File

@@ -1,8 +1,42 @@
# Welcome to the Sentri wiki! # Welcome to the Sentri docs!
>[!note]
>The making of the this documentation is still in progress.
# What is Sentri
Sentri is a self-hosted web application built as a modular system. Each module provides a specific feature or solves a particular use case, and was created from practical needs encountered throughout my career as a system and network administrator. Instead of relying on multiple separate services or portals for smaller operational tasks, Sentri centralizes them into a single platform.
The making of the this documentation is still in progress. Its modular structure keeps the platform lightweight and flexible by allowing you to enable only the components you actually use. Sentri is open-source, performance-focused, and designed to remain minimal and simple. Because Sentri is fully self-hosted, all data remains under your control without depending on third-party providers.
This wiki explains how Sentri works. If anything is missing or unclear in this documentation, please let me know. *Sentri is released under the Apache License, Version 2.0.*
# Modules
Sentri includes these modules that can be enabled or disabled at any time, so you only see and use the functionality you need.
## Module: Portal Management
Always enabled. This module is used to manage Sentris core settings and configuration. Its also used to configure different sources.
## Module: Customers
This module is used to store companies from your CRM inside Sentri, allowing you to link them to items across different modules.
Documentation written by Marco Mooij The following CRM customer sources are currently available:
- [[Inserve|Inserve]]
## Module: Office
This module currently provides a feature that lets you “stomp” a colleague. It can be used to keep track of things such as counting your mom jokes or other actions between team members. These events are counted and visualized through a simple graph.
## Module: Servers
The Servers module is designed to help you keep track of all servers you manage. It centralizes key information such as assigned resources, configured backups, used licenses, and more.
This data can be pushed to Sentri via [[API/v1/servers/POST Create or update server|this API endpoint]] using your own scripts or automation.
Once centralized, server information can be shared with external sources, such as:
- [[Inserve|Inserve]]
- Automatically creates and updates cloud distributor licenses for invoicing
- Automatically creates and updates subscriptions for invoicing
## Module: Autoprovisioning
> [!Note]
> This module is under contruction and far from complete
The Autoprovisioning module is used to manage configuration settings for devices such as Yealink phones. Full device configurations are generated dynamically when requested through Yealink autoprovisioning. This makes the configuring of Yealink phones extremly flexible.
# Getting Started
You can find the installation guide [[Installation|here]].
To get started, follow [[Getting Started|this guide]].
# Sources
Sentri allows external data sources to integrate and synchronize information into and out of the the system. Currently, [[Portal Management/Settings/Sources/Inserve|Inserve]] is the only supported source. When the time and need comes additional sources will be added.