| #!/bin/bash |
| |
| # Copyright (c) 2009 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| source `dirname "$0"`/memento_updater_logging.sh |
| . /usr/share/misc/shflags || exit 1 |
| |
| DEFINE_string app_version "" \ |
| "Force a given app version rather than autodetect" |
| DEFINE_string omaha_url "" \ |
| "Use target autoupdate server for Omaha protocol." |
| DEFINE_string track "" \ |
| "Force a given track rather than autodetect" |
| DEFINE_string board "" \ |
| "The board type to download from the server." |
| |
| # Parse command line |
| FLAGS "$@" || exit 1 |
| eval set -- "${FLAGS_ARGV}" |
| |
| source `dirname "$0"`/find_omaha.sh |
| |
| # Example Omaha ping and response (converted to 80 char width w/ backslashes): |
| |
| # <?xml version="1.0" encoding="UTF-8"?> |
| # <o:gupdate xmlns:o="http://www.google.com/update2/request" \ |
| # version="Keystone-1.0.5.0" protocol="2.0" \ |
| # machineid="{177255303f3cc519182a103069489327}" ismachine="0" \ |
| # userid="{706F576A-ACF9-4611-B608-E5528EAC106A}"> |
| # <o:os version="MacOSX" platform="mac" sp="10.5.6_i486"></o:os> |
| # <o:app appid="com.google.GoogleAppEngineLauncher" version="1.2.2.380" \ |
| # lang="en-us" brand="GGLG" board="x86-generic"> |
| # <o:ping active="0"></o:ping> |
| # <o:updatecheck></o:updatecheck> |
| # </o:app> |
| # </o:gupdate> |
| |
| # Response (converted to 80 char width w/ backslashes): |
| |
| # <?xml version="1.0" encoding="UTF-8"?><gupdate \ |
| # xmlns="http://www.google.com/update2/response" protocol="2.0"><app \ |
| # appid="com.google.GoogleAppEngineLauncher" status="ok"><ping \ |
| # status="ok"/><updatecheck status="noupdate"/></app></gupdate> |
| |
| # If you change version= above to "0.0.0.0", you get (again, 80 chars w/ \s): |
| |
| # <?xml version="1.0" encoding="UTF-8"?><gupdate \ |
| # xmlns="http://www.google.com/update2/response" protocol="2.0"><app \ |
| # appid="com.google.GoogleAppEngineLauncher" status="ok"><ping \ |
| # status="ok"/><updatecheck DisplayVersion="1.2.2.0" \ |
| # MoreInfo="http://appenginesdk.appspot.com" Prompt="true" \ |
| # codebase="http://googleappengine.googlecode.com/files/GoogleAppEngine\ |
| # Launcher-1.2.2.dmg" hash="vv8ifTj79KivBMTsCDsgKPpsmOo=" needsadmin="false" \ |
| # size="4018650" status="ok"/></app></gupdate> |
| |
| |
| LOCAL_VERSION=$(findLSBValue "CHROMEOS_RELEASE_VERSION") |
| |
| # Parameters of the update request: |
| OS=Memento |
| PLATFORM=memento |
| APP_ID={87efface-864d-49a5-9bb3-4b050a7c227a} |
| APP_VERSION=${1:-$LOCAL_VERSION} |
| APP_BOARD="$2" |
| OS_VERSION=${APP_VERSION}_$(uname -m) |
| PING_APP_VERSION="${FLAGS_app_version:-${APP_VERSION}}" |
| LANG=en-us |
| BRAND=GGLG |
| |
| OMAHA_ID_FILE=/mnt/stateful_partition/etc/omaha_id |
| if [ ! -f "$OMAHA_ID_FILE" ] |
| then |
| # omaha file isn't a regular file |
| if [ -e "$OMAHA_ID_FILE" ] |
| then |
| # but the omaha file does exist. delete it |
| rm -rf "$OMAHA_ID_FILE" |
| fi |
| # Generate Omaha ID: |
| mkdir -p $(dirname $OMAHA_ID_FILE) |
| dd if=/dev/urandom bs=16 count=1 status=noxfer | xxd -c 32 -g 1 -u | \ |
| cut -d ' ' -f 2-17 | awk \ |
| '{print "{" $1 $2 $3 $4 "-" $5 $6 "-" $7 $8 "-" $9 $10 "-" \ |
| $11 $12 $13 $14 $15 $16 "}"; }' > "$OMAHA_ID_FILE" |
| chmod 0444 "$OMAHA_ID_FILE" |
| fi |
| |
| MACHINE_ID=$(cat "$OMAHA_ID_FILE") |
| if [ "x" = "x$MACHINE_ID" ] |
| then |
| log missing Omaha ID and unable to generate one |
| exit 1 |
| fi |
| |
| USER_ID=$MACHINE_ID |
| |
| AU_VERSION=MementoSoftwareUpdate-0.1.0.0 |
| |
| APP_TRACK=${FLAGS_track:-$(findLSBValue "CHROMEOS_RELEASE_TRACK")} |
| |
| APP_BOARD=${FLAGS_board:-$(findLSBValue "CHROMEOS_RELEASE_BOARD")} |
| |
| if [ -n "${FLAGS_omaha_url}" ]; then |
| AUSERVER_URL="${FLAGS_omaha_url}" |
| else |
| AUSERVER_URL=$(findLSBValue "CHROMEOS_AUSERVER") |
| fi |
| |
| if [ -z "$AUSERVER_URL" ] |
| then |
| # trying default omaha path |
| AUSERVER_URL="https://tools.google.com/service/update2" |
| log using default update server |
| fi |
| log URL $AUSERVER_URL |
| |
| # for testing. Uncomment and use these to reproduce the examples above |
| # OS=MacOSX |
| # PLATFORM=mac |
| # OS_VERSION=10.5.6_i486 |
| # APP_ID=com.google.GoogleAppEngineLauncher |
| # #APP_VERSION=0.0.0.0 |
| # APP_VERSION=1.2.2.380 |
| # #APP_BOARD=arm-generic |
| # APP_BOARD=x86-generic |
| # LANG=en-us |
| # BRAND=GGLG |
| # MACHINE_ID={177255303f3cc519182a103069489327} |
| # USER_ID={706F576A-ACF9-4611-B608-E5528EAC106A} |
| # AU_VERSION=Keystone-1.0.5.0 |
| |
| # post file must be a regular file for wget: |
| POST_FILE=/tmp/memento_au_post_file |
| cat > "/tmp/memento_au_post_file" << EOF |
| <?xml version="1.0" encoding="UTF-8"?> |
| <o:gupdate xmlns:o="http://www.google.com/update2/request" \ |
| version="$AU_VERSION" updaterversion="$AU_VERSION" \ |
| protocol="2.0" machineid="$MACHINE_ID" \ |
| ismachine="0" userid="$USER_ID"> |
| <o:os version="$OS" platform="$PLATFORM" sp="$OS_VERSION"></o:os> |
| <o:app appid="$APP_ID" version="$PING_APP_VERSION" lang="$LANG" \ |
| brand="$BRAND" track="$APP_TRACK" board="$APP_BOARD"> |
| <o:ping active="0"></o:ping> |
| <o:updatecheck></o:updatecheck> |
| </o:app> |
| </o:gupdate> |
| EOF |
| |
| log sending this request to omaha at $AUSERVER_URL |
| cat "$POST_FILE" >> "$MEMENTO_AU_LOG" |
| |
| RESPONSE=$(wget -q --header='Content-Type: text/xml' \ |
| --post-file="$POST_FILE" -O - $AUSERVER_URL) |
| WGET_RC=$? |
| rm -f "$POST_FILE" |
| |
| if [ "$WGET_RC" != "0" ]; then |
| log "Can't connect to miniomaha server" |
| exit 1 |
| fi |
| |
| log got response: |
| log "$RESPONSE" |
| |
| # parse response |
| CODEBASE=$(expr match "$RESPONSE" '.* codebase="\([^"]*\)"') |
| HASH=$(expr match "$RESPONSE" '.* hash="\([^"]*\)"') |
| SIZE=$(expr match "$RESPONSE" '.* size="\([^"]*\)"') |
| |
| if [ -z "$CODEBASE" ] |
| then |
| log No update |
| exit 0 |
| fi |
| |
| # We need to make sure that we download updates via HTTPS, but we can skip |
| # this check for developer builds. |
| DEVSERVER_URL=$(findLSBValue "CHROMEOS_DEVSERVER") |
| |
| # Check for the override if we are ok to download via HTTP. This is |
| # different from DEVSERVER_URL because our URL is going to be served |
| # from Omaha. |
| |
| HTTP_SERVER_OVERRIDE=$(findLSBValue "HTTP_SERVER_OVERRIDE") |
| HTTP_SERVER_OVERRIDE=`echo $HTTP_SERVER_OVERRIDE | tr '[:upper:]' '[:lower:]'` |
| |
| log Server override= $HTTP_SERVER_OVERRIDE |
| if [ -z "$DEVSERVER_URL" ] |
| then |
| if [ "$HTTP_SERVER_OVERRIDE" != "true" ] |
| then |
| log Server override is not true |
| HTTPS_CODEBASE=$(expr match "$CODEBASE" '\(https://.*\)') |
| if [ -z "$HTTPS_CODEBASE" ] |
| then |
| log No https url |
| exit 0 |
| fi |
| fi |
| fi |
| |
| echo URL=$CODEBASE |
| echo HASH=$HASH |
| echo SIZE=$SIZE |
| echo APP_VERSION=$APP_VERSION |
| echo NEW_VERSION=TODO |
| |