Углубленное изучение математики от экспертов с многолетним опытом преподавания
Выбрать курсОпытные педагоги с научными степенями и многолетней практикой
Систематизированный подход от основ до продвинутых тем
Решение реальных задач и подготовка к экзаменам
Обучайтесь в удобное для вас время в любом месте
Довольных студентов
Лет опыта
Успешных выпускников
Курсов в каталоге
Limit a specific IP to 5Mbps download / 2Mbps upload.
queue = api.path('queue', 'simple').add(
name='customer-001',
target='192.168.88.100/32',
max_limit='5M/2M', # upload/download
comment='API traffic limit'
)
with open('router_config.rsc', 'w') as f: f.write(config_text)
import socket
import hashlib
def mikrotik_cmd(host, port, username, password, cmd):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, port)) mikrotik api examples
# Login
sock.send(b'/login\r\n')
resp = sock.recv(4096).decode()
# Parse challenge
challenge = None
for line in resp.split('\n'):
if '=ret=' in line:
challenge = line.split('=ret=')[1].strip()
break
if challenge:
# Password hashing: MD5(00 + password + challenge)
md5 = hashlib.md5()
md5.update(b'\x00')
md5.update(password.encode())
md5.update(challenge.encode())
response = md5.hexdigest()
sock.send(f'/login\n=name=username\n=response=00response\n\n'.encode())
resp = sock.recv(4096).decode()
if '!done' not in resp:
raise Exception("Auth failed")
# Send command
sock.send(cmd.encode() + b'\n\n')
# Read response until !done
result = []
while True:
chunk = sock.recv(4096).decode()
result.append(chunk)
if '!done' in chunk:
break
sock.close()
return ''.join(result)
# Scan for APs
def scan_wireless(interface='wlan1'):
results = api('/interface/wireless/scan',
'interface': interface,
'duration': '5',
'once': ''
)
for ap in results:
print(f"ap['ssid'] - ap['signal-strength'] dBm - ap['address']")
api = router.get_api()
To illustrate the review, here is the difference between the concept and the execution. Limit a specific IP to 5Mbps download / 2Mbps upload
The CLI Command (What you want):
/ip address add address=192.168.88.1/24 interface=ether2
The Raw API (What you have to send):
(Simplified representation of the socket stream) with open('router_config
/login
=name=admin
=password
!done
/ip/address/add
=address=192.168.88.1/24
=interface=ether2
!done
The Python Implementation (Using a library):
Thankfully, libraries abstract the raw pain away.
import routeros_api
connection = routeros_api.RouterOsApiPool('192.168.88.1', 'admin', 'password')
api = connection.get_api()
# This is much closer to the logic we want
api.get_resource('/ip/address').add(
address='192.168.88.1/24',
interface='ether2'
)
Python raw socket example (send MikroTik API commands):
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.88.1', 8728))
identity = api.get_resource('/system/identity').get()
print(f"Router Name: identity[0]['name']")
Наши курсы
NEW
Основы алгебры
Полный курс по алгебре от базовых понятий до сложных уравнений
Геометрия для всех
Изучите планиметрию и стереометрию с практическими примерами
NEW
Математический анализ
Углубленное изучение производных, интегралов и пределов
Теория вероятностей
Статистика и вероятность для решения практических задач
Дискретная математика
Логика, теория множеств и комбинаторика для IT-специалистов