Google Chrome browser on CentOS 6.4 Desktop

Sadly, it seems Google Chrome is not available in the standard yum repository. Thankfully, there are more people than just you and I that desire this.
I found a great script that configures things and downloads/installs chrome. That’s that. It’s pretty nifty.
It can be found at http://chrome.richardlloyd.org.uk/ but I’m going to paste the script here from the working version that I used. (just in case it magically “disappears” off of the net)
I ran this on a fresh install of CentOS 6.4 with the gnome desktop environment.

#! /bin/bash

# Google Chrome Installer/Uninstaller for CentOS 6
# (C) Richard K. Lloyd 2013
# See http://chrome.richardlloyd.org.uk/ for further details.

# This script is in the public domain and has no warranty.
# It needs to be run as root because it installs/uninstalls RPMs.

# Minimum system requirements:
# – 32-bit or 64-bit CentOS 6.4 or later (you will be asked to
# upgrade the OS and reboot if you’re running 6.3 or earlier)
# – At least 250MB free in each of the temporary directory, /opt and /root
# – A working yum system (including http proxy configured if needed)
# – http_proxy env var set if you are using an http proxy
# – Google Chrome should not be running at the same time as this script

show_syntax()
# Show syntax of script
{
cat <&2
}

show_space_used()
# Calculate disk space and number of files in install and temp dirs
# and display it if there actually any installed files
{
for each_tree in “$inst_tree” “$tmp_tree”
do
if [ -d “$each_tree” ]
then
num_files=”`find \”$each_tree/.\” -type f | wc -l`”
if [ $num_files -gt 0 ]
then
size_files=”`du -s \”$each_tree/.\” | awk ‘{ printf(\”%d\”,$1/1024); }’`”
message “$each_tree tree contains $num_files files totalling $size_files MB” “n”
fi
fi
done
}

clean_up()
# Remove the stuff we don’t want to keep once script finishes
{
# Make sure we don’t trash system directories!
if [ “$tmp_tree” != “” -a “$tmp_tree” != “/” -a “$tmp_tree” != “/tmp” ]
then
if [ $delete_tmp -eq 1 ]
then
if [ -d “$tmp_tree” ]
then
if [ $dry_run -eq 1 ]
then
echo “Would delete temporary dir $tmp_tree”
echo
else
cd /
rm -rf “$tmp_tree”
if [ -d “$tmp_tree” ]
then
warning “Failed to delete temporary directory $tmp_tree”
else
message “Deleted temporary directory $tmp_tree”
fi
fi
fi
else
rm_dir_list=”etc lib lib64 usr sbin usr var”
if [ $dry_run -eq 1 ]
then
echo “Would delete these directories from inside of $tmp_tree:”
echo “$rm_dir_list”
else
# We delete specific directories so that RPM downloads/builds
# remain and can be re-used if the script is run again
for each_dir in $rm_dir_list
do
rm -rf “$tmp_tree/$each_dir”
done
fi
fi

show_space_used
fi
}

is_installed()
# See if $1 package is installed (returns non-null string if it is)
{
rpm -q “$1” | egrep “($rpmarch|$arch|noarch)” | grep “^$1″
}

uninstall_rpms()
# Uninstall $* RPMs if they are installed
{
uninstall_list=””
for each_pack in $*
do
if [ “`is_installed $each_pack`” != “” ]
then
uninstall_list=”$uninstall_list $each_pack”
fi
done

if [ “$uninstall_list” != “” ]
then
if [ $dry_run -eq 1 ]
then
echo “Would uninstall $uninstall_list using \”yum remove\””
echo
else
message “Uninstalling $uninstall_list”
yum $yum_options remove $uninstall_list
fi
fi
}

uninstall_google_chrome()
# Uninstall the Google Chrome and chrome-deps RPMs if they are installed
{
uninstall_rpms $rpm_name $deps_name

# Do a final cleanup if /opt/google/chrome persists
if [ “$inst_tree” != “” -a “$inst_tree” != “/” -a “$inst_tree” != “/tmp” ]
then
if [ -d “$inst_tree” -a $dry_run -eq 0 ]
then
warning “$inst_tree install tree still present – deleting it” “n”
cd /
rm -rf “$inst_tree”
if [ -d “$inst_tree” ]
then
warning “Failed to delete $inst_tree install tree” “n”
fi
fi
fi
}

error()
# $1 = Error message
# Exit script after displaying error message
{
if [ $dry_run -eq 1 ]
then
echo “Would display this error message to stderr:”
echo “ERROR: $1 – aborted”
else
echo >&2
echo “ERROR: $1 – aborted” >&2
echo >&2
fi

# A failure means we have to uninstall Google Chrome
# if it got on the system and we were installing, but only
# if we got past the check that it was running
if [ $do_install -eq 1 -a $past_run_check -eq 1 ]
then
uninstall_google_chrome
fi

clean_up

exit 1
}

interrupt()
# Interrupt received (usually CTRL-C)
{
error “Interrupt (usually CTRL-C) received”
}

set_tmp_tree()
# Set tmp_tree variable to $1/chrome_install
{
if [ “$1” = “” -o “$1” = “/” -o “`echo \”x$1\” | grep ^x-`” != “” ]
then
error “Invalid temporary directory parent specified ($1)”
fi

if [ ! -d “$1” ]
then
warning “Temporary directory parent $1 doesn’t exist – will be created”
fi

tmp_tree=”$1/chrome_install”
unsetsrc=”$tmp_tree/unset_var.c”
}

check_binary_not_running()
# See if the Google Chrome binary is running and abort if it is
{
if [ $dry_run -eq 1 ]
then
echo “Would check to see if $chrome_name is running and abort if it is.”
echo
else
if [ “`ps -ef | grep \”$inst_tree/chrome\” | grep -v grep`” != “” ]
then
error “$chrome_name is running – exit it then re-run this script”
fi
fi
past_run_check=1
}

set_rpm_type()
# Set RPM type to $1
# $1 = stable, beta or unstable
{
if [ $do_install -eq 1 -a “$1” != “$old_rpm_type” ]
then
case “$1” in
stable|beta|unstable)
if [ $dry_run -eq 1 ]
then
echo “Would prompt to confirm switch to $1 channel”
echo “(assuming y is input)”
echo
else
warning “You have requested to switch to the $1 channel”
if [ $quiet -eq 0 ]
then
echo “This script will uninstall all previously installed $chrome_name”
echo “packages that originated from non-$1 channels.”
echo
fi
yesno “install the $1 release (and uninstall all non-$1s)”
if [ $ans -eq 0 ]
then
error “Did not switch to the $1 channel”
fi
fi ;;
*) error “Invalid $chrome_name channel ($1)” ;;
esac

check_binary_not_running
uninstall_rpms \
`echo google-chrome-stable google-chrome-beta google-chrome-unstable | \
sed -e “s/google-chrome-$1//g”`
fi

