Difference between revisions of "Python Sync AD with MySQL DB"
Jump to navigation
Jump to search
Michael.mast (talk | contribs) (Created page with "==Purpose== To dip my toes into Python.<br><br> My intern is syncing a local MySQL database with an external payroll API. Great, but now I need this information synced with A...") |
Michael.mast (talk | contribs) |
||
| (One intermediate revision by the same user not shown) | |||
| Line 3: | Line 3: | ||
My intern is syncing a local MySQL database with an external payroll API. Great, but now I need this information synced with AD. | My intern is syncing a local MySQL database with an external payroll API. Great, but now I need this information synced with AD. | ||
| + | |||
| + | ==Full Script== | ||
| + | |||
| + | <pre> | ||
| + | ##Import things | ||
| + | from ldap3 import Server, Connection, ALL, NTLM, MODIFY_REPLACE | ||
| + | import mysql.connector | ||
| + | from ldap_filter import Filter | ||
| + | ##LDAP Setup | ||
| + | ldap_server = Server('<ldap server>') | ||
| + | ldap_conn = Connection( | ||
| + | ldap_server, | ||
| + | user="tld\\<adminaccount>", | ||
| + | password='<somepassword>', | ||
| + | authentication=NTLM | ||
| + | ) | ||
| + | |||
| + | ##MySQL Setup | ||
| + | mysql_conn = mysql.connector.connect( | ||
| + | host = "<somehostname>", | ||
| + | user = "<db user name>", | ||
| + | passwd = "<somepassword>", | ||
| + | database = "<database name>" | ||
| + | ) | ||
| + | ##Value Mapping | ||
| + | values_dict = { | ||
| + | "First_Name": "givenname", | ||
| + | "Middle_Name": "middlename", | ||
| + | "Last_Name": "sn", | ||
| + | "Preferred_Name": "extensionattribute2", | ||
| + | "Work_Location": "physicaldeliveryofficename", | ||
| + | "Work_City": "l", | ||
| + | "Work_State": "st", | ||
| + | "Work_Postal": "postalcode", | ||
| + | "Work_Email": "mail" | ||
| + | } | ||
| + | |||
| + | ##Make connections and compare values. | ||
| + | cursor = mysql_conn.cursor() | ||
| + | selecttest = "select * from Employee_Info" | ||
| + | try: | ||
| + | ldap_conn.bind() | ||
| + | except: | ||
| + | print("Unable to bind to LDAP") | ||
| + | exit() | ||
| + | try: | ||
| + | cursor.execute(selecttest) | ||
| + | except: | ||
| + | print("Unable to select from database") | ||
| + | exit() | ||
| + | else: | ||
| + | dblist = cursor.fetchall() | ||
| + | for i in dblist: | ||
| + | #print(i) | ||
| + | #print(i[1]) | ||
| + | Employee_ID = i[1] | ||
| + | First_Name = i[2] | ||
| + | Middle_Name = i[3] | ||
| + | Last_Name = i[4] | ||
| + | Preferred_Name = i[13] | ||
| + | Work_Address1 = i[15] | ||
| + | Work_Address2 = i[16] | ||
| + | Work_City = i[17] | ||
| + | Work_State = i[18] | ||
| + | Work_Postal = i[19] | ||
| + | Job_Title = i[20] | ||
| + | Position_Code = i[21] | ||
| + | Work_Email = i[22] | ||
| + | ldap_conn.search('DC=domain,DC=tld', '(employeeid={})'.format(Employee_ID), attributes = ["givenname","middlename","sn","extensionattribute2","physicaldeliveryofficename","streetaddress","l","st","postalcode","title","mail"]) | ||
| + | #print(ldap_conn.entries) | ||
| + | try: | ||
| + | dn = ldap_conn.entries[0].entry_dn | ||
| + | except: | ||
| + | '' | ||
| + | for x in values_dict: | ||
| + | value2 = values_dict[x] | ||
| + | try: | ||
| + | result1 = getattr(ldap_conn.entries[0], value2) | ||
| + | #print(result1) | ||
| + | except Exception as error: | ||
| + | '' | ||
| + | else: | ||
| + | if Work_Address2: | ||
| + | sql_address='{0}\n{1}'.format(Work_Address1, Work_Address2) | ||
| + | else: | ||
| + | sql_address=Work_Address1 | ||
| + | ldap_address=(ldap_conn.entries[0].streetaddress) | ||
| + | if sql_address != ldap_address: | ||
| + | print('Updating Address for ',First_Name, Last_Name) | ||
| + | #print('Comparing\n',sql_address,'\n\n',ldap_address) | ||
| + | ldap_conn.modify(dn, {'streetaddress' : [(MODIFY_REPLACE, [sql_address])] }) | ||
| + | ldap1 = str(result1) | ||
| + | ldap2 = ldap1.lower() | ||
| + | if '[' not in ldap2: | ||
| + | try: | ||
| + | sql1 = eval(x) | ||
| + | sql1 = str(sql1) | ||
| + | sql2 = sql1.lower() | ||
| + | if not sql2: | ||
| + | raise Exception('sql2 is empty') | ||
| + | except Exception as error: | ||
| + | '' | ||
| + | else: | ||
| + | if ldap2 != sql2: | ||
| + | print(First_Name, Last_Name) | ||
| + | #print('SQL', sql1, 'does not match LDAP', ldap1) | ||
| + | sql3 = sql2.capitalize() | ||
| + | print(sql3, 'replacing', ldap1) | ||
| + | ldap_conn.modify(dn, {value2 : [(MODIFY_REPLACE, [sql3])] }) | ||
| + | |||
| + | ldap_conn.unbind() | ||
| + | |||
| + | </pre> | ||
==LDAP== | ==LDAP== | ||
| Line 8: | Line 121: | ||
Running this on Amazon Linux 2 | Running this on Amazon Linux 2 | ||
<pre> | <pre> | ||
| − | sudo pip3 install ldap3 | + | sudo pip3 install ldap3 ldap-filter |
</pre> | </pre> | ||
Latest revision as of 13:01, 5 February 2020
Contents
Purpose
To dip my toes into Python.
My intern is syncing a local MySQL database with an external payroll API. Great, but now I need this information synced with AD.
Full Script
##Import things
from ldap3 import Server, Connection, ALL, NTLM, MODIFY_REPLACE
import mysql.connector
from ldap_filter import Filter
##LDAP Setup
ldap_server = Server('<ldap server>')
ldap_conn = Connection(
ldap_server,
user="tld\\<adminaccount>",
password='<somepassword>',
authentication=NTLM
)
##MySQL Setup
mysql_conn = mysql.connector.connect(
host = "<somehostname>",
user = "<db user name>",
passwd = "<somepassword>",
database = "<database name>"
)
##Value Mapping
values_dict = {
"First_Name": "givenname",
"Middle_Name": "middlename",
"Last_Name": "sn",
"Preferred_Name": "extensionattribute2",
"Work_Location": "physicaldeliveryofficename",
"Work_City": "l",
"Work_State": "st",
"Work_Postal": "postalcode",
"Work_Email": "mail"
}
##Make connections and compare values.
cursor = mysql_conn.cursor()
selecttest = "select * from Employee_Info"
try:
ldap_conn.bind()
except:
print("Unable to bind to LDAP")
exit()
try:
cursor.execute(selecttest)
except:
print("Unable to select from database")
exit()
else:
dblist = cursor.fetchall()
for i in dblist:
#print(i)
#print(i[1])
Employee_ID = i[1]
First_Name = i[2]
Middle_Name = i[3]
Last_Name = i[4]
Preferred_Name = i[13]
Work_Address1 = i[15]
Work_Address2 = i[16]
Work_City = i[17]
Work_State = i[18]
Work_Postal = i[19]
Job_Title = i[20]
Position_Code = i[21]
Work_Email = i[22]
ldap_conn.search('DC=domain,DC=tld', '(employeeid={})'.format(Employee_ID), attributes = ["givenname","middlename","sn","extensionattribute2","physicaldeliveryofficename","streetaddress","l","st","postalcode","title","mail"])
#print(ldap_conn.entries)
try:
dn = ldap_conn.entries[0].entry_dn
except:
''
for x in values_dict:
value2 = values_dict[x]
try:
result1 = getattr(ldap_conn.entries[0], value2)
#print(result1)
except Exception as error:
''
else:
if Work_Address2:
sql_address='{0}\n{1}'.format(Work_Address1, Work_Address2)
else:
sql_address=Work_Address1
ldap_address=(ldap_conn.entries[0].streetaddress)
if sql_address != ldap_address:
print('Updating Address for ',First_Name, Last_Name)
#print('Comparing\n',sql_address,'\n\n',ldap_address)
ldap_conn.modify(dn, {'streetaddress' : [(MODIFY_REPLACE, [sql_address])] })
ldap1 = str(result1)
ldap2 = ldap1.lower()
if '[' not in ldap2:
try:
sql1 = eval(x)
sql1 = str(sql1)
sql2 = sql1.lower()
if not sql2:
raise Exception('sql2 is empty')
except Exception as error:
''
else:
if ldap2 != sql2:
print(First_Name, Last_Name)
#print('SQL', sql1, 'does not match LDAP', ldap1)
sql3 = sql2.capitalize()
print(sql3, 'replacing', ldap1)
ldap_conn.modify(dn, {value2 : [(MODIFY_REPLACE, [sql3])] })
ldap_conn.unbind()
LDAP
[1] Running this on Amazon Linux 2
sudo pip3 install ldap3 ldap-filter
MySQL
sudo pip3 install mysql-connector-python