Como você pode automatizar o download e a instalação de aplicativos do OS X?

4

iusethis.com redireciona URLs como http://osx.iusethis.com/app/download/appname para download de links, e você pode curl MacUpdate páginas para links de download direto. Existem fontes mais completas ou confiáveis para links de download?

Como você pode automatizar a extração de diferentes tipos de arquivos ou a instalação de instaladores? O DropZone vem com um script que aceita arquivos dmg ou zip como entrada e move pacotes de aplicativos dentro deles para /Applications/ . Alguém sabe um script semelhante que funcionaria com instaladores ou mais tipos de arquivo?

    
por user495470 18.03.2011 / 12:14

3 respostas

2

Eu acabei hackeando este shell script, mas parei de mantê-lo, já que muitos dos links de download do iusethis.org não são mais válidos e mais aplicativos são agora distribuídos através da App Store. Eu estou deixando aqui para o registro de qualquer maneira.

#!/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
    
por 03.12.2011 / 18:11
1

Dê uma olhada no AppFresh. Se você inserir os aplicativos em seu perfil iUseThis, poderá baixá-los usando o processo de download semiautomático dessa ferramenta. Basta selecionar "usado, mas não instalado" (ou similar) na barra lateral.

Se você parece interessado em automatizar o processamento de dmg arquivos, tente algo assim:

#!/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}

Use assim:

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

É claro que só funciona para instalar novos aplicativos e não faz nenhum tratamento de erros, portanto, use por sua conta e risco. Mas abrir arquivos dmg não é o desafio real - ter um banco de dados abrangente de locais de download é.

    
por 18.03.2011 / 13:34
1

Aqui estão algumas outras opções para automatizar a instalação de .dmg packages:

  1. broto-embrulhe
  2. solista + Chef
  3. Homebrew + Barris

Solista + embrulhar chefs Cookbooks

As duas primeiras opções permitem que você utilize receitas do Chef para automatizar a instalação do software em um Mac (ou outro sistema operacional) . O projeto sprout-wrap da Pivotal Labs é uma coleção de livros de receitas e receitas que fornecem receitas de instalação de software para o Mac OS X . Solista é um Ruby gem que torna extremamente fácil executar chef-solo fornecendo um único arquivo para conter a run_list de livros de culinária / receitas para executar e attributes (como variáveis) que as receitas usam.

O livro de receitas do homebrew tem um fornecedor homebrew_cask que o livro de receitas sprout-osx-apps e sprout-osx-base :: receita homebrew use para instalar barris de homebrew via brew cask install . Para usar a receita sprout-osx-base::homebrew , basta adicionar os nomes dos barris a serem instalados nos atributos do nó em node[:sprout][:homebrew][:casks] no seu soloistrc como neste exemplo .

Para manter as coisas simples, basta verificar o README para sprout-wrap e seguir as etapas de instalação. Se você quiser personalizar o arquivo soloistrc para escolher o que instalar, verifique o exemplo do Pivotal aqui ou olhe para o meu mais avançado & versão personalizada aqui .

Se você quer uma maneira ainda mais fácil de começar, confira SoloWizard . O que gerará um script de autoinicialização para você começar a usar.

Cascos de Homebrew

Se você não estiver procurando por algo tão personalizável ou se pensar que o Chef / solista é muito complicado ... Basta começar com Barris Homebrew e verificar se houver uma fórmula de barril já existente para o seu pacote com brew cask search .

    
por 31.12.2014 / 04:52

Tags