Author: tchemit Date: 2014-10-09 11:49:02 +0200 (Thu, 09 Oct 2014) New Revision: 111 Url: http://forge.codelutin.com/projects/adminsys/repository/revisions/111 Log: refs #5074: Mise en place git (mise a jour des sites techniques) amelioration autres script du cron Added: scripts/redmine-tools/project-site.rb scripts/redmine-tools/project-technical-site.rb scripts/redmine-tools/update_technical_site.sh Modified: scripts/redmine-tools/create-project-site.sh scripts/redmine-tools/cron-redmine scripts/redmine-tools/project-scm.rb Modified: scripts/redmine-tools/create-project-site.sh =================================================================== --- scripts/redmine-tools/create-project-site.sh 2014-10-09 08:52:14 UTC (rev 110) +++ scripts/redmine-tools/create-project-site.sh 2014-10-09 09:49:02 UTC (rev 111) @@ -5,6 +5,7 @@ FORGE=$1 PROJECT=$2 +PROJECT_NAME=$3 #TODO Add dns entry @@ -49,3 +50,59 @@ mkdir /var/lib/doc/maven-site/$FORGE/$PROJECT 2> /dev/null a2ensite $APACHE_SITE_NAME > /dev/null + +INDEX_FILE=/var/lib/doc/site/$FORGE/$PROJECT/index.html + +if [ ! -f $INDEX_FILE ]; +then + echo "Create default index.html file at $INDEX_FILE" + +cat << EOF >> $INDEX_FILE +<html> +<head> +<title>$PROJECT_NAME</title> +</head> + +<body> +<h1>$PROJECT_NAME</h1> + +<p> +The main site of $PROJECT_NAME will be soon realized. +</p> + +<p> +Meanwhile, you can consult technical sites generated by Maven +for each release (see Releases section). +</p> + +<p>Enjoy! ($PROJECT_NAME Team)</p> + +<h2>Releases</h2> + +<table> +<thead> +<tr> +<th>version</th> +<th>date</th> +<th>site</th> +</tr> +</thead> +<tr> +<td>Latest</td> +<td></td> +<td><a href="http://$PROJECT.$FORGE/v/latest">site</a></td> +</tr> +<tr> +<td>Next</td> +<td></td> +<td><a href="http://$PROJECT.$FORGE/v/develop">site</a></td> +</tr> +<tr><td colspan="5"><hr/></td></tr> +<!-- UPDATE_START --> +</table> + +</body> +</html> + +EOF +fi \ No newline at end of file Modified: scripts/redmine-tools/cron-redmine =================================================================== --- scripts/redmine-tools/cron-redmine 2014-10-09 08:52:14 UTC (rev 110) +++ scripts/redmine-tools/cron-redmine 2014-10-09 09:49:02 UTC (rev 111) @@ -67,3 +67,10 @@ ruby /opt/redmine-tools/project-site.rb -f nuiton.org -k $nuiton_key >> $nuiton_log #ruby /opt/redmine-tools/project-site.rb -f chorem.org -k $chorem_key >> $chorem_log #ruby /opt/redmine-tools/project-site.rb -f codelutin.com -k $codelutin_key >> codelutin_log + +# Update project technical site +# TODO Do it for chorem.org and codelutin.com sites + +ruby /opt/redmine-tools/project-technical-site.rb -f nuiton.org -k $nuiton_key >> $nuiton_log +#ruby /opt/redmine-tools/project-technical-site.rb -f chorem.org -k $chorem_key >> $chorem_log +#ruby /opt/redmine-tools/project-technical-site.rb -f codelutin.com -k $codelutin_key >> codelutin_log Modified: scripts/redmine-tools/project-scm.rb =================================================================== --- scripts/redmine-tools/project-scm.rb 2014-10-09 08:52:14 UTC (rev 110) +++ scripts/redmine-tools/project-scm.rb 2014-10-09 09:49:02 UTC (rev 111) @@ -36,7 +36,7 @@ # # You can find more information on the redmine's wiki : http://www.redmine.org/wiki/redmine/HowTos -print "run /opt/redmine-tools/project-site.rb #{ARGV}\n" +print "run /opt/redmine-tools/project-scm.rb #{ARGV}\n" #tchemit - fix verbose deprecated warning about iconv (since it used in cron, don't want to header about it) oldverb = $VERBOSE; $VERBOSE = nil Added: scripts/redmine-tools/project-site.rb =================================================================== --- scripts/redmine-tools/project-site.rb (rev 0) +++ scripts/redmine-tools/project-site.rb 2014-10-09 09:49:02 UTC (rev 111) @@ -0,0 +1,176 @@ +#!/usr/bin/env ruby + +# == changelog +# 20111029 chemit@codelutin.com +# - do not check list existance with his domain name but just his list name (all our lists for all our forge are on this very server) +# 20090827 poussin +# - add call to config_list after list creation to update some list configuration +# +# == Synopsis +# +# project-site: create site structure for all projects in a Redmine +# +# == Usage +# +# project-site [OPTIONS...] -r [HOST] +# +# Examples: +# project-site --forge=nuiton.org|chorem.org|codelutin.com +# +# == Arguments (mandatory) +# +# -f, --forge=HOST nuiton.org|chorem.org|codelutin.com +# -k, --key=KEY use KEY as the Redmine API key +# +# == Options +# +# -h, --help show help and exit +# -v, --verbose verbose +# -V, --version print version and exit +# -q, --quiet no log +# +# + +print "run /opt/redmine-tools/project-site.rb #{ARGV}\n" + +#tchemit - fix verbose deprecated warning about iconv (since it used in cron, don't want to header about it) +oldverb = $VERBOSE; $VERBOSE = nil +require 'iconv' +$VERBOSE = oldverb + +require 'getoptlong' +#require 'rdoc/usage' +require 'find' +require 'etc' + +Version = "1.0" + +opts = GetoptLong.new( + ['--forge', '-f', GetoptLong::REQUIRED_ARGUMENT], + ['--key', '-k', GetoptLong::REQUIRED_ARGUMENT], + ['--verbose', '-v', GetoptLong::NO_ARGUMENT], + ['--version', '-V', GetoptLong::NO_ARGUMENT], + ['--help' , '-h', GetoptLong::NO_ARGUMENT], + ['--quiet' , '-q', GetoptLong::NO_ARGUMENT] + ) + +$verbose = 0 +$quiet = false +$forge = '' + +def log(text, options={}) + level = options[:level] || 0 + puts text unless $quiet or level > $verbose + exit 1 if options[:exit] +end + +def system_or_raise(command) + raise "\"#{command}\" failed" unless system command +end + +begin + opts.each do |opt, arg| + case opt + when '--forge'; $forge = arg.dup + when '--key'; $api_key = arg.dup + when '--verbose'; $verbose += 1 + when '--version'; puts Version; exit + when '--help'; RDoc::usage + when '--quiet'; $quiet = true + end + end +rescue + exit 1 +end + +if ($forge.empty? or $api_key.empty?) + RDoc::usage +end + +begin + require 'active_resource' +rescue LoadError + log("This script requires activeresource.\nRun 'gem install activeresource' to install it.", :exit => true) +end + +class Project < ActiveResource::Base +#include Redmine::SafeAttributes +# acts_as_customizable +#class Project < ActiveRecord::Base + + self.headers["User-agent"] = "Redmine repository manager/#{Version}" +end + +log("querying Redmine for projects...", :level => 1); + +#$redmine_host.gsub!(/^/, "http://") unless $redmine_host.match("^https?://") +#$redmine_host.gsub!(/\/$/, '') + +Project.site = "http://forge.#{$forge}/sys"; + +begin + # Get all active projects that have the Repository module enabled + projects = Project.find(:all, :conditions => "status = 1 AND parent IS NOT NULL", :params => {:key => $api_key}) +rescue => e + log("Unable to connect to #{Project.site}: #{e}", :exit => true) +end + +if projects.nil? + log('no project found, perhaps you forgot to "Enable WS for repository management"', :exit => true) +end + +log("retrieved #{projects.size} projects", :level => 1) + +def apache_site_not_exists(forge, projectId) + cmd ="ls /etc/apache2/sites-available | grep -i \"site-#{projectId}.#{forge}\" > /dev/null" + system(cmd) && $? && $?.exitstatus == 0 ? false : true +end + +def apache_site_create(forge, projectId, projectName) + log("will create apache site-#{projectId}.#{forge}") + cmd = "/opt/redmine-tools/create-project-site.sh #{forge} #{projectId} #{projectName}" +# cmd = "/opt/redmine-tools/ #{forge} #{listname}" + + result = system(cmd) && $? && $?.exitstatus == 0 ? true : false + + if result + log("apache site #{projectId}@#{forge} created", :level => 1) + else + log("apache site failed #{projectId}@#{forge}", :level => 1) + end + result +end + +def reload_apache() + log("will reload apache") + system("service apache2 reload") +end + +update_apache = 0 + +projects.each do |project| + log("treating project #{project.name} #{project.attributes}", :level => 1) + + if project.identifier.empty? + log("\tno identifier for project #{project.name}") + next + elsif not project.identifier.match(/^[a-z0-9\-]+$/) + log("\tinvalid identifier for project #{project.name} : #{project.identifier}"); + next; + end + + projectId = "#{project.identifier}" + projectName = "#{project.name}" + + # check apache site existance + if apache_site_not_exists($forge, projectId) + apache_site_create($forge, projectId, projectName) + update_apache = 1 + end + + +end + +if update_apache = 1 + reload_apache() +end Property changes on: scripts/redmine-tools/project-site.rb ___________________________________________________________________ Added: svn:executable + * Added: scripts/redmine-tools/project-technical-site.rb =================================================================== --- scripts/redmine-tools/project-technical-site.rb (rev 0) +++ scripts/redmine-tools/project-technical-site.rb 2014-10-09 09:49:02 UTC (rev 111) @@ -0,0 +1,143 @@ +#!/usr/bin/env ruby + +# == changelog +# +# == Synopsis +# +# project-tecnical-site: update technical site (latest link + index.html page) for all projects in a Redmine +# +# == Usage +# +# project-technical-site [OPTIONS...] -r [HOST] +# +# Examples: +# project-technical-site --forge=nuiton.org|chorem.org|codelutin.com +# +# == Arguments (mandatory) +# +# -f, --forge=HOST nuiton.org|chorem.org|codelutin.com +# -k, --key=KEY use KEY as the Redmine API key +# +# == Options +# +# -h, --help show help and exit +# -v, --verbose verbose +# -V, --version print version and exit +# -q, --quiet no log +# +# + +print "run /opt/redmine-tools/project-technical-site.rb #{ARGV}\n" + +#tchemit - fix verbose deprecated warning about iconv (since it used in cron, don't want to header about it) +oldverb = $VERBOSE; $VERBOSE = nil +require 'iconv' +$VERBOSE = oldverb + +require 'getoptlong' +#require 'rdoc/usage' +require 'find' +require 'etc' + +Version = "1.0" + +opts = GetoptLong.new( + ['--forge', '-f', GetoptLong::REQUIRED_ARGUMENT], + ['--key', '-k', GetoptLong::REQUIRED_ARGUMENT], + ['--verbose', '-v', GetoptLong::NO_ARGUMENT], + ['--version', '-V', GetoptLong::NO_ARGUMENT], + ['--help' , '-h', GetoptLong::NO_ARGUMENT], + ['--quiet' , '-q', GetoptLong::NO_ARGUMENT] + ) + +$verbose = 0 +$quiet = false +$forge = '' + +def log(text, options={}) + level = options[:level] || 0 + puts text unless $quiet or level > $verbose + exit 1 if options[:exit] +end + +def system_or_raise(command) + raise "\"#{command}\" failed" unless system command +end + +begin + opts.each do |opt, arg| + case opt + when '--forge'; $forge = arg.dup + when '--key'; $api_key = arg.dup + when '--verbose'; $verbose += 1 + when '--version'; puts Version; exit + when '--help'; RDoc::usage + when '--quiet'; $quiet = true + end + end +rescue + exit 1 +end + +if ($forge.empty? or $api_key.empty?) + RDoc::usage +end + +begin + require 'active_resource' +rescue LoadError + log("This script requires activeresource.\nRun 'gem install activeresource' to install it.", :exit => true) +end + +class Project < ActiveResource::Base +#include Redmine::SafeAttributes +# acts_as_customizable +#class Project < ActiveRecord::Base + + self.headers["User-agent"] = "Redmine repository manager/#{Version}" +end + +log("querying Redmine for projects...", :level => 1); + +#$redmine_host.gsub!(/^/, "http://") unless $redmine_host.match("^https?://") +#$redmine_host.gsub!(/\/$/, '') + +Project.site = "http://forge.#{$forge}/sys"; + +begin + + # Get all active projects that have the Repository module enabled + projects = Project.find(:all, :conditions => "status = 1 AND parent IS NOT NULL", :params => {:key => $api_key}) +rescue => e + log("Unable to connect to #{Project.site}: #{e}", :exit => true) +end + +if projects.nil? + log('no project found, perhaps you forgot to "Enable WS for repository management"', :exit => true) +end + +log("retrieved #{projects.size} projects", :level => 1) + +def update_technical_site(forge, projectId) + + log("will update technical site of #{projectId}.#{forge}") + cmd = "/opt/redmine-tools/update_technical_site.sh #{forge} #{projectId}" + system(cmd) + +end + +projects.each do |project| + + log("treating project #{project.name}", :level => 1) + + if project.identifier.empty? + log("\tno identifier for project #{project.name}") + next + elsif not project.identifier.match(/^[a-z0-9\-]+$/) + log("\tinvalid identifier for project #{project.name} : #{project.identifier}"); + next; + end + + update_technical_site($forge, "#{project.identifier}") + +end \ No newline at end of file Property changes on: scripts/redmine-tools/project-technical-site.rb ___________________________________________________________________ Added: svn:executable + * Added: scripts/redmine-tools/update_technical_site.sh =================================================================== --- scripts/redmine-tools/update_technical_site.sh (rev 0) +++ scripts/redmine-tools/update_technical_site.sh 2014-10-09 09:49:02 UTC (rev 111) @@ -0,0 +1,87 @@ +#!/bin/bash + +# usage: update_technical_site.sh nuiton.org|chorem.org|codelutin.com +# +# Will regenerate the index.html if necessary with last version found on redmine +# Will link to latest if necessary with last version found on redmine +# +# History +# 2014-10-08 tchemit@codelutin.com : initial version +# +# + +FORGE=$1 +PROJECT=$2 + + +VERSIONS_FILE=/tmp/$FORGE-$PROJECT.versions + +curl http://forge.$FORGE/jredmine/get_project_closed_versions.json/$PROJECT -s > $VERSIONS_FILE + +LAST_VERSION_NAME=$(cat $VERSIONS_FILE |sed -e 's/[{}]/''/g' | awk -v RS=',"' -F: '/^name/ {print $2}'|cut -d\" -f 2| head -n 1) +LAST_VERSION_DATE=$(cat $VERSIONS_FILE |sed -e 's/[{}]/''/g' | awk -v RS=',"' -F: '/^effective/ {print $2}'|cut -d\" -f 2| head -n 1) + +if [ "" = "$LAST_VERSION_NAME" ]; +then + echo "Skip - No version found for $PROJECT.$FORGE" + exit 0 +fi + +echo "Last version: $LAST_VERSION_NAME - $LAST_VERSION_DATE" + +DOC_DIR=/var/lib/doc/maven-site/$FORGE/$PROJECT + +if [ ! -d $DOC_DIR/$LAST_VERSION_NAME ]; +then + echo "Skip - Last version technical site not found at $DOC_DIR/$LAST_VERSION_NAME" + exit 0 +fi + +unlink $DOC_DIR/latest 2> /dev/null + +(cd $DOC_DIR ; ln -s $LAST_VERSION_NAME latest) +chown www-data. $DOC_DIR/latest + +SITE_DIR=/var/lib/doc/site/$FORGE/$PROJECT + +INDEX_FILE=$SITE_DIR/index.html +INDEX_FILE2=/tmp/$FORGE-$PROJECT-index.html +rm -rf $INDEX_FILE2 + + +grep -e "UPDATE_START" $INDEX_FILE > /dev/null +if [ $? -eq 1 ]; +then + echo "Skip - $INDEX_FILE does not contains the UPDATE_START field, do nothing" + exit 0 +fi + +grep -e "_UPDATE_ $LAST_VERSION_NAME _" $INDEX_FILE > /dev/null + +if [ $? -eq 0 ]; +then + echo "$INDEX_FILE is up-to-date" +else + echo "update $INDEX_FILE" + cat $INDEX_FILE | while read line + do + echo "$line" >> $INDEX_FILE2 + echo $line | grep -e 'UPDATE_START' > /dev/null + if [ $? -eq 0 ] ; then + # Add new version + cat <<EOF >> $INDEX_FILE2 + <!-- _UPDATE_ $LAST_VERSION_NAME _ --> + <tr> + <td>$LAST_VERSION_NAME</td> + <td>$LAST_VERSION_DATE</td> + <td><a href="http://$PROJECT.$FORGE/v/$LAST_VERSION_NAME">site</a></td> + </tr> +EOF + fi + done + #cat $INDEX_FILE2 + cp -f $INDEX_FILE $INDEX_FILE"_backup" + mv -f $INDEX_FILE2 $INDEX_FILE + chown www-data. $INDEX_FILE +fi + Property changes on: scripts/redmine-tools/update_technical_site.sh ___________________________________________________________________ Added: svn:executable + *
participants (1)
-
tchemit@users.forge.codelutin.com