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_php1 && return 0
 77     [[ -r "$index_html]] && ! index_file_is_default "$member" "$index_html" && index_file_has_more_lines_than "$index_html3 && 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