Jump to content
Local
rliskov

Mikrotik v. 6.45.1 авторизация по API

Recommended Posts

Обновил микротик до версии 6.45.1 и теперь биллинг не может авторизоваться по api на микротике. В описании релиза 6.45.1 написано:

Старый метод аутентификации API также больше не будет работать. Документацию для новой процедуры входа в систему смотрите в официальной Вики Микротик: https://wiki.mikrotik.com/wiki/Manual:API#Initial_login.

Подскажите что нужно подправить в убиллинге, чтоб он работал с микротиком версии 6.45.1

 

Share this post


Link to post
Share on other sites

ченждог почитать не?

ещё с 0.9.2 сделано

image.thumb.png.f0c665a7515fb29e6e54e8da903a16b8.png

или хотя бы попытаться почитать опции в алтер.ини 

я уже молчу про саму доку по микротикам

http://wiki.ubilling.net.ua/doku.php?id=mikrotikapi

  • Like 1

Share this post


Link to post
Share on other sites

Подскажите , пожалуйста, после обновления микротика до 6.45.6 перестал автаризовываться старгейзер, в самом убиллинге все отлично - в разделе  Сервера доступа (NAS) показываются расширенные настройки микротика и подтягиваются все данные.

А вот сам старгейзер:

2019-10-19 13:33:28 - [Ubilling] - OnConnect started for user `1558511444`:
2019-10-19 13:33:32 - [Executer] - Error: Cannot establish connection with MikroTik!
2019-10-19 13:33:32 - [Ubilling] - QC: 2, elapsed time: 3.281 sec.
 

в скрипте /api/libs/api.routeros.php вижу новый метод обращения по API:

 

 if ($UseNewConnMode) {
                    $this->write('/login', false);
                    $this->write('=name=' . $username, false);
                    $this->write('=password=' . $password);

                    $response = $this->read(false);
                    if ($response[0] == '!done') {
                        $this->connected = true;
                        break;
                    }
                } else {
                    $this->write('/login');
                    $response = $this->read(false);
                    if (isset($response[0]) && $response[0] == '!done') {
                        if (preg_match_all('/[^=]+/i', $response[1], $matches)) {
                            if ($matches[0][0] == 'ret' && strlen($matches[0][1]) == 32) {
                                $this->write('/login', false);
                                $this->write('=name=' . $username, false);
                                $this->write('=response=00' . md5(chr(0) . $password . pack('H*', $matches[0][1])));
                                $response = $this->read(false);
                                if ($response[0] == '!done') {
                                    $this->connected = true;
                                    break;
                                }
                            }
                        }
                    }
                }

