fork 0k-charms
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

145 lines
5.5 KiB

  1. #!/bin/bash
  2. set -eux
  3. ## Certificate DST_Root_CA-X3 expired, it needs to be removed
  4. ## from list of available certificates. Debian <10 have the issue.
  5. ##
  6. ## Fixing: https://www.reddit.com/r/sysadmin/comments/pzags0/lets_encrypts_dst_root_ca_x3_expired_yesterday/
  7. ## see also: https://techcrunch.com/2021/09/21/lets-encrypt-root-expiry/?guccounter=1
  8. modified_certificate=
  9. mkdir -p /usr/local/share/ca-certificates/custom
  10. for certfile_name in isrgrootx1:ISRG_Root_X1 isrg-root-x2 lets-encrypt-r3; do
  11. certfile=${certfile_name%%:*}
  12. name=${certfile_name#*:}
  13. echo "Checking $certfile for $name"
  14. if ! [ -e "/usr/local/share/ca-certificates/custom/$certfile".crt ] &&
  15. ! [ -e "/etc/ssl/certs/$name.pem" ]; then
  16. wget --no-check-certificate https://letsencrypt.org/certs/"$certfile".pem \
  17. -O "/usr/local/share/ca-certificates/custom/$certfile".crt
  18. modified_certificate=1
  19. fi
  20. done
  21. if grep "^mozilla/DST_Root_CA_X3.crt" /etc/ca-certificates.conf 2>/dev/null 2>&1; then
  22. sed -ri 's%^(mozilla/DST_Root_CA_X3.crt)%!\1%g' /etc/ca-certificates.conf
  23. fi
  24. if [ -n "$modified_certificate" ]; then
  25. update-ca-certificates
  26. fi
  27. ## We can now do the ``apt-get update`` safely...
  28. apt:update() {
  29. tried=()
  30. backup=
  31. while ! out=$(apt-get update 2>&1); do
  32. echo "Failed to 'apt-get update', looking for fixes..."
  33. old_tried_length="${#tried[@]}"
  34. failed_fetch=$(printf "%s" "$out" | egrep "^E: Failed to fetch .*404\s+Not Found")
  35. failed_release=$(printf "%s" "$out" | egrep "^[EW]: The repository '.*' does (no longer|not) have a Release file.$")
  36. changed_release=$(printf "%s" "$out" | egrep "^[EW]: Repository '.*' changed its 'Suite' value from .* to .*$")
  37. if [[ " ${tried[*]} " != *" stretch-updates-fix "* ]] &&
  38. [[ "$failed_fetch" == *" http://archive.debian.org/dists/stretch/updates/"* ]]; then
  39. tried+=("stretch-updates-fix")
  40. [ -z "$backup" ] && {
  41. backup=1
  42. echo "Backup old /etc/apt/sources.list"
  43. cp -v /etc/apt/sources.list{,.myc-update}
  44. }
  45. echo "Applying stretch-updates-fix"
  46. sed -ri 's%^(\s*deb(-src)? http://archive.debian.org/? stretch/updates .*)$%# \1%g' /etc/apt/sources.list
  47. fi
  48. if [[ " ${tried[*]} " != *" stretch-archive-fix "* ]] &&
  49. [[ "$failed_release" == *"'http://deb.debian.org/debian stretch"* ]]; then
  50. tried+=("stretch-archive-fix")
  51. [ -z "$backup" ] && {
  52. backup=1
  53. echo "Backup old /etc/apt/sources.list"
  54. cp -v /etc/apt/sources.list{,.myc-update}
  55. }
  56. echo "Applying stretch-archive-fix"
  57. sed -i 's,http://deb.debian.org,http://archive.debian.org,g;
  58. s,http://security.debian.org,http://archive.debian.org,g;
  59. s,\(.*stretch-updates\),#\1,' \
  60. /etc/apt/sources.list
  61. fi
  62. if [[ " ${tried[*]} " != *" change-release-fix "* ]] &&
  63. [[ "$changed_release" == *"'http://deb.debian.org/debian "* ]]; then
  64. tried+=("change-release-fix")
  65. echo "Applying change-release-fix"
  66. apt-get update --allow-releaseinfo-change </dev/null || true
  67. fi
  68. if [[ "$old_tried_length" == "${#tried[@]}" ]]; then
  69. echo "Failing 'apt-get update'. Couldn't fix it automatically. Stopping."
  70. if [ -n "$backup" ]; then
  71. mv -v /etc/apt/sources.list{,.myc-update-fix}
  72. mv -v /etc/apt/sources.list{.myc-update,}
  73. fi
  74. printf "%s\n" "$out" | sed -r 's/^/ | /g'
  75. return 1
  76. fi
  77. done
  78. echo "Successful 'apt-get update'."
  79. }
  80. apt:update || exit 1
  81. apt-get -y install bash-completion wget bzip2 git-core \
  82. less tmux mosh \
  83. sudo git vim file gawk </dev/null
  84. if ! apt-get -y python-software-properties </dev/null; then
  85. if ! apt-get -y software-properties-common </dev/null; then
  86. echo "Couldn't install package, but you probably don't need it."
  87. fi
  88. fi
  89. type -p lsb_release >/dev/null 2>&1 ||
  90. apt-get install -y lsb-release </dev/null
  91. case $(lsb_release -is) in
  92. Ubuntu)
  93. apt-get install -y language-pack-en </dev/null
  94. ;;
  95. Debian)
  96. if ! type -p locale-gen >/dev/null && [ -x /usr/sbin/locale-gen ]; then
  97. echo "Your shell is incorrectly set as your PATH doesn't contain '/usr/sbin'." >&2
  98. echo "This probably happens because you've incorrectly entered root environment" >&2
  99. echo "Please use 'sudo -i' or 'su -' to enter a root shell from another user." >&2
  100. echo " ref: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=918754"
  101. exit 1
  102. fi
  103. sed -ri 's/^\s*#\s*(en_US\.UTF-?8.*)\s*$/\1/g' /etc/locale.gen
  104. locale-gen
  105. ## Debian11 doesn't have a 'python' executable but only a
  106. ## 'python3' executable some python script don't care about
  107. ## the version, they just want a 'python' executable.
  108. if ! type -p python >/dev/null 2>&1; then
  109. if py3=$(type -p python3); then
  110. echo "No 'python' available in \$PATH, but 'python3' found, using it." >&2
  111. ln -svf "$py3" /usr/local/bin/python
  112. fi
  113. fi
  114. ;;
  115. esac
  116. YQ_VERSION=4.35.2
  117. if ! type -p "yq" 2>/dev/null ||
  118. ! version_line=$(yq --version) ||
  119. [[ "${version_line}" != *"${YQ_VERSION}" ]]; then
  120. wget "https://github.com/mikefarah/yq/releases/download/v${YQ_VERSION}/yq_linux_amd64" \
  121. -O /usr/local/bin/yq &&
  122. chmod +x /usr/local/bin/yq
  123. fi