177 lines
3.1 KiB
Markdown
177 lines
3.1 KiB
Markdown
|
# IcyDNS HTTP API
|
||
|
HTTP API for managing BIND zone files.
|
||
|
|
||
|
## Running
|
||
|
This application is intended to be run behind a proxy. Requires node v14+ for `fs/promises`. Also requires `bind-tools` for checking zone files.
|
||
|
|
||
|
* `npm install`
|
||
|
* `npm run build`
|
||
|
* `npm start`
|
||
|
|
||
|
### Environment variables
|
||
|
* `PORT` - server port
|
||
|
* `ZONEFILES` - path to zone files
|
||
|
* `CACHE_TTL` - internal zone cache time-to-live
|
||
|
* `RNDC_SERVER` - RNDC host
|
||
|
* `RNDC_PORT` - RNDC port
|
||
|
* `RNDC_KEYFILE` - location of RNDC's key file
|
||
|
|
||
|
Zones are automatically reloaded using `rndc` after updates. If you do not have rndc configured, you will need to reload the zones manually, but the files still get updated.
|
||
|
|
||
|
## API
|
||
|
|
||
|
**All requests are prefixed with `/api/v1`.** Authorization is by bearer token, i.e. `-H 'Authorization: Bearer <token>'`. `?` denotes optional parameter.
|
||
|
|
||
|
### `GET /zone/:domain`
|
||
|
Returns all of `:domain`'s DNS records.
|
||
|
|
||
|
**Query:** None
|
||
|
|
||
|
**Response:**
|
||
|
```typescript
|
||
|
{
|
||
|
ttl: number;
|
||
|
records: [
|
||
|
[index]: {
|
||
|
name: string;
|
||
|
type: string;
|
||
|
value: string;
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### `GET /zone/:domain/download`
|
||
|
Provides `:domain`'s records as a file.
|
||
|
|
||
|
**Query:** None
|
||
|
|
||
|
**Response:** BIND zone file
|
||
|
|
||
|
### `POST /zone/:domain`
|
||
|
Reloads `:domain`'s zone file. Optionally changes the zone file's TTL value.
|
||
|
|
||
|
**Body:**
|
||
|
```typescript
|
||
|
{
|
||
|
ttl?: number;
|
||
|
}
|
||
|
```
|
||
|
|
||
|
**Response:**
|
||
|
```typescript
|
||
|
{
|
||
|
success: boolean;
|
||
|
message: string;
|
||
|
ttl?: number;
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### `GET /zone/records/:domain`
|
||
|
Returns all of `:domain`'s DNS records or performs a search based on provided query parameters.
|
||
|
|
||
|
**Query:**
|
||
|
* `name?`
|
||
|
* `type?`
|
||
|
* `value?`
|
||
|
|
||
|
**Response:**
|
||
|
```typescript
|
||
|
[
|
||
|
[index]: {
|
||
|
name: string;
|
||
|
type: string;
|
||
|
value: string;
|
||
|
index?: number; // when searching only
|
||
|
}
|
||
|
]
|
||
|
```
|
||
|
|
||
|
### `POST /zone/records/:domain`
|
||
|
Updates a DNS record of `:domain` at `index`.
|
||
|
|
||
|
**Body:**
|
||
|
```typescript
|
||
|
{
|
||
|
index: number;
|
||
|
record: {
|
||
|
name?: string;
|
||
|
type?: string;
|
||
|
value?: string;
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
**Response:**
|
||
|
```typescript
|
||
|
{
|
||
|
success: boolean;
|
||
|
message: string;
|
||
|
record: DNSRecord;
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### `PUT /zone/records/:domain`
|
||
|
Creates a new DNS record for `:domain`.
|
||
|
|
||
|
**Body:**
|
||
|
```typescript
|
||
|
{
|
||
|
record: {
|
||
|
name: string;
|
||
|
type: string;
|
||
|
value: string;
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
**Response:**
|
||
|
```typescript
|
||
|
{
|
||
|
success: boolean;
|
||
|
message: string;
|
||
|
record: DNSRecord;
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### `DELETE /zone/records/:domain`
|
||
|
Deletes a DNS record from `:domain` at `index`.
|
||
|
|
||
|
**Body:**
|
||
|
```typescript
|
||
|
{
|
||
|
index: number;
|
||
|
}
|
||
|
```
|
||
|
|
||
|
**Response:**
|
||
|
```typescript
|
||
|
{
|
||
|
success: boolean;
|
||
|
message: string;
|
||
|
record: DNSRecord;
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### `POST /set-ip/:domain`
|
||
|
Quickly updates the `:domain`'s IP address (first occurences of `A` and `AAAA` records of `@` or `subdomain`). One of the IP addresses is taken from the request, so it's a good idea to use curl with `-4` to automatically set the IPv4 address and provide the IPv6 address with a body parameter.
|
||
|
|
||
|
**Body:**
|
||
|
```typescript
|
||
|
{
|
||
|
ipv4?: string;
|
||
|
ipv6?: string;
|
||
|
subdomain?: string;
|
||
|
dualRequest?: boolean;
|
||
|
}
|
||
|
```
|
||
|
|
||
|
**Response:**
|
||
|
```typescript
|
||
|
{
|
||
|
success: boolean;
|
||
|
message: string;
|
||
|
actions: string[]; // detailed descriptions of what was actually done
|
||
|
}
|
||
|
```
|