## ## Copyright (C) Centeris Corporation 2004-2007 ## Copyright (C) Likewise Software 2007-2008 ## All rights reserved. ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program. If not, see . ## # # Copyright Centeris Corporation. All rights reserved. # # This short program fixes a problem with the bash command prompt on Red Hat systems # by installing two prompt files in /etc/sysconfig. # use strict; use warnings; use FindBin; use lib "$FindBin::Bin"; use Centeris; sub main(); exit(main()); sub CreatePromptFile($$$) { my $path = shift || die; my $content = shift || die; my $opt = shift || die; # do not overwrite existing files if ( -e $path ) { print "File $path already exists.\n" if $opt->{debug}; return; } print "Writing file $path.\n" if $opt->{debug}; WriteFile( $path, $content ) if (not $opt->{test}); chmod 0755, $path; print "Wrote $path\n"; } sub CreateSysConfigPromptFiles($) { my $opt = shift || die; my $testPrefix = $opt->{testprefix} || ''; my $sysConfigDir = "$testPrefix/etc/sysconfig"; my $bash_prompt_xterm_path = "$sysConfigDir/bash-prompt-xterm"; my $bash_prompt_screen_path = "$sysConfigDir/bash-prompt-screen"; if (not -d $sysConfigDir) { return; } my @bash_prompt_screen_content = ( q(#!/bin/bash), q(echo -n $'\033'"_${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}"$'\033\\\\') ); CreatePromptFile($bash_prompt_screen_path, \@bash_prompt_screen_content, $opt); my @bash_prompt_xterm_content = ( q(#!/bin/bash), q(echo -n $'\033'"]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}"$'\007')); CreatePromptFile($bash_prompt_xterm_path, \@bash_prompt_xterm_content, $opt); } sub FixSkelBashRcPrompt($) { my $opt = shift || die; my $testPrefix = $opt->{testprefix} || ''; my $path = "$testPrefix/etc/skel/.bashrc"; if (not -f $path) { return; } # OLD: PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"' # NEW: PROMPT_COMMAND=$'echo -n "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"' my $modified; my $lines = ReadFile($path); map { if ($_ =~ /^(\s*)PROMPT_COMMAND=\'echo -ne \"\\033\]0;\$\{USER\}\@\$\{HOSTNAME\}: \$\{PWD\/\$HOME\/~\}\\007\"\'(\s*)$/) { my $pre = $1 || ''; my $post = $2 || ''; my $replace = "PROMPT_COMMAND=\$\'echo -n \"\\033\]0;\$\{USER\}\@\$\{HOSTNAME\}: \$\{PWD\/\$HOME\/~\}\\007\"\'"; $_ = $pre.$replace.$post; $modified = 1; } } @$lines; if ($modified) { ReplaceFile($path, $lines); } } sub usage() { use Centeris; $0 = QuickBaseName($0); return < Prefix for test directory --debug Print debugging messages --test Run but do not change anything DATA } sub main() { use Centeris; use Getopt::Long; Getopt::Long::Configure('no_ignore_case', 'no_auto_abbrev') || die; my $opt = {}; my $ok = GetOptions($opt, 'help|h|?', 'testprefix=s', 'test', 'debug' ); if ( not $ok or $opt->{help} or ( $#ARGV != -1 ) ) { die usage(); } my $testPrefix = $opt->{testprefix} || ''; CheckTestPrefix($testPrefix); my $osType = GetOsType($testPrefix); my $distroType = GetDistroType($testPrefix); my $distroVersion = GetDistroVersion($testPrefix); my $do_distro; if ($osType eq 'Linux') { if ( $distroType eq 'rhel' || $distroType eq 'centos' || $distroType eq 'fedora' ) { $do_distro = 1; CreateSysConfigPromptFiles($opt); } elsif ( $distroType eq 'ubuntu' ) { $do_distro = 1; FixSkelBashRcPrompt($opt); } } if (not $do_distro) { print "No prompt modifications are needed for $distroType distribution.\n" if ( $opt->{debug} ); } return 0; }