ldap_gravatar: Initial version of role

This commit is contained in:
Timo Makinen 2021-03-16 19:18:55 +00:00
parent b841119e1a
commit 015de5a8df
2 changed files with 97 additions and 0 deletions

View file

@ -0,0 +1,72 @@
#!/usr/bin/python3
import urllib
import syslog
import hashlib
import ldap3
import requests
def ldap_connect():
server = ldap3.Server("ldapi:///var/run/ldapi")
conn = ldap3.Connection(
server,
authentication=ldap3.SASL,
sasl_mechanism=ldap3.EXTERNAL,
sasl_credentials="",
client_strategy=ldap3.SYNC,
)
conn.bind()
conn.search(
search_base="",
search_filter="(objectClass=*)",
search_scope=ldap3.BASE,
attributes=["namingContexts"],
)
basedn = conn.response[0]["attributes"]["namingContexts"][0]
return (conn, basedn)
def get_users(conn, basedn):
conn.search(
search_base=basedn,
search_filter="(&(mail=*)(objectClass=inetOrgPerson))",
attributes=["mail", "jpegPhoto"],
)
for result in conn.response:
yield (result["dn"], result["attributes"])
def get_avatar(emails):
for email in emails:
mailhash = hashlib.md5(email.encode("utf-8").lower()).hexdigest()
url = f"https://gravatar.com/avatar/{mailhash}.jpg?d=404&size=80"
req = requests.get(url)
if req.status_code == 200:
return req.content
elif req.status_code == 404:
continue
raise ValueError(f"Invalid response from gravatar {req.status_code}")
return None
def update_avatar(conn, dn, image):
if image is None:
syslog.syslog(syslog.LOG_INFO, f"Removing jpegPhoto from user '{dn}'")
data = (ldap3.MODIFY_REPLACE, [])
else:
syslog.syslog(syslog.LOG_INFO, f"Updating jpegPhoto for user '{dn}'")
data = (ldap3.MODIFY_REPLACE, [image])
conn.modify(dn, {"jpegPhoto": [data]})
if __name__ == "__main__":
syslog.openlog()
(conn, basedn) = ldap_connect()
for (dn, user) in get_users(conn, basedn):
image = get_avatar(user["mail"])
if len(user["jpegPhoto"]) == 1 and user["jpegPhoto"][0] == image:
continue
update_avatar(conn, dn, image)
syslog.closelog()

View file

@ -0,0 +1,25 @@
---
- name: install dependencies
package:
name: "{{ item }}"
state: installed
with_items:
- python3-ldap3
- python3-requests
- name: install script
copy:
src: gravatar-update.py
dest: /usr/local/sbin/gravatar-update
mode: 755
owner: root
group: "{{ ansible_wheel }}"
- name: install cron job
cron:
name: gravatar-update
hour: "05"
minute: "10"
job: /usr/local/sbin/gravatar-update