case “$1″ in
stable|beta|unstable)
rpm_type=”$1″
rpm_name=”google-chrome-$1″
chrome_rpm=”${rpm_name}_current_$rpmarch.rpm” ;;
*) error “Invalid $chrome_name type ($1)” ;;
esac
}

init_vars()
# Initialise variables
# $1 = Original $0 (i.e. script name)
{
# Set option variables to temporary values so that errors prior to the
# actual option parsing behave sensibly
dry_run=0 ; do_install=0 ; delete_tmp=0
past_run_check=0

# Avoid picking up the Fedora libs for any binaries
# run by this script
unset LD_LIBRARY_PATH

if [ “$TMPDIR” = “” ]
then
set_tmp_tree “/tmp”
else
set_tmp_tree “$TMPDIR”
fi

arch=”`uname -m`”
case “$arch” in
x86_64) rellib=”lib64″ ; ld_linux=”ld-linux-x86-64″ ; rpmarch=”$arch” ;;
i686) rellib=”lib” ; ld_linux=”ld-linux” ; rpmarch=”i386″ ;;
*) error “Unsupported architecture ($arch)” ;;
esac
relusrlib=”usr/$rellib”

chrome_name=”Google Chrome”
chrome_defaults=”/etc/default/google-chrome”
chrome_repo=”/etc/yum.conf.d/google-chrome.repo”

# Find the most stable installed Google Chrome and use that
# as the default for the rest of the script (override with -b, -s or -U)
old_rpm_type=””
for each_old_rpm_type in stable beta unstable
do
if [ “$old_rpm_type” = “” ]
then
if [ “`is_installed google-chrome-$each_old_rpm_type`” != “” ]
then
old_rpm_type=”$each_old_rpm_type”
fi
fi
done

# If nothing installed at all, default to stable
if [ “$old_rpm_type” = “” ]
then
old_rpm_type=”stable”
fi
set_rpm_type “$old_rpm_type”

chrome_csv=”http://omahaproxy.appspot.com/all?csv=1&#8243;
inst_tree=”/opt/google/chrome”
libdir=”$inst_tree/lib”
chrome_wrapper=”$inst_tree/google-chrome”
modify_wrapper=”$inst_tree/modify_wrapper”

deps_name=”chrome-deps”
deps_version=”1.01″
deps_latest=”`is_installed $deps_name | grep $deps_version`”
wrapper_mod_version=”1.01″
install_success=0
trap “interrupt” 1 2 3

fedver=15 # Fedora version with needed libraries (F16 doesn’t work!)
suffix=”$arch.rpm”
# $fedver archived updated packages URL
archive_baseurl=”http://archives.fedoraproject.org/pub/archive/fedora/linux/updates/$fedver/$rpmarch&#8221;
# $fedver updated packages URL
core_baseurl=”http://dl.fedoraproject.org/pub/fedora/linux/updates/$fedver&#8221;
baseurl=”$core_baseurl/$rpmarch”
wget=”/usr/bin/wget”
wget_options=”–no-check-certificate”
yum_options=”-y”
rpm_options=”-U –force –nodeps”
chcon_options=”-u system_u”
rpmbuild_options=”-bb”
new_ld_suff=.”so.0″

# Update checker URL
checksite=”http://chrome.richardlloyd.org.uk/&#8221;
checkfile=”version.dat”
checkurl=”$checksite$checkfile”
scriptname=”install_chrome.sh”
upgradeurl=”$checksite$scriptname”

unsetlib=”$libdir/unset_var.so”

script=”$1″
case “$script” in
./*) script=”`pwd`/`basename $script`” ;;
/*) script=”$script” ;;
*) script=”`pwd`/$script” ;;
esac
}

download_file()
# $1 = Full URL to download
# $2 = Optional basename to save to (if omitted, then = basename $1)
# Also allow download to fail without exit if $2 is set
{
if [ “$2” = “” ]
then
dlbase=”`basename \”$1\”`”
else
dlbase=”$2″
fi

if [ $dry_run -eq 1 ]
then
echo “Would download this URL to $tmp_tree/$dlbase :”
echo $1 ; echo
return
fi

old_dlbase=”$dlbase.old”
if [ -f “$dlbase” ]
then
rm -f “$old_dlbase”
mv -f “$dlbase” “$old_dlbase”
fi

message “Downloading $dlbase (please wait)”
$wget $wget_options -O “$dlbase” “$1”

if [ ! -s “$dlbase” ]
then
if [ -f “$old_dlbase” ]
then
mv -f “$old_dlbase” “$dlbase”
fi
if [ “$2” = “” ]
then
error “Failed to download $dlbase”
fi
fi
}

change_se_context()
# $1 = File or directory name
# Change SELinux context type for $1 to lib_t (or other
# types depending on its name)
{
if [ $selinux_enabled -eq 0 ]
then
# chcon commands fail if SELinux is disabled
return
fi

if [ -s “$1” -o -d “$1” ]
then
case “$1″ in
*$ld_linux*) con_type=”ld_so_t” ;;
$chrome_wrapper) con_type=”execmem_exec_t” ;;
$unsetlib) con_type=”textrel_shlib_t” ;;
*) con_type=”lib_t” ;;
esac

if [ $dry_run -eq 1 ]
then
echo “Would change SELinux context type of $1 to $con_type”
echo
else
chcon $chcon_options -t $con_type “$1”
fi
else
if [ $dry_run -eq 0 ]
then
error “Couldn’t change SELinux context type of $1 – not found”
fi
fi
}

install_ld_preload_lib()
# Compile and install LD_PRELOAD lib as $libdir/unset_var.so
{
if [ $dry_run -eq 1 ]
then
echo “Would compile/install $unsetlib and”
echo “add LD_PRELOAD=$unsetlib to $chrome_wrapper”
echo
return
fi

cat <“$unsetsrc”
/* unset_var.c 1.02 (C) Richard K. Lloyd 2013

LD_PRELOAD code to save LD_LIBRARY_PATH, blank LD_LIBRARY_PATH
if the file to be exec’d isn’t a full path, run the original
exec*() library routine and then restore LD_LIBRARY_PATH.

This way, we can avoid Fedora 15 libraries being picked up
by helper apps or plugins that are subsequently loaded by
Google Chrome.

strings -a /opt/google/chrome/chrome | grep ^exec
reveals three exec* routines used by the binary:
execvp(), execve() and execlp().

Compile with:
gcc -O -fpic -shared -s -o unset_var.so unset_var.c -ldl

Run with:
export LD_PRELOAD=/path/to/unset_var.so
/opt/google/chrome/google-chrome
*/

/* Have to build with this flag defined */
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif

/* The environmental variable we’re going to unsetenv() */
#define ENV_VAR “LD_LIBRARY_PATH”

/* Some system headers */
#include
#include
#include
#include
#include
#include

/* Each routine we intercept is likely to have different parameter types
and return types too, so firstly, we create common code macros */

