1 #!/bin/bash
2 # Script: update-script
3 # Description: Updates http://crew.c-base.org/ - can be called by cron as user www-data
4 # Author: Brian Wiborg <baccenfutter@c-base.org>
5 # Version : 1.0
6 # Date: 2011-05-08
7 # Source: git://dev.c-base.org/crew-c-base-org/crew-c-base-org.git
8 # License: Creative Commons Attribution 3.0 Unsupported (CC BY 3.0)
9
10 grouping_limit=50
11
12 ##### FILES #####
13 index_file=/var/www/crew.c-base.org/index.html
14 member_file=/var/www/crew.c-base.org/member/memberlist.txt
15 staging_file=/var/www/crew.c-base.org/testindex.html
16 html_header=/var/www/crew.c-base.org/template-crew_header.html
17 html_footer=/var/www/crew.c-base.org/template-crew_footer.html
18 dontlist_filename=".dontlist"
19
20 ##### GLOBAL ARRAYS #####
21 declare -a all_homes
22 declare -a ldap_users
23
24 ##### PLACEHOLDER VARS #####
25 clearboth="</div><div style=\"clear:both;\"></div>"
26
27 ##### FUNCTIONS #####
28 ### LDAP ###
29 get_all_active_members () {
30 local users=$(ldapsearch -x -b 'ou=crew,dc=c-base,dc=org' '(&(objectClass=cbaseMember)(memberOf=cn=crew,ou=groups,dc=c-base,dc=org))' uid | grep "uid:"| cut -d " " -f 2)
31 ldap_users=($(echo ${users[@]} | tr ' ' '\n' | sort -n))
32 }
33 is_user_active () {
34 local member="$1"
35 for ldap_user in ${ldap_users[@]}; do
36 if [[ "$ldap_user" == "$member" ]]; then
37 return 0
38 fi
39 done
40 return -1
41 }
42 ### HOMES ###
43 get_all_home_dirs () {
44 for dir in /home/*/; do
45 local member=$(basename ${dir} /)
46 if is_index_file "$member"; then
47 www_homes+=("${dir}")
48 fi
49 done
50 }
51 ### FILTERS ###
52 index_file_is_default () {
53 local member="$1"
54 local index_html="$2"
55 local default_string="<html><head><title>crewmember: ${member} </title></head><body bgcolor='black'></body></html>"
56 grep -q "$default_string" "$index_html"
57 }
58 index_file_has_more_lines_than () {
59 local index_html="$1"
60 local min_line_count="$2"
61 (( $(wc -l < "$index_html") > "$min_line_count" ))
62 }
63 dontlist_file_exists () {
64 local member="$1"
65 local dontlist="/home/${member}/public_html/${dontlist_filename}"
66 [[ -f "$dontlist" ]]
67 }
68 is_index_file () {
69 local member="$1"
70 local member_html_dir="/home/$member/public_html/"
71 local index_html="$member_html_dir/index.html"
72 local index_php="$member_html_dir/index.php"
73 # disqualify un-active and filter un-willing members
74 is_user_active "$member" || return -1
75 dontlist_file_exists "$member" && return -1
76 [[ -r "$index_php" ]] && index_file_has_more_lines_than "$index_php" 1 && return 0
77 [[ -r "$index_html" ]] && ! index_file_is_default "$member" "$index_html" && index_file_has_more_lines_than "$index_html" 3 && return 0
78 }
79 # HTML #
80 write_html_header () {
81 cat "$html_header"
82 }
83 write_html_footer () {
84 cat "$html_footer"
85 }
86 render_memberbox () {
87 local member="$1"
88 local gravatar_url="$2"
89 cat <<EOF
90 <div class="memberbox">
91 <div class="member-icon">
92 <img src="${gravatar_url}" alt="${gravatar_url}" />
93 </div>
94 [ <span class="crewname">${member}</span> ]<br />
95 member-page: [ <a href="http://${member}.crew.c-base.org">HTTP</a> | <a href="https://${member}.crew.c-base.org">SSL</a> ]
96 </div>
97 EOF
98 }
99 render_first_letter_and_hr () {
100 local member=$1
101 cat <<EOF
102 ${clearboth}
103 <br /><hr />
104 <br /><h2>${member:0:1}</h2><br />
105 <div class="memberbox-wrapper">
106 EOF
107 }
108 group_by_first_letter () {
109 # this function does <div>-voodoo-magic to group all members
110 # by the first letter of their crewname
111 local member="$1"
112 local first_letter="$2"
113 if [[ ! ${member:0:1} == "$first_letter" ]]; then
114 render_first_letter_and_hr "$member" >> "$staging_file"
115 first_letter=${member:0:1}
116 fi
117 echo "$first_letter"
118 }
119 render_memberbox_wrapper () {
120 local first_letter="" # needed for group_by_first_letter()
121 echo "<div class=\"memberbox-wrapper\">"
122 for dir in ${www_homes[@]}; do
123 local member="$(basename ${dir} /)"
124 local md5hash=$(echo -n "${member}@c-base.org" | md5sum)
125 local gravatar_url="http://gravatar.com/avatar/$md5hash"
126 # the following condition takes care of grouping members by first letter once the grouping limit is reached
127 (( ${#www_homes[@]} > $grouping_limit )) && first_letter="$(group_by_first_letter ${member} ${first_letter})"
128 render_memberbox "$member" "$gravatar_url"
129 done
130 cat <<EOF
131 </div><br />
132 ${clearboth}
133 <br /><hr />
134 Last update @ CET:$(date +%Y-%m-%d--%H:%M) found ${#www_homes[@]} member-pages from a total of ${#ldap_users[@]} crew-members.
135 <hr /><br /><br />
136 EOF
137 }
138 update_index_file () {
139 cp "$staging_file" "$index_file"
140 chown -R www-data:www-data "$staging_file" "$index_file"
141 chmod 755 "$staging_file" "$index_file"
142 }
143
144 user_finger_toget_sirname () {
145 local member="$1"
146 sirname=$(finger "$member" | head -n1 | tr ':' '\n' | tail -n1 | tr ' ' '\n' | tail -n 1)
147 totalsize=${#sirname}
148 securename=${sirname:${#sirname}-3:${#sirname}}
149 asteriskcount=$(( totalsize - 3 ))
150 for asterisk in $(seq 1 ${asteriskcount}); do
151 securename="*$securename"
152 done
153 echo $securename
154
155 }
156
157 ### MAIN ###
158 get_all_active_members
159 get_all_home_dirs
160 write_html_header > "$staging_file"
161 render_memberbox_wrapper >> "$staging_file"
162 write_html_footer >> "$staging_file"
163 update_index_file
164
165 echo "<b>Achtung:</b> Einige Nachnamen werden inkorrekt dargestellt, was auf Zeichensatzprobleme im OpenLDAP zurueckzufuehren ist!" > "$member_file"
166 echo "membername nachname" >> "$member_file"
167 echo "======================" >> "$member_file"
168 for user in ${ldap_users[@]}; do
169 echo "$user <-> $(user_finger_toget_sirname ${user})" >> "$member_file"
170 done
171 # fix character encoding
172 mv $member_file $member_file.tmp
173 iconv -ct utf-8 $member_file.tmp > $member_file
174 rm $member_file.tmp