4

iusethis.com перенаправляет URL-адреса, такие как http://osx.iusethis.com/app/download/appname для загрузки ссылок, и вы можете curl страницы MacUpdate для прямых ссылок на скачивание. Существуют ли более полные или надежные источники ссылок для скачивания?

Как вы можете автоматизировать извлечение различных типов архивов или запуск инсталляторов? DropZone поставляется со скриптом, который принимает файлы dmg или zip в качестве входных данных и перемещает пакеты приложений внутри них в /Applications/ . Кто-нибудь знает подобный скрипт, который будет работать с установщиками или несколькими типами файлов?

3 ответа3

2

В итоге я взломал этот сценарий оболочки, но перестал его поддерживать, поскольку многие ссылки для скачивания на iusethis.org больше не действительны, и теперь через App Store распространяется больше приложений. В любом случае я оставляю это здесь для записи.

#!/bin/bash

export uuid1=$(uuidgen) uuid2=$(uuidgen)
export tmp1=/tmp/autoapp$uuid1 tmp2=/tmp/autoapp$uuid2
mkdir -p $tmp1 $tmp2

shopt -s nullglob
IFS=$'\n'

trap 'onexit &' EXIT
onexit() {
  for mp in $tmp1/mountpoint-*; do
    hdiutil detach -quiet -force $mp
  done
  rm -rf /tmp/autoapp$uuid1 /tmp/autoapp$uuid2
}

app() {
  basename="$(basename "$1")"
  ditto "$1" "/Applications/$basename" 2> /dev/null
  echo "Copied $basename to /Applications/"
}

prefpane() {
  basename="$(basename "$1")"
  ditto "$1" ~/"Library/PreferencePanes/$basename" 2> /dev/null
  echo "Copied $basename to PreferencePanes/"
}

wdgt() {
  basename="$(basename "$1")"
  ditto "$1" ~/"Library/Widgets/$basename" 2> /dev/null
  echo "Copied $basename to Widgets/" 
}

pkg() {
  basename="$(basename "$1")"
  sudo installer -pkg "$1" -target /
  if [[ $? != 0 ]]; then
    read -n 1 -p "Open $basename (y/n)? " answer
    echo
    [[ "$aswer" == y ]] && open "$f" && exit 1
  fi
}

dmg() {
  mp=$tmp1/mountpoint-$(uuidgen)
  basename="$(basename "$1")"
  echo "Mounting $basename"
  yes | hdiutil attach -noverify -nobrowse -mountpoint $mp "$1" > /dev/null
  getfound "$mp" && exit
  echo "Couldn't find an application or package inside $basename"
  exit 1
}

gettmp() {
  getfound $tmp2 && exit

  found="$(find $tmp2 -depth 1 -name "*.dmg" -print0 2> /dev/null |
  xargs -0 du -s | sort -n | tail -n 1 | cut -f 2)"
  [[ -n "$found" ]] && dmg "$found" && exit

  echo "Couldn't find an application or package"
}

getfound() {
  found="$(find "$1" -maxdepth 2 -name "*.app" -print0\
  -o -name "*.prefPane" -print0 -o -name "*.pkg" -print0\
  -o -name "*.mpkg" -print0 2> /dev/null |
  xargs -0 du -s | sort -n | tail -n 1 | cut -f 2)"
  if [[ "$found" == *.app ]]; then
    app "$found"
    exit
  elif [[ "$found" == *.prefPane ]]; then
    prefpane "$found"
    exit
  elif [[ "$found" == *.wdgt ]]; then
    wdgt "$found"
    exit
  elif [[ "$found" == *.safariextz ]]; then
    open "$found" && exit
  elif [[ "$found" == *.pkg || "$found" == *.mpkg ]]; then
    pkg "$found"
    exit
  fi
  exit 1
}

untradedouble() {
  echo -n "$1" | ruby -e 'require "CGI"
  x = $<.read
  if x =~ /^http:\/\/.*?tradedoubler.com.*?&url=(.+)/
    print CGI.unescape($1)
  else
    print x
  end'
}