/* Define local variables for function, passing in the function return type */
#define INTERCEPT_LOCAL_VARS(return_type) \
char *envptr=getenv(ENV_VAR); \
static char savebuf[BUFSIZ]; \
/* FILE *outhand=fopen(“/tmp/exec.log”,”a”); */ \
return_type retval

/* Save ENV_VAR value in local buffer and then unset it
if it’s not a full path */
#define INTERCEPT_SAVE_VAR(fname) \
if (envptr!=(char *)NULL && envptr[0]!=”) \
(void)snprintf(savebuf,BUFSIZ,ENV_VAR “=%s”,envptr); \
else savebuf[0]=”; \
/* if (outhand!=(FILE *)NULL) { fprintf(outhand,”%s\n”,fname); (void)fclose(outhand); } */ \
if (strstr(fname,”/”)==(char *)NULL || \
strstr(fname,”/opt/google/talkplugin/”)!=(char *)NULL) unsetenv(ENV_VAR)

/* Restore ENV_VAR value and return value from function. */
#define INTERCEPT_RESTORE_VAR \
if (savebuf[0]) putenv(savebuf); else unsetenv(ENV_VAR); \
return(retval)

/* Now string it into macros for different numbers of parameters. */

/* execvp() */
#define INTERCEPT_2_PARAMS(return_type,function_name,function_name_str,param_1_type,param_1_name,param_2_type,param_2_name) \
return_type function_name(param_1_type param_1_name,param_2_type param_2_name) \
{ \
INTERCEPT_LOCAL_VARS(return_type); \
return_type (*original_##function_name)(param_1_type,param_2_type); \
original_##function_name=dlsym(RTLD_NEXT,function_name_str); \
INTERCEPT_SAVE_VAR(param_1_name); \
retval=(*original_##function_name)(param_1_name,param_2_name); \
INTERCEPT_RESTORE_VAR; \
}

/* execve() */
#define INTERCEPT_3_PARAMS(return_type,function_name,function_name_str,param_1_type,param_1_name,param_2_type,param_2_name,param_3_type,param_3_name) \
return_type function_name(param_1_type param_1_name,param_2_type param_2_name,param_3_type param_3_name) \
{ \
INTERCEPT_LOCAL_VARS(return_type); \
return_type (*original_##function_name)(param_1_type,param_2_type,param_3_type); \
original_##function_name=dlsym(RTLD_NEXT,function_name_str); \
INTERCEPT_SAVE_VAR(param_1_name); \
retval=(*original_##function_name)(param_1_name,param_2_name,param_3_name); \
INTERCEPT_RESTORE_VAR; \
}

/* execlp() – I’m not fully sure I’ve done the va_list stuff right here! */
#define INTERCEPT_2_VARARGS(return_type,function_name,function_name_str,param_1_type,param_1_name,param_2_type,param_2_name) \
return_type function_name(param_1_type param_1_name,param_2_type param_2_name,…) \
{ \
va_list args; \
INTERCEPT_LOCAL_VARS(return_type); \
return_type (*original_##function_name)(param_1_type,param_2_type,…); \
original_##function_name=dlsym(RTLD_NEXT,function_name_str); \
INTERCEPT_SAVE_VAR(param_1_name); \
va_start(args,param_2_name); \
retval=(*original_##function_name)(param_1_name,param_2_name,args); \
va_end(args); \
INTERCEPT_RESTORE_VAR; \
}

/* Only 3 routines intercepted so far – may be more in the future */
INTERCEPT_2_PARAMS(int,execvp,”execvp”,const char *,file,const char **,argv);
INTERCEPT_3_PARAMS(int,execve,”execve”,const char *,filename,const char **,argv,const char **,envp);
INTERCEPT_2_VARARGS(int,execlp,”execlp”,const char *,file,const char *,arg);
@EOF

if [ -s “$unsetsrc” ]
then
gcc -O -fpic -shared -s -o “$unsetlib” “$unsetsrc” -ldl
rm -f “$unsetsrc”
if [ -s “$unsetlib” ]
then
chmod a+rx “$unsetlib”
change_se_context “$unsetlib”
message “Compiled/installed $unsetlib”
else
error “Failed to compile/install $unsetlib”
fi
else
error “Unable to create $unsetsrc source file”
fi
}

install_library()
# $1 = Core of basename of RPM filename
# $2 = After unpacking, relative path to library soft-link
# $3 = Optional rename filename
{
if [ “$3” = “” ]
then
lib_name=”`basename $2`”
else
lib_name=”$3″
fi
fname=”$libdir/$lib_name”
nonorig=”$libdir/`basename $lib_name .orig`”

if [ “$fname” != “$nonorig” ]
then
# We hit here if library is patchable –
# we must leave function with the .orig file existing
if [ -s “$nonorig” -a ! -s “$fname” ]
then
# We have the non-.orig file and don’t have the .orig one,
# rename one to the other. It will get patched later on.
mv -f “$nonorig” “$fname”
fi
fi

# Obvious optimisation here – if Fedora library is already installed,
# we only change SELinux context (no RPM or extraction needed)
# as long as patching isn’t needed (the patching changed in 3.10+
# so we can’t be sure the patch has been applied).
if [ -s “$fname” -a “$3” = “” ]
then
change_se_context “$fname”
return
fi

rpmfile=”$1.$suffix”
if [ ! -s $rpmfile ]
then
download_file “$baseurl/$rpmfile”
fi

message “Installing $fname” “n”

if [ $dry_run -eq 1 ]
then
echo “Would unpack $rpmfile using rpm2cpio/cpio and”
echo “then copy $2 to $fname” ; echo
return
fi

rpm2cpio “$rpmfile” | cpio -id 2>/dev/null

rel_link=”`dirname \”$2\”`/`basename \”$2\” .orig`”
if [ ! -h “$rel_link” ]
then
error “Failed to find $rel_link soft-link (couldn’t install $fname)”
fi

rel_file=”`dirname \”$2\”`/`readlink \”$rel_link\”`”
if [ ! -s “$rel_file” ]
then
error “Failed to find $rel_file file (couldn’t install $fname)”
fi

rm -f “$fname”
cp -fp “$rel_file” “$fname”
if [ -s “$fname” ]
then
change_se_context “$fname”
else
error “Failed to install $fname”
fi
}

yesno()
# $1 = Message prompt
# Returns ans=0 for no, ans=1 for yes
{
if [ $dry_run -eq 1 ]
then
echo “Would be asked here if you wanted to”
echo “$1 (y/n – y is assumed)”
ans=1
else
ans=2
fi

while [ $ans -eq 2 ]
do
echo -n “Do you want to $1 (y/n) ?” ; read reply
case “$reply” in
Y*|y*) ans=1 ;;
N*|n*) ans=0 ;;
*) echo “Please answer y or n” ;;
esac
done
}

check_version()
# Make sure that we are running the latest version
# $* = Params passed to script
{
message “Checking for an update to $scriptname” “n”
download_file “$checkurl”

if [ $dry_run -eq 1 ]
then
echo “Would check if this running script (version $version) is out of date.”
echo “If it’s been superseded, the new version would be downloaded and you’d be asked”
echo “if you want to upgrade to it and run the new version.”
echo
return
fi

newversion=”`cat \”$checkfile\”`”
newversion=”`echo $newversion`”
rm -f “$checkfile”

if [ “$newversion” = “$version” ]
then
message “$scriptname is already the latest version ($version) – continuing” “n”
else
message “New version ($newversion) of $scriptname detected – downloading it now”
download_file “$upgradeurl”

if [ “$scriptname” -ef “$script” ]
then
let a=1
else
mv -f “$scriptname” “$script”
fi
chmod u+x “$script”
message “Download of $scriptname $newversion successful”

yesno “run $scriptname $newversion now”
if [ $ans -eq 1 ]
then
message “OK, executing $script $*”
exec “$script” $*
error “Failed to run $script $*”
else
if [ $quiet -lt 2 ]
then
echo
echo “$scriptname $newversion is available as $script”
echo “Please inspect the new code and then run the new script.”
echo
fi
clean_up
exit 1
fi
fi
}

find_latest_chrome_version()
# Look on OmahaProxy CSV site for latest version number of linux/$rpm_type/current
{
csv_name=”chrome_versions.csv”
message “Determining latest $chrome_name version number” “n”
download_file “$chrome_csv” “$csv_name”

if [ $dry_run -eq 1 ]
then
echo “Would use OmahaProxy CSV to determine latest $chrome_name version number”
echo
return
fi

if [ -s “$csv_name” ]
then
# CSV annoyingly uses “dev” for the unstable release
case “$rpm_type” in
unstable) csv_type=”dev” ;;
*) csv_type=”$rpm_type” ;;
esac
chrome_latest=”`grep ^linux,$csv_type, \”$csv_name\” | head -1 | cut -d, -f3`”
else
chrome_latest=””
fi

rm -f “$csv_name”
if [ “$chrome_latest” = “” ]
then
warning “Unable to determine latest $chrome_name version number” “n”
else
message “Latest $rpm_name version number is $chrome_latest” “n”
chrome_name=”$chrome_name $chrome_latest”
fi
}

