Added "don't run as root" and sudo check, Java install on Fedora and Ubuntu.
[webos-internals:bootstrap.git] / novaterm-bootstrap.sh
1 #!/bin/bash
2
3 # novaterm-bootstrap.sh
4 # version 0.0.6
5 #
6 # Script to install novaterm and it's prerequisites.  This script is intended for stand-alone use
7 # and to be packaged on a LiveCD for easy terminal access to a Pre.
8 #
9 # by Drew DeNardo (nt4cats)
10 # drew at denardo dot com
11 #
12 # Special thanks to sbromwich and rwhitby for the idea/inspiration to put this script together
13
14 # This script re-uses significant parts of Daniel Beames' (dBsooner's) preware-bootstrap.sh script.
15 # Most notably, the overall structure and many of the the helper/utility functions are his.
16 #
17 # Features:
18 # 1. Make sure the script is running on a Ubuntu (Hardy, Intrepid, Jaunty, and Karmic) or Fedora box
19 # 2. Install Java (if required)
20 # 3. Install ia32-libs (if required)
21 # 4. Download novacom (if required)
22 # 5. Download SDK (if required)
23 # 6. Install the SDK (if required)
24 # 7. Install novacom (if required)
25
26 # Additional Thoughts:
27 # 1. Detect and report if a Pre is connected via USB but is either:
28 #      a) in disk mode
29 #      b) not in developer mode
30 #
31 # 2. Should this script also install/configure mobi.optware.openssh for them?
32 #
33 # 3. Where to put the downloads?  My thoughts are:
34 #       1) $BOOTSTRAP_DL_DIR (if it exists)
35 #       2) ~/Downloads/ (if it exists)
36 #       3) ~/.novacom-bootstrap/
37 #
38 #    Regardless of where the files go, it should clearly tell the user where they're ending up.
39 #
40 # 4. This script will need root priv's at some point.  I'm thinking about requiring the script to
41 #    run as root, but it will run as much as it can without root priv's.  Still thinking about this one ...
42 #
43 # Changelog:
44 #
45 # 0.0.1 Initial skeleton, no usable functionality
46 # 0.0.2 Added Linux version detection
47 # 0.0.3 Cleaned up and fleshed out skeleton.  Added hard-coded file downloads.
48 # 0.0.4 Added support to re-use downloaded files if they exist.
49 # 0.0.5 Initial Java environment tests
50 # 0.0.6 Added "don't run as root" and sudo check, Java install on Fedora and Ubuntu
51
52 ### VARIABLES
53
54 SCRIPTNAME="$(basename $0)"                
55 LOG=/tmp/${SCRIPTNAME}.log
56 ARCH=$(uname -m)
57 if [ "$ARCH" == "armv7l" ] ; then
58   echo "Do not run this on your Pre.  This script is for Ubuntu or Fedora Linux.  Aborting."
59   exit 99
60 elif [ "$ARCH" == "armv6l" ] ; then
61   echo "Do not run this on your Pixi.  This script is for Ubuntu or Fedora Linux.  Aborting."
62   exit 98
63 else    
64     # TODO: Detect emulator
65
66     # Make sure this is a Ubuntu or Fedora box
67     RELNAME="Unknown"
68
69     if [ -f /etc/lsb-release ] ; then
70         # Check /etc/lsb-release for Ubuntu
71         RELTEST=`egrep -io "Hardy|Intrepid|Jaunty|Karmic" /etc/lsb-release`
72         if [ "$RELTEST" == "" ]; then
73             RELNAME="Debian"
74         else
75             RELNAME="$RELTEST"
76         fi
77     elif [ -f /etc/redhat-release ] ; then
78         # Check /etc/redhat-release for Fedora
79         RELTEST=`grep -o Fedora /etc/redhat-release`
80         if [ "$RELTEST" == "" ]; then
81             RELNAME="RedHat"
82         else
83             RELNAME="Fedora"
84         fi
85     fi
86 fi
87
88 # TODO: These URLs need to be scraped from the Palm website instead of hard-coded here
89 NOVA_32="palm-novacom_1.0.55_i386.deb"
90 NOVA_64="palm-novacom_1.0.55_amd64.deb"
91 PALM_SDK="palm-sdk_1.4.1-svn274946-sdk1436-pho427_i386.deb"
92
93 NOVA_32_URL="http://cdn.downloads.palm.com/sdkdownloads/1.4.1.427/sdkBinaries/$NOVA_32"
94 NOVA_64_URL="http://cdn.downloads.palm.com/sdkdownloads/1.4.1.427/sdkBinaries/$NOVA_64"
95 PALM_SDK_URL="http://cdn.downloads.palm.com/sdkdownloads/1.4.1.427/sdkBinaries/$PALM_SDK"
96
97 # TODO: If we're scraping URLs, these MD5s will have to be optional
98 NOVA_32_MD5="69be6d7c6806f32b47a1e7794ea26ad8"
99 NOVA_64_MD5="04d6b299b1c7236eb947f5e41299c775"
100 PALM_SDK_MD5="b4f195433b04aa0778f19cef2c405447"
101
102 ### END of VARIABLES
103
104 ### FUNCTIONS
105
106 # Name:        say
107 # Arguments:   Message
108 # Description: echoes message to the console and then logs message
109 say() {
110   echo "$@"
111   log "$@"
112 }
113
114 # Name:        log
115 # Arguments:   Message
116 # Description: logs Message to $LOG
117 log() {
118   echo "$@" >> $LOG
119   if [ "$?" -ne 0 ]; then
120      echo "Cannot write to ${LOG} -- script aborting."
121      exit 50
122   fi
123 }
124
125
126 # Name:        yesno
127 # Arguments:   Question
128 # Description: Asks a yes/no Question, returns 1 for yes, 0 for no
129 yesno() {
130   IN=""
131   until [ -n "$IN" ] ; do
132     read -p "${@} " IN
133     case "$IN" in
134       y|Y|yes|YES)  return 1;;
135       n|N|no|NO)    return 0;;
136       *)            IN="";;
137     esac
138   done
139 }
140
141
142 # Name:        error
143 # Arguments:   Message
144 # Description: Displays FAILED followed by Message
145   error() {
146   echo "FAILED"
147   log "ERROR: ${@}"
148   echo "$@"
149   echo
150   echo "Please paste the contents of ${LOG} to http://webos.pastebin.com/"
151   echo "and seek help in the IRC channel #webos-internals."
152   echo
153   echo "To view ${LOG}, type:"
154   echo
155   echo "cat ${LOG}"
156   echo
157   echo
158   return 1
159 }
160
161 ### END FUNCTIONS
162
163 say "Starting installation..."
164
165 USER=`id -u`
166
167 if [ "$USER" == "0" ]; then
168     say "Please do not run this script as root.  Run as a user with sudo privileges."
169     exit 97
170 fi
171
172 say "Checking for sudo privileges.  If you are prompted for your password, that prompt is coming from the 'sudo' command, not this script."
173
174 sudo -v
175
176 if [ "$?" -ne 0 ]; then
177    say "Sudo check failed.   Script aborting."
178    exit 96
179 fi
180
181 case $RELNAME in
182
183    "Unknown"|"RedHat"|"Debian")
184        say "Your OS is not supported.  Please run on Ubuntu (Hardy, Intrepid, Jaunty, or Karmic) or Fedora Linux."
185        ;;
186    "Fedora")
187        say "You are running Fedora Linux."
188        ;;
189    "hardy"|"intrepid"|"jaunty"|"karmic")
190        say "You are running Ubuntu Linux."
191        ;;
192 esac
193
194 echo "This is early pre-release software.  Do not run this unless you are fully prepared to deal with the consequences."
195 yesno "Is this okay with you?"
196 if [ "$?" -eq 0 ] ; then
197     say "I think saying 'no' was probably the correct thing to do."
198     exit 0
199 fi
200
201 # This early release does not yet check to see what steps are completed.  This is coming soon.
202
203 # TODO: basic connectivity/DNS checks here
204
205 NET_TEST=`dig +short www.webos-internals.org`
206
207 if [ "$?" -ne 0 ]; then
208    say "Could not verify Internet connectivity.  Please make sure you are connected to the Internet and that DNS is working."
209    exit 81
210 fi
211
212 if [ "$NET_TEST" = "" ]; then
213    say "Could not resolve www.webos-internals.org.  Please make sure you are connected to the Internet and that DNS is working."
214    exit 80
215 fi
216
217 # TODO: create / find appropriate temporary/working directory
218 # Until then, just use "~/Downloads"
219 DOWNLOAD_DIR="$HOME/Downloads"
220 mkdir -p $DOWNLOAD_DIR
221
222 # Check for Java
223 JAVA_IN_PATH=`which java`
224 JAVA_VER=""
225
226 if [ "$JAVA_IN_PATH" != "" ]; then
227     JAVA_VER=`java -version 2>&1 | head -1 | grep -o "1.6."`
228 fi
229
230 # Install Java (if required)
231
232 if [ "$JAVA_VER" != "1.6." ]; then
233     say "You don't have JDK 1.6 installed.  This script will install it now.  Installing ..."
234     if [ $RELNAME == "Fedora" ]; then
235        sudo yum -y install java-1.6.0-openjdk
236        if [ "$?" -ne 0 ]; then
237            say "Could not install OpenJDK v1.6.  Script aborting."
238            exit 79
239        fi
240     else
241        sudo apt-get update
242        if [ "$?" -ne 0 ]; then
243            say "Could not update package list.  Script aborting."
244            exit 78
245        fi
246
247        say "Note: You may be prompted to accept a Java license agreement."
248        sleep 2 # Give the user a moment to notice the note (not a urgent message, but may eliminate some surprises)
249
250        sudo apt-get install sun-java6-jre
251        if [ "$?" -ne 0 ]; then
252            say "Could not install Java 6 JRE.  Script aborting."
253            exit 77
254        fi
255
256        sudo update-alternatives --set java /usr/lib/jvm/java-6-sun/jre/bin/java
257        if [ "$?" -ne 0 ]; then
258            say "Could not update 'alternatives' link.  Script aborting."
259            exit 76
260        fi
261     fi 
262
263     # At this point Java should be installed.  Check ...
264     # TODO: The 'check' below is a copy-and-paste from above.  Make this a function.
265     JAVA_IN_PATH=`which java`
266     JAVA_VER=""
267
268     if [ "$JAVA_IN_PATH" != "" ]; then
269         JAVA_VER=`java -version 2>&1 | head -1 | grep -o "1.6."`
270     fi
271
272     if [ "$JAVA_VER" != "1.6." ]; then
273         say "Install of Java failed for an unknown reason.  Script aborting."
274         exit 75
275     else
276         say "Java 1.6 installation successful."
277     fi
278 else
279     say "Suitable Java 1.6 environment found."
280 fi
281
282 # TODO: Check for ia32-libs
283
284 # TODO: Install ia32-libs (if reqiured)
285
286 if [ "$ARCH" == "x86_64" ]; then
287    NOVA_FILE=$NOVA_64
288    NOVA_URL=$NOVA_64_URL
289    NOVA_MD5=$NOVA_64_MD5
290 else
291    NOVA_FILE=$NOVA_32
292    NOVA_URL=$NOVA_32_URL
293    NOVA_MD5=$NOVA_32_MD5
294 fi
295
296 if [ -f $DOWNLOAD_DIR/$NOVA_FILE ]; then
297    MD5_TEST=`md5sum $DOWNLOAD_DIR/$NOVA_FILE | awk '{print $1}'`
298    if [ "$NOVA_MD5" == "$MD5_TEST" ]; then
299        say "Novacom is already downloaded."
300        NOVA_URL=""
301    else
302        say "Partial download detected.  Removing ...."
303        rm -f $DOWNLOAD_DIR/$NOVA_FILE
304    fi
305 fi
306
307 if [ "$NOVA_URL" != "" ]; then
308     pushd $DOWNLOAD_DIR > /dev/null
309     say "Downloading $NOVA_FILE to $DOWNLOAD_DIR"
310     wget $NOVA_URL
311     popd > /dev/null
312 fi
313
314 # TODO: write a "download if needed" function so this code isn't copied twice
315
316 if [ -f $DOWNLOAD_DIR/$PALM_SDK ]; then
317    MD5_TEST=`md5sum $DOWNLOAD_DIR/$PALM_SDK | awk '{print $1}'`
318    if [ "$PALM_SDK_MD5" == "$MD5_TEST" ]; then
319        say "Palm SDK is already downloaded."
320        PALM_SDK_URL=""
321    else
322        say "Partial download detected.  Removing ...."
323        rm -f $DOWNLOAD_DIR/$PALM_SDK
324    fi
325 fi
326
327 if [ "$PALM_SDK_URL" != "" ]; then
328     pushd $DOWNLOAD_DIR > /dev/null
329     say "Downloading $PALM_SDK_FILE to $DOWNLOAD_DIR"
330     wget $PALM_SDK_URL
331     popd > /dev/null
332 fi
333
334 say "Setup Complete!"
335 echo