-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinstall_chrome.sh
executable file
·2317 lines (2066 loc) · 77.2 KB
/
install_chrome.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#! /bin/bash
# Google Chrome Installer/Uninstaller for 64-bit RHEL/CentOS 6 or 7
# (C) Richard K. Lloyd 2016 <[email protected]>
# 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:
# - 64-bit RHEL/CentOS 6.6 or later (32-bit is no longer supported)
# (any 64-bit RHEL/CentOS 7 version is supported)
# - Minimum RHEL/CentOS 6 kernel version supported is 2.6.32-431.el6
# (any RHEL/CentOS 7 kernel version is supported)
# - 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 and https_proxy env vars 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 <<@EOF
Syntax: ./install_chrome.sh [-b] [-d] [-f [-f [-f]]] [-h] [-n] [-q] [-s]
[-t tmpdir] [-u] [-U]
-b (or --beta) will switch to beta versions (google-chrome-beta).
-d (or --delete) will delete the temporary directory used for downloads
if an installation was successful.
-f (or --force) forces an automatic "y" for any interactive prompting
except for OS mismatch/OS upgrade/reboot prompts. Specify -f twice to force
it for OS mismatches or OS upgrades as well and three times for reboots
on top of that.
-h (or -? or --help) will display this syntax message.
-n (or --dryrun) will show what actions the script will take,
but it won't actually perform those actions.
-q (or --quiet) will switch to "quiet mode" where minimal info is displayed.
Specify -q twice to go completely silent except for errors.
-s (or --stable) will switch to stable versions (google-chrome-stable),
which is the default if -b or -U haven't previously been specified.
-t tmpdir (or --tmpdir tmpdir) will use tmpdir as the temporary directory
parent tree rather than \$TMPDIR (if set) or /tmp.
-u performs an uninstallation of Google Chrome and chrome-deps-* rather the
default action of an installation.
-U (or --unstable) will switch to unstable versions (google-chrome-unstable).
@EOF
}
# Current version of this script
version="7.40"
# This script will download/install the following for an installation:
# These RHEL/CentOS 6 RPMs and their (many!) deps that aren't already installed
# or are out-of-date:
# redhat-lsb, wget, xdg-utils, GConf2, libXScrnSaver, libX11, gnome-keyring,
# gcc, glibc-devel, nss, rpm-build, libexif, dbus, selinux-policy
# and rpmdevtools.
# These RHEL/CentOS 7 RPMs and their (many!) deps that aren't already installed
# or are out-of-date:
# redhat-lsb, wget, xdg-utils, GConf2, libXscrnSaver. libX11, gnome-keyring,
# libexif, dbus, nss and selinux-policy.
# The latest Google Chrome RPM if not already downloaded (or out-of-date).
# RHEL/CentOS 6 only: libstdc++ library from a gcc 6.1.0 source build.
# For RHEL/CentOS 6 only:
# It then copies the downloaded libstdc++ library into /opt/google/chrome*/lib.
# Next, it C-compiles a shared library that provides the "missing"
# gnome_keyring_attribute_list_new function that's installed as
# /opt/google/chrome*/lib/libgnome-keyring.so.0 and linked against a
# newly installed soft-link called
# /opt/google/chrome*/lib/link-to-libgmome-keyring.so.0 which in turn points
# to the system copy of libgmome-keyring.so.0.
# Finally, it creates and installs a chrome-deps-* RPM which includes the
# downloaded libstdc++ library, libgnome-keyring.so.0, the soft-link
# link-to-libgmome-keyring.so.0 and code to modify the
# google-chrome wrapper. (End of RHEL/CentOS 6 only actions)
# Note that you can't run Google Chrome as root - it stops you from doing so.
# Revision history:
# 7.40 - 15th May 2016
# - If wget isn't installed (e.g. it's a minimal CentOS 6 install) or it's
# out-of-date, download and install it. dbus and selinux-policy (if SELinux
# is enabled) dependencies have been added, which may help minimal installs.
# Note that if dbus isn't running on CentOS 6, it's now started and also
# enabled via chkconfig for future reboots. If any of the main dependencies
# are out-of-date, they will now be updated (this is particularly critical
# for nss and selinux-policy, which won't work on an unpatched 6.7 install).
# 7.31 - 29th April 2016
# - The Google Chrome binary seems to dynamically load libexif.so.12 at
# runtime which caused me to miss libexif off the dependencies list, so
# it's finally been added in. gcc 6.1.0 is now used as the basis for
# the libstdc++ download, so that meant a new size and checksum as usual.
# 7.30 - 5th March 2016
# - Google have completely pulled the 32-bit Linux Google Chrome repository,
# so I've matched this by dropping 32-bit support (I don't understand
# why anyone would ever install 32-bit RHEL/CentOS, but that's just me :-) ).
# - An out-of-date kernel is always an error now rather than a warning.
# 7.24 - 13th February 2016
# - Adjusted year references to be 2016.
# - Finally removed all references to LD_PRELOAD.
# - Warn that this script's 32-bit support is deprecated and will be
# removed in a future release (shortly after Google Chrome drops 32-bit).
# - CentoS 7.2.1511 is on the mirrors, so grab 32-bit libstdc++ from that
# and switch the fallback to the 7.1.1503 version.
# 7.23 - 15th December 2015
# - Increased version of chrome-deps package to 3.12 because of the newer
# libstdc++ in the previous release (yes, I should have done that with 7.22).
# - wget now ignores cached files (e.g. from proxies) when downloading.
# - If your running kernel is older than 2.6.32-431.el6 and you either refuse
# (or fail) to update it when prompted or refuse to reboot after the latest
# kernel update, then this is now a fatal error rather than a warning.
# - On an unrelated note (the company I work for hosts the official site),
# good luck to Tim Peake/Principia today - see https://principia.org.uk/
# 7.22 - 12th December 2015
# - The gcc 5.3.0-built version of 64-bit libstdc++.so.6 is now downloaded,
# triggering a new script release.
# - RHEL/CentOS 6.6 is now the mandatory minimum 6.X release this script will
# run on. If you don't upgrade to at least 6.6 when prompted, the script
# will abort (previous releases let you continue with a warning).
#
# 7.21 - 23rd July 2015
# - gcc 5.2.0 was recently released, so the downloadable 64-bit libstdc++.so.6
# was rebuilt using it. A new checksum/size for the library meant a new
# script release.
# 7.20 - 7th June 2015
# - Warn about out-of-date kernels that will cause Google Chrome to crash
# and offer to update the kernel (and preferably reboot).
# - Fixed a yum repo path typo shown during a dry run (-n) (reported by John
# Stembridge).
# - Don't try to create a spec file if the dry run option -n is specified
# (also reported by John Stembridge).
# - Removed remove_redundant_libs() function - ironically, it's now redundant.
# 7.13 - 24th April 2015
# - Updated the downloadable 64-bit libstdc++.so.6 to one built from gcc 5.1.0.
# Sadly, the uncompressed library has bloated to being 60% bigger than the
# one created from gcc 4.9.2 :-(
# 7.12 - 10th April 2015
# - CentOS 7.0.1406 got abruptly shunted off to vault.centos.org this week,
# promptly completely breaking the 32-bit libstdc++ RPM download. Now the
# download looks at latest 7.1.1503 RPM on mirror.centos.org first and if
# that gets moved (which it eventually will be when 7.2 comes out), it looks
# at the latest 7.0.1406 update on vault.centos.org as a fallback.
# 7.11 - 23rd February 2015
# - Added a Provides: link to the spec file to avoid RPM dependency issues
# with the soft-link (thanks to Raymond Page for spotting the issue) and
# bumped chrome-deps-* RPM version to 3.11.
# 7.10 - 6th February 2015
# - The later libstdc++ works fine with LD_LIBRARY_PATH pointing to it when
# sub-processes are run, so we can finally stop using LD_PRELOAD and the
# unset_var.so shared library.
# - We still need the "missing" gnome_keyring_attribute_list_new function
# that's in later releases of libgnome-keyring.so.0, so build a library
# using that name with the function in it, but link it against a soft-link
# (link-to-libgnome-keyring.so.0 which soft-links to the system-installed
# copy of libgnome-keyring.so.0). Convoluted, but allows us to bring in
# both gnome_keyring_attribute_list_new and all the other library functions/
# symbols in at start-up.
# - Added gnome-keyring as a dependency just to make sure it's there before
# we go ahead with the machinations above.
# - 50% reduction in orphaned kitten-killing tendencies.
# 7.00 - 2nd February 2015
# - Raise minimum RHEL/CentOS 6 version required from 6.5 to 6.6. This is
# because 6.6 now has library updates that negate the need to install patched
# versions from Fedora 15 or 17.
# - The only external library that has to remain is libstdc++, which provides
# the appropriate runtime symbols to satisfy the Google Chrome binary. The
# good news is that it no longer needs to be patched. For 64-bit systems,
# the libstdc++ is lifted by me from a gcc 4.9.2 source build I did.
# For 32-bit systems, libstdc++ is extracted from the CentOS 7 libstdc++ RPM.
# - If the updated CentOS 7 libstdc++ 32-bit RPM goes "missing" (e.g. it is
# removed because of an even newer update), fall back to the
# original 32-bit libstdc++ RPM that shipped with the initial CentOS 7 release.
# I will release a new script version if a libstdc++ (or gcc source) update
# happens of course.
# - Remove any unneeded /opt/google/chrome*/lib libraries that are probably
# hanging around from earlier script releases. For the avoidance of
# doubt, this includes removing the F15 libc library, thus removing the
# GHOST vulnerability that previous script releases may have had.
# - Use %_topdir for RPM build dir location (thanks to Bob Hepple for this)
# - Changed year to 2015 in a few places.
# - Now kills less orphaned kittens than ever!
# 6.10 - 29th August 2014
# - Don't permanently run 2 copies of cat from the google-chrome script
# (this is a horrible kludge intro'ed by Google Chrome 37). They both
# crashed with the previous (6.00) install_chrome.sh, so now just redirect
# stdout and stderr to /dev/null instead (OK, it'll hide console messages/
# errors, but that's better than 2 core dumps or, indeed, running 2 cats).
# - Added "Obsoletes: chrome-deps" to the RPM spec file (suggested by a
# couple of users).
# - Bumped both wrapper_mod_version and the chrome-deps RPM to version 2.10.
# 6.00 - 27th July 2014
# - Google Chrome 36 onwards now has separate install trees for each
# RPM type (stable, beta, unstable), but bizarrely all 3 RPMs include an
# /usr/bin/google-chrome soft-link, preventing simultaneous installation.
# Code was duly added to deal with this significant change.
# - Added PackageKit as a dependency (some live CentOS DVDs don't install it).
# - Removed the last remnants of the custom CentOS 7 repo code.
# - Used a soft-link to fix a failed grep of google-chrome.desktop during the
# installation of the beta or unstable RPM (this is a Google bug, not mine).
# - wrapper_mod_version changed to 2.00 and code added to scan for
# all 3 RPM types since the defaults for all 3 of them are dubiously
# stuck in a single /etc/default/google-chrome file.
# - Bumped chrome-deps-* version to 2.00 because check for google-chrome*
# binary path was widened and the RPM name has changed to include
# stable, beta or unstable as appropriate.
# - If an old "chrome-deps" RPM is present during (un)installation, remove it.
# 5.02 - 10th July 2014
# - Now CentOS 7 final is out, remove the pre-release repo code and
# delete the .repo file if it was created. Refusing to upgrade the OS to
# 6.5 or later will now terminate the script rather than continue with a
# warning. Changed all equivalent RHEL and CentOS references to be
# RHEL/CentOS instead.
# 5.01 - 26th June 2014
# - Fix for latest CentOS 7 pre-release repo detection, because the latest
# pre-release bizarrely includes placeholder .repo files that don't do
# anything.
# 5.00 - 21st June 2014
# - Added support for pre-release CentOS 7, which mainly means no RPM building
# and also the installation of missing dependencies. If no CentOS 7 repos are
# detected - which is the current case with pre-release CentOS 7 versions -
# in /etc/yum.repos.d, a "chrome-deps-updates" repo will be created (this
# will be removed on later runs if any other .repo files are created, on the
# assumption that the user has added their own repos for installing/updating
# RPMs instead or the final CentOS 7 repos are already present).
# - Minimum RHEL/CentOS 6 release supported is now 6.5, which has been out for
# over 6 months at the time of writing. This means libX11 and nss should be
# up-to-date versions, avoiding run-time problems with older versions of
# those packages.
# - Tidied up final messages e.g. it now says the latest version was already
# installed if that was the case.
#
# 4.70 - 17th May 2014
# - Added -f option to auto-force a "y" answer to any interactive prompt
# without bothering to actually prompt you (thanks to Steve Cleveland for the
# idea). The only exceptions to this are the prompts for an OS mismatch, OS
# upgrade or reboot, but even those can be forced by specifying -f twice (or
# three times for reboots).
# - Fixed the 2-hourly bash segfault recorded in syslog. It was caused by the
# chrome binary self-calling the google-chrome bash script to get its version,
# which is bizarre since surely it could just call one of its own functions
# to get that? By unsetting LD_LIBRARY_PATH on the self-call, the segfault
# was avoided. Bumped chrome-deps to version 1.21 because of this.
# 4.60 - 12th April 2014
# - The latest Google Chrome releases kept prompting me for a keyring
# password when starting up. It turns out they were using the
# gnome_keyring_attribute_list_new function, which didn't exist until Fedora
# 17's libgnome-keyring.so.0 library! Luckily, the F17 library works in
# RHEL/CentOS 6, so that's been added and the chrome-deps RPM has been
# bumped to version 1.20.
# - Added nss to the list of possible RHEL/CentOS 6 RPMs that are installed
# (thanks to Ravi Saive at tecmint.com for this, though no-one told me
# directly...).
# - Check the size and cksum of downloaded RPMs and delete them (and quit) if
# they are bad.
# 4.50 - 11th December 2013
# - A user reported that file-roller wouldn't work when opening downloaded
# .tar.gz files inside Google Chrome. It turns out LD_PRELOAD was still set
# when file-roller tried to exec() sub-processes like gzip, so I now unset
# LD_PRELOAD (as well as LD_LIBRARY_PATH) when exec'ing from within Google
# Chrome, which fixes the issue. chrome-deps version was bumped to 1.10
# because of this change. Another user suggested checking previously
# downloaded F15 RPMs have the right checksum/size (and a fresh download is
# forced if they don't), which has been implemented.
# 4.41 - 9th December 2013
# - Added glibc-devel to the list of dependencies because a user reported
# that it wasn't dragged in by gcc. With the imminent release of Fedora 20,
# Fedora 15 has been archived and the code has been changed to reflect that.
# Removed SELinux warning at end of install - the last few releases of
# Google Chrome don't seem to have a problem with enforcing mode w.r.t.
# nacl_helper. Future releases of this script may remove all SELinux-related
# code if enforcing mode remains OK. Google Chrome 31 is displaying a
# manifestTypes error to the console in some setups, but this doesn't seem
# to affect the running of Google Chrome.
# 4.40 - 5th October 2013
# - A similar issue to the 4.30 release cropped up again (reported by
# the same user!) that I still can't reproduce. This time it was a missing
# gdk_pixbuf_format_get_type symbol in F15's libgtk-x11-2.0. This was fixed
# by additionally downloading F15's gdk-pixbuf2 RPM and extracting
# libgdk_pixbuf-2.0 from it. This prompted a bump of the chrome-deps RPM to
# version 1.03.
# 4.30 - 4th October 2013
# - The g_desktop_app_info_get_filename symbol in the F15 libgdk-x11-2.0
# library is present in the F15 libgio-2.0 library (but not in RHEL/CentOS's).
# The script used the former library, but not the latter and a user reported
# a missing symbol crash due to this, despite my testing not showing the
# issue. This release is therefore purely to add libgio-2.0 and its
# libgobject-2.0 dependency to the set of extracted F15 libraries and has
# also been tested against Google Chrome 30 and Google Talk Plugin 4.7.0.0.
# The chrome-deps RPM is now at version 1.02 because of the two extra
# libraries.
# 4.20 - 22nd August 2013
# - If the Google Chrome repo is enabled and a Google Chrome RPM is already
# installed, use "yum check-update google-chrome-stable" to determine if
# there is a newer version available and then fallback to using the
# OmahaProxy site if there isn't.
# - Any newer version than what's been previously downloaded or installed
# can now be downloaded/installed, rather than being exactly the version
# displayed on the OmahaProxy site (which was out of date for a full day when
# Chrome 29 was released, stopping this script from updating to version 29).
# - Removed terminal messages warning because this is fixed with Google Chrome
# 29.
# - Used extra parameters in the OmahaProxy request to narrow the data down to
# the exact channel and platform (linux).
# 4.10 - 8th August 2013
# - Fixed Google Talk (Hangouts) plugin crash - it was because, unlike Google
# Chrome itself, the plugin hasn't been built with later libraries, so it
# needs LD_LIBRARY_PATH to be unset. There still appears to be other
# library issues with the Hangouts plugin, mainly because the older libraries
# don't implement certain calls it uses. Google need to update the plugin!
# Bumped chrome-deps version to 1.01 because of the unset_var.c change.
# - Catered for non-standard i686 RPM build trees on 32-bit systems. I couldn't
# reproduce this myself (it uses i386 for me all the time in RHEL/CentOS and
# Scientific Linux 32-bit VMs) but the code is in place anyway for the users
# that reported the issue.
# - modify_wrapper (now bumped to version 1.01) no longer echoes anything to
# stdout after a successful update of /opt/google/chrome/google-chrome.
# 4.01 - 30th July 2013
# - Emergency 2-char change fix due to a terrible spec parsing bug in rpmbuild.
# It appears that it tries to parse % directives in comment lines.
# Strangely, three different build envs of mine didn't have the bug, but
# a fourth one I tried did.
#
# 4.00 - 30th July 2013
# - Creates a new chrome-deps RPM that it installs alongside the
# google-chrome-stable RPM. It contains the Fedora libraries, the
# built unset_var.so library and a script which is run post-install
# to add code to /etc/default/google-chrome to modify google-chrome if
# its LD_PRELOAD addition isn't present. This gets sourced daily by
# /etc/cron.daily/google-chrome and is a way to auto-modify google-chrome
# within a day of a Google Chrome update (this is because google-chrome
# isn't marked as a config file by Google Chrome's spec file, so updates
# will overwrite any changes made to it). The new code will also enable the
# Google Chrome repo of course. Many thanks to Marcus Sandberg
# for his spec file at https://github.com/adamel/chrome-deps which
# I used as the initial basis for the spec file I create.
# - Adjusted unset_var code to not unset LD_LIBRARY_PATH if a full file
# path (i.e. one containing a slash) is supplied to exec*() routines.
# - Download/installation of google-chrome-stable/chrome-deps dependencies
# is now prompted for (if you decline, the script aborts).
# - Moved out-of-date OS check right to the end of the script and it also
# now offers to reboot the machine after a successful OS update. Warn user
# not to run Google Chrome if either the OS update or reboot are declined
# until they complete the OS update and reboot.
# - Don't remove /etc/cron.daily/google-chrome or
# /etc/yum.repos.d/google-chrome.repo any more because we actually want
# people to use those (they won't be happy cron'ing this script or having
# to regularly run it manually to check for updates).
# - Added -t option to specify the temporary directory parent tree.
# - Added -s (stable), -b (beta) and -U (unstable) options to switch
# release channels. Yes, it remembers the switch, so you only have to
# specify once time.
# - Added libdl.so.2 to the Fedora library list (for unset_var.so).
# 3.20 - 27th July 2013
# - Initial attempt to stop helper apps crashing by wrapping exec*() routines
# with LD_PRELOAD functions that save/blank LD_LIBRARY_PATH, call the
# original routines and, if they return, restore LD_LIBRARY_PATH. Seems to
# stop crashes previously logged to syslog on startup at least, but does
# require gcc and its dependencies to be installed now of course.
# 3.11 - 25th July 2013
# - If SELinux is enabled, set appropriate SELinux contexts on Fedora libraries
# in /opt/google/chrome/lib and that directory itself. Investigation shows
# that if you enable SELinux and set it to enforcing, nacl_helper appears to
# fail to start correctly, possibly disabling sandboxing. The script warns
# about this and suggests a temporary workaround of setting
# SELINUX=permissive in /etc/selinux/config and rebooting. It's hoped to fix
# this SELinux issue more permanently in a future release soon (any help is
# most welcome!).
# 3.10 - 24th July 2013
# - Use .so.0 extension (instead of .so.3) for renamed Fedora ld-linux library
# and change ld-linux*.so.2 references to ld-linux*.so.0 in ld-linux, libc
# and libstdc++. Thanks to Marcus Sundberg for this suggestion.
# - Dependency list for Google Chrome RPM is now redhat-lsb, wget, xdg-utils,
# GConf2, libXScrnSaver and libX11 (not 1.3* or 1.4* though).
# - If OS version ("lsb_release -rs") is less than 6.4 then
# offer to "yum update" and refuse to continue if the user declines.
# If you don't update to at least 6.4, bad things can
# happen (I got a hang and a memory allocation error when starting Google
# Chrome on a RHEL/CentOS 6.0 VM for example).
# 3.00 - 21st July 2013
# - Command-line options now supported including -d (delete temp dir),
# -h (syntax help), -n (dry run), -q (quiet) and -u (uninstall).
# - Abort if Google Chrome is running when the script is started.
# - Display any non-zero disk space figures for /opt/google/chrome and the
# temporary download directory at the start and end of the script.
# 2.10 - 20th July 2013
# - Can now detect if Fedora 15 RPMs have been archived and will download
# them from the archive site if they're found there instead.
# - Fixed lsb package check, so lsb deps will actually be downloaded now.
# - Follow Fedora 15 library soft-links to determine the actual filenames
# that need to be copied.
# - Removed /etc/cron.daily/google-chrome and
# /etc/yum.repos.d/google-chrome.repo straight after the Google Chrome RPM
# is installed to avoid any potential conflict with old releases.
# - Simplistic check for RHEL/CentOS 6 derivatives (initially a prompt if the
# script thinks you aren't running one, but a future release will block
# non-derivatives).
# - Early exits due to errors or an interrupt (CTRL-C) will now properly
# tidy up files in the temporary directory and uninstall the Google Chrome
# RPM if it was installed.
# - All downloads now go via a common function, which saves any pre-existing
# file as a .old version and renames it back if the download fails.
# 2.00 - 14th July 2013
# - Installed a 32-bit RHEL/CentOS 6.4 VM and this enabled me to add initial
# 32-bit support, though there is an nacl_helper issue that I display a warning
# for. Thanks to Seva Epsteyn for a 32-bit patch that got the ball rolling.
# - Check for version number of latest Google Chrome and download/install it
# if it hasn't been already.
# - Use updated Fedora 15 RPMs rather than the original ISO versions.
# - Warn if an enabled Google Chrome repo is detected (we don't want it).
# - Tidied main code into separate functions.
# - Added blank lines before/after messages and prefixed them with three stars.
# - Displayed more messages now they're easier to read.
# 1.10 - 13th July 2013
# - Added an update check for a new version of this script.
# It will always download/install the new version, but will ask
# if you want to run the new version or exit in case you want to
# code inspect it first.
# - Always force-install a downloaded Google RPM, even if a version
# is already installed. Yes, very obvious it should do this but it
# didn't (slaps forehead).
# 1.02 - 13th July 2013
# - Second emergency fix today as someone spotted that wget needed
# "--no-check-certificate" to talk to Google's https download site.
# I didn't need it for the two machines I tested it on though!
# - Added in a check for wget as well while I was at it and it will
# yum install wget if it's not found.
# 1.01 - 13th July 2013
# - Bad variable fix if you've not downloaded Google Chrome's RPM yet.
# Serves me right for making a last minute change and not testing it :-(
# 1.00 - 13th July 2013
# - Tested on 64-bit RHEL/CentOS 6.4 using Fedora 15 libraries. Code is there
# for 32-bit but has not been tested at all because I have no such systems.
message_blank_line()
# $1 != "n" (and no quiet mode) to display blank line
{
if [ $quiet -eq 0 -a "$1" != "n" ]
then
echo
fi
}
message_output()
# Display $1 depending on the quiet mode
{
case "$quiet" in
0) echo "*** $1 ..." ;;
1) echo "$1" ;;
esac
}
message()
# Display a message (passed in $1) prominently
# $2 = "n" to avoid displaying blank lines before or after the message
{
if [ $quiet -eq 2 ]
then
return
fi
if [ $dry_run -eq 1 ]
then
echo "Would display the following message:"
message_output "$1"
echo
return
fi
message_blank_line "$2"
message_output "$1"
message_blank_line "$2"
}
warning()
# $1 = Warning message to display to stderr
# $2 = "n" to avoid displaying blank lines before or after the message
{
message "WARNING: $1" "$2" >&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 `basename $tmp_updates`"
if [ $dry_run -eq 1 ]
then
echo "Would delete these directories/files from inside of $tmp_tree:"
echo "$rm_dir_list"
else
# We delete specific directories/files 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 $yum_options 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
{
# Remove bug fix soft-link if necessary
if [ "$rpm_type" != "stable" -a -h $chrome_desktop ]
then
rm -f $chrome_desktop
fi
# Note we use the old name in addition, in case it's still 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"
customsrc="$tmp_tree/missing_functions.c"
tmp_updates="$tmp_tree/updates.dat$$"
}
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
}
yesno()
# $1 = Message prompt
# $2 = Minimal force level required (1 if not stated)
# Returns ans=0 for no, ans=1 for yes
{
ans=1
if [ $dry_run -eq 1 ]
then
echo "Would be asked here if you wanted to"
echo "$1 (y/n - y is assumed)"
else
if [ "$2" = "" ]
then
minforce=1
else
minforce=$2
fi
if [ $force -lt $minforce ]
then
ans=2
fi
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
}
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"
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 \
chrome-deps-stable chrome-deps-beta chrome-deps-unstable | \
sed -e "s/google-chrome-$1//g" -e "s/chrome-deps-$1//g"`
fi
case "$1" in
stable|beta|unstable)
rpm_type="$1"
case "$1" in
unstable) csv_type="dev" ;;
*) csv_type="$1" ;;
esac
rpm_name="google-chrome-$1"
chrome_csv="http://omahaproxy.appspot.com/all?os=linux&channel=$csv_type"
chrome_rpm="${rpm_name}_current_$rpmarch.rpm" ;;
*) error "Invalid $chrome_name type ($1)" ;;
esac
case "$1" in
beta|unstable) swtype="chrome-$1" ;;
*) swtype="chrome" ;;
esac
inst_tree="/opt/google/$swtype"
libdir="$inst_tree/lib"
missinglib="libgnome-keyring.so.0"
customlib="$libdir/$missinglib"
customlink="$libdir/link-to-${missinglib}"
chrome_wrapper="$inst_tree/google-$swtype"
modify_wrapper="$inst_tree/modify_wrapper"
this_desktop="$app_tree/google-$swtype.desktop"
deps_name="chrome-deps-$rpm_type"
deps_latest="`is_installed $deps_name | grep $deps_version`"
}
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 ; force=0 ; quiet=0
# Avoid picking up the custom 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" ; rpmarch="$arch"
rpmdep="()(64bit)" ;;
*) error "Unsupported architecture ($arch)" ;;
esac
relusrlib="usr/$rellib"
chrome_name="Google Chrome"
# The next definition (chrome_defaults) should probably be different for
# stable vs. others, but Google haven't changed it because it's not
# shipped with the RPM, but actually created during installation.
chrome_defaults="/etc/default/google-chrome"
chrome_repo="/etc/yum.repos.d/google-chrome.repo"
app_tree="/usr/share/applications"
chrome_desktop="$app_tree/google-chrome.desktop"
deps_version="3.13"
download_lib="libstdc++.so.6"
download_lib_xz="$download_lib.xz"
# 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"
wrapper_mod_version="2.10"
install_message="already installed"
trap "interrupt" 1 2 3
wget="/usr/bin/wget"
wget_options="--no-check-certificate --no-cache"
yum_options="-y"
rpm_options="-U --force --nodeps"
chcon_options="-u system_u"
rpmbuild_options="-bb"
# Update checker URL
checksite="http://chrome.richardlloyd.org.uk/"
checkfile="version.dat"
checkurl="$checksite$checkfile"
scriptname="install_chrome.sh"
upgradeurl="$checksite$scriptname"
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 silently fail without exit if $2 is set
# $3 = Optional cksum value to compare download against
# $4 = Optional 0 if failures are warnings, = 1 if errors
{
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
if [ "$3" != "" ]
then
# If file already exists with right cksum, do nothing
if [ "`cksum \"$dlbase\"`" = "$3" ]
then
return
fi
fi
rm -f "$old_dlbase"
mv -f "$dlbase" "$old_dlbase"
fi
message "Downloading $dlbase (please wait)"
$wget $wget_options -O "$dlbase" "$1"
if [ -s "$dlbase" -a "$3" != "" ]
then
if [ "`cksum \"$dlbase\"`" != "$3" ]
then
rm -f "$dlbase"
warning "Deleted downloaded $dlbase - checksum or size incorrect"
fi
fi
if [ ! -s "$dlbase" ]
then
if [ -f "$old_dlbase" ]
then
mv -f "$old_dlbase" "$dlbase"
fi
if [ "$2" = "" -o "$3" != "" ]
then
if [ "$4" = "0" ]
then
warning "Failed to download $dlbase correctly"
else
error "Failed to download $dlbase correctly"
fi
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
$chrome_wrapper) con_type="execmem_exec_t" ;;
$customlib) 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_custom_lib()
# Compile and install missing function lib as $libdir/libgnome-keyring.so.0
{
if [ $dry_run -eq 1 ]