#!/usr/dt/bin/dtksh
#
# Solaris patch checker script
#
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is
# Roland Mainz <roland.mainz@nrubsig.org>
# Portions created by the Initial Developer are Copyright (C) 2004
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****

export PATH=/usr/xpg4/bin:/usr/sbin:/usr/bin

# Enumerate installed patches
enumerate_patch_list()
{
    showrev -p | sort -n |grep "^Patch: "
    #cat patchlist.txt | grep "^Patch: "
}

# Exit with a warning for unsupported platforms

unsupported_exit()
{
    echo "# WARNING: Patch checker not supported for $(uname -sr) on $(uname -p)."
    exit 0
}

# Setup list of required patches
typeset -A required_patches
case "$(uname -p)" in
  "sparc")
      case "$(uname -r)" in
        # Solaris 2.7/SPARC
        "5.7")
            required_patches=(
              [0]="106300-22" [0_title]="64-Bit Shared library patch for C++"
              [1]="106327-21" [1_title]="32-Bit Shared library patch for C++"
              [2]="106950-24" [2_title]="SunOS 5.7: linker patch"
              [3]="107650-08" [3_title]="OpenWindows 3.6.1 X11R6.4 Xprint Extension Patch"
              [4]="107636-10" [4_title]="SunOS 5.7: X Input & Output Method patch"
              [5]="108376-44" [5_title]="OpenWindows 3.6.1: Xsun Patch"
              [6]="112689-02" [6_title]="SunOS 5.7: UTF-8 locale ICONV patch"
            )
            num_required_patches=7
            ;;

        # Solaris 2.8/SPARC
        "5.8")
            required_patches=(
              [0]="108434-17" [0_title]="32-Bit Shared library patch for C++"
              [1]="108435-17" [1_title]="64-Bit Shared library patch for C++"
              [2]="108652-79" [2_title]="X11 6.5.1: Xsun patch"
              [3]="108773-18" [3_title]="SunOS 5.8: IIIM and X Input & Output Method patch"
              [4]="109147-27" [4_title]="SunOS 5.8: linker patch"
              [5]="109159-03" [5_title]="SunOS 5.8: Chinese iconv module updates"
              [6]="109704-03" [6_title]="SunOS 5.8: Japanese iconv patch"
              [7]="111721-04" [7_title]="SunOS 5.8: Math Library (libm) patch"
              [8]="113261-02" [8_title]="SunOS 5.8: UTF-8 locale ICONV patch"
              [9]="114542-01" [9_title]="SunOS 5.8: Adds extended Arabic support"
              [10]="111721-04" [10_title]="SunOS 5.8: Math Library (libm) patch"
            )
            num_required_patches=11
            ;;

        # Solaris 2.9/SPARC
        "5.9")
            required_patches=(
              [0]="111711-11" [0_title]="32-Bit Shared library patch for C++"
              [1]="111712-11" [1_title]="64-Bit Shared library patch for C++"
              [2]="111722-04" [2_title]="SunOS 5.9: Math Library (libm) patch"
              [3]="112661-06" [3_title]="SunOS 5.9: IIIM and X Input & Output Method patch"
              [4]="112785-34" [4_title]="X11 6.6.1: Xsun patch"
              [5]="112963-10" [5_title]="SunOS 5.9: linker patch"
              [6]="113902-03" [6_title]="SunOS 5.9: Asian UTF-8 iconv modules enhancement"
              [7]="114276-02" [7_title]="SunOS 5.9: Extended Arabic support in UTF-8"
              [8]="114641-02" [8_title]="SunOS 5.9: Japanese iconv for UTF-8 patch"
              [9]="111722-04" [9_title]="SunOS 5.9: Math Library (libm) patch"
            )
            num_required_patches=10
            ;;

	# Solaris 10/SPARC - no patches yet
	"5.10")
            exit 0
            ;;

        *)
            unsupported_exit
            ;;
      esac
      ;;
  "i386")
      case "$(uname -r)" in
        # Solaris 2.7/x86
        "5.7")
            required_patches=(
              [0]="106328-19" [0_title]="SunOS 5.7_x86: Shared library patch for C++"
              [1]="106951-25" [1_title]="SunOS 5.7_x86: Linker Patch"
              [2]="107651-08" [2_title]="OpenWindows 3.6.1_x86: X11R6.4 Xprint Extension Patch"
              [3]="107637-10" [3_title]="SunOS 5.7_x86: X Input & Output Method patch"
              [4]="108377-39" [4_title]="OpenWindows 3.6.1_x86: Xsun Patch"
              [5]="112690-01" [5_title]="SunOS 5.7_x86: UTF-8 locale ICONV patch"
            )
            num_required_patches=6
            ;;

        # Solaris 2.8/x86
        "5.8")
            required_patches=(
              [0]="108436-13" [0_title]="SunOS 5.8_x86 Shared library patch for C++"
              [1]="108653-68" [1_title]="X11 6.4.1_x86: Xsun patch"
              [2]="108774-18" [2_title]="SunOS 5.8_x86: IIIM and X Input & Output Method patch"
              [3]="109148-28" [3_title]="SunOS 5.8_x86: linker patch"
              [4]="109160-03" [4_title]="SunOS 5.8_x86: Chinese iconv module updates"
              [5]="109705-03" [5_title]="SunOS 5.8_x86: Japanese iconv patch"
              [6]="112757-01" [6_title]="SunOS 5.8_x86: Math Library (libm) patch"
              [7]="113262-02" [7_title]="SunOS 5.8_x86: UTF-8 locale ICONV patch"
              [8]="114543-01" [8_title]="SunOS 5.8_x86: Adds extended Arabic support"
              [9]="112757-01" [9_title]="SunOS 5.8_x86: Math Library (libm) patch"
            )
            num_required_patches=10
            ;;

        # Solaris 2.9/x86
        "5.9")
            required_patches=(
              [0]="111713-06" [0_title]="SunOS 5.9_x86: Shared library patch for C++"
              [1]="111728-03" [1_title]="SunOS 5.9_x86: Math Library (libm) patch"
              [2]="112662-04" [2_title]="SunOS 5.9_x86: IIIM and X Input & Output Method patch"
              [3]="112786-22" [3_title]="X11 6.6.1_x86: Xsun patch"
              [4]="113986-06" [4_title]="SunOS 5.9_x86: linker Patch"
              [5]="113903-03" [5_title]="SunOS 5.9_x86: Asian UTF-8 iconv modules enhancement"
              [6]="114277-02" [6_title]="SunOS 5.9_x86: Extended Arabic support in UTF-8 "
              [7]="114642-02" [7_title]="SunOS 5.9_x86: Japanese iconv for UTF-8 patch"
              [8]="111728-03" [8_title]="SunOS 5.9_x86: Math Library (libm) patch"
            )
            num_required_patches=9
            ;;

	# Solaris 10/x86 - no patches yet
	"5.10")
            exit 0
            ;;

        *)
            unsupported_exit
            ;;
      esac
      ;;
  *)
      unsupported_exit
      ;;