get_installed_version()
# Find out what version of Google Chrome is installed
{
if [ $dry_run -eq 1 ]
then
echo “Would use \”$inst_tree/google-chrome –version\” or”
echo “\”rpm -q $rpm_name\” to determine installed Google Chrome version”
echo
return
fi

# Look for the shell wrapper first and get version from that
if [ -x “$inst_tree/google-chrome” ]
then
# This may fail of course if Google Chrome 28+ installed without Fedora libs
chrome_installed=”`\”$inst_tree/google-chrome\” –version 2>/dev/null | awk ‘{ print $3; }’`”
else
chrome_installed=””
fi

# If couldn’t find version from wrapper, look it up as an RPM install instead
if [ “$chrome_installed” = “” ]
then
chrome_installed=”`is_installed $rpm_name | cut -d- -f4`”
fi
}

get_downloaded_version()
# Find out what version of Google Chrome RPM was downloaded
{
if [ $dry_run -eq 1 ]
then
chrome_downloaded=””
echo “Would use \”rpm -qp\” on downloaded Google Chrome RPM to find its version”
echo
return
fi

if [ -s $chrome_rpm ]
then
chrome_downloaded=”`rpm -qp \”$chrome_rpm\” | cut -d- -f4`”
if [ “$chrome_downloaded” = “” ]
then
error “Can’t find version number of $chrome_rpm”
fi
else
chrome_downloaded=””
fi
}

download_chrome_rpm()
# Download latest RPM because we don’t have it downloaded and don’t have
# the latest release installed either
{
download_file “https://dl.google.com/linux/direct/$chrome_rpm&#8221;
get_downloaded_version

if [ $dry_run -eq 1 ]
then
return
fi

if [ “$chrome_latest” = “” ]
then
chrome_latest=”$chrome_downloaded”
chrome_name=”$chrome_name $chrome_latest”
fi

if [ “$chrome_downloaded” != “$chrome_latest” ]
then
error “Downloaded Google Chrome RPM version ($chrome_downloaded) not the latest one ($chrome_latest)”
fi

message “$chrome_name downloaded successfully” “n”
}

install_chrome_rpm()
# We force install the RPM because CentOS 6’s packages
# are below the minimum requirements now
{
message “Installing $chrome_name RPM (please wait)”

if [ $dry_run -eq 1 ]
then
echo “Would force-install $chrome_rpm RPM and”
echo “then check the installed version number is the one it should be”
return
fi

check_binary_not_running
rm -f “$inst_tree/chrome”
rpm $rpm_options “$chrome_rpm”
if [ ! -x “$inst_tree/chrome” ]
then
error “Failed to install $chrome_name”
else
get_installed_version
if [ “$chrome_installed” = “$chrome_latest” ]
then
message “$chrome_name installed successfully”
install_success=1
else
error “Newly-installed Google Chrome version ($chrome_installed) not the latest one ($chrome_latest)”
fi
fi
}

update_google_chrome()
# Download and install the latest Google Chrome RPM
# if it’s either out of date or not installed yet
{
find_latest_chrome_version
get_installed_version
get_downloaded_version

if [ $dry_run -eq 1 ]
then
echo “Would check if installed Google Chrome is the latest version.”
echo “If it isn’t, the latest version would be downloaded and installed.”
echo
return
fi

if [ “$chrome_installed” = “$chrome_latest” -a “$chrome_latest” != “” ]
then
message “$chrome_name is already installed – skipping installation”
install_success=1
else
if [ “$chrome_downloaded” != “$chrome_latest” -o “$chrome_latest” = “” ]
then
download_chrome_rpm
fi
install_chrome_rpm
fi
}

patch_libs()
# Hack references to $ld_linux.so.2 to be $ld_linux.so.0 in libc.so.6,
# $ld_linux.so.0 and libstdc++.so.6, so that we avoid picking up the system
# version in /$rellib (yes, there’s a maddeningly hard-coded path in the ld
# library that ignores LD_LIBRARY_PATH).
{
libc=”$libdir/libc.so.6″
libld=”$libdir/$ld_linux$new_ld_suff”
libcpp=”$libdir/libstdc++.so.6″
libdl=”$libdir/libdl.so.2″

if [ $dry_run -eq 1 ]
then
echo “Would patch downloaded $libc, $libld, $libcpp and”
echo “$libdl to use $ld_linux$new_ld_suff and also”
echo “set their SELinux context types if necessary.”
echo
return
fi

for each_lib in “$libc” “$libld” “$libcpp” “$libdl”
do
each_lib_orig=”$each_lib.orig”
if [ -s “$each_lib_orig” ]
then
message “Patching $each_lib” “n”
sed -e “s/$ld_linux.so.2/$ld_linux$new_ld_suff/g” “$each_lib”
rm -f “$each_lib_orig”
if [ -s “$each_lib” ]
then
chmod a+rx “$each_lib”
change_se_context “$each_lib”
else
error “Failed to created patched $each_lib”
fi
else
error “$each_lib_orig missing (didn’t extract from Fedora RPM)”
fi
done
}

init_setup()
# Get everything setup and do a few basic checks
{
if [ $quiet -lt 2 ]
then
echo “$chrome_name $inst_str $version on the $arch platform”
echo “(C) Richard K. Lloyd `date +%Y` ”
show_space_used
echo
fi

if [ $dry_run -eq 1 ]
then
echo “Running in dry-run mode (-n) – none of the actions below will be performed.”
if [ $quiet -ne 0 ]
then
echo “Please note that combining dry-run and quiet modes isn’t a good idea,”
echo “but I’ll continue anyway just to keep you happy.”
fi
echo
fi

# Must run this script as root
if [ `id -u` -ne 0 ]
then
error “You must run $scriptname as the superuser (usually root)”
fi

if [ “$tmp_tree” = “” -o “$tmp_tree” = “/tmp” -o “$tmp_tree” = “/” ]
then
error “Temporary directory location ($tmp_tree) incorrect”
fi

if [ $do_install -eq 0 ]
then
return
fi

if [ $dry_run -eq 1 ]
then
if [ ! -d “$tmp_tree” ]
then
echo “Would create temporary $tmp_tree directory”
fi
echo “Would change working directory to $tmp_tree”
echo
else
if [ ! -d “$tmp_tree” ]
then
message “Creating temporary directory $tmp_tree” “n”
mkdir -p “$tmp_tree”
if [ ! -d “$tmp_tree” ]
then
error “Couldn’t create $tmp_tree directory”
fi
fi

message “Changing working directory to $tmp_tree” “n”
cd /
cd “$tmp_tree”
if [ “`pwd`” != “$tmp_tree” ]
then
error “Couldn’t change working directory to $tmp_tree”
fi
fi
}

check_derivative()
# A rather naff check for version 6 of OS and 2.6 kernel
{
if [ “`grep 6 /etc/issue 2>/dev/null`” = “” ]
then
case “`uname -r`” in
2.6.*) let a=1 ;;
*) echo
echo “This OS doesn’t look like it’s in the RHEL 6 family.”
echo “Very bad things could happen if you continue!”
echo
yesno “you want to continue”
if [ $ans -eq 1 ]
then
message “OK, but you’ve been warned, so remember that”
else
error “Probably a wise move”
fi ;;
esac
fi
}

yum_install()
# Download and Install specified packages if they aren’t already installed
# $1 = “prompt” Prompt if any of $2.. aren’t already installed
# $2.. = List of packages to install
{
# Nothing to install yet
install_list=””

if [ “$1” = “prompt” ]
then
prompt=1 ; promptstr=”ask for”
else
prompt=0 ; promptstr=”proceed with” ; ans=1
fi
shift

for each_dep in $*
do
if [ “`is_installed $each_dep`” = “” ]
then
install_list=”$install_list $each_dep”
else
if [ “$each_dep” = “libX11” ]
then
# Need libX11 1.5* or later, so check for that.
# OS upgrade would move to 1.5+ anyway, so probably not needed
case “`rpm -q –queryformat ‘%{VERSION}’ $each_dep`” in
1.3*|1.4*) install_list=”$install_list $each_dep” ;;
esac
fi
fi
done

if [ “$install_list” != “” ]
then
if [ $dry_run -eq 1 ]
then
echo “Would $promptstr the installation of these packages and their dependencies:”
echo “$install_list”
echo
return
fi

echo “The following packages and their dependencies need downloading/installing:”
echo “$install_list”
if [ $prompt -eq 1 ]
then
echo
yesno “download/install these packages and dependencies”
fi

if [ $ans -eq 1 ]
then
message “Downloading/installing $install_list (please wait)”
yum $yum_options install $install_list
else
error “Those packages are required by this script”
fi
fi
}

check_if_os_obsolete()
# If OS version is less than 6.4, offer to upgrade (and abort if declined).
# We need at least 6.4 because bad things happen in earlier versions
{
os_version=”`lsb_release -rs`”
case “$os_version” in
6.0|6.1|6.2|6.3)
if [ $dry_run -eq 1 ]
then
echo “Would offer to upgrade your out-of-date OS (version $os_version).”
echo “If declined, user is warned that they must upgrade their OS and reboot”
echo “before running $chrome_name.”
echo
return
fi

echo “Your OS version ($os_version) is out-of-date and will probably not”
echo “run $chrome_name correctly.”
echo
yesno “upgrade your OS”

if [ $ans -eq 1 ]
then
message “Upgrading OS to latest release” “n”
message “You will have a final y/n prompt before updates are downloaded/installed”
yum update
new_os_version=”`lsb_release -rs`”
if [ “$new_os_version” = “$os_version” ]
then
ans=0
warning “You declined an OS update to the latest release”
else
message “Upgrade to OS version $new_os_version completed successfully”
echo “You are STRONGLY RECOMMENDED to reboot this machine to run the new $new_os_version kernel.”
echo “If you don’t, it’s likely $chrome_name will not run correctly.”
echo “Please close all applications now (except this script!) if you want to reboot.”
warning “These users are logged into this machine: `users | tr ‘ ‘ ‘\n’ | sort -u`”

yesno “reboot this machine immediately”
if [ $ans -eq 1 ]
then
message “Rebooting machine now”
/sbin/shutdown -r now
exit 0
fi
warning “Do not run $chrome_name until after the next reboot”
ans=1
fi
fi

if [ $ans -eq 0 ]
then
warning “$chrome_name should not be run until you upgrade this machine’s OS via \”yum update\” and reboot it after the upgrade”
fi ;;
esac
}

check_if_archived()
# See if $fedver has had its RPMs archived
# i.e. moved from $baseurl to $archive_baseurl
{
message “Detecting if Fedora $fedver has been moved to archive site”
check_file=”README”

# Easiest way is to look for $core_baseurl/$check_file
# If it’s present, Fedora $fedver has been archived
# Because this download displays an error (not archived yet),
# don’t show any of its output otherwise the end user would panic
download_file “$core_baseurl/$check_file” “$check_file” >/dev/null 2>&1

if [ $dry_run -eq 1 ]
then
echo “Would see if $core_baseurl/$check_file exists.”
echo “If it does, Fedora $fedver has been moved to an archive site at:”
echo “$archive_baseurl”
echo
return
fi

if [ -s “$check_file” ]
then
message “Yes, it has! Fedora $fedver RPM downloads will use archive URLs” “n”
baseurl=”$archive_baseurl”
else
message “No, it hasn’t. Fedora $fedver RPM downloads will use normal URLs” “n”
fi

if [ $quiet -lt 2 ]
then
echo
fi

rm -f “$check_file”
}