в скрипте самого executer-а старый метод:

 

        private function connect() {
            for ($ATTEMPT = 1; $ATTEMPT <= $this->config['attempts']; $ATTEMPT++) {
                $this->connected = FALSE;
                $this->log->message(__CLASS__, 'Connection attempt #' . $ATTEMPT . ' to ' . $this->parameters['ip'] . ':' . $this->config['api_port'] . '...', "api");
                if ( $this->socket = @fsockopen($this->parameters['ip'], $this->config['api_port'], $this->error_no, $this->error_str, $this->config['timeout']) ) {
                    socket_set_timeout($this->socket, $this->config['timeout']);
                    $this->write('/login');
                    $RESPONSE = $this->read(FALSE);
                    if ( $RESPONSE[0] == '!done' ) {
                        if ( preg_match_all('/[^=]+/i', $RESPONSE[1], $MATCHES) ) {
                            if ( $MATCHES[0][0] == 'ret' && strlen($MATCHES[0][1]) == 32 ) {
                                $this->write('/login', FALSE);
                                $this->write('=name=' . $this->options['username'], FALSE);
                                $this->write('=response=00' . md5(chr(0) . $this->options['password'] . pack('H*', $MATCHES[0][1])));
                                $RESPONSE = $this->read(FALSE);
                                if ( $RESPONSE[0] == '!done' ) {
                                    $this->connected = TRUE;
                                    break;
                                }
                           }
                        }
                    }

Переделываю точб-в точь как в /api/libs/api.routeros.php и глухо.

 

Подскажите что сделать нужно еще или может кто-то использует уже старгейзер с новым методом API для микротика - покажите вашу функцию connect в старгейзере.

Share this post


Link to post
Share on other sites
3 часа назад, Vsevolod сказал:

Подскажите , пожалуйста, после обновления микротика до 6.45.6 перестал автаризовываться старгейзер, в самом убиллинге все отлично - в разделе  Сервера доступа (NAS) показываются расширенные настройки микротика и подтягиваются все данные.

А вот сам старгейзер:

2019-10-19 13:33:28 - [Ubilling] - OnConnect started for user `1558511444`:
2019-10-19 13:33:32 - [Executer] - Error: Cannot establish connection with MikroTik!
2019-10-19 13:33:32 - [Ubilling] - QC: 2, elapsed time: 3.281 sec.
 

в скрипте /api/libs/api.routeros.php вижу новый метод обращения по API:

 


 if ($UseNewConnMode) {
                    $this->write('/login', false);
                    $this->write('=name=' . $username, false);
                    $this->write('=password=' . $password);

                    $response = $this->read(false);
                    if ($response[0] == '!done') {
                        $this->connected = true;
                        break;
                    }
                } else {
                    $this->write('/login');
                    $response = $this->read(false);
                    if (isset($response[0]) && $response[0] == '!done') {
                        if (preg_match_all('/[^=]+/i', $response[1], $matches)) {
                            if ($matches[0][0] == 'ret' && strlen($matches[0][1]) == 32) {
                                $this->write('/login', false);
                                $this->write('=name=' . $username, false);
                                $this->write('=response=00' . md5(chr(0) . $password . pack('H*', $matches[0][1])));
                                $response = $this->read(false);
                                if ($response[0] == '!done') {
                                    $this->connected = true;
                                    break;
                                }
                            }
                        }
                    }
                }

в скрипте самого executer-а старый метод:

 


        private function connect() {
            for ($ATTEMPT = 1; $ATTEMPT <= $this->config['attempts']; $ATTEMPT++) {
                $this->connected = FALSE;
                $this->log->message(__CLASS__, 'Connection attempt #' . $ATTEMPT . ' to ' . $this->parameters['ip'] . ':' . $this->config['api_port'] . '...', "api");
                if ( $this->socket = @fsockopen($this->parameters['ip'], $this->config['api_port'], $this->error_no, $this->error_str, $this->config['timeout']) ) {
                    socket_set_timeout($this->socket, $this->config['timeout']);
                    $this->write('/login');
                    $RESPONSE = $this->read(FALSE);
                    if ( $RESPONSE[0] == '!done' ) {
                        if ( preg_match_all('/[^=]+/i', $RESPONSE[1], $MATCHES) ) {
                            if ( $MATCHES[0][0] == 'ret' && strlen($MATCHES[0][1]) == 32 ) {
                                $this->write('/login', FALSE);
                                $this->write('=name=' . $this->options['username'], FALSE);
                                $this->write('=response=00' . md5(chr(0) . $this->options['password'] . pack('H*', $MATCHES[0][1])));
                                $RESPONSE = $this->read(FALSE);
                                if ( $RESPONSE[0] == '!done' ) {
                                    $this->connected = TRUE;
                                    break;
                                }
                           }
                        }
                    }

Переделываю точб-в точь как в /api/libs/api.routeros.php и глухо.

 

Подскажите что сделать нужно еще или может кто-то использует уже старгейзер с новым методом API для микротика - покажите вашу функцию connect в старгейзере.

 

Разобрался, перенес скипты и папки docs в старгейзер. Просто реально этого нигде в документации не нашел.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×