esac


typeset -A patchmap

# Fill patchmap
enumerate_patch_list | while read i1 i2 i3 ; do
  patch_id="${i2%-*}"
  patch_rev="${i2#*-}"
  patchmap[${patch_id}]="${patch_rev}"
done

# Check patch requirements against the list of installed patches and
# print out missing patches ...
missing_patches_msg="$(
count=0
while [ ${count} -lt ${num_required_patches} ] ; do
  req_patch_id="${required_patches[${count}]%-*}"
  req_patch_rev="${required_patches[${count}]#*-}"

  if [ "${patchmap[${req_patch_id}]}" = "" ] ; then
    echo "- patch ${req_patch_id} (\"${required_patches[${count}_title]}\"). Install ${required_patches[${count}]} (or higher)."
  fi
  
  count=$((${count} + 1))
done
)"

# ... and then the patches which need updates:
low_rev_patches_msg="$(
count=0
while [ ${count} -lt ${num_required_patches} ] ; do
  req_patch_id="${required_patches[${count}]%-*}"
  req_patch_rev="${required_patches[${count}]#*-}"

  if [ "${patchmap[${req_patch_id}]}" != "" ] ; then
    if [ ${req_patch_rev} -gt ${patchmap[${req_patch_id}]} ] ; then
      echo "- patch ${required_patches[${count}]} (or higher), currently installed patch ${req_patch_id}-${patchmap[${req_patch_id}]} (\"${required_patches[${count}_title]}\")."
    fi
  fi
  
  count=$((${count} + 1))
done
)"

# Build message text
display_warning=false
# Intro...
msg=" \
One or more of the following Solaris patches are missing in your OS which are requirements to run Mozilla.\n \
Please contact your system adminstrator to install these patches. \n \
"
# ... missing patches ...
if [ "${missing_patches_msg}" != "" ] ; then
    msg="$(printf "%s\n%s\n%s\n " "${msg}" "* The following patches are not installed:" "${missing_patches_msg}")"
    display_warning=true
fi
# ... and the too old ones ...
if [ "${low_rev_patches_msg}" != "" ] ; then
    msg="$(printf "%s\n%s\n%s\n " "${msg}" "* The following patches need to be updated to higher revisions:" "${low_rev_patches_msg}")"
    display_warning=true
fi

# Do we really need to display the dialog ?
if [ "${display_warning}" = "false" ] ; then
    exit 0
fi

# Display warning dialog
dismissCB()
{
   exit 0
}

exitCB()
{
   exit 1
}

XtInitialize TOPLEVEL moz_patch_error MozPatchError "$@"

XmCreateMessageBox MISSING_PATCHES_DIALOG ${TOPLEVEL} missing_patches_dialog \
  messageString:"${msg}" \
  dialogTitle:"Mozilla patch checker" \
  okLabelString:"Ignore problem and start Mozilla" \
  cancelLabelString:"Exit" \
  dialogType:DIALOG_ERROR
XmMessageBoxGetChild CANCEL_BUTTON ${MISSING_PATCHES_DIALOG} DIALOG_CANCEL_BUTTON
XmMessageBoxGetChild HELP_BUTTON   ${MISSING_PATCHES_DIALOG} DIALOG_HELP_BUTTON

# Remove the unwanted help button
XtUnmanageChild ${HELP_BUTTON}

XtAddCallback ${MISSING_PATCHES_DIALOG} okCallback dismissCB 
XtAddCallback ${MISSING_PATCHES_DIALOG} cancelCallback exitCB 

XtDisplay DISP ${TOPLEVEL}
XmInternAtom CLOSE_ATOM ${DISP} WM_DELETE_WINDOW false
XmAddWMProtocolCallback ${TOPLEVEL} ${CLOSE_ATOM} exitCB
 
XtSetValues ${TOPLEVEL} deleteResponse:DO_NOTHING

XtManageChild ${MISSING_PATCHES_DIALOG}

XtRealizeWidget ${TOPLEVEL}

XtMainLoop

echo "# should not be hit."
exit 255
# EOF.