[[ $# == 0 ]] && exit
[[ "$1" == "-h" || "$1" == "--help" || "$1" == "-help" ]] && exit

if [[ -e "$@" ]]; then
  [[ -e "$@" ]] && appfile="$@" || exit
elif [[ "$@" =~ "/" || "$@" =~ "." ]]; then
    echo "The file $@ does not exist"
    exit 1
else
  download=true
fi

if [[ $download ]]; then
  app="$@"
  app2="$(echo "$app" | tr '[:upper:]' '[:lower:]' | sed 's|[^a-z0-9\-]||g')"
  iut=http://osx.iusethis.com/app/download/
  head="$(curl --head --max-time 5 -s -w "%{url_effective}\n" -L "$iut$app2")"
  ok="$(echo "$head" | grep "HTTP/1.[01] [23]..")"
  redirect="$(echo "$head" | tail -n 1 | tr -d '\n')"
  bytes=$(echo "$head" | sed -n 's|Content-Length: ||p' |
  tail -n 1 | tr -d '\r')
  if [[ -z "$redirect" || -z "$ok" ]]; then
    read -n 1 -p "Couldn't find $app. Search with Google (y/n)? " answer
    echo
    google="http://www.google.com/search?q=mac+application+"
    [[ $answer =~ [y|Y] ]] && open "$google$app2"
    exit
  fi
  ext="${redirect##*.}"
  exts=" zip gz rar mpkg dmg safariextz prefPane "
  if [[ "$exts" != *" $ext "* || "$bytes" -le 5000 ]]; then
    redirect="$(untradedouble "$redirect")"
    echo "Redirected to $redirect"
    read -n 1 -p "Open in a browser (y/n)? " answer
    echo
    [[ $answer == "y" || $answer == "Y" ]] && open "$redirect"
    exit
  fi
  appfile="$tmp1/${redirect##*/}"
  echo "Downloading $redirect"
  curl "$redirect" -o "$appfile"
fi

appfile="$(echo -n "$appfile" | sed 's|/$||')"

if [[ "$appfile" == *.app ]]; then
  app "$appfile"
elif [[ "$appfile" == *.prefPane ]]; then
  prefpane "$appfile"
elif [[ "$appfile" == *.wdgt ]]; then
  wdgt "$appfile"
elif [[ "$appfile" == *.safariextz ]]; then
  open "$appfile"
elif [[ "$appfile" == *.zip ]]; then
  unzip -q "$appfile" -d $tmp2
  gettmp
elif [[ "$appfile" == *.tar.gz ]]; then
  tar -xf $appfile -C $tmp2
  gettmp
elif [[ "$appfile" == *.dmg ]]; then
  dmg "$appfile"
elif [[ "$appfile" == *.pkg || "$appfile" == *.mpkg ]]; then
  pkg "$appfile"
else
  echo "Couldn't process $(basename "$appfile")"
  exit
fi
1

Посмотрите на AppFresh. Если вы введете приложения в свой профиль iUseThis, вы сможете загрузить их, используя полуавтоматический процесс загрузки этого инструмента. Просто выберите «используется, но не установлен» (или аналогичный) на боковой панели.


Как вы, кажется, заинтересованы в автоматизации обработки файлов dmg , попробуйте что-то вроде этого:

#!/usr/bin/env bash
tempimgfile=$( mktemp img.img) || exit 1
mountpoint=$( mktemp -d img.mnt) || exit 1
curl "$1" > ${tempimgfile} || exit 1
hdiutil attach -mountpoint ${mountpoint} ${tempimgfile} || exit 1
cp -r ${mountpoint}/*.app "/Applications"
hdiutil unmount ${mountpoint}
rm -rf ${mountpoint}
rm -f ${tempimgfile}

Используйте как это:

$ ./unpack.sh http://www.panic.com/stattoo/d/Stattoo%201.5.dmg

Конечно, он работает только для установки новых приложений и не обрабатывает ошибки, поэтому используйте его на свой страх и риск. Но открытие dmg файлов не является реальной проблемой - иметь обширную базу данных о местах загрузки.

1

Вот пара других опций для автоматизации установки пакетов .dmg :

  1. проросшие обертывание
  2. солист + повар
  3. Доморощенный + Бочки

Солист + повязка от повара

Первые две опции позволяют вам использовать рецепты Chef для автоматизации установки программного обеспечения на Mac (или другую ОС). Проект sprout-wrap от Pivotal Labs - это коллекция кулинарных книг и рецептов, которые предоставляют рецепты установки программного обеспечения для Mac OS X. Soloist - это драгоценный камень Ruby, который чрезвычайно облегчает запуск chef-solo , предоставляя один файл, содержащий список run_list поваренных книг / рецептов и attributes (например, переменных), которые используются в рецептах.

У поваренной книги homebrew есть провайдер homebrew_cask , который используют поваренная книга sprout-osx-apps и sprout-osx-base::homebrew для установки доморощенных бочек через brew cask install . Чтобы использовать рецепт sprout-osx-base::homebrew , просто добавьте имена бочек для установки в атрибуты вашего узла под node[:sprout][:homebrew][:casks] casks ] в вашем soloistrc, как в этом примере .

Для простоты просто проверьте README на предмет прорастания и следуйте инструкциям по установке. Если вы хотите настроить свой файл soloistrc чтобы выбрать, что устанавливать, вы можете посмотреть пример Pivotal здесь или посмотреть мою более продвинутую и настроенную версию здесь.

Если вы хотите еще более простой способ начать, ознакомьтесь с SoloWizard. Который сгенерирует автоустановочный скрипт начальной загрузки для вас, чтобы начать с.

Доморощенные бочки

Если вы не ищете ничего настраиваемого или думаете, что повар / солист слишком сложны ... Просто начните с доморощенных бочек и проверьте, существует ли уже существующая формула бочки для вашего пакета, с помощью brew cask search .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .