Суть работы скрипта, добавляет пользователей из AD в систему удаленного доступа guacamole.
Полученные данные выгружаются из AD и загружаются в таблицу mysql guacamole.
#! /usr/bin/python
# -*- coding: utf-8 -*-
import re
import MySQLdb
import sys
from ldap3 import Server, Connection, SIMPLE, SYNC, ASYNC, SUBTREE, ALL
def create_new_user(name, local, ip): # Добавление в базу сотрудника для удаленного управления
# Первая часть добавления сотрудника согласно логике работы Guacamole
db = MySQLdb.connect(host='*********', user='*********', passwd='*********', db='*********', charset='utf8')
cursor = db.cursor()
sql = """INSERT INTO guacamole_connection(connection_name, parent_id, protocol)
VALUES ('%(name)s', '%(local)d', 'vnc')"""%{"name":name, "local":local}
cursor.execute(sql)
# Получение connection_id последней записи из таблицы базы Guacamole
last_id = """SELECT connection_id FROM guacamole_connection ORDER BY connection_id DESC LIMIT 1"""
cursor.execute(last_id)
data = cursor.fetchall()
for rec in data:
my_id = rec[0]
# Добавление IP адреса сотрудника, полученного из Active Directory.
sql_2 = """INSERT INTO guacamole_connection_parameter(connection_id, parameter_name, parameter_value)
VALUES ('%(my_id)d', 'hostname', '%(ip)s')"""%{"my_id":my_id, "ip":ip}
cursor.execute(sql_2)
# Добавление пароля сотрудника
sql_3 = """INSERT INTO guacamole_connection_parameter(connection_id, parameter_name, parameter_value)
VALUES ('%(my_id)d', 'password', '**************')"""%{"my_id":my_id}
cursor.execute(sql_3)
# Добавление порта сотрудника
sql_4 = """INSERT INTO guacamole_connection_parameter(connection_id, parameter_name, parameter_value)
VALUES ('%(my_id)d', 'port', 5900)"""%{"my_id":my_id}
cursor.execute(sql_4)
db.commit()
db.close()
def create_new_user_read_only(name, local, ip): # Добавление в базу сотрудника для удаленного управления
# Первая часть добавления сотрудника согласно логике работы Guacamole
db = MySQLdb.connect(host='*********', user='*********', passwd='*********', db='*********', charset='utf8')
cursor = db.cursor()
sql = """INSERT INTO guacamole_connection(connection_name, parent_id, protocol)
VALUES ('%(name)s', '%(local)d', 'vnc')"""%{"name":name, "local":local}
cursor.execute(sql)
# Получение connection_id последней записи из таблицы базы Guacamole
last_id = """SELECT connection_id FROM guacamole_connection ORDER BY connection_id DESC LIMIT 1"""
cursor.execute(last_id)
data = cursor.fetchall()
for rec in data:
my_id = rec[0]
# Добавление IP адреса сотрудника, полученного из Active Directory.
sql_2 = """INSERT INTO guacamole_connection_parameter(connection_id, parameter_name, parameter_value)
VALUES ('%(my_id)d', 'hostname', '%(ip)s')"""%{"my_id":my_id, "ip":ip}
cursor.execute(sql_2)
# Добавление пароля сотрудника
sql_3 = """INSERT INTO guacamole_connection_parameter(connection_id, parameter_name, parameter_value)
VALUES ('%(my_id)d', 'password', '************')"""%{"my_id":my_id}
cursor.execute(sql_3)
# Добавление порта сотрудника
sql_4 = """INSERT INTO guacamole_connection_parameter(connection_id, parameter_name, parameter_value)
VALUES ('%(my_id)d', 'port', 5900)"""%{"my_id":my_id}
cursor.execute(sql_4)
# Добавление статуса, только чтение
sql_5 = """INSERT INTO guacamole_connection_parameter(connection_id, parameter_name, parameter_value)
VALUES ('%(my_id)d', 'read-only', 'true')"""%{"my_id":my_id}
cursor.execute(sql_5)
db.commit()
db.close()
def delete_old_data(base): # Предварительная очистка таблиц от старых данных
db = MySQLdb.connect(host='*********', user='*********', passwd='*********', db='*********', charset='utf8')
cursor = db.cursor()
sql = """DELETE FROM %(base)s WHERE connection_id >= 10"""%{"base":base}
cursor.execute(sql)
db.commit()
db.close()
def new_auto_increment(base): # Пересчет счетчика автоинкремента
db = MySQLdb.connect(host='*********', user='*********', passwd='*********', db='*********', charset='utf8')
cursor = db.cursor()
sql = """ALTER TABLE %(base)s AUTO_INCREMENT = 11"""%{"base":base}
cursor.execute(sql)
db.commit()
db.close()
# DNS имя сервера Active Directory
AD_SERVER = '**********'
# Пользователь (логин) в Active Directory - нужно указать логин в AD
AD_USER = '********'
AD_PASSWORD = '********'
AD_SEARCH_TREE = **********'
server = Server(AD_SERVER)
conn = Connection(server, user=AD_USER, password=AD_PASSWORD)
conn.bind()
# Должен вернуться ответ True
# Поиск в Active Directory
# примеры ldap фильтров можно посмотреть здесь
conn.search(AD_SEARCH_TREE, '(&(objectCategory=Person)(objectClass=user)(employeeID=*))', SUBTREE,
attributes = ['cn','employeeID'])
base_1 = 'guacamole_connection'
base_2 = 'guacamole_connection_parameter'
delete_old_data(base_1)
delete_old_data(base_2)
new_auto_increment(base_1)
new_auto_increment(base_2)
create_new_user('Касса', 6, '*********')
create_new_user_read_only('Касса', 10, '*********')
create_new_user('Касса', 8, '*********')
create_new_user_read_only('Касса', 12, '*********')
create_new_user('Касса', 7, '*********')
create_new_user_read_only('Касса', 11, '*********')
for entry in conn.entries:
name = str(entry.cn)
ip = str(entry.employeeID)
office = re.findall(r'*********', ip)
office_1 = re.findall(r'*********', ip)
alt = re.findall(r'*********', ip)
krd = re.findall(r'172*********123', ip)
ros = re.findall(r'172*********61', ip)
if office:
create_new_user(name, 3, ip)
create_new_user_read_only(name, 9, ip)
if office_1:
create_new_user(name, 3, ip)
create_new_user_read_only(name, 9, ip)
if krd:
create_new_user(name, 6, ip)
create_new_user_read_only(name, 10, ip)
if ros:
create_new_user(name, 8, ip)
create_new_user_read_only(name, 12, ip)
if alt:
create_new_user(name, 7, ip)
create_new_user_read_only(name, 11, ip)