install_rpm_libraries()
# Extract and install libraries from Fedora RPMs
{
# Make sure RPMs haven’t been archived – could happen at any time
check_if_archived

# We need to create library dir because we haven’t installed
# the Google Chrome RPM yet
if [ ! -d “$libdir” ]
then
mkdir -p -m 755 “$libdir”
if [ ! -d “$libdir” ]
then
error “Can’t create $chrome_name library dir ($libdir)”
fi
fi

# TODO: Download and scan $baseurl to determine RPM links
# Function RPM core filename Relative soft-link unpacked Optional rename
install_library libstdc++-4.6.3-2.fc$fedver $relusrlib/libstdc++.so.6 libstdc++.so.6.orig
install_library glibc-2.14.1-6 $rellib/libc.so.6 libc.so.6.orig
install_library glibc-2.14.1-6 $rellib/$ld_linux.so.2 $ld_linux$new_ld_suff.orig
install_library glibc-2.14.1-6 $rellib/libdl.so.2 libdl.so.2.orig

if [ $dry_run -eq 0 ]
then
# If we get this far, we’ll silently remove pre-3.10’s $ld_linux.so.3 library
rm -f $libdir/$ld_linux.so.3
fi

install_library gtk2-2.24.7-3.fc$fedver $relusrlib/libgdk-x11-2.0.so.0
install_library gtk2-2.24.7-3.fc$fedver $relusrlib/libgtk-x11-2.0.so.0
install_library glib2-2.28.8-1.fc$fedver $rellib/libglib-2.0.so.0
}

bulk_warning()
# Multi-line warning message in $1, $2 and $3
{
if [ $dry_run -eq 1 ]
then
echo “Would display this warning to stderr:”
echo “$1”
echo “$2”
echo “$3”
else
echo >&2
echo “WARNING:” >&2
echo “$1” >&2
echo “$2” >&2
echo “$3.” >&2
fi
}

final_messages()
# Display final installation messages before exiting
{
if [ $quiet -eq 2 -o $do_install -eq 0 ]
then
return
fi

echo
if [ $dry_run -eq 1 ]
then
echo “Would display these final messages after a successful run:”
echo
fi

echo “$chrome_name and Fedora $fedver libraries installed successfully.”
echo “Please run the browser via the ‘google-chrome’ command as a non-root user.”
echo
echo “You will get a few terminal warnings when starting the browser, but”
echo “these even appear on Fedora 19, so it looks like a Google Chrome bug to me.”
echo

echo “To update Google Chrome, run \”yum update $rpm_name\” or”
echo “simply re-run this script with \”./$scriptname\”.”
echo “To uninstall Google Chrome and its dependencies added by this script,”
echo “run \”yum remove $rpm_name $deps_name\” or \”./$scriptname -u\”.”
echo

if [ $selinux_enforcing -eq 1 ]
then
bulk_warning \
“$chrome_name can’t run nacl_helper with SELINUX=enforcing” \
“(you will see terminal messages to that effect), which may disable sandboxing.” \
“A workaround is to set SELINUX=permissive in /etc/selinux/config and reboot.”
echo
fi
}

parse_options()
# Parse script options passed as $*
{
delete_tmp=0 ; dry_run=0 ; do_install=1
quiet=0 ; inst_str=”Installer”
risky_type=”$old_rpm_type”

while [ “x$1” != “x” ]
do
case “$1″ in
-\?|-h|–help) show_syntax ; exit 0 ;;
-b|–beta) risky_type=”beta” ;;
-d|–delete) delete_tmp=1 ;;
-n|–dryrun) dry_run=1 ;;
-q|–quiet) if [ $quiet -lt 2 ]
then
let quiet=$quiet+1
fi ;;
-s|–stable) risky_type=”stable” ;;
-t|–tmpdir) shift ; set_tmp_tree “$1″ ;;
-u|–uninstall) do_install=0 ; inst_str=”Uninstaller” ;;
-U|–unstable) risky_type=”unstable” ;;
*) show_syntax >&2
error “Invalid option ($1)” ;;
esac
shift
done

if [ $quiet -ne 0 ]
then
wget_options=”$wget_options -q”
yum_options=”$yum_options -q”
rpm_options=”$rpm_options –quiet”
rpmbuild_options=”$rpmbuild_options –quiet”
else
rpm_options=”$rpm_options -vh”
chcon_options=”$chcon_options -v”
fi

if [ “$risky_type” != “$old_rpm_type” ]
then
set_rpm_type “$risky_type”
fi
}

