Документация CloudPub Python SDK
CloudPub Python SDK предоставляет простой и мощный интерфейс для взаимодействия с платформой сервисов CloudPub. CloudPub обеспечивает безопасное туннелирование и публикацию сервисов, позволяя безопасно открывать локальные сервисы в интернет.
Установка
Установите SDK с помощью pip:
pip install cloudpub-python-sdk
Быстрый старт
Простая публикация сервиса
from cloudpub_python_sdk import Connection, Protocol, Auth
# Создание соединения с учетными данными
conn = Connection(
email="user@example.com",
password="password"
)
# Публикация локального веб-сервиса
endpoint = conn.publish(
Protocol.HTTP,
"localhost:3000",
name="Мое веб-приложение",
auth=Auth.NONE
)
print(f"Сервис опубликован по адресу: {endpoint.url}")
# Поддержание сервиса в работе
try:
input("Нажмите Enter для остановки...")
finally:
# Очистка
conn.unpublish(endpoint.guid)
Расширенная публикация сервиса
from cloudpub_python_sdk import (
Connection, Protocol, Auth, Acl, Header,
FilterRule, FilterAction, Role
)
conn = Connection(
email="admin@example.com",
password="password"
)
# Настройка списка контроля доступа
acl = [
Acl("admin@example.com", Role.ADMIN),
Acl("user@example.com", Role.READER),
Acl("writer@example.com", Role.WRITER),
]
# Добавление пользовательских HTTP заголовков
headers = [
Header("X-API-Version", "2.0"),
Header("Access-Control-Allow-Origin", "*"),
Header("X-Custom-Header", "CloudPub"),
]
# Определение правил фильтрации для обработки запросов
rules = [
FilterRule(
data='http.path starts_with "/api/" and http.headers["X-API-Key"] contains "valid"',
action_type=FilterAction.ALLOW,
order=0
),
FilterRule(
data='http.path matches "^/admin.*" and not (ip.src >= 192.168.1.0 and ip.src <= 192.168.1.255)',
action_type=FilterAction.DENY,
order=1
),
FilterRule(
data='http.path starts_with "/api/v1/"',
action_type=FilterAction.REDIRECT,
action_value="https://api.example.com/v2/",
order=2
),
]
# Публикация сервиса со всеми расширенными возможностями
endpoint = conn.publish(
Protocol.HTTPS,
"localhost:8443",
name="Защищенный API сервер",
auth=Auth.BASIC,
acl=acl,
headers=headers,
rules=rules
)
print(f"Расширенный сервис опубликован по адресу: {endpoint.url}")
Типы сервисов
HTTP/HTTPS сервисы
# Публикация HTTP сервиса с базовой аутентификацией
http_endpoint = conn.publish(
Protocol.HTTP,
"localhost:8080",
name="API сервер",
auth=Auth.BASIC # Требовать пароль для доступа
)
# Публикация HTTPS сервиса
https_endpoint = conn.publish(
Protocol.HTTPS,
"localhost:8443",
name="Защищенный API",
auth=Auth.BASIC
)
TCP/UDP сервисы
# Публикация TCP сервиса (например, SSH)
tcp_endpoint = conn.publish(
Protocol.TCP,
"localhost:22",
name="SSH сервер",
auth=Auth.NONE
)
# Публикация UDP сервиса (например, DNS)
udp_endpoint = conn.publish(
Protocol.UDP,
"localhost:53",
name="DNS сервер",
auth=Auth.NONE
)
RTSP стриминговые сервисы
# Публикация RTSP потока с учетными данными в URL
# Формат: rtsp://username:password@host:port/path
rtsp_endpoint = conn.publish(
Protocol.RTSP,
"rtsp://camera:secret123@192.168.1.100:554/live/stream1",
name="Камера безопасности",
auth=Auth.BASIC # Аутентификация доступа CloudPub
)
# RTSP без учетных данных (публичный поток)
public_rtsp = conn.publish(
Protocol.RTSP,
"rtsp://localhost:554/public",
name="Публичный поток",
auth=Auth.NONE
)
Управление сервисами
Список сервисов
# Получить все зарегистрированные сервисы
services = conn.ls()
for service in services:
print(f"Сервис: {service.guid}")
print(f" URL: {service.url}")
print(f" Статус: {service.status}")
print(f" Протокол: {service.remote_proto}")
Запуск и остановка сервисов
# Временно остановить сервис
conn.stop("service-guid-123")
# Перезапустить сервис
conn.start("service-guid-123")
# Постоянно удалить сервис
conn.unpublish("service-guid-123")
# Удалить все сервисы
conn.clean()
Управление конфигурацией
Динамическая конфигурация
# Установка значений конфигурации
conn.set("server", "api.cloudpub.com")
conn.set("port", "443")
conn.set("ssl", "true")
# Получение значений конфигурации
server = conn.get("server")
print(f"Сервер: {server}")
# Получение всех опций конфигурации
options = conn.options()
for key, value in options.items():
print(f"{key}: {value}")
Управление аутентификацией
# Аутентификация с учетными данными
conn = Connection(
email="user@example.com",
password="password"
)
# Позже, выход для очистки токена
conn.logout()
# Повторная аутентификация с сохраненным токеном
conn = Connection(token="saved-auth-token")
Вспомогательные функции
Проверка состояния сервера
# Измерение задержки сервера (возвращает микросекунды)
latency_us = conn.ping()
latency_ms = latency_us / 1000.0
print(f"Задержка сервера: {latency_us}мкс ({latency_ms:.2f}мс)")
if latency_ms > 100:
print("Предупреждение: Обнаружена высокая задержка!")
Управление кэшем
# Очистка локального кэша
conn.purge()
print("Кэш очищен")
Обработка ошибок
Все методы SDK генерируют соответствующие исключения для обработки ошибок:
from cloudpub_python_sdk import Connection, CloudPubError, AuthenticationError
try:
conn = Connection(
email="user@example.com",
password="wrong-password"
)
except AuthenticationError as e:
print(f"Ошибка аутентификации: {e}")
# Обработка ошибки аутентификации
except CloudPubError as e:
print(f"Ошибка соединения: {e}")
# Обработка общей ошибки
Справочник по правилам фильтрации
Правила фильтрации позволяют управлять маршрутизацией запросов и доступом на основе различных параметров соединения.
Правила обрабатываются по порядку (по полю order
), и первое подходящее правило применяется.
Доступные переменные
ip.src
,ip.dst
- IP адреса источника и назначенияport.src
,port.dst
- Порты источника и назначенияprotocol
- Протокол соединения (“tcp”, “udp”, “http”)http.host
,http.path
,http.method
- HTTP-специфичные поляhttp.headers["Header-Name"]
- Доступ к HTTP заголовкамgeo.country
,geo.region
,geo.city
,geo.code
- Данные геолокации
Операторы
Сравнение:
==
,!=
,>
,<
,>=
,<=
Строковые:
matches
(regex),contains
,starts_with
,ends_with
Логические:
and
,or
,not
Примеры правил фильтрации
rules = [
# Разрешить доступ к API только из локальной сети
FilterRule(
data='ip.src >= 192.168.1.0 and ip.src <= 192.168.1.255 and http.path starts_with "/api/"',
action_type=FilterAction.ALLOW,
order=0
),
# Блокировать доступ к админ-панели снаружи
FilterRule(
data='http.path matches "^/admin.*"',
action_type=FilterAction.DENY,
order=1
),
# Перенаправление старых API эндпоинтов на новую версию
FilterRule(
data='http.path starts_with "/api/v1/"',
action_type=FilterAction.REDIRECT,
action_value="https://api.example.com/v2/",
order=2
),
# Блокировать запросы из определенных стран
FilterRule(
data='geo.country != "Россия"',
action_type=FilterAction.DENY,
order=3
),
# Разрешить только аутентифицированные API запросы
FilterRule(
data='http.path starts_with "/api/" and http.headers["Authorization"] contains "Bearer"',
action_type=FilterAction.ALLOW,
order=4
),
]
Полный пример
Вот полный пример, демонстрирующий полный жизненный цикл с расширенными возможностями:
from cloudpub_python_sdk import (
Connection, Protocol, Auth, Acl, Header,
FilterRule, FilterAction, Role, CloudPubError
)
import time
def main():
try:
# Инициализация соединения с конфигурацией
print("Подключение к CloudPub...")
conn = Connection(
email="admin@example.com",
password="secure-password",
log_level="info",
verbose=True
)
print("Успешно подключено!")
# Публикация нескольких сервисов
print("\nПубликация сервисов...")
# Простой веб-сервис без расширенных возможностей
web_service = conn.publish(
Protocol.HTTP,
"localhost:3000",
name="Веб-приложение",
auth=Auth.NONE
)
print(f"✓ Веб-приложение: {web_service.url}")
# API сервер с ACL и пользовательскими заголовками
api_acl = [
Acl("api_admin@example.com", Role.ADMIN),
Acl("api_user@example.com", Role.READER),
]
api_headers = [
Header("X-API-Version", "2.0"),
Header("Access-Control-Allow-Origin", "*"),
]
api_service = conn.publish(
Protocol.HTTPS,
"localhost:8443",
name="API сервер",
auth=Auth.BASIC,
acl=api_acl,
headers=api_headers
)
print(f"✓ API сервер: {api_service.url}")
# SSH сервис с правилами фильтрации для безопасности
ssh_rules = [
FilterRule(
data="ip.src == 192.168.1.10 or ip.src == 10.0.0.5",
action_type=FilterAction.ALLOW,
order=0
),
FilterRule(
data='ip.src matches ".*"',
action_type=FilterAction.DENY,
order=1
),
]
ssh_service = conn.publish(
Protocol.TCP,
"localhost:22",
name="SSH доступ",
auth=Auth.BASIC,
rules=ssh_rules
)
print(f"✓ SSH: {ssh_service.url}")
# Проверка состояния сервера
print("\nПроверка состояния сервера...")
latency_us = conn.ping()
print(f"Задержка сервера: {latency_us}мкс ({latency_us/1000.0:.2f}мс)")
# Список всех сервисов
print("\nАктивные сервисы:")
services = conn.ls()
for i, service in enumerate(services, 1):
print(f"{i}. {service.guid} - {service.url}")
# Работать некоторое время
print("\nСервисы запущены. Нажмите Ctrl+C для остановки...")
try:
time.sleep(3600) # Работать 1 час
except KeyboardInterrupt:
print("\nОстановка...")
# Очистка
print("Очистка сервисов...")
for service in services:
conn.unpublish(service.guid)
print(f"✓ Удален: {service.guid}")
print("Все сервисы остановлены. До свидания!")
except CloudPubError as e:
print(f"Ошибка: {e}")
return 1
return 0
if __name__ == "__main__":
exit(main())