From b75f1a4ab828e54f329b2191673ca4b64c953dae Mon Sep 17 00:00:00 2001 From: Evgeny Zinoviev Date: Thu, 25 Feb 2021 17:57:43 +0300 Subject: initial --- FastDNS.php | 307 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ LICENSE | 25 +++++ README.md | 28 ++++++ 3 files changed, 360 insertions(+) create mode 100644 FastDNS.php create mode 100644 LICENSE create mode 100644 README.md diff --git a/FastDNS.php b/FastDNS.php new file mode 100644 index 0000000..bd2ab66 --- /dev/null +++ b/FastDNS.php @@ -0,0 +1,307 @@ +jwtToken = $response['token']; + $this->expire = $response['expire']; + } + + /** + * @return mixed + * @throws FastDNSException + */ + public function getDomains() { + return $this->get('/api/domains', []); + } + + /** + * @param $id + * @return mixed + * @throws FastDNSException + */ + public function getDomain($id) { + return $this->get('/api/domains/'.$id); + } + + /** + * @param $name + * @return mixed + * @throws FastDNSException + */ + public function getDomainByName($name) { + return $this->get('/api/domains/'.$name.'/name'); + } + + /** + * @param string $name + * @param string $ip + * @param int $mail_service + * @return mixed + * @throws FastDNSException + */ + public function createDomain(string $name, string $ip, int $mail_service = self::MAIL_SERVICE_MAIN) { + return $this->post('/api/domains', [ + 'name' => $name, + 'ip' => $ip, + 'mail_service' => $mail_service + ]); + } + + /** + * No idea what this does and what "required" means + * + * @param $domain_id + * @param int $required + * @return mixed + * @throws FastDNSException + */ + public function updateDomain($domain_id, int $required) { + return $this->put('/api/domains/'.$domain_id, [ + 'required' => $required + ]); + } + + /** + * @param int $domain_id + * @return mixed + * @throws FastDNSException + */ + public function deleteDomain(int $domain_id) { + return $this->delete('/api/domains/'.$domain_id); + } + + /** + * @param int $domain_id + * @return mixed + * @throws FastDNSException + */ + public function getRecords(int $domain_id) { + return $this->get('/api/domains/'.$domain_id.'/records'); + } + + /** + * @param int $domain_id + * @param string $name + * @param string $type + * @param string $content + * @param int $ttl + * @param string $tag + * @param int $flag + * @param int $priority + * @param int $weight + * @param int $port + * @return mixed + * @throws FastDNSException + */ + public function createRecord( + int $domain_id, + string $name, + string $type, + string $content, + int $ttl, + string $tag = '', + int $flag = 0, + int $priority = 5, + int $weight = 0, + int $port = 0) { + return $this->post('/api/domains/'.$domain_id.'/records', [ + 'name' => $name, + 'type' => $type, + 'content' => $content, + 'ttl' => $ttl, + 'tag' => $tag, + 'flag' => $flag, + 'priority' => $priority, + 'weight' => $weight, + 'port' => $port + ]); + } + + /** + * @param int $domain_id + * @param string $record_id + * @return mixed + * @throws FastDNSException + */ + public function getRecord(int $domain_id, string $record_id) { + return $this->get('/api/domains/'.$domain_id.'/records/'.$record_id); + } + + /** + * @param int $domain_id + * @param string $record_id + * @param string $name + * @param string $type + * @param string $content + * @param int $ttl + * @param string $tag + * @param int $flag + * @param int $priority + * @param int $weight + * @param int $port + * @return mixed + * @throws FastDNSException + */ + public function updateRecord( + int $domain_id, + string $record_id, + string $name, + string $type, + string $content, + int $ttl, + string $tag = '', + int $flag = 0, + int $priority = 5, + int $weight = 0, + int $port = 0) { + + // если здесь передавать все поля, то сервер возвращает ошибку "запись уже существует", + return $this->put('/api/domains/'.$domain_id.'/records/'.$record_id, [ + // 'type' => $type, + 'content' => $content, + 'name' => $name, + // 'ttl' => $ttl, + // 'tag' => $tag, + // 'flag' => $flag, + // 'priority' => $priority, + // 'weight' => $weight, + // 'port' => $port + ]); + } + + /** + * @param int $domain_id + * @param string $record_id + * @throws FastDNSException + */ + public function deleteRecord(int $domain_id, string $record_id) { + return $this->delete('/api/domains/'.$domain_id.'/records/'.$record_id); + } + + /** + * @return mixed + * @throws FastDNSException + */ + public function getUserInfo() { + return $this->get('/api/me'); + } + + /** + * @param string $endpoint + * @param array $params + * @return mixed + * @throws FastDNSException + */ + protected function get(string $endpoint, array $params = []) { + return $this->request('GET', $endpoint, $params); + } + + /** + * @param string $endpoint + * @param array $params + * @return mixed + * @throws FastDNSException + */ + protected function post(string $endpoint, array $params = []) { + return $this->request('POST', $endpoint, $params); + } + + /** + * @param string $endpoint + * @param array $params + * @return mixed + * @throws FastDNSException + */ + protected function put(string $endpoint, array $params = []) { + return $this->request('PUT', $endpoint, $params); + } + + /** + * @param string $endpoint + * @param array $params + * @return mixed + * @throws FastDNSException + */ + protected function delete(string $endpoint, array $params = []) { + return $this->request('DELETE', $endpoint, $params); + } + + /** + * @param string $method + * @param string $endpoint + * @param array $params + * @return mixed + * @throws FastDNSException + */ + protected function request(string $method, string $endpoint, array $params = []) { + if (!$this->jwtToken) + throw new FastDNSException(__METHOD__.': JWT token is null, forgot to authorize?'); + + $url = self::API_HOST.$endpoint; + $ch = curl_init(); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); + if (!empty($params)) { + if ($method === 'POST' || $method == 'PUT') { + curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); + curl_setopt($ch, CURLOPT_POSTFIELDS, jsonEncode($params)); + } else if ($method === 'GET') { // Probably never used + $url .= '?'.http_build_query($params); + } + } + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'Accept: application/json', + 'Authorization: Bearer '.$this->jwtToken + ]); + $body = curl_exec($ch); + $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + $response = jsonDecode($body); + if ($code >= 400) { + if (!empty($response['code']) && !empty($response['message'])) { + $message = $response['message']; + $code = $response['code']; + } else { + $message = $response['errors']['name'] ?? $body; + } + throw new FastDNSException($message, $code); + } + + return $response; + } + +} + +class FastDNSException extends Exception {} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4ea1ed1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,25 @@ +BSD 2-Clause License + +Copyright (c) 2021, Evgeny Zinoviev +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..de191c6 --- /dev/null +++ b/README.md @@ -0,0 +1,28 @@ +# php-fastdns + +Клиент к FastVPS DNS API. Позволяет создавать, редактировать, удалять домены и записи. + +Полезно для автоматизации, если у вас много доменов/поддоменов. + +## Использование + +```php +$fastdns = new FastDNS(); +try { + // авторизуемся + $fastdns->auth('ВАШ ТОКЕН'); + + // готово + // для примера, получим список доменов + $domains = $fastdns->getDomains(); + var_dump($domains); +} catch (FastDNSException $e) { + // что-то пошло не так +} +``` + +Все доступные методы и параметры смотрите в классе, он простой. + +## Лицензия + +BSD-2c -- cgit v1.2.3