Now installing redmine version 0.7.3 …
Failed to install script : Failed to open /home/foodomain.tld/public_html/redmine/public/stylesheets/redmine/mephisto.css for writing : Bad file descriptor
Now installing redmine version 0.7.3 …
Failed to install script : Failed to open /home/foodomain.tld/public_html/redmine/public/stylesheets/redmine/mephisto.css for writing : Bad file descriptor
When this happend?
During installation?
Are you running some other rails applications on your server?
My script is derivated from other install script and I hope that I’ve followed API instructions.
File descriptor seems to be problem somewher else.
Please let me know if you will find something.
Hi!
This happens on install. There are no other rails applications on the server or domain.
Other install scripts work fine!
sub script_redmine_desc
{
return "redmine";
}
sub script_redmine_uses
{
return ( "ruby", "proxy" );
}
sub script_redmine_longdesc
{
return "Redmine is a flexible project management web application.";
}
sub script_redmine_versions
{
return ( "0.7.3" );
}
sub script_redmine_category
{
return "Project Management";
}
sub script_redmine_depends
{
local ($d, $ver) = @_;
local @rv;
&has_command("ruby") || push(@rv, "The ruby command is not installed");
&require_apache();
&has_proxy_balancer($d) ||
push(@rv, "The Apache proxy module is not installed");
&has_domain_databases($d, [ "mysql" ]) ||
push(@rv, "redmine requires either MySQL database");
return @rv;
}
sub script_redmine_params
{
local ($d, $ver, $upgrade) = @;
local $rv;
local $hdir = &public_html_dir($d, 1);
if ($upgrade) {
# Options are fixed when upgrading
local ($dbtype, $dbname) = split(//, $upgrade->{‘opts’}->{‘db’}, 2);
$rv .= &ui_table_row(“Database for redmine tables”, $dbname);
local $dir = $upgrade->{‘opts’}->{‘dir’};
$dir =~ s/^$d->{‘home’}///;
$rv .= &ui_table_row(“Install directory”, $dir);
}
else {
# Show editable install options
local @dbs = &domain_databases($d, [ “mysql” ]);
$rv .= &ui_table_row(“Database for redmine tables”,
&ui_database_select(“db”, undef, @dbs, $d, “redmine”));
$rv .= &ui_table_row(“Install sub-directory under <tt>$hdir</tt>”,
&ui_opt_textbox(“dir”, “redmine”, 30,
“At top level”));
$rv .= &show_mongrels_ports_input($d);
}
return $rv;
}
sub script_redmine_parse
{
local ($d, $ver, $in, $upgrade) = @_;
if ($upgrade) {
# Options are always the same
return $upgrade->{‘opts’};
}
else {
local $hdir = &public_html_dir($d, 0);
$in->{‘dir_def’} || $in->{‘dir’} =~ /\S/ && $in->{‘dir’} !~ /../ ||
return “Missing or invalid installation directory”;
local $dir = $in->{‘dir_def’} ? $hdir : “$hdir/$in->{‘dir’}”;
local ($newdb) = ($in->{‘db’} =~ s/^*//);
local $mongrels = &parse_mongrels_ports_input($d, $in);
return $mongrels if (!int($mongrels));
return { ‘db’ => $in->{‘db’},
‘newdb’ => $newdb,
‘dir’ => $dir,
‘mongrels’ => $mongrels,
‘path’ => $in{‘dir_def’} ? “/” : “/$in{‘dir’}”,
};
}
}
sub script_redmine_check
{
local ($d, $ver, $opts, $upgrade) = @;
if (-r “$opts->{‘dir’}/config/database.yml”) {
return “Redmine appears to be already installed in the selected directory”;
}
local ($dbtype, $dbname) = split(//, $opts->{‘db’}, 2);
foreach my $t (@redmine_tables) {
local $clash = &find_database_table($dbtype, $dbname, $t);
$clash && return “redmine appears to be already using the selected database (table $clash)”;
}
$opts->{‘mongrels’} ||= 1;
return undef;
}
sub script_redmine_files
{
local ($d, $ver, $opts, $upgrade) = @_;
local @files = ( { ‘name’ => “source”,
‘file’ => “redmine-$ver.tar.gz”,
‘url’ => “http://rubyforge.org/frs/download.php/39477/redmine-$ver.tar.gz” } );
}
sub script_redmine_commands
{
return ("ruby", "gcc", "make");
}
sub script_redmine_install
{
local ($d, $version, $opts, $files, $upgrade) = @_;
local ($out, $ex);
&has_command("gem") || return (0, "The Ruby gem command is not installed");
if ($opts->{‘newdb’} && !$upgrade) {
local $err = &create_script_database($d, $opts->{‘db’});
return (0, “Database creation failed : $err”) if ($err);
}
local ($dbtype, $dbname) = split(/_/, $opts->{‘db’}, 2);
local $dbuser = &mysql_user($d);
local $dbpass = &mysql_pass($d);
local $dbhost = &get_database_host($dbtype);
local $dberr = &check_script_db_connection($dbtype, $dbname,
$dbuser, $dbpass);
return (0, “Database connection failed : $dberr”) if ($dberr);
local $err = &install_ruby_gem("mongrel", undef, 1);
if ($err) {
return (0, "Mongrel GEM install failed : <pre>$err</pre>");
}
if (!&find_rails_command("mongrel_rails")) {
return (0, "Mongrel appeared to install, but mongrel_rails command ".
"was not found");
}
$err = &install_ruby_gem("rails", undef, 1);
if ($err) {
return (0, "Rails on Rails install failed : <pre>$err</pre>");
}
$err = &install_ruby_gem("mysql", undef, 1);
if ($err) {
return (0, "Rails MySQL driver install failed : <pre>$err</pre>");
}
if ($upgrade) {
# Stop the running redmine server
&script_redmine_stop_server($d, $opts);
}
local $temp = &transname();
local $err = &extract_script_archive($files->{‘source’}, $temp, $d,
$opts->{‘dir’}, “redmine-$ver”);
$err && return (0, “Failed to extract source : $err”);
local $cfilebase = “$opts->{‘dir’}/config/database.example.yml”;
if (!$upgrade) {
# Find a free port
$opts->{‘port’} = &allocate_mongrel_port(undef, $opts->{‘mongrels’});
# Setup DB config
local $cfile = "$opts->{'dir'}/config/database.yml";
&open_tempfile(CFILE, ">$cfile");
&print_tempfile(CFILE, "production:\n".
" adapter: mysql\n".
" database: $dbname\n".
" username: $dbuser\n".
" password: $dbpass\n".
" host: $dbhost\n");
&print_tempfile(CFILE, "development:\n".
" adapter: mysql\n".
" database: $dbname\n".
" username: $dbuser\n".
" password: $dbpass\n".
" host: $dbhost\n");
&close_tempfile(CFILE);
&set_ownership_permissions($d->{'uid'}, $d->{'ugid'}, undef, $cfile);
# Run the DB creation script
$out = &run_as_domain_user($d, "cd ".quotemeta($opts->{'dir'})." && ".
"rake db:migrate RAILS_ENV=production");
if ($?) {
return (-1, "Database creation failed : <pre>$out</pre>");
}
}
if ($opts->{‘path’} ne ‘/’) {
# In config file
local $efile = “$opts->{‘dir’}/config/environment.rb”;
local $lref = &read_file_lines($efile);
foreach my $l (@$lref) {
if ($l =~ /^#\sActionController::AbstractRequest.relative_url_root/) {
$l = “ActionController::AbstractRequest.relative_url_root = ‘$opts->{‘path’}’”;
}
}
&flush_file_lines($efile);
# In CSS file
local $cssfile = "$opts->{'dir'}/public/stylesheets/redmine/mephisto.css";
local $lref = &read_file_lines($cssfile);
local $path = $opts->{'path'};
foreach my $l (@$lref) {
$l =~ s/url\(\/images/url\(${path}\/images/g;
}
&flush_file_lines($cssfile);
# In liquid.layout
local $lqfile = "$opts->{'dir'}/themes/default/layouts/layout.liquid";
local $lref = &read_file_lines($lqfile);
foreach my $l (@$lref) {
$l =~ s/<a\s+href="\/">/<a href="$path">/;
$l =~ s/action="\/search"/action="$path\/search"/;
}
&flush_file_lines($lqfile);
}
local $logdir = “$opts->{‘dir’}/log”;
if (!-d $logdir) {
&make_dir($logdir, 0700);
&set_ownership_permissions($d->{‘uid’}, $d->{‘ugid’}, undef, $logdir);
}
local (@logs, @startcmds, @stopcmds);
local @ports = split(/\s+/, $opts->{‘port’});
local $err = &mongrel_rails_start_servers($d, $opts, “redmine”, @startcmds,
@stopcmds, @logs);
return (0, $err) if ($err);
$opts->{‘log’} = join(" ", @logs);
&setup_mongrel_proxy($d, $opts->{‘path’}, $opts->{‘port’},
$opts->{‘path’} eq ‘/’ ? undef : $opts->{‘path’});
if (!$upgrade) {
# Configure server to start at boot
&setup_mongrel_startup($d,
join("\n", @startcmds),
join("\n", @stopcmds),
$opts,
1, "redmine-".$ports[0], "Mephisto Wiki");
}
if (!$upgrade) {
# Deny regular web access to directory
&protect_rails_directory($d, $opts);
}
local $url = &script_path_url($d, $opts);
local $adminurl = $url.“login”;
local $rp = $opts->{‘dir’};
$rp =~ s/^$d->{‘home’}///;
return (1, "redmine installation complete. Go to <a target=_new href=’$adminurl’>$adminurl</a> to manage it.<br />
", “Under $rp using $dbtype database $dbname”, $url, “admin”, “admin”);
}
sub script_redmine_uninstall
{
local ($d, $version, $opts) = @_;
&script_redmine_stop_server($d, $opts);
&delete_mongrel_startup($d, $opts, “mongrel_rails start”, $opts->{‘port’});
local $derr = &delete_script_install_directory($d, $opts);
return (0, $derr) if ($derr);
&delete_mongrel_proxy($d, $opts->{‘path’});
®ister_post_action(&restart_apache);
local ($dbtype, $dbname) = split(/_/, $opts->{‘db’}, 2);
&require_mysql();
foreach $t (&mysql::list_tables($dbname)) {
if (&indexof($t, @redmine_tables) >= 0) {
&mysql::execute_sql_logged($dbname,
"drop table ".&mysql::quotestr($t));
}
}
if ($opts->{‘newdb’}) {
&delete_script_database($d, $opts->{‘db’});
}
return (1, "redmine directory and tables deleted.");
}
sub script_redmine_stop
{
local ($d, $sinfo) = @_;
&script_redmine_stop_server($d, $sinfo->{‘opts’});
&delete_mongrel_startup($d, $sinfo->{‘opts’},
“mongrel_rails start”, $sinfo->{‘opts’}->{‘port’});
}
sub script_redmine_latest
{
return ( "http://rubyforge.org/frs/?group_id=1850",
"redmine-([0-9\.]+).tar.gz" );
}
sub script_redmine_start_server
{
local ($d, $opts) = @_;
return &mongrel_rails_start_servers($d, $opts, "redmine");
}
sub script_redmine_status_server
{
local ($d, $opts) = @_;
return &mongrel_rails_status_servers($d, $opts);
}
sub script_redmine_stop_server
{
local ($d, $opts) = @_;
&mongrel_rails_stop_servers($d, $opts);
}
sub script_redmine_site
{
return ‘http://www.redmine.org/’;
}
1;
sub script_redmine_desc
{
return "redmine";
}
sub script_redmine_uses
{
return ( "ruby", "proxy" );
}
sub script_redmine_longdesc
{
return "Redmine is a flexible project management web application.";
}
sub script_redmine_versions
{
return ( "0.7.3" );
}
sub script_redmine_category
{
return "Project Management";
}
sub script_redmine_depends
{
local ($d, $ver) = @_;
local @rv;
&has_command("ruby") || push(@rv, "The ruby command is not installed");
&require_apache();
&has_proxy_balancer($d) ||
push(@rv, "The Apache proxy module is not installed");
&has_domain_databases($d, [ "mysql" ]) ||
push(@rv, "redmine requires either MySQL database");
return @rv;
}
sub script_redmine_params
{
local ($d, $ver, $upgrade) = @;
local $rv;
local $hdir = &public_html_dir($d, 1);
if ($upgrade) {
# Options are fixed when upgrading
local ($dbtype, $dbname) = split(//, $upgrade->{‘opts’}->{‘db’}, 2);
$rv .= &ui_table_row(“Database for redmine tables”, $dbname);
local $dir = $upgrade->{‘opts’}->{‘dir’};
$dir =~ s/^$d->{‘home’}///;
$rv .= &ui_table_row(“Install directory”, $dir);
}
else {
# Show editable install options
local @dbs = &domain_databases($d, [ “mysql” ]);
$rv .= &ui_table_row(“Database for redmine tables”,
&ui_database_select(“db”, undef, @dbs, $d, “redmine”));
$rv .= &ui_table_row(“Install sub-directory under <tt>$hdir</tt>”,
&ui_opt_textbox(“dir”, “redmine”, 30,
“At top level”));
$rv .= &show_mongrels_ports_input($d);
}
return $rv;
}
sub script_redmine_parse
{
local ($d, $ver, $in, $upgrade) = @_;
if ($upgrade) {
# Options are always the same
return $upgrade->{‘opts’};
}
else {
local $hdir = &public_html_dir($d, 0);
$in->{‘dir_def’} || $in->{‘dir’} =~ /\S/ && $in->{‘dir’} !~ /../ ||
return “Missing or invalid installation directory”;
local $dir = $in->{‘dir_def’} ? $hdir : “$hdir/$in->{‘dir’}”;
local ($newdb) = ($in->{‘db’} =~ s/^*//);
local $mongrels = &parse_mongrels_ports_input($d, $in);
return $mongrels if (!int($mongrels));
return { ‘db’ => $in->{‘db’},
‘newdb’ => $newdb,
‘dir’ => $dir,
‘mongrels’ => $mongrels,
‘path’ => $in{‘dir_def’} ? “/” : “/$in{‘dir’}”,
};
}
}
sub script_redmine_check
{
local ($d, $ver, $opts, $upgrade) = @;
if (-r “$opts->{‘dir’}/config/database.yml”) {
return “Redmine appears to be already installed in the selected directory”;
}
local ($dbtype, $dbname) = split(//, $opts->{‘db’}, 2);
foreach my $t (@redmine_tables) {
local $clash = &find_database_table($dbtype, $dbname, $t);
$clash && return “redmine appears to be already using the selected database (table $clash)”;
}
$opts->{‘mongrels’} ||= 1;
return undef;
}
sub script_redmine_files
{
local ($d, $ver, $opts, $upgrade) = @_;
local @files = ( { ‘name’ => “source”,
‘file’ => “redmine-$ver.tar.gz”,
‘url’ => “http://rubyforge.org/frs/download.php/39477/redmine-$ver.tar.gz” } );
}
sub script_redmine_commands
{
return ("ruby", "gcc", "make");
}
sub script_redmine_install
{
local ($d, $version, $opts, $files, $upgrade) = @_;
local ($out, $ex);
&has_command("gem") || return (0, "The Ruby gem command is not installed");
if ($opts->{‘newdb’} && !$upgrade) {
local $err = &create_script_database($d, $opts->{‘db’});
return (0, “Database creation failed : $err”) if ($err);
}
local ($dbtype, $dbname) = split(/_/, $opts->{‘db’}, 2);
local $dbuser = &mysql_user($d);
local $dbpass = &mysql_pass($d);
local $dbhost = &get_database_host($dbtype);
local $dberr = &check_script_db_connection($dbtype, $dbname,
$dbuser, $dbpass);
return (0, “Database connection failed : $dberr”) if ($dberr);
local $err = &install_ruby_gem("mongrel", undef, 1);
if ($err) {
return (0, "Mongrel GEM install failed : <pre>$err</pre>");
}
if (!&find_rails_command("mongrel_rails")) {
return (0, "Mongrel appeared to install, but mongrel_rails command ".
"was not found");
}
$err = &install_ruby_gem("rails", undef, 1);
if ($err) {
return (0, "Rails on Rails install failed : <pre>$err</pre>");
}
$err = &install_ruby_gem("mysql", undef, 1);
if ($err) {
return (0, "Rails MySQL driver install failed : <pre>$err</pre>");
}
if ($upgrade) {
# Stop the running redmine server
&script_redmine_stop_server($d, $opts);
}
local $temp = &transname();
local $err = &extract_script_archive($files->{‘source’}, $temp, $d,
$opts->{‘dir’}, “redmine-$ver”);
$err && return (0, “Failed to extract source : $err”);
local $cfilebase = “$opts->{‘dir’}/config/database.example.yml”;
if (!$upgrade) {
# Find a free port
$opts->{‘port’} = &allocate_mongrel_port(undef, $opts->{‘mongrels’});
# Setup DB config
local $cfile = "$opts->{'dir'}/config/database.yml";
&open_tempfile(CFILE, ">$cfile");
&print_tempfile(CFILE, "production:\n".
" adapter: mysql\n".
" database: $dbname\n".
" username: $dbuser\n".
" password: $dbpass\n".
" host: $dbhost\n");
&print_tempfile(CFILE, "development:\n".
" adapter: mysql\n".
" database: $dbname\n".
" username: $dbuser\n".
" password: $dbpass\n".
" host: $dbhost\n");
&close_tempfile(CFILE);
&set_ownership_permissions($d->{'uid'}, $d->{'ugid'}, undef, $cfile);
# Run the DB creation script
$out = &run_as_domain_user($d, "cd ".quotemeta($opts->{'dir'})." && ".
"rake db:migrate RAILS_ENV=production");
if ($?) {
return (-1, "Database creation failed : <pre>$out</pre>");
}
}
if ($opts->{‘path’} ne ‘/’) {
# In config file
local $efile = “$opts->{‘dir’}/config/environment.rb”;
local $lref = &read_file_lines($efile);
foreach my $l (@$lref) {
if ($l =~ /^#\sActionController::AbstractRequest.relative_url_root/) {
$l = “ActionController::AbstractRequest.relative_url_root = ‘$opts->{‘path’}’”;
}
}
&flush_file_lines($efile);
# In CSS file
local $cssfile = "$opts->{'dir'}/public/stylesheets/redmine/mephisto.css";
local $lref = &read_file_lines($cssfile);
local $path = $opts->{'path'};
foreach my $l (@$lref) {
$l =~ s/url\(\/images/url\(${path}\/images/g;
}
&flush_file_lines($cssfile);
# In liquid.layout
local $lqfile = "$opts->{'dir'}/themes/default/layouts/layout.liquid";
local $lref = &read_file_lines($lqfile);
foreach my $l (@$lref) {
$l =~ s/<a\s+href="\/">/<a href="$path">/;
$l =~ s/action="\/search"/action="$path\/search"/;
}
&flush_file_lines($lqfile);
}
local $logdir = “$opts->{‘dir’}/log”;
if (!-d $logdir) {
&make_dir($logdir, 0700);
&set_ownership_permissions($d->{‘uid’}, $d->{‘ugid’}, undef, $logdir);
}
local (@logs, @startcmds, @stopcmds);
local @ports = split(/\s+/, $opts->{‘port’});
local $err = &mongrel_rails_start_servers($d, $opts, “redmine”, @startcmds,
@stopcmds, @logs);
return (0, $err) if ($err);
$opts->{‘log’} = join(" ", @logs);
&setup_mongrel_proxy($d, $opts->{‘path’}, $opts->{‘port’},
$opts->{‘path’} eq ‘/’ ? undef : $opts->{‘path’});
if (!$upgrade) {
# Configure server to start at boot
&setup_mongrel_startup($d,
join("\n", @startcmds),
join("\n", @stopcmds),
$opts,
1, "redmine-".$ports[0], "Mephisto Wiki");
}
if (!$upgrade) {
# Deny regular web access to directory
&protect_rails_directory($d, $opts);
}
local $url = &script_path_url($d, $opts);
local $adminurl = $url.“login”;
local $rp = $opts->{‘dir’};
$rp =~ s/^$d->{‘home’}///;
return (1, "redmine installation complete. Go to <a target=_new href=’$adminurl’>$adminurl</a> to manage it.<br />
", “Under $rp using $dbtype database $dbname”, $url, “admin”, “admin”);
}
sub script_redmine_uninstall
{
local ($d, $version, $opts) = @_;
&script_redmine_stop_server($d, $opts);
&delete_mongrel_startup($d, $opts, “mongrel_rails start”, $opts->{‘port’});
local $derr = &delete_script_install_directory($d, $opts);
return (0, $derr) if ($derr);
&delete_mongrel_proxy($d, $opts->{‘path’});
®ister_post_action(&restart_apache);
local ($dbtype, $dbname) = split(/_/, $opts->{‘db’}, 2);
&require_mysql();
foreach $t (&mysql::list_tables($dbname)) {
if (&indexof($t, @redmine_tables) >= 0) {
&mysql::execute_sql_logged($dbname,
"drop table ".&mysql::quotestr($t));
}
}
if ($opts->{‘newdb’}) {
&delete_script_database($d, $opts->{‘db’});
}
return (1, "redmine directory and tables deleted.");
}
sub script_redmine_stop
{
local ($d, $sinfo) = @_;
&script_redmine_stop_server($d, $sinfo->{‘opts’});
&delete_mongrel_startup($d, $sinfo->{‘opts’},
“mongrel_rails start”, $sinfo->{‘opts’}->{‘port’});
}
sub script_redmine_latest
{
return ( "http://rubyforge.org/frs/?group_id=1850",
"redmine-([0-9\.]+).tar.gz" );
}
sub script_redmine_start_server
{
local ($d, $opts) = @_;
return &mongrel_rails_start_servers($d, $opts, "redmine");
}
sub script_redmine_status_server
{
local ($d, $opts) = @_;
return &mongrel_rails_status_servers($d, $opts);
}
sub script_redmine_stop_server
{
local ($d, $opts) = @_;
&mongrel_rails_stop_servers($d, $opts);
}
sub script_redmine_site
{
return ‘http://www.redmine.org/’;
}
1;