Author: tchemit Date: 2014-10-09 10:52:14 +0200 (Thu, 09 Oct 2014) New Revision: 110 Url: http://forge.codelutin.com/projects/adminsys/repository/revisions/110 Log: refs #4057: Ameliorer les sites des applications et librairies (pour nuiton le site apache est cree automatiquement) amelioration (ajout de commentaires et TODO) dans le cron redmine Added: scripts/redmine-tools/create-project-site.sh scripts/redmine-tools/project-scm.rb Removed: scripts/redmine-tools/project-site.rb Modified: scripts/redmine-tools/cron-redmine Added: scripts/redmine-tools/create-project-site.sh =================================================================== --- scripts/redmine-tools/create-project-site.sh (rev 0) +++ scripts/redmine-tools/create-project-site.sh 2014-10-09 08:52:14 UTC (rev 110) @@ -0,0 +1,51 @@ +#!/bin/sh + +# To create the apache site for a project and enable it +# And create necessary directories + +FORGE=$1 +PROJECT=$2 + +#TODO Add dns entry + +APACHE_SITE_NAME=site-$PROJECT.$FORGE + +a2dissite $APACHE_SITE_NAME > /dev/null + +cat << EOF >> /etc/apache2/sites-available/$APACHE_SITE_NAME +<VirtualHost *:80> + ServerName $PROJECT.$FORGE + + DocumentRoot /var/lib/doc/site/$FORGE/$PROJECT + + Alias /v /var/lib/doc/maven-site/$FORGE/$PROJECT + + ErrorLog /var/log/apache2/site-$PROJECT.$FORGE-error.log + LogLevel warn + CustomLog /var/log/apache2/site-$PROJECT.$FORGE-access.log combined +</VirtualHost> +<VirtualHost 94.23.103.141:443> + ServerName $PROJECT.$FORGE + + <IfModule mod_ssl.c> + SSLEngine on + SSLCertificateFile /etc/ssl/certs/wildcard.$FORGE.crt + SSLCertificateKeyFile /etc/ssl/private/wildcard.$FORGE.key + SSLCACertificateFile /etc/ssl/certs/GandiStandardSSLCA.pem + SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown + SSLVerifyClient None + </IfModule> + + DocumentRoot /var/lib/doc/site/$FORGE/$PROJECT + Alias /v /var/lib/doc/maven-site/$FORGE/$PROJECT + + ErrorLog /var/log/apache2/site-$PROJECT.$FORGE-ssl-error.log + LogLevel warn + CustomLog /var/log/apache2/site-$PROJECT.$FORGE-ssl-access.log combined +</VirtualHost> +EOF + +mkdir /var/lib/doc/site/$FORGE/$PROJECT 2> /dev/null +mkdir /var/lib/doc/maven-site/$FORGE/$PROJECT 2> /dev/null + +a2ensite $APACHE_SITE_NAME > /dev/null Property changes on: scripts/redmine-tools/create-project-site.sh ___________________________________________________________________ Added: svn:executable + * Modified: scripts/redmine-tools/cron-redmine =================================================================== --- scripts/redmine-tools/cron-redmine 2014-10-09 08:34:42 UTC (rev 109) +++ scripts/redmine-tools/cron-redmine 2014-10-09 08:52:14 UTC (rev 110) @@ -18,31 +18,52 @@ date >> $chorem_log date >> $codelutin_log +# Create nuiton.org mailing-lists + ruby /opt/redmine-tools/project-list.rb --redmine-host forge.nuiton.org --admin-email moderate@codelutin.com --list-domain list.nuiton.org --list-suffix commits --key $nuiton_key >> $nuiton_log ruby /opt/redmine-tools/project-list.rb --redmine-host forge.nuiton.org --admin-email moderate@codelutin.com --list-domain list.nuiton.org --list-suffix users --key $nuiton_key >> $nuiton_log ruby /opt/redmine-tools/project-list.rb --redmine-host forge.nuiton.org --admin-email moderate@codelutin.com --list-domain list.nuiton.org --list-suffix devel --key $nuiton_key >> $nuiton_log ruby /opt/redmine-tools/project-list.rb --redmine-host forge.nuiton.org --admin-email moderate+nuiton.org+build@codelutin.com --list-domain list.nuiton.org --list-suffix build --key $nuiton_key >> $nuiton_log +# Create chorem.org mailing-lists ruby /opt/redmine-tools/project-list.rb --redmine-host forge.chorem.org --admin-email moderate@codelutin.com --list-domain list.chorem.org --list-suffix commits --key $chorem_key >> $chorem_log ruby /opt/redmine-tools/project-list.rb --redmine-host forge.chorem.org --admin-email moderate@codelutin.com --list-domain list.chorem.org --list-suffix users --key $chorem_key >> $chorem_log ruby /opt/redmine-tools/project-list.rb --redmine-host forge.chorem.org --admin-email moderate@codelutin.com --list-domain list.chorem.org --list-suffix devel --key $chorem_key >> $chorem_log ruby /opt/redmine-tools/project-list.rb --redmine-host forge.chorem.org --admin-email moderate+chorem.org+build@codelutin.com --list-domain list.chorem.org --list-suffix build --key $chorem_key >> $chorem_log +# Create codelutin.com mailing-lists + ruby /opt/redmine-tools/project-list.rb --redmine-host forge.codelutin.com --admin-email moderate@codelutin.com --list-domain list.forge.codelutin.com --list-suffix commits --key $codelutin_key >> $codelutin_log ruby /opt/redmine-tools/project-list.rb --redmine-host forge.codelutin.com --admin-email moderate@codelutin.com --list-domain list.forge.codelutin.com --list-suffix users --key $codelutin_key >> $codelutin_log ruby /opt/redmine-tools/project-list.rb --redmine-host forge.codelutin.com --admin-email moderate@codelutin.com --list-domain list.forge.codelutin.com --list-suffix devel --key $codelutin_key >> $codelutin_log ruby /opt/redmine-tools/project-list.rb --redmine-host forge.codelutin.com --admin-email moderate@codelutin.com --list-domain list.forge.codelutin.com --list-suffix private --key $codelutin_key >> $codelutin_log ruby /opt/redmine-tools/project-list.rb --redmine-host forge.codelutin.com --admin-email moderate+codelutin.com+build@codelutin.com --list-domain list.forge.codelutin.com --list-suffix build --key $codelutin_key >> $codelutin_log +# Create scm repositories +#TODO Deal with git + ruby /opt/redmine-nuiton.org/extra/svn/reposman.rb --redmine-host forge.nuiton.org --svn-dir /var/lib/svn/svn-nuiton.org --owner www-data --group publish --url http://forge.nuiton.org/svn-private/ --key $nuiton_key >> $nuiton_log ruby /opt/redmine-chorem.org/extra/svn/reposman.rb --redmine-host forge.chorem.org --svn-dir /var/lib/svn/svn-chorem.org --owner www-data --group publish --url http://forge.chorem.org/svn-private/ --key $chorem_key >> $chorem_log ruby /opt/redmine-codelutin.com/extra/svn/reposman.rb --redmine-host forge.codelutin.com --svn-dir /var/lib/svn/svn-codelutin.com --owner www-data --group publish --url http://forge.codelutin.com/svn-private/ --key $codelutin_key >> $codelutin_log -ruby /opt/redmine-tools/project-site.rb -s /var/lib/doc/nuiton.org -r forge.nuiton.org --owner publish --key $nuiton_key >> $nuiton_log -ruby /opt/redmine-tools/project-site.rb -s /var/lib/doc/chorem.org -r forge.chorem.org --owner publish --key $chorem_key >> $chorem_log -ruby /opt/redmine-tools/project-site.rb -s /var/lib/doc/codelutin.com -r forge.codelutin.com --owner publish --key $codelutin_key >> $codelutin_log +# Manage project scm +#TODO Rename the script, this is not clear at all -bash /opt/git-tools/mark_public_git_repositories.sh nuiton.org -bash /opt/git-tools/mark_public_git_repositories.sh chorem.org -bash /opt/git-tools/mark_public_git_repositories.sh codelutin.com +ruby /opt/redmine-tools/project-scm.rb -s /var/lib/doc/nuiton.org -r forge.nuiton.org --owner publish --key $nuiton_key >> $nuiton_log +ruby /opt/redmine-tools/project-scm.rb -s /var/lib/doc/chorem.org -r forge.chorem.org --owner publish --key $chorem_key >> $chorem_log +ruby /opt/redmine-tools/project-scm.rb -s /var/lib/doc/codelutin.com -r forge.codelutin.com --owner publish --key $codelutin_key >> $codelutin_log + +# Make git project visible in gitweb +#TODO Should use a ruby script to allow private git repositories + +bash /opt/git-tools/mark_public_git_repositories.sh nuiton.org >> $nuiton_log +bash /opt/git-tools/mark_public_git_repositories.sh chorem.org >> $chorem_log +bash /opt/git-tools/mark_public_git_repositories.sh codelutin.com >> $codelutin_log + +# Create project site configuration (apache) +# TODO Do it for chorem.org and codelutin.com sites + +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 Copied: scripts/redmine-tools/project-scm.rb (from rev 106, scripts/redmine-tools/project-site.rb) =================================================================== --- scripts/redmine-tools/project-scm.rb (rev 0) +++ scripts/redmine-tools/project-scm.rb 2014-10-09 08:52:14 UTC (rev 110) @@ -0,0 +1,210 @@ +#!/usr/bin/env ruby + +# == Synopsis +# +# project-site: manages your repositories with Redmine +# +# == Usage +# +# project-site [OPTIONS...] -s [DIR] -r [HOST] +# +# Examples: +# project-site --svn-dir=/var/svn --redmine-host=redmine.example.net --scm subversion +# project-site -s /var/git -r redmine.example.net -u http://svn.example.net --scm git +# +# == Arguments (mandatory) +# +# -s, --site-dir=DIR use DIR as base directory for svn repositories +# -r, --redmine-host=HOST assume Redmine is hosted on HOST. Examples: +# -r redmine.example.net +# -r http://redmine.example.net +# -r https://example.net/redmine +# -k, --key=KEY use KEY as the Redmine API key +# +# == Options +# +# -o, --owner=OWNER owner of the repository. using the rails login +# allow user to browse the repository within +# Redmine even for private project. If you want to share repositories +# through Redmine.pm, you need to use the apache owner. +# -h, --help show help and exit +# -v, --verbose verbose +# -V, --version print version and exit +# -q, --quiet no log +# +# == References +# +# 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" + +#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( + ['--site-dir', '-s', GetoptLong::REQUIRED_ARGUMENT], + ['--redmine-host', '-r', GetoptLong::REQUIRED_ARGUMENT], + ['--key', '-k', GetoptLong::REQUIRED_ARGUMENT], + ['--owner', '-o', 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 +$redmine_host = '' +$repos_base = '' +$svn_owner = 'www-data' +$use_groupid = false +$command = 'mkdir -p' + +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 '--site-dir'; $repos_base = arg.dup + when '--redmine-host'; $redmine_host = arg.dup + when '--key'; $api_key = arg.dup + when '--owner'; $svn_owner = arg.dup; $use_groupid = false; + when '--verbose'; $verbose += 1 + when '--version'; puts Version; exit + when '--help'; RDoc::usage + when '--quiet'; $quiet = true + end + end +rescue + exit 1 +end + +if ($redmine_host.empty? or $repos_base.empty?) + RDoc::usage +end + +unless File.directory?($repos_base) + log("directory '#{$repos_base}' doesn't exists", :exit => true) +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 + 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 = "#{$redmine_host}/sys"; + +begin + # Get all active projects that have the Repository module enabled + projects = Project.find(:all, :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 set_owner_and_rights(project, repos_path, &block) + if RUBY_PLATFORM =~ /mswin/ + yield if block_given? + else + uid, gid = Etc.getpwnam($svn_owner).uid, ($use_groupid ? Etc.getgrnam(project.identifier).gid : -1) + right = project.is_public ? 0775 : 0770 + yield if block_given? + Find.find(repos_path) do |f| + File.chmod right, f + File.chown uid, gid, f + end + end +end + +def other_read_right?(file) + (File.stat(file).mode & 0007).zero? ? false : true +end + +def owner_name(file) + RUBY_PLATFORM =~ /mswin/ ? + $svn_owner : + Etc.getpwuid( File.stat(file).uid ).name +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 + + repos_path = File.join($repos_base, project.identifier).gsub(File::SEPARATOR, File::ALT_SEPARATOR || File::SEPARATOR) + + if File.directory?(repos_path) + + # we must verify that repository has the good owner and the good + # rights before leaving + other_read = other_read_right?(repos_path) + owner = owner_name(repos_path) + next if project.is_public == other_read and owner == $svn_owner + + begin + set_owner_and_rights(project, repos_path) + rescue Errno::EPERM => e + log("\tunable to change mode on #{repos_path} : #{e}\n") + next + end + + log("\tmode change on #{repos_path}"); + + else + # if repository is already declared in redmine, we don't create + # unless user use -f with project-site + + project.is_public ? File.umask(0002) : File.umask(0007) + + begin + set_owner_and_rights(project, repos_path) do + system_or_raise "#{$command} #{repos_path}" + end + rescue => e + log("\tunable to create #{repos_path} : #{e}\n") + next + end + + log("\tproject site #{repos_path} created"); + end + +end + Deleted: scripts/redmine-tools/project-site.rb =================================================================== --- scripts/redmine-tools/project-site.rb 2014-10-09 08:34:42 UTC (rev 109) +++ scripts/redmine-tools/project-site.rb 2014-10-09 08:52:14 UTC (rev 110) @@ -1,210 +0,0 @@ -#!/usr/bin/env ruby - -# == Synopsis -# -# project-site: manages your repositories with Redmine -# -# == Usage -# -# project-site [OPTIONS...] -s [DIR] -r [HOST] -# -# Examples: -# project-site --svn-dir=/var/svn --redmine-host=redmine.example.net --scm subversion -# project-site -s /var/git -r redmine.example.net -u http://svn.example.net --scm git -# -# == Arguments (mandatory) -# -# -s, --site-dir=DIR use DIR as base directory for svn repositories -# -r, --redmine-host=HOST assume Redmine is hosted on HOST. Examples: -# -r redmine.example.net -# -r http://redmine.example.net -# -r https://example.net/redmine -# -k, --key=KEY use KEY as the Redmine API key -# -# == Options -# -# -o, --owner=OWNER owner of the repository. using the rails login -# allow user to browse the repository within -# Redmine even for private project. If you want to share repositories -# through Redmine.pm, you need to use the apache owner. -# -h, --help show help and exit -# -v, --verbose verbose -# -V, --version print version and exit -# -q, --quiet no log -# -# == References -# -# 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" - -#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( - ['--site-dir', '-s', GetoptLong::REQUIRED_ARGUMENT], - ['--redmine-host', '-r', GetoptLong::REQUIRED_ARGUMENT], - ['--key', '-k', GetoptLong::REQUIRED_ARGUMENT], - ['--owner', '-o', 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 -$redmine_host = '' -$repos_base = '' -$svn_owner = 'www-data' -$use_groupid = false -$command = 'mkdir -p' - -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 '--site-dir'; $repos_base = arg.dup - when '--redmine-host'; $redmine_host = arg.dup - when '--key'; $api_key = arg.dup - when '--owner'; $svn_owner = arg.dup; $use_groupid = false; - when '--verbose'; $verbose += 1 - when '--version'; puts Version; exit - when '--help'; RDoc::usage - when '--quiet'; $quiet = true - end - end -rescue - exit 1 -end - -if ($redmine_host.empty? or $repos_base.empty?) - RDoc::usage -end - -unless File.directory?($repos_base) - log("directory '#{$repos_base}' doesn't exists", :exit => true) -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 - 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 = "#{$redmine_host}/sys"; - -begin - # Get all active projects that have the Repository module enabled - projects = Project.find(:all, :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 set_owner_and_rights(project, repos_path, &block) - if RUBY_PLATFORM =~ /mswin/ - yield if block_given? - else - uid, gid = Etc.getpwnam($svn_owner).uid, ($use_groupid ? Etc.getgrnam(project.identifier).gid : -1) - right = project.is_public ? 0775 : 0770 - yield if block_given? - Find.find(repos_path) do |f| - File.chmod right, f - File.chown uid, gid, f - end - end -end - -def other_read_right?(file) - (File.stat(file).mode & 0007).zero? ? false : true -end - -def owner_name(file) - RUBY_PLATFORM =~ /mswin/ ? - $svn_owner : - Etc.getpwuid( File.stat(file).uid ).name -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 - - repos_path = File.join($repos_base, project.identifier).gsub(File::SEPARATOR, File::ALT_SEPARATOR || File::SEPARATOR) - - if File.directory?(repos_path) - - # we must verify that repository has the good owner and the good - # rights before leaving - other_read = other_read_right?(repos_path) - owner = owner_name(repos_path) - next if project.is_public == other_read and owner == $svn_owner - - begin - set_owner_and_rights(project, repos_path) - rescue Errno::EPERM => e - log("\tunable to change mode on #{repos_path} : #{e}\n") - next - end - - log("\tmode change on #{repos_path}"); - - else - # if repository is already declared in redmine, we don't create - # unless user use -f with project-site - - project.is_public ? File.umask(0002) : File.umask(0007) - - begin - set_owner_and_rights(project, repos_path) do - system_or_raise "#{$command} #{repos_path}" - end - rescue => e - log("\tunable to create #{repos_path} : #{e}\n") - next - end - - log("\tproject site #{repos_path} created"); - end - -end -
participants (1)
-
tchemit@users.forge.codelutin.com