Init project
This commit is contained in:
commit
db4dbc2e14
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
config.py
|
||||||
|
__pycache__**
|
||||||
|
res.xml
|
||||||
|
.venv**
|
BIN
MANUAL. Get token.pdf
Normal file
BIN
MANUAL. Get token.pdf
Normal file
Binary file not shown.
19
app.py
Normal file
19
app.py
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
import config
|
||||||
|
import cloud
|
||||||
|
import cloudad
|
||||||
|
|
||||||
|
c = cloud.cloud(config.API_TOKEN)
|
||||||
|
a = cloudad.AD()
|
||||||
|
#r = a.getUserInfo("M-kab4", "sAMAccountName", ['sAMAccountName', "cn", "mail", "Enabled"])
|
||||||
|
#print(a.isDisabled("Esina.Svetlana1", "sAMAccountName"))
|
||||||
|
|
||||||
|
for r in c.getUserList():
|
||||||
|
print(r["name"], a.isDisabled(r["name"], "sAMAccountName"), a.isEnabled(r["name"], "sAMAccountName"))
|
||||||
|
|
||||||
|
|
||||||
|
# print(c.getVMList())
|
||||||
|
|
||||||
|
# print(c.getUserList())
|
||||||
|
|
||||||
|
|
||||||
|
|
69
cloud.py
Normal file
69
cloud.py
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
import config
|
||||||
|
import requests
|
||||||
|
import xml.dom.minidom
|
||||||
|
|
||||||
|
class cloud:
|
||||||
|
def __init__(self, API_KEY: str):
|
||||||
|
'''
|
||||||
|
Запрос списка машин с перечнем атрибутов: Имя, ОС, IP-адрес, Состояние
|
||||||
|
На входе нужен Access Token получить который можно при помощи функции getAccessToken(API Token)
|
||||||
|
'''
|
||||||
|
|
||||||
|
url = "https://" + config.SITE + "/oauth/tenant/" + config.TENANT + "/token"
|
||||||
|
headers = {
|
||||||
|
"Accept": "application/json",
|
||||||
|
"Content-Type": "application/x-www-form-urlencoded",
|
||||||
|
"Content-Length": "71"
|
||||||
|
}
|
||||||
|
data = "grant_type=refresh_token&refresh_token=" + config.API_TOKEN
|
||||||
|
|
||||||
|
try:
|
||||||
|
token = requests.post(url=url, headers=headers, data=data).json()['access_token']
|
||||||
|
self.__access_token = token
|
||||||
|
except:
|
||||||
|
raise SystemError("Ошибка иницализации Access Token.")
|
||||||
|
|
||||||
|
def getVMList(self) -> list:
|
||||||
|
'''
|
||||||
|
Запрос списка машин с перечнем атрибутов: Имя, ОС, IP-адрес, Состояние
|
||||||
|
'''
|
||||||
|
url = "https://" + config.SITE + "/api/query/?type=vm&fields=name,detectedGuestOs,ipAddress,status&filter=isVAppTemplate==false"
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
"Accept": "application/*;version=" + config.API_VERSION,
|
||||||
|
"Authorization": "Bearer " + self.__access_token
|
||||||
|
}
|
||||||
|
|
||||||
|
res = requests.get(url=url, headers=headers)
|
||||||
|
dom = xml.dom.minidom.parseString(res.text)
|
||||||
|
|
||||||
|
return [{
|
||||||
|
"name": e.attributes['name'].value,
|
||||||
|
"detectedGuestOs": e.attributes['detectedGuestOs'].value,
|
||||||
|
"ipAddress": e.attributes['ipAddress'].value,
|
||||||
|
"status": e.attributes['status'].value}
|
||||||
|
for e in dom.getElementsByTagName("VMRecord")]
|
||||||
|
|
||||||
|
def getUserList(self) -> list:
|
||||||
|
'''
|
||||||
|
Запрос списка пользователей
|
||||||
|
На выходе имеем список словарей:
|
||||||
|
[{
|
||||||
|
"name": "str('name')",
|
||||||
|
"fullName": "str('fullName)",
|
||||||
|
"isEnabled": bool('isEnabled')
|
||||||
|
}, {
|
||||||
|
.....
|
||||||
|
}]
|
||||||
|
'''
|
||||||
|
url = "https://" + config.SITE + "/api/query?type=user&fields=name,fullName,isEnabled"
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
"Accept": "application/*;version=" + config.API_VERSION,
|
||||||
|
"Authorization": "Bearer " + self.__access_token
|
||||||
|
}
|
||||||
|
|
||||||
|
res = requests.get(url=url, headers=headers)
|
||||||
|
dom = xml.dom.minidom.parseString(res.text)
|
||||||
|
|
||||||
|
return [{"name": e.attributes['name'].value, "fullName": e.attributes['fullName'].value, "isEnabled": bool(e.attributes['isEnabled'].value)} for e in dom.getElementsByTagName("UserRecord")]
|
32
cloudad.py
Normal file
32
cloudad.py
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
import ldap3
|
||||||
|
import ldap3.abstract
|
||||||
|
import ldap3.abstract.entry
|
||||||
|
import config
|
||||||
|
|
||||||
|
class AD:
|
||||||
|
def __init__(self):
|
||||||
|
server = ldap3.Server(config.AD_SERVER)
|
||||||
|
try:
|
||||||
|
server = ldap3.Server(config.AD_SERVER)
|
||||||
|
self.__conn = ldap3.Connection(server, user=config.AD_USERNAME, password=config.AD_PASSWORD, auto_bind=True)
|
||||||
|
except:
|
||||||
|
raise "Ошибка подключения к LDAP"
|
||||||
|
|
||||||
|
def getUserInfo(self, searchValue: str, searchField: str, searchAttr: list) -> list:
|
||||||
|
search_filter = "(&(objectClass=User)("+ searchField +"="+ searchValue +"))"
|
||||||
|
self.__conn.search(config.AD_BASE_DN, search_filter, search_scope="LEVEL", attributes=searchAttr)
|
||||||
|
|
||||||
|
d = {}
|
||||||
|
l = []
|
||||||
|
for entry in self.__conn.entries:
|
||||||
|
l.append(entry.entry_attributes_as_dict)
|
||||||
|
return l
|
||||||
|
|
||||||
|
def isDisabled(self, searchValue: str, searchField: str) -> bool:
|
||||||
|
ldap_filder = "(&(objectClass=User)(" + searchField + "="+searchValue+")(userAccountControl:1.2.840.113556.1.4.803:=2))"
|
||||||
|
self.__conn.search(config.AD_BASE_DN, ldap_filder, "SUBTREE" )
|
||||||
|
return bool(len(self.__conn.entries))
|
||||||
|
|
||||||
|
def isEnabled(self, searchValue: str, searchField: str) -> bool:
|
||||||
|
return not self.isDisabled(searchValue, searchField)
|
||||||
|
|
9
config.py-example
Normal file
9
config.py-example
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
API_TOKEN = "YOU TOKEN"
|
||||||
|
API_VERSION = "38.1"
|
||||||
|
SITE = "SITE NAME"
|
||||||
|
TENANT = "TENANT NAME"
|
||||||
|
|
||||||
|
AD_SERVER = "x.x.x.x"
|
||||||
|
AD_USERNAME = "UserLogin@domain.name"
|
||||||
|
AD_PASSWORD = "VeeeeryStrongPassword"
|
||||||
|
AD_BASE_DN = "OU=Super,OU=Users,dc=consto,dc=com"
|
22
readme.md
Normal file
22
readme.md
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
# getCloud
|
||||||
|
Набор инструментов дял получения данных из cloud.ru
|
||||||
|
|
||||||
|
## Что нужно для запуска
|
||||||
|
1. Установить библиотеку ldap3
|
||||||
|
2. Для запуска необхдоимо получить API-токен на cloud.ru (инструкция находится в pdf-файле)
|
||||||
|
3. Переименовать файл config.py-example в config.py
|
||||||
|
4. Заполнить содержимое config.py актуальными данными.
|
||||||
|
|
||||||
|
|
||||||
|
## Структура
|
||||||
|
#### ./app.py
|
||||||
|
Основной файл приложения с примерами использования
|
||||||
|
|
||||||
|
#### ./cloud.py
|
||||||
|
Описание класса для взаимодействия с cloud.ru
|
||||||
|
|
||||||
|
#### ./cloud.py
|
||||||
|
Описание класса для взаимодействия с ActiveDirectory
|
||||||
|
|
||||||
|
#### ./config.py
|
||||||
|
Конфигурационный файл с описанием глобальных переменных.
|
Loading…
Reference in New Issue
Block a user