create_spec_file()
# Create chrome-deps.spec file for building the chrome-deps RPM.
# Many thanks to to Marcus Sandberg for his (public domain) spec file at
# https://github.com/adamel/chrome-deps which I have used as a basis for the
# spec file that this script creates.
{
( cat <<@EOF
# Much of this spec file was taken from Marcus Sandberg's fine (public domain)
# effort at https://github.com/adamel/chrome-deps although it has been
# modified compared to his version.

Name: @DEPS_NAME@
Version: @DEPS_VERSION@
Release: 1
Summary: Dependencies required for Google Chrome 28+ on RHEL 6 derivatives
License: LGPLv2+, LGPLv2+ with exceptions, GPLv2+, GPLv3+, GPLv3+ with exceptions, GPLv2+ with exceptions, BSD, public domain
Group: System Environment/Libraries
URL: @CHECKSITE@
Vendor: Richard K. Lloyd and the Fedora Project
Packager: Richard K. Lloyd
BuildRoot: @BUILDROOT@

%description
Includes modified Fedora @FEDVER@ Libraries (@LD_LINUX@, libc, libgdk-x11-2.0,
libdl, libglib-2.0, libgtk-x11-2.0 and libstdc++) and an LD_PRELOAD
library (unset_var.so). Also modifies Google Chrome’s @CHROME_WRAPPER@
wrapper to allow Google Chrome 28 or later to run on RHEL 6 derivatives.
SELinux enforcing mode will cause startup issues, so it is recommended you
switch SELinux to permissive mode in that case. The URL for the script
that downloaded, modified and re-packaged the Fedora @FEDVER@ libraries
in this RPM is @CHECKSITE@@SCRIPTNAME@
and it is in the public domain.

# List of libraries to include in the RPM
%files
%defattr(-,root,root,-)
@MODIFY_WRAPPER@
@LIBDIR@/@LD_LINUX@.so.0
@LIBDIR@/libc.so.6
@LIBDIR@/libdl.so.2
@LIBDIR@/libgdk-x11-2.0.so.0
@LIBDIR@/libglib-2.0.so.0
@LIBDIR@/libgtk-x11-2.0.so.0
@LIBDIR@/libstdc++.so.6
@LIBDIR@/unset_var.so

# No prep or build rules because it’s all been done by @SCRIPTNAME@

# Install a copy of libraries into build root
%install
rm -rf %{buildroot}
mkdir -p -m 755 %{buildroot}@LIBDIR@
cp -pf @MODIFY_WRAPPER@ %{buildroot}@INST_TREE@
cp -pf @LIBDIR@/*.so.* @LIBDIR@/unset_var.so %{buildroot}@LIBDIR@/

# Run modify_wrapper once the files are installed
%post
@MODIFY_WRAPPER@

# At end of build, remove build root
%clean
rm -rf %{buildroot}

# Changelog, with annoyingly “wrong” US date format
%changelog
* Sun Jul 28 2013 Richard K. Lloyd – @DEPS_VERSION@-1
– Initial version based on Marcus Sandberg’s fine work at
https://github.com/adamel/chrome-deps (differences are below).
– All the Fedora @FEDVER@ library downloads, unpacking and modifications are
done in the @SCRIPTNAME@ script that generated this spec file, rather
than run as spec file commands.
– LD_PRELOAD @UNSETLIB@ library and @MODIFY_WRAPPER@
script are both included in the built RPM.
@EOF
) | sed \
-e “s#@DEPS_VERSION@#$deps_version#g” \
-e “s#@LD_LINUX@#$ld_linux#g” \
-e “s#@DEPS_NAME@#$deps_name#g” \
-e “s#@CHECKSITE@#$checksite#g” \
-e “s#@FEDVER@#$fedver#g” \
-e “s#@SCRIPTNAME@#$scriptname#g” \
-e “s#@LIBDIR@#$libdir#g” \
-e “s#@UNSETLIB@#`basename $unsetlib`#g” \
-e “s#@CHROME_WRAPPER@#`basename $chrome_wrapper`#g” \
-e “s#@MODIFY_WRAPPER@#$modify_wrapper#g” \
-e “s#@INST_TREE@#$inst_tree#g” \
-e “s#@BUILDROOT@#$rpmbuilddir/BUILDROOT#g” \
>”$specfile”
}

setup_build_env()
# Create RPM build environment under ~/rpmbuild and also
# create the chrome-deps.spec file
{
rpmbuilddir=~/rpmbuild
built_rpm=”$rpmbuilddir/RPMS/$rpmarch/$built_rpm_base”
specsdir=”$rpmbuilddir/SPECS”
specfile=”$specsdir/$deps_name.spec”
setuptree=”/usr/bin/rpmdev-setuptree”

if [ $dry_run -eq 1 ]
then
echo “Would create the build environment tree ($rpmbuilddir)”
echo “and also the $deps_name spec file ($specfile).”
echo
return
fi

if [ ! -d “$specsdir” ]
then
if [ -x “$setuptree” ]
then
$setuptree
fi

if [ ! -d “$specsdir” ]
then
error “Unable to correctly run $setuptree to create build enviroment”
fi
fi
}

build_deps_rpm()
# Create chrome-deps RPM from the chrome-deps.spec file and install it
{
built_rpm_base=”$deps_name-$deps_version-1.$rpmarch.rpm”
tmpdir_rpm=”$tmp_tree/$built_rpm_base”

# Only build latest chrome-deps RPM if we haven’t already got it
if [ ! -s “$tmpdir_rpm” ]
then
# Get ready for RPM build
setup_build_env

# Create chrome-deps.spec file
create_spec_file

if [ $dry_run -eq 1 ]
then
echo “Would run rpmbuild to create $tmpdir_rpm”
echo
else
cd “$specsdir”
message “Building $tmpdir_rpm”
rm -f “$tmpdir_rpm”

rpmbuild $rpmbuild_options “`basename \”$specfile\”`”
rm -f “$specfile”

# Some users claim that the i386 build tree is actually i686,
# but that’s doesn’t happen for me in CentOS or Scientific Linux.
# Still, let’s check for it anyway
if [ ! -s “$built_rpm” -a “$rpmarch” = “i386″ ]
then
built_rpm_base=”$deps_name-$deps_version-1.i686.rpm”
built_rpm=”$rpmbuilddir/RPMS/i686/$built_rpm_base”
# We don’t change tmpdir_rpm, so this handily renames
# the final RPM to an i386-based filename below
fi

if [ -s “$built_rpm” ]
then
mv -f “$built_rpm” “$tmpdir_rpm”
built_rpm=”$tmpdir_rpm”
fi

if [ ! -s “$built_rpm” ]
then
error “Failed to build $tmpdir_rpm”
fi
fi
fi

if [ $dry_run -eq 1 ]
then
echo “Would install $tmpdir_rpm”
echo
else
message “Installing $tmpdir_rpm”
rpm $rpm_options “$tmpdir_rpm”
fi
}

adjust_chrome_defaults()
# Create a modify_wrapper script to be included in chrome-deps that modifies
# /etc/default/google-chrome if necessary to doing the following:
# – Remove any existing setting of repo_add_once
# – Updates (or adds) a custom ### START .. ### END section, which will
# add an LD_PRELOAD definition to google-chrome if one isn’t present.
# – Sets repo_add_once to true (picked up by /etc/cron.daily/google-chrome)
# modify_wrapper is run once at the end of the chrome-deps RPM installation.
{
if [ $dry_run -eq 1 ]
then
echo “Would create a modify_wrapper script to modify $chrome_defaults.”
echo “The script would ensure the creation of $chrome_repo and”
echo “the addition of a LD_PRELOAD variable to $chrome_wrapper.”
echo
return
fi

( cat <<@EOF
#! /bin/bash
# @MODIFY_WRAPPER@ @WRAPPER_MOD_VERSION@ (C) Richard K. Lloyd 2013
# Created by @SCRIPTNAME@ and included in the @DEPS_NAME@ RPM
# to modify @CHROME_DEFAULTS@ in the following ways:
# – Remove any existing setting of repo_add_once
# – Updates (or adds) a custom ### START .. ### END section, which will
# add an LD_PRELOAD definition to google-chrome if one isn’t present.
# – Sets repo_add_once to true (picked up by /etc/cron.daily/google-chrome)
# @MODIFY_WRAPPER@ is run once at the end of the @DEPS_NAME@ RPM installation.

chrome_defaults=”@CHROME_DEFAULTS@”
progname=”\`basename \$0\`”

error()
{
echo “\$progname: ERROR: \$1 – aborted” >&2
exit 1
}

# Create defaults file if it doesn’t exist
touch “\$chrome_defaults”
if [ ! -f “\$chrome_defaults” ]
then
error “Can’t create \$chrome_defaults”
fi

update_file()
# \$1 = File to update with contents of stdin
{
nfile=”\$1.new” ; ofile=”\$1.old”
cat >”\$nfile”
if [ ! -f “\$nfile” ]
then
rm -f “\$nfile”
error “Failed to create temporary update file \$nfile”
fi

# Don’t do update if new file is the same as old one
if [ “\`diff \”\$1\” \”\$nfile\”\`” = “” ]
then
rm -f “\$nfile”
return
fi

mv -f “\$1” “\$ofile”
if [ ! -f “\$ofile” ]
then
error “Failed to create temporary backup of \$1”
fi

mv -f “\$nfile” “\$1”
rm -f “\$nfile”
if [ ! -f “\$1” ]
then
mv -f “\$ofile” “\$1”
chmod a+r “\$1”
error “Failed to update \$1”
fi

chmod a+r “\$1”
rm -f “\$ofile”
}

grep -v repo_add_once= “\$chrome_defaults” | awk ‘
BEGIN { wrapper_mod=0; exclude_mod=0; end_of_mod=0; }
{
if (\$4==scriptname)
{
if (\$2==”START”)
{
if (\$3==wrapper_mod_version)
{
wrapper_mod=1; exclude_mod=0;
}
else exclude_mod=1;
}
else
if (\$2==”END”) end_of_mod=1;
}

if (!exclude_mod) printf(“%s\n”,\$0);

if (end_of_mod) { exclude_mod=0; end_of_mod=0; }
}
END {
if (!wrapper_mod)
{
printf(“### START %s %s modifications\n”,
wrapper_mod_version,scriptname);
printf(“old_line=\”export LD_LIBRARY_PATH\”\n”);
printf(“new_line=\”\$old_line LD_PRELOAD=\\\\\”%s\\\\\”\”\n”,unsetlib);
printf(“chrome_wrapper=\”%s\”\n”,chrome_wrapper);
printf(“if [ -s \”\$chrome_wrapper\” ]\n”);
printf(“then\n”);
printf(” if [ \”\`grep \\\\\”\$new_line\\\\\” \\\\\”\$chrome_wrapper\\\\\”\`\” = \”\” ]\n”);
printf(” then\n”);
printf(” new_wrapper=\”\$chrome_wrapper.new\”\n”);
printf(” sed -e \”s#\$old_line#\$new_line#g\” \”\$new_wrapper\”\n”);
printf(” if [ -s \”\$new_wrapper\” ]\n”);
printf(” then\n”);
printf(” mv -f \”\$new_wrapper\” \”\$chrome_wrapper\”\n”);
printf(” chmod a+rx \”\$chrome_wrapper\”\n”);
printf(” fi\n”);
printf(” fi\n”);
printf(“fi\n”);
printf(“### END %s %s modifications\n”,
wrapper_mod_version,scriptname);
}
printf(“repo_add_once=\”true\”\n”);
}’ \
wrapper_mod_version=”@WRAPPER_MOD_VERSION@” scriptname=”@SCRIPTNAME@” \
unsetlib=”@UNSETLIB@” chrome_wrapper=”@CHROME_WRAPPER@” |
update_file “\$chrome_defaults”

# Now actually run the defaults file (it will be run daily via cron or
# when the google-chrome-stable RPM is installed or updated),
# so that google-chrome is updated if it needs to be
if [ -s “\$chrome_defaults” ]
then
. “\$chrome_defaults”
fi

exit 0
@EOF
) | sed \
-e “s#@MODIFY_WRAPPER@#`basename \”$modify_wrapper\”`#g” \
-e “s#@WRAPPER_MOD_VERSION@#$wrapper_mod_version#g” \
-e “s#@SCRIPTNAME@#$scriptname#g” \
-e “s#@DEPS_NAME@#$deps_name#g” \
-e “s#@CHROME_DEFAULTS@#$chrome_defaults#g” \
-e “s#@DEPS_NAME@#$deps_name#g” \
-e “s#@UNSETLIB@#$unsetlib#g” \
-e “s#@CHROME_WRAPPER@#$chrome_wrapper#g” \
>”$modify_wrapper”

if [ -s “$modify_wrapper” ]
then
chmod a+rx “$modify_wrapper”
change_se_context “$modify_wrapper”
message “Created $modify_wrapper sucessfully”
else
error “Failed to create $modify_wrapper”
fi
}

main_code()
# Initialisation complete, so run the code
{
if [ $do_install -eq 1 ]
then
# Only install RPM-building packages if latest chrome-deps isn’t installed
if [ “$deps_latest” = “” ]
then
rpm_build_packages=”gcc rpm-build rpmdevtools”
else
rpm_build_packages=””
fi

# Make sure google-chrome-stable and chrome-deps dependencies are present
# but prompt for their download/install if any aren’t
yum_install prompt redhat-lsb wget xdg-utils GConf2 libXScrnSaver libX11 $rpm_build_packages

# Now update Google Chrome if necessary
update_google_chrome

if [ “$deps_latest” = “” ]
then
# Download/install/patch Fedora libraries
install_rpm_libraries
patch_libs

# Adjust /etc/default/google-chrome (sourced in daily by
# /etc/cron.daily/google-chrome) as required
adjust_chrome_defaults

# Build/install LD_PRELOAD library if latest chrome-deps not installed
install_ld_preload_lib

# Build and install the chrome-deps RPM if the latest isn’t installed
build_deps_rpm

# That’s the end of $libdir changes, so change its SELinux context type
change_se_context “$libdir”
fi
else
# If it’s installed, uninstall Google Chrome and dependency packages
check_binary_not_running
uninstall_google_chrome
fi
}

check_selinux()
# See if SELinux is enabled and if it’s enforcing
{
selinux_enforcing=0 ; selinux_enabled=0

# Yes, there’s a value-returning util (0=enabled, ho hum, so we flip it)
# but it may not exist, so fallback on /selinux dir existence
if [ -x /usr/sbin/selinuxenabled ]
then
/usr/sbin/selinuxenabled
let selinux_enabled=1-$?
else
if [ -d /selinux ]
then
selinux_enabled=1
fi
fi

if [ $selinux_enabled -eq 1 ]
then
# Enforcing mode upsets nacl_helper, so try to see if we’re using it
if [ -f /selinux/enforce ]
then
selinux_enforcing=”`cat /selinux/enforce`”
fi
fi
}

# Initialisation functions
init_vars $0
check_derivative
check_selinux
parse_options $*
check_binary_not_running
init_setup
check_version $*

# Now do the install or uninstall
main_code

# Finalisation functions
clean_up
final_messages

if [ $do_install -eq 1 ]
then
# Need at least version 6.4 of OS to run Google Chrome successfully
check_if_os_obsolete
fi

# A good exit
exit 0

Advertisements

3 thoughts on “Google Chrome browser on CentOS 6.4 Desktop

  1. Well, I’ve got no plans to disappear from the Net 🙂 It should be noted that my script will attempt to look for an updated version and run that in preference, so it might not work too well if the script site is down. I just released version 4.50, which should fix “misbehaving” helper apps if you’ve had trouble with those previously.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s