diff --git a/fix/fix.txt b/fix/fix.txt new file mode 100644 index 0000000..6aca35e --- /dev/null +++ b/fix/fix.txt @@ -0,0 +1,114 @@ +#!/bin/bash + +echo +echo "A2SERVER fix: This utility will make a Raspberry Pi SD card boot if it" +echo "kernel panics (crashes) on startup after updating its operating system" +echo "while A2SERVER is installed." +echo +echo -n "Continue? " +read +doFix= +if [[ ${REPLY:0:1} == "y" || ${REPLY:0:1} == "Y" ]]; then + while true; do + echo + echo "If attached, remove the Raspberry Pi's SD card from this computer." + echo -n "Press return to continue..."; read; echo + + ls -1 /dev/sd? > /tmp/sd1 2> /dev/null + + echo "Insert the Raspberry Pi's SD card into this computer, using a USB" + echo "reader if you don't have an SD slot. If this is a virtual machine," + echo "make sure you select the reader or SD slot from its USB menu." + echo -n "Press return to continue..."; read; echo + + ls -1 /dev/sd? > /tmp/sd2 2> /dev/null + + # if exactly one drive has been inserted, exit loop + if { ! diff /tmp/sd1 /tmp/sd2 &> /dev/null; }; then + # files are different, get dev name + if [[ $(wc -c /tmp/sd1 | cut -f 1 -d ' ') -eq 0 ]]; then + if [[ $(wc -l /tmp/sd2 | cut -f 1 -d ' ') -eq 1 ]]; then + devName=$(cat /tmp/sd2) + break + else + echo "More than one volume seems to have appeared. Trying again..." + echo + fi + else + devName=$(grep -v "$(cat /tmp/sd1)" /tmp/sd2) + if [[ $(wc -l <<< $devName) -eq 1 ]]; then + break + else + echo "More than one volume seems to have appeared. Trying again..." + echo + fi + fi + else + echo "No SD card found. Trying again..." + echo + fi + + done + + mkdir -p /tmp/sd + sudo mount ${devName}6 /tmp/sd + + raspbianDate=$(date -d "$(zcat /tmp/sd/usr/share/doc/raspberrypi-bootloader/changelog.Debian.gz | grep -m 1 ' --' | rev | cut -f 1-6 -d ' ' | rev)" +%s) + doFix= + if [[ $raspbianDate -lt 1403204265 ]]; then + echo "This doesn't appear to be a version of Raspbian that requires fixing." + echo -n "Are you sure you want to continue? " + read + if [[ ${REPLY:0:1} == "y" || ${REPLY:0:1} == "Y" ]]; then + doFix=1 + fi + else + doFix=1 + fi + + if [[ $doFix ]]; then + while read kernelRelease; do + kernelReplaced= + kernelMajorRelease=$(cut -d '.' -f 1 <<< $kernelRelease) + kernelMinorRelease=$(cut -d '.' -f 2 <<< $kernelRelease | sed 's/\(^[0-9]*\)[^0-9].*$/\1/') + kernelPatchRelease=$(cut -d '.' -f 3- <<< $kernelRelease | sed 's/\(^[0-9]*\)[^0-9].*$/\1/') + # if kernel 3.12 below 3.12.25+, delete defective AppleTalk kernel + if [[ $kernelMajorRelease -eq 3 && $kernelMinorRelease -eq 12 && $kernelPatchRelease -lt 25 ]]; then + if [[ -f /tmp/sd/lib/modules/$kernelRelease/kernel/net/appletalk/appletalk.ko ]]; then + if [[ $(sha1sum /tmp/sd/lib/modules/$kernelRelease/kernel/net/appletalk/appletalk.ko | cut -f 1 -d ' ') != "ecb239fc084c36de93f6926e7749b80f6024f269" ]]; then + echo "Removing defective AppleTalk module from kernel $kernelRelease..." + sudo rm -rf /tmp/sd/lib/modules/$kernelRelease/kernel/net/appletalk 2> /dev/null + wget -qO /tmp/appletalk.ko.gz ${A2SERVER_SCRIPT_URL}files/appletalk-$kernelRelease.ko.gz + if [[ $? -eq 0 ]]; then + # if we found a prebuilt one on a2server site, so install it + gunzip -f /tmp/appletalk.ko.gz + sudo mkdir -p /tmp/sd/lib/modules/$kernelRelease/kernel/net/appletalk + sudo mv /tmp/appletalk.ko /tmp/sd/lib/modules/$kernelRelease/kernel/net/appletalk + echo "Installed fixed AppleTalk module for kernel $kernelRelease." + kernelReplaced=1 + fi + fi + fi + fi + done <<< "$(ls -1 /tmp/sd/lib/modules | sort -V)" + sudo umount /tmp/sd + + echo kern:$kernelReplaced + if [[ $kernelReplaced ]]; then + echo + echo "All set. Remove your SD card, put it back in your Pi, and boot it." + echo + echo "You should be able to connect from your Apple II, but if you can't," + echo "log in to your Pi and type 'a2server-setup' to complete the fix." + else + echo + echo "Okey doke. Half done. Remove your SD card, and put it back in your Pi." + echo "After it boots, log in and type 'a2server-setup' to complete the fix." + fi + echo "See the A2SERVER web site at http://ivanx.com/a2server for more help." + echo "(You can type 'sudo shutdown -h now' if you're done on this machine.)" + echo + fi +fi + +rm fix &> /dev/null diff --git a/scripts/a2server-2-tools.txt b/scripts/a2server-2-tools.txt index 55e2f67..c92555d 100755 --- a/scripts/a2server-2-tools.txt +++ b/scripts/a2server-2-tools.txt @@ -7,14 +7,26 @@ # Ensure URL we'll use ends in a / case "$A2SERVER_SCRIPT_URL" in */) scriptURL="$A2SERVER_SCRIPT_URL" ;; - *) scriptURL="${A2SERVER_SCRIPT_URL:-http://appleii.ivanx.com/a2server}/" ;; + *) scriptURL="${A2SERVER_SCRIPT_URL:-http://ivanx.com/a2server}/" ;; esac +case "$A2SERVER_BINARY_URL" in + */) binaryURL="$A2SERVER_BINARY_URL" ;; + *) binaryURL="${A2SERVER_BINARY_URL:-http://ivanx.com/a2server/files}/" ;; +esac +useExternalURL=1 +[[ $A2SERVER_NO_EXTERNAL ]] && useExternalURL= -isRpi= -[[ -f /usr/bin/raspi-config ]] && isRpi=1 - -isDebian= -[[ ( -f /etc/debian_version ) && ( $(cut -c 1 < /etc/debian_version) -ge "7" ) && ( $(uname -m) == "i686" ) ]] && isDebian=1 +arch= +if [[ -f /usr/bin/raspi-config ]]; then + isRpi=1 +elif lsb_release -a 2> /dev/null | grep -q 'Distributor ID:.Debian' && [[ ( -f /etc/debian_version ) && ( $(cut -c 1 < /etc/debian_version) -ge "7" ) ]]; then + uname_m="$(uname -m)" + if [[ $uname_m == "i686" ]]; then + arch='debian_x86' + elif [[ $uname_m == "x86_64" ]]; then + arch='debian_x64' + fi +fi isJessie= [[ ( -f /etc/debian_version ) && ( $(cut -c 1-2 < /etc/debian_version) == "8." ) ]] && isJessie=1 @@ -26,10 +38,8 @@ if ! command -v nulib2 > /dev/null; then echo "A2SERVER: Installing nulib2..." cd /tmp - if [[ $isRpi ]]; then - wget -qO- "http://appleii.ivanx.com/a2server/files/nulib2-rpi.tgz" | sudo tar Pzx - elif [[ $isDebian ]]; then - wget -qO- "http://appleii.ivanx.com/a2server/files/nulib2-debian7_x86.tgz" | sudo tar Pzx + if [[ $arch ]]; then + { wget -qO- "${binaryURL}precompiled/nulib2-${arch}.tgz" | sudo tar Pzx; } &> /dev/null fi if ! command -v nulib2 > /dev/null; then @@ -48,8 +58,14 @@ if ! command -v nulib2 > /dev/null; then rm -rf /tmp/nulib &> /dev/null mkdir /tmp/nulib cd /tmp/nulib - wget -q -O nulib.tgz http://web.archive.org/web/20131031160750/http://www.nulib.com/downloads/nulibdist.tar.gz - tar zxf nulib.tgz + if [[ $useExternalURL ]]; then + wget -q -O nulibdist.tar.gz http://web.archive.org/web/20131031160750/http://www.nulib.com/downloads/nulibdist.tar.gz + tar zxf nulibdist.tar.gz &> /dev/null + fi + if [[ ! -d nulib2-220 ]]; then + wget -q -O nulibdist.tar.gz ${binaryURL}external/nulibdist.tar.gz + tar zxf nulibdist.tar.gz &> /dev/null + fi cd nufxlib* ./configure make @@ -81,22 +97,16 @@ if ! command -v unar > /dev/null; then # jessie and later: Just use the unar package if [[ $isJessie ]]; then - sudo apt-get install -y unar + sudo apt-get -y install unar sudo apt-get clean fi if ! command -v unar > /dev/null; then - if [[ $isRpi || $isDebian ]]; then - + if [[ $arch ]]; then # Dependencies: for unar sudo apt-get -y install libgnustep-base1.22 sudo apt-get clean - - if [[ $isRpi ]]; then - wget -qO- "http://appleii.ivanx.com/a2server/files/unar-rpi_wheezy.tgz" | sudo tar Pzx - elif [[ $isDebian ]]; then - wget -qO- "http://appleii.ivanx.com/a2server/files/unar-debian7_x86.tgz" | sudo tar Pzx - fi + { wget -qO- "${binaryURL}precompiled/unar-${arch}.tgz" | sudo tar Pzx; } &> /dev/null fi # If all else fails, compile from source. @@ -109,9 +119,15 @@ if ! command -v unar > /dev/null; then rm -rf /tmp/unar &> /dev/null mkdir /tmp/unar cd /tmp/unar - wget -qO unar1.7_src.zip http://theunarchiver.googlecode.com/files/unar1.7_src.zip - unzip -o unar1.7_src.zip - cd The\ Unarchiver/XADMaster + if [[ $useExternalURL ]]; then + wget -O unar_1.8.zip https://github.com/incbee/Unarchiver/archive/unar-1.8.zip + unzip -o unar_1.8.zip &> /dev/null + fi + if [ ! -d *Unarchiver*/XADMaster ]; then # need single bracket for glob + wget -O unar_1.8.zip ${binaryURL}external/unar-1.8.zip + unzip -o unar_1.8.zip &> /dev/null + fi + cd *Unarchiver*/XADMaster make -f Makefile.linux sudo mv lsar unar /usr/local/bin cd ../Extra @@ -135,6 +151,7 @@ if ! command -v unzip >/dev/null; then # Dependencies: unzip sudo apt-get -y install unzip + sudo apt-get clean else echo "A2SERVER: unzip has already been installed." fi @@ -162,9 +179,9 @@ echo "source /usr/local/etc/a2serverrc" | sudo tee -a /etc/bash.bashrc > /dev/nu motd="/etc/motd" if [[ ! $(grep A2SERVER $motd) ]]; then - echo | sudo tee -a $motd > /dev/null - echo "Type 'system-shutdown' to turn off A2SERVER." | sudo tee -a $motd > /dev/null - echo "Type 'a2server-setup' to configure network boot." | sudo tee -a $motd > /dev/null - echo "Type 'a2server-help' for a list of other commands." | sudo tee -a $motd > /dev/null - echo | sudo tee -a $motd > /dev/null + echo | sudo tee -a $motd > /dev/null + echo "Type 'system-shutdown' to turn off A2SERVER." | sudo tee -a $motd > /dev/null + echo "Type 'a2server-setup' to configure network boot." | sudo tee -a $motd > /dev/null + echo "Type 'a2server-help' for a list of other commands." | sudo tee -a $motd > /dev/null + echo | sudo tee -a $motd > /dev/null fi diff --git a/scripts/a2server-3-sharing.txt b/scripts/a2server-3-sharing.txt index ed8259b..68e8fc4 100755 --- a/scripts/a2server-3-sharing.txt +++ b/scripts/a2server-3-sharing.txt @@ -19,12 +19,26 @@ case "$A2SERVER_SCRIPT_URL" in */) scriptURL="$A2SERVER_SCRIPT_URL" ;; *) scriptURL="${A2SERVER_SCRIPT_URL:-http://appleii.ivanx.com/a2server}/" ;; esac +case "$A2SERVER_BINARY_URL" in + */) binaryURL="$A2SERVER_BINARY_URL" ;; + *) binaryURL="${A2SERVER_BINARY_URL:-http://ivanx.com/a2server/files}/" ;; +esac +useExternalURL=1 +[[ $A2SERVER_NO_EXTERNAL ]] && useExternalURL= isRpi= -[[ -f /usr/bin/raspi-config ]] && isRpi=1 - -isDebian_x86= -[[ ( -f /etc/debian_version ) && ( $(cut -c 1 < /etc/debian_version) -ge 7 ) && ( $(uname -m) == "i686" ) ]] && isDebian_x86=1 +arch= +if [[ -f /usr/bin/raspi-config ]]; then + isRpi=1 + arch='rpi' +elif lsb_release -a 2> /dev/null | grep -q 'Distributor ID:.Debian' && [[ ( -f /etc/debian_version ) && ( $(cut -c 1 < /etc/debian_version) -ge "7" ) ]]; then + uname_m="$(uname -m)" + if [[ $uname_m == "i686" ]]; then + arch='debian_x86' + elif [[ $uname_m == "x86_64" ]]; then + arch='debian_x64' + fi +fi isJessie= [[ ( -f /etc/debian_version ) && ( $(cut -c 1-2 < /etc/debian_version) == "8." ) ]] && isJessie=1 @@ -55,27 +69,31 @@ else pkgFile=${url##*/} pkgName=${pkgFile%%_*} if ! dpkg -l $pkgName 2> /dev/null | grep -q '^ii'; then - wget -qO /tmp/${url##*/} "$url" - sudo dpkg -i /tmp/${url##*/} + if [[ $useExternalURL ]]; then + wget -qO "/tmp/${url##*/}" "$url" + fi + if [[ $? -ne 0 || ! -f "/tmp/${url##*/}" ]]; then + wget -qO "/tmp/${url##*/}" "${binaryURL}external/deb/${url##*/}" + fi + sudo dpkg -i "/tmp/${url##*/}" sudo apt-get clean - rm /tmp/${url##*/} + rm "/tmp/${url##*/}" fi done } compileFromSource=1 urls= - while [[ $isRpi || $isDebian_x86 ]]; do + while [[ $arch ]]; do # Install runtime libraries needed by Netatalk if [[ $isJessie ]]; then - if [[ $isRpi ]]; then + if [[ $arch == "rpi" ]]; then getOldPackage "http://mirrordirector.raspbian.org/raspbian/pool/main/d/db/libdb5.1_5.1.29-5_armhf.deb" - elif [[ $isDebian_x86 ]]; then + elif [[ $arch == "debian_x86" ]]; then getOldPackage "http://ftp.debian.org/debian/pool/main/d/db/libdb5.1_5.1.29-5_i386.deb" + elif [[ $arch == "debian_x64" ]]; then + getOldPackage "http://ftp.debian.org/debian/pool/main/d/db/libdb5.1_5.1.29-5_amd64.deb" fi - elif [[ $(apt-cache search '^libdb4.8$') ]]; then - # FIXME: Obsolete? - sudo apt-get -y install libdb4.8 elif [[ $(apt-cache search '^libdb5.1$') ]]; then # Dependencies: netatalk 2.2.4 sudo apt-get -y install libdb5.1 @@ -85,18 +103,17 @@ else if [[ $(apt-cache search '^libssl1.0.0$') ]]; then # Dependencies: netatalk 2.2.4 sudo apt-get -y install libssl1.0.0 - elif [[ $(apt-cache search '^libssl0.9.8$') ]]; then - # FIXME: Obsolete? - sudo apt-get -y install libssl0.9.8 else break fi if [[ $isJessie ]]; then - if [[ $isRpi ]]; then + if [[ $arch == "rpi" ]]; then getOldPackage "http://mirrordirector.raspbian.org/raspbian/pool/main/libg/libgcrypt11/libgcrypt11_1.5.0-5+deb7u3_armhf.deb" - elif [[ $isDebian_x86 ]]; then + elif [[ $arch == "debian_x86" ]]; then getOldPackage "http://ftp.debian.org/debian/pool/main/libg/libgcrypt11/libgcrypt11_1.5.0-5+deb7u3_i386.deb" + elif [[ $arch == "debian_x64" ]]; then + getOldPackage "http://ftp.debian.org/debian/pool/main/libg/libgcrypt11/libgcrypt11_1.5.0-5+deb7u3_amd64.deb" fi elif [[ $(apt-cache search '^libgcrypt11$') ]]; then # Dependencies: netatalk 2.2.4 @@ -106,10 +123,8 @@ else fi # install Netatalk - if [[ $isRpi ]]; then - { wget -qO- /tmp/netatalk.tgz "http://appleii.ivanx.com/a2server/files/netatalk224-rpi_wheezy.tgz" | sudo tar Pzx; } 2> /dev/null - elif [[ $isDebian_x86 ]]; then - { wget -qO- /tmp/netatalk.tgz "http://appleii.ivanx.com/a2server/files/netatalk224-debian7_x86.tgz" | sudo tar Pzx; } 2> /dev/null + if [[ $arch ]]; then + { wget -qO- "${binaryURL}precompiled/netatalk224-${arch}.tgz" | sudo tar Pzx; } &> /dev/null fi sudo mandb &> /dev/null @@ -121,18 +136,20 @@ else if [[ $compileFromSource ]]; then # Dependencies: build-deps for netatalk 2.2.4 sudo apt-get -y install build-essential libssl-dev - if [[ $isJessie ]]; then - if [[ $isRpi ]]; then + if [[ $arch ]]; then + if [[ $arch == "rpi" ]]; then getOldPackage "http://mirrordirector.raspbian.org/raspbian/pool/main/d/db/libdb5.1-dev_5.1.29-5_armhf.deb" - elif [[ $isDebian_x86 ]]; then + elif [[ $arch == "debian_x86" ]]; then getOldPackage "http://ftp.us.debian.org/debian/pool/main/d/db/libdb5.1-dev_5.1.29-5_i386.deb" + elif [[ $arch == "debian_x64" ]]; then + getOldPackage "http://ftp.us.debian.org/debian/pool/main/d/db/libdb5.1-dev_5.1.29-5_amd64.deb" fi - elif [[ $(apt-cache search '^libdb4.8-dev$') ]]; then - # FIXME: Obsolete? - sudo apt-get -y install libdb4.8-dev elif [[ $(apt-cache search '^libdb5.1-dev$') ]]; then # Dependencies: build-deps for netatalk 2.2.4 sudo apt-get -y install libdb5.1-dev + elif [[ $(apt-cache search '^libdb4.8-dev$') ]]; then + # Dependencies: build-deps for netatalk 2.2.4 + sudo apt-get -y install libdb4.8-dev else echo "A2SERVER: WARNING: unknown version of libdb-dev is being installed." # Dependencies: build-deps for netatalk 2.2.4 @@ -140,10 +157,12 @@ else fi if [[ $isJessie ]]; then sudo apt-get -y install libgpg-error-dev - if [[ $isRpi ]]; then + if [[ $arch == "rpi" ]]; then getOldPackage "http://mirrordirector.raspbian.org/raspbian/pool/main/libg/libgcrypt11/libgcrypt11-dev_1.5.0-5+deb7u3_armhf.deb" - elif [[ $isDebian_x86 ]]; then + elif [[ $arch == "debian_x86" ]]; then getOldPackage "http://ftp.debian.org/debian/pool/main/libg/libgcrypt11/libgcrypt11-dev_1.5.0-5+deb7u3_i386.deb" + elif [[ $arch == "debian_x64" ]]; then + getOldPackage "http://ftp.debian.org/debian/pool/main/libg/libgcrypt11/libgcrypt11-dev_1.5.0-5+deb7u3_amd64.deb" fi elif [[ $(apt-cache search '^libgcrypt11-dev$') ]]; then # Dependencies: build-deps for netatalk 2.2.4 @@ -160,8 +179,14 @@ else mkdir /tmp/netatalk cd /tmp/netatalk - wget -q "http://downloads.sourceforge.net/project/netatalk/netatalk/2.2.4/netatalk-2.2.4.tar.gz" - tar zxf netatalk-2.2.4.tar.gz + if [[ $useExternalURL ]]; then + wget -qO netatalk-2.2.4.tar.gz "http://downloads.sourceforge.net/project/netatalk/netatalk/2.2.4/netatalk-2.2.4.tar.gz" + tar zxf netatalk-2.2.4.tar.gz &> /dev/null + fi + if [[ ! -d netatalk-2.2.4 ]]; then + wget -O netatalk-2.2.4.tar.gz "${binaryURL}external/netatalk-2.2.4.tar.gz" + tar zxf netatalk-2.2.4.tar.gz &> /dev/null + fi cd netatalk-2.2.4 # Patch the source so file dates are preserved during a GS/OS folder copy, @@ -191,10 +216,8 @@ fi if ! command -v macipgw > /dev/null; then echo "A2SERVER: Installing TCP over AppleTalk (MacIP)..." - if [[ $isRpi ]]; then - wget -qO- "http://appleii.ivanx.com/a2server/files/macipgw-rpi.tgz" | sudo tar Pzx - elif [[ $isDebian_x86 ]]; then - wget -qO- "http://appleii.ivanx.com/a2server/files/macipgw-debian7_x86.tgz" | sudo tar Pzx + if [[ $arch ]]; then + { wget -qO- "${binaryURL}precompiled/macipgw-${arch}.tgz" | sudo tar Pzx; } 2> /dev/null fi if ! command -v macipgw > /dev/null; then @@ -203,8 +226,14 @@ if ! command -v macipgw > /dev/null; then rm -rf /tmp/macipgw &> /dev/null mkdir /tmp/macipgw cd /tmp/macipgw - wget -qO macipgw-master.zip "https://github.com/zero2sixd/macipgw/archive/master.zip" - unzip macipgw-master.zip + if [[ $useExternalURL ]]; then + wget -qO macipgw.zip "https://github.com/zero2sixd/macipgw/archive/master.zip" + unzip macipgw-src.zip &> /dev/null + fi + if [[ ! -d macipgw-master ]]; then + wget -qO macipgw-src.zip "${binaryURL}external/macipgw-src.zip" + unzip macipgw-src.zip &> /dev/null + fi cd macipgw-master make sudo make install @@ -222,7 +251,7 @@ echo "A2SERVER: Configuring Netatalk..." # if missing Netatalk startup file, download a fresh one if [ ! -f /etc/init.d/netatalk ]; then echo "A2SERVER: Downloading new Netatalk startup script..." - sudo wget -qO /etc/init.d/netatalk http://appleii.ivanx.com/a2server/files/netatalk-init.d-clean.txt + sudo wget -qO /etc/init.d/netatalk ${binaryURL}netatalk-init.d-clean.txt fi # make the Netatalk startup script work correctly @@ -325,10 +354,11 @@ if [[ -d /srv/A2SERVER/A2FILES && ! -d /srv/A2SERVER/.a2files ]]; then fi rm /srv/A2SERVER/A2FILES/.APPLEDESKTOP 2> /dev/null mkdir -p /tmp/netboot - a2FilesList="$(wget -qO- http://ivanx.com/a2server/files/A2FILES-list.txt)" - find /srv/A2SERVER/A2FILES -name '*' | tail -n +2 | tac | while read -d $'\n' thisFile; do + wget -qO /tmp/A2FILES-list.txt ${binaryURL}A2FILES-list.txt + find /srv/A2SERVER/A2FILES -name '*' | tail -n +2 | tac > /tmp/filelist.txt + while read thisFile; do mixedCase="${thisFile##*/}" - gsosPath=$(grep -i "^${thisFile}$" <<< "$a2FilesList") + gsosPath=$(grep -i -m 1 "^${thisFile}$" /tmp/A2FILES-list.txt) [[ $gsosPath ]] && mixedCase="${gsosPath##*/}" sudo setfattr -n "user.filename" -v "$mixedCase" "$thisFile" if [[ ${thisFile##*/} != $mixedCase ]]; then @@ -336,12 +366,12 @@ if [[ -d /srv/A2SERVER/A2FILES && ! -d /srv/A2SERVER/.a2files ]]; then else echo -e " processing $thisFile\n" fi - sudo mv "$thisFile" "${thisFile%/*}"/"$(tr [:upper:] [:lower:] <<< $mixedCase)" 2> /dev/null - done + sudo mv "$thisFile" "${thisFile%/*}/${mixedCase,,}" 2> /dev/null + done < /tmp/filelist.txt mv /srv/A2SERVER/A2FILES /srv/A2SERVER/.a2files mkdir /srv/A2SERVER/A2FILES - sudo sed -i 's/casefold:toupper //' /usr/local/etc/netatalk/AppleVolumes.default - sudo sed -i 's/^VOLCASEFOLD:.*/VOLCASEFOLD:/' /srv/A2SERVER/.a2files/.appledesktop/.volinfo + sudo sed -i 's/casefold:toupper //' /usr/local/etc/netatalk/AppleVolumes.default 2> /dev/null + sudo sed -i 's/^VOLCASEFOLD:.*/VOLCASEFOLD:/' /srv/A2SERVER/.a2files/.appledesktop/.volinfo 2> /dev/null fi # 1.3.0: remove GSFILES if empty @@ -375,11 +405,8 @@ if ! command -v ciopfs > /dev/null; then # Dependency: For ciopfs sudo apt-get -y install fuse libglib2.0-0 libattr1 libfuse2 - - if [[ $isRpi ]]; then - wget -qO- "http://appleii.ivanx.com/a2server/files/ciopfs-rpi.tgz" | sudo tar Pzx - elif [[ $isDebian_x86 ]]; then - wget -qO- "http://appleii.ivanx.com/a2server/files/ciopfs-debian7_x86.tgz" | sudo tar Pzx + if [[ $arch ]]; then + { wget -qO- "${binaryURL}precompiled/ciopfs-${arch}.tgz" | sudo tar Pzx; } &> /dev/null fi if [[ -f /etc/fuse.conf ]] && sudo grep -q user_allow_other /etc/fuse.conf; then sudo sed -i 's/#user_allow_other/user_allow_other/' /etc/fuse.conf @@ -402,8 +429,14 @@ if ! command -v ciopfs > /dev/null; then rm -rf /tmp/ciopfs &> /dev/null mkdir /tmp/ciopfs cd /tmp/ciopfs - wget -q -O ciopfs-0.4.tar.gz http://www.brain-dump.org/projects/ciopfs/ciopfs-0.4.tar.gz - tar zxf ciopfs-0.4.tar.gz + if [[ $useExternalURL ]]; then + wget -q -O ciopfs-0.4.tar.gz http://www.brain-dump.org/projects/ciopfs/ciopfs-0.4.tar.gz + tar zxf ciopfs-0.4.tar.gz &> /dev/null + fi + if [ ! -f ciopfs*/ciopfs.c ]; then # single brackets required for glob + wget -q -O ciopfs-0.4.tar.gz ${binaryURL}external/ciopfs-0.4.tar.gz + tar zxf ciopfs-0.4.tar.gz &> /dev/null + fi cd ciopfs* make sudo mv ciopfs /usr/local/bin @@ -458,11 +491,8 @@ else # set registered user login using RandNum authentication sudo afppasswd -c sudo sed -i "s/^\(${USER}\).*$/\1:6170706C65320000:****************:********/" /usr/local/etc/netatalk/afppasswd - # while [[ ! $(sudo afppasswd -a $USER) ]]; do - # true - # done # (The afppasswd -c only needs to ever be done once. You can repeat - # the afppasswd -a to make Netatalk logins for other Linux users.) + # the afppasswd -a to make Netatalk randnum logins for other Linux users.) fi @@ -498,26 +528,27 @@ if [[ $kernelMajor -eq 3 && $kernelMinor -ge 12 && $kernelMinor -le 15 ]]; then fi # if IPDDP module exists (e.g. Debian, but not Raspbian), -# AppleTalk kernel module can't work with MacIP +# AppleTalk kernel module has been compiled to support it and can't work with MacIP if [[ -f "/lib/modules/$kernelRelease/kernel/drivers/net/appletalk/ipddp.ko" ]]; then sudo /etc/init.d/netatalk stop &> /dev/null sudo rmmod ipddp 2> /dev/null sudo rmmod appletalk 2> /dev/null echo "A2SERVER: Attempting to replace AppleTalk kernel module for MacIP use..." - sudo mv /lib/modules/$kernelRelease/kernel/net/appletalk/appletalk.ko /tmp + sudo mv /lib/modules/$kernelRelease/kernel/net/appletalk/appletalk.ko /tmp 2> /dev/null - if [[ $isDebian_x86 ]]; then - echo "A2SERVER: Attempting to fetch AppleTalk kernel module for Debian x86..." - wget -qO /tmp/appletalk.tgz http://appleii.ivanx.com/a2server/files/appletalk-$kernelRelease-debian_x86.tgz + if [[ ${arch%_*} == "debian" ]]; then + echo "A2SERVER: Attempting to fetch AppleTalk kernel module for Debian..." + wget -qO /tmp/appletalk.tgz ${binaryURL}precompiled/appletalk-$kernelRelease-${arch}.tgz if [[ $? -eq 0 ]]; then # if we found a prebuilt one on a2server site, install it and load it - sudo tar Pxf /tmp/appletalk.tgz + sudo tar Pxf /tmp/appletalk.tgz &> /dev/null sudo depmod sudo modprobe appletalk if [[ $(lsmod | grep appletalk) ]]; then # if it loaded, restart netatalk - sudo sed -i "s/ATALKD_RUN=no/ATALKD_RUN=yes/" /etc/default/netatalk; sudo /etc/init.d/netatalk restart &> /dev/null + sudo sed -i "s/ATALKD_RUN=no/ATALKD_RUN=yes/" /etc/default/netatalk + sudo /etc/init.d/netatalk restart &> /dev/null else # if we didn't load it successfully, remove it sudo rm /lib/modules/$kernelRelease/kernel/net/appletalk/appletalk.ko 2> /dev/null @@ -542,11 +573,11 @@ if [[ -f "/lib/modules/$kernelRelease/kernel/drivers/net/appletalk/ipddp.ko" ]]; cd /usr/src kernelSrc=$(find linux-source-${kernelMajorMinor}*) if [[ ${kernelSrc##*.} == "xz" ]]; then - xzcat $kernelSrc | sudo tar x + { xzcat $kernelSrc | sudo tar x; } &> /dev/null elif [[ ${kernelSrc##*.} == "bz2" ]]; then - sudo tar jxf $kernelSrc + sudo tar jxf $kernelSrc &> /dev/null elif [[ ${kernelSrc##*.} == "gz" || ${kernelSrc##*.} == "tgz" ]]; then - sudo tar zxf $kernelSrc + sudo tar zxf $kernelSrc &> /dev/null fi cd linux-source-$kernelMajorMinor sudo make mrproper @@ -620,10 +651,10 @@ if [[ ( ! $(ps aux | grep [a]talkd) ) && ( $isRpi ) ]]; then # if no AppleTalk module, try to download it from a2server site if [[ ! -f /lib/modules/$kernelRelease/kernel/net/appletalk/appletalk.ko ]]; then # check for rpi kernel module echo "A2SERVER: Attempting to install AppleTalk kernel module for Raspbian..." - wget -qO /tmp/appletalk.ko.gz http://appleii.ivanx.com/a2server/files/appletalk-$kernelRelease.ko.gz + wget -qO /tmp/appletalk.ko.gz ${binaryURL}appletalk-$kernelRelease-rpi.ko.gz if [[ $? -eq 0 ]]; then # if we found a prebuilt one on a2server site, install it and load it - gunzip -f /tmp/appletalk.ko.gz + gunzip -f /tmp/appletalk.ko.gz &> /dev/null sudo mkdir -p /lib/modules/$kernelRelease/kernel/net/appletalk sudo mv /tmp/appletalk.ko /lib/modules/$kernelRelease/kernel/net/appletalk sudo depmod diff --git a/scripts/a2server-5-netboot.txt b/scripts/a2server-5-netboot.txt index 4b099d4..84645f8 100755 --- a/scripts/a2server-5-netboot.txt +++ b/scripts/a2server-5-netboot.txt @@ -12,6 +12,12 @@ case "$A2SERVER_SCRIPT_URL" in */) scriptURL="$A2SERVER_SCRIPT_URL" ;; *) scriptURL="${A2SERVER_SCRIPT_URL:-http://ivanx.com/a2server}/" ;; esac +case "$A2SERVER_BINARY_URL" in + */) binaryURL="$A2SERVER_BINARY_URL" ;; + *) binaryURL="${A2SERVER_BINARY_URL:-http://ivanx.com/a2server/files}/" ;; +esac +useExternalURL=1 +[[ $A2SERVER_NO_EXTERNAL ]] && useExternalURL= gsosDir="/srv/A2SERVER/A2FILES" imagesDir=$gsosDir/GSOS.Installer/Images @@ -72,11 +78,18 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then echo "A2SERVER: Downloading Apple II Boot Blocks..." cd /tmp/netboot - wget --max-redirect 0 -qO Disk_7_of_7-Apple_II_Setup.sea.bin ${gsosURL}Disk_7_of_7-Apple_II_Setup.sea.bin - if (( $? != 0 )); then - wget -qO Disk_7_of_7-Apple_II_Setup.sea.bin ${gsosBackupURL}Disk_7_of_7-Apple_II_Setup.sea.bin + if [[ $useExternalURL ]]; then + wget --max-redirect 0 -qO Disk_7_of_7-Apple_II_Setup.sea.bin ${gsosURL}Disk_7_of_7-Apple_II_Setup.sea.bin + unar -k skip Disk_7_of_7-Apple_II_Setup.sea.bin &> /dev/null + if (( $? != 0 )); then + wget -qO Disk_7_of_7-Apple_II_Setup.sea.bin ${gsosBackupURL}Disk_7_of_7-Apple_II_Setup.sea.bin + unar -k skip Disk_7_of_7-Apple_II_Setup.sea.bin &> /dev/null + fi + fi + if [[ ! -f 'Disk 7 of 7-Apple II Setup.sea' ]]; then + wget -qO Disk_7_of_7-Apple_II_Setup.sea.bin ${binaryURL}external/appleii/gsos601/Disk_7_of_7-Apple_II_Setup.sea.bin + unar -k skip Disk_7_of_7-Apple_II_Setup.sea.bin &> /dev/null fi - unar -k skip Disk_7_of_7-Apple_II_Setup.sea.bin &> /dev/null truncate -s 819284 'Disk 7 of 7-Apple II Setup.sea' dd if='Disk 7 of 7-Apple II Setup.sea' of=APPLE2SETUP.HDV bs=84 skip=1 2> /dev/null @@ -234,21 +247,38 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then afpsync -v $gsosDir > /dev/null for diskname in ${diskNames[@]}; do - outfile="$imagesDir/$diskname" + outfile="$imagesDir/$diskname.po" (( activeDisk++ )) echo "A2SERVER: Disk ${activeDisk} of ${#diskNames[@]}: $diskname" if (( $gsosInstall == 1 )); then - wget --max-redirect 0 -qO "Disk_${activeDisk}_of_7-$diskname.sea.bin" "${gsosURL}Disk_${activeDisk}_of_7-$diskname.sea.bin" - if (( $? != 0 )); then - wget -qO "Disk_${activeDisk}_of_7-$diskname.sea.bin" "${gsosBackupURL}Disk_${activeDisk}_of_7-$diskname.sea.bin" + if [[ $useExternalURL ]]; then + wget --max-redirect 0 -qO "Disk_${activeDisk}_of_7-${diskname}.sea.bin" "${gsosURL}Disk_${activeDisk}_of_7-${diskname}.sea.bin" + unar -k skip "Disk_${activeDisk}_of_7-${diskname}.sea.bin" &> /dev/null + if [[ ! -f "Disk ${activeDisk} of 7-${diskname}.sea" ]]; then + wget -qO "Disk_${activeDisk}_of_7-${diskname}.sea.bin" "${gsosBackupURL}Disk_${activeDisk}_of_7-${diskname}.sea.bin" + unar -k skip "Disk_${activeDisk}_of_7-${diskname}.sea.bin" &> /dev/null + fi + fi + if [[ ! -f "Disk ${activeDisk} of 7-${diskname}.sea" ]]; then + wget -qO "Disk_${activeDisk}_of_7-${diskname}.sea.bin" "${binaryURL}external/appleii/gsos601/Disk_${activeDisk}_of_7-${diskname}.sea.bin" + unar -k skip "Disk_${activeDisk}_of_7-${diskname}.sea.bin" &> /dev/null fi - unar -k skip "Disk_${activeDisk}_of_7-$diskname.sea.bin" &> /dev/null truncate -s 819284 "Disk ${activeDisk} of 7-${diskname}.sea" dd if="Disk ${activeDisk} of 7-${diskname}.sea" of=${outfile} bs=84 skip=1 &> /dev/null elif (( $gsosInstall == 2 )); then - wget -qO $outfile "$gsosURL/IIGS%20System%206.0.2%20-%20Disk%20${activeDisk}%20${diskWebNames[$activeDisk-1]}.po" + if [[ $useExternalURL ]]; then + wget -qO $outfile "$gsosURL/IIGS%20System%206.0.2%20-%20Disk%20${activeDisk}%20${diskWebNames[$activeDisk-1]}.po" + fi + if [[ $? -ne 0 || ! -f $outfile ]]; then + wget -qO $outfile "${binaryURL}external/appleii/gsos602/$diskname.po" + fi elif (( $gsosInstall == 3 )); then - wget -qO $outfile "$gsosURL/$diskname.po" + if [[ $useExternalURL ]]; then + wget -qO $outfile "$gsosURL/$diskname.po" + fi + if [[ $? -ne 0 || ! -f $outfile ]]; then + wget -qO $outfile "${binaryURL}external/appleii/gsos603/$diskname.po" + fi fi cppo -s -ad $outfile $netInstallDir 2> /dev/null done @@ -358,8 +388,14 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then else echo cd /tmp/netboot - wget -qO Asimov.shk http://www.ninjaforce.com/downloads/Asimov.shk - nulib2 -x -s Asimov.shk > /dev/null + if [[ $useExternalURL ]]; then + wget -qO Asimov.shk http://www.ninjaforce.com/downloads/Asimov.shk + nulib2 -x -s Asimov.shk &> /dev/null + fi + if [[ ! -d Asimov ]]; then + wget -qO Asimov.shk ${binaryURL}external/appleii/Asimov.shk + nulib2 -x -s Asimov.shk &> /dev/null + fi cp -p Asimov/Asimov $imageToolsDir/Asimov afpsync -v $gsosDir > /dev/null cat Asimov/Asimov_rsrc_ >> $imageToolsDir/.AppleDouble/Asimov @@ -372,14 +408,22 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then echo " is already installed." else echo - cd /tmp/netboot - wget -qO gshk.sea http://web.archive.org/web/20131031160750/http://nulib.com/library/gshk11.sea - #wget -qO gshk.sea http://www.nulib.com/library/gshk11.sea - nulib2 -x -s gshk.sea > /dev/null + mkdir -p /tmp/netboot/gshk + cd /tmp/netboot/gshk + if [[ $useExternalURL ]]; then + wget -qO gshk11.sea http://web.archive.org/web/20131031160750/http://nulib.com/library/gshk11.sea + #wget -qO gshk11.sea http://www.nulib.com/library/gshk11.sea + nulib2 -x -s gshk11.sea &> /dev/null + fi + if [[ ! -f GSHK ]]; then + wget -qO gshk11.sea ${binaryURL}external/appleii/gshk11.sea + nulib2 -x -s gshk11.sea &> /dev/null + fi cp -p GSHK $imageToolsDir/GSHK afpsync -v $gsosDir > /dev/null cat GSHK_rsrc_ >> $imageToolsDir/.AppleDouble/GSHK afptype -p S16 -a DB07 -q $imageToolsDir/GSHK + cd /tmp/netboot fi echo -n "MountIt 1.4" @@ -389,7 +433,12 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then else echo cd /tmp/netboot - wget -q -O MOUNTIT.SHK http://www.brutaldeluxe.fr/products/apple2gs/MOUNTIT.SHK + if [[ $useExternalURL ]]; then + wget -q -O MOUNTIT.SHK http://www.brutaldeluxe.fr/products/apple2gs/MOUNTIT.SHK + fi + if [[ $? -ne 0 || ! -f MOUNTIT.SHK ]]; then + wget -qO MOUNTIT.SHK ${binaryURL}external/appleii/MOUNTIT.SHK + fi cp -p MOUNTIT.SHK $imageToolsDir/MOUNTIT.SHK afpsync -v $gsosDir > /dev/null afptype -p SHK -q $imageToolsDir/MOUNTIT.SHK @@ -415,9 +464,14 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then else echo cd /tmp/netboot - wget -qO shrinkit.sdk http://web.archive.org/web/20131031160750/http://www.nulib.com/library/shrinkit.sdk - [[ ! -f shrinkit.sdk ]] && wget -qO shrinkit.sdk "http://appleii.ivanx.com/a2server/files/shrinkit.sdk" - nulib2 -xs shrinkit.sdk > /dev/null + if [[ $useExternalURL ]]; then + wget -qO shrinkit.sdk http://web.archive.org/web/20131031160750/http://www.nulib.com/library/shrinkit.sdk + nulib2 -x -s shrinkit.sdk &> /dev/null + fi + if [[ ! -f SHRINKIT ]]; then + wget -qO shrinkit.sdk ${binaryURL}external/appleii/shrinkit.sdk + nulib2 -x -s shrinkit.sdk &> /dev/null + fi cppo -s -ad SHRINKIT /SHRINKIT/SHRINKIT $diskToolsP8Dir 2> /dev/null afpsync -v $sharepath > /dev/null fi @@ -429,8 +483,14 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then else echo cd /tmp/netboot - wget -q -O dsk2file.shk http://www.dwheeler.com/6502/oneelkruns/dsk2file.zip - nulib2 -x -s dsk2file.shk > /dev/null + if [[ $useExternalURL ]]; then + wget -q -O dsk2file.shk http://www.dwheeler.com/6502/oneelkruns/dsk2file.zip + nulib2 -x -s dsk2file.shk &> /dev/null + fi + if [[ ! -f DSK2FILE58 ]]; then + wget -qO dsk2file.shk ${binaryURL}external/appleii/dsk2file.shk + nulib2 -x -s dsk2file.shk &> /dev/null + fi cp -p DSK2FILE58 $diskToolsP8Dir/DSK2FILE afpsync -v $sharepath > /dev/null afptype -p SYS -q $diskToolsP8Dir/DSK2FILE @@ -442,11 +502,17 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then else echo cd /tmp/netboot - wget --max-redirect 0 -qO Apple_II_System_Disk_3.2.sea.bin http://download.info.apple.com/Apple_Support_Area/Apple_Software_Updates/English-North_American/Apple_II/Apple_II_Supplemental/Apple_II_System_Disk_3.2.sea.bin - if (( $? != 0 )); then - wget -qO Apple_II_System_Disk_3.2.sea.bin http://archive.org/download/download.info.apple.com.2012.11/download.info.apple.com.2012.11.zip/download.info.apple.com%2FApple_Support_Area%2FApple_Software_Updates%2FEnglish-North_American%2FApple_II%2FApple_II_Supplemental%2FApple_II_System_Disk_3.2.sea.bin + if [[ $useExternalURL ]]; then + wget --max-redirect 0 -qO Apple_II_System_Disk_3.2.sea.bin http://download.info.apple.com/Apple_Support_Area/Apple_Software_Updates/English-North_American/Apple_II/Apple_II_Supplemental/Apple_II_System_Disk_3.2.sea.bin + if (( $? != 0 )); then + wget -qO Apple_II_System_Disk_3.2.sea.bin http://archive.org/download/download.info.apple.com.2012.11/download.info.apple.com.2012.11.zip/download.info.apple.com%2FApple_Support_Area%2FApple_Software_Updates%2FEnglish-North_American%2FApple_II%2FApple_II_Supplemental%2FApple_II_System_Disk_3.2.sea.bin + unar -k skip Apple_II_System_Disk_3.2.sea.bin &> /dev/null + fi + fi + if [[ ! -f 'Apple II System Disk 3.2.sea' ]]; then + wget -qO Apple_II_System_Disk_3.2.sea.bin ${binaryURL}external/appleii/Apple_II_System_Disk_3.2.sea.bin + unar -k skip Apple_II_System_Disk_3.2.sea.bin &> /dev/null fi - unar -k skip Apple_II_System_Disk_3.2.sea.bin &> /dev/null truncate -s 819284 'Apple II System Disk 3.2.sea' dd if='Apple II System Disk 3.2.sea' of=A2SYSDISK32.HDV bs=84 skip=1 2> /dev/null cppo -s -ad A2SYSDISK32.HDV /UTILITIES/SYSUTIL.SYSTEM $diskToolsP8Dir/SYSUTIL 2> /dev/null @@ -478,22 +544,33 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then else mkdir -p $spectrumDir echo - mkdir -p /tmp/netboot - cd /tmp/netboot + mkdir -p /tmp/netboot/spectrum + cd /tmp/netboot/spectrum if [[ ! -f $gsosDir/SYSTEM/START.GS.OS ]]; then #if true; then # provide disk images for MountIt if no GS/OS present - wget -qO- http://www.speccie.co.uk/speccie/software/spectrum.2mg | dd bs=64 skip=1 of=$spectrumDir/SPECTRUM.HDV 2> /dev/null - wget -qO- http://www.speccie.co.uk/speccie/software/spectrum_extras.2mg | dd bs=64 skip=1 of=$spectrumDir/EXTRAS.HDV 2> /dev/null - wget -qO- http://www.speccie.co.uk/speccie/software/spectrum_sounds.2mg | dd bs=64 skip=1 of=$spectrumDir/SOUNDS.HDV 2> /dev/null - wget -qO- http://www.speccie.co.uk/speccie/software/spectrum_manuals.2mg | dd bs=64 skip=1 of=$spectrumDir/MANUALS.HDV 2> /dev/null - echo -n "These Spectrum installer disk image files can be converted to floppy disks with Asimov or DSK2FILE, or mounted directly with MountIt. If using MountIt, mount bouth SPECTRUM.HDV and EXTRAS.HDV before running the installer." > $spectrumDir/SPECTRUM.README + for filename in spectrum.2mg spectrum_extras.2mg spectrum_sounds.2mg spectrum_manuals.2mg; do + if [[ $useExternalURL ]]; then + wget -qO $filename http://www.speccie.co.uk/speccie/software/$filename + fi + if [[ $? -ne 0 || ! -f $filename ]]; then + wget -qO $filename ${binaryURL}external/appleii/spectrum/$filename + fi + dd bs=64 skip=1 if=$filename of=$spectrumDir/${filename,,}.HDV 2> /dev/null + done + echo -n "The Spectrum installer disk image files can be converted to floppy disks with Asimov or DSK2FILE, or mounted directly with MountIt. If using MountIt, mount bouth SPECTRUM.HDV and EXTRAS.HDV before running the installer." > $spectrumDir/SPECTRUM.README afpsync -v $gsosDir > /dev/null afptype -p TXT -q $spectrumDir/SPECTRUM.README else # install Spectrum into GS/OS - wget -qO spectrum_gold_2mg.zip http://www.speccie.co.uk/speccie/software/spectrum_gold_2mg.zip - unzip -p spectrum_gold_2mg.zip | dd bs=64 skip=1 of=Spectrum.Gold.HDV 2> /dev/null + if [[ $useExternalURL ]]; then + wget -qO spectrum_gold_2mg.zip http://www.speccie.co.uk/speccie/software/spectrum_gold_2mg.zip + unzip -p spectrum_gold_2mg.zip 2> /dev/null | dd bs=64 skip=1 of=Spectrum.Gold.HDV 2> /dev/null + fi + if [[ ! -f Spectrum.Gold.2mg ]]; then + wget -qO spectrum_gold_2mg.zip ${binaryURL}external/appleii/spectrum/spectrum_gold_2mg.zip + unzip -p spectrum_gold_2mg.zip 2> /dev/null | dd bs=64 skip=1 of=Spectrum.Gold.HDV 2> /dev/null + fi cppo -s -ad Spectrum.Gold.HDV . userFolder=$(tr [:lower:] [:upper:] <<< $USER) for thisFolder in \ @@ -532,7 +609,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then mkdir -p $zlinkDir/.AppleDouble echo cd /tmp/netboot - wget -qO A2CLOUD.HDV "http://ivanx.com/a2server/files/A2CLOUD.HDV" + wget -qO A2CLOUD.HDV "${binaryURL}A2CLOUD.HDV" cppo -ad A2CLOUD.HDV . > /dev/null cd A2CLOUD mv *PT3* *PROTERM* $protermDir @@ -561,8 +638,6 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then # clean up cd - [[ -d /tmp/netboot ]] && rm -rf /tmp/netboot - [[ -d ~/GNUstep ]] && rm -rf ~/GNUstep # rock and roll! echo @@ -572,7 +647,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then echo "GS/OS network boot (for registered user and Guest) and" fi echo "ProDOS 8 network boot (for Guest only) is now configured." - echo "See http://appleii.ivanx.com/a2server for info using it." + echo "See http://ivanx.com/a2server for info using it." fi @@ -585,7 +660,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then if [[ $autoAnswerYes || ${REPLY:0:1} == "Y" || ${REPLY:0:1} == "y" ]]; then # Farallon bridge patch for GS/OS courtesy of Geoff Body echo "A2SERVER: Downloading Farallon bridge patch..." - wget -O /tmp/FARALLON.PO "http://appleii.ivanx.com/a2server/files/FARALLON.B1.PO" &> /dev/null + wget -O /tmp/FARALLON.PO "${binaryURL}FARALLON.B1.PO" &> /dev/null if [[ -d $gsosDir/SYSTEM/SYSTEM.SETUP ]]; then cppo -s -ad /tmp/FARALLON.PO /ATALKPATCH/ATALKIRQ $gsosDir/SYSTEM/SYSTEM.SETUP &> /dev/null echo diff --git a/scripts/a2server-6-samba.txt b/scripts/a2server-6-samba.txt index cb8c78a..f319464 100755 --- a/scripts/a2server-6-samba.txt +++ b/scripts/a2server-6-samba.txt @@ -31,7 +31,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupWindowsSharing ]]; then # Dependency: samba for Windows/modern Macs # FIXME: Figure out when smbpasswd moved and adjust this as necessary sudo apt-get -y install samba - command -v smbpasswd >/dev/null || sudo apt-get -y install samba-common-bin + command -v smbpasswd > /dev/null || sudo apt-get -y install samba-common-bin sudo apt-get clean fi diff --git a/scripts/raspbian-update.txt b/scripts/raspbian-update.txt new file mode 100644 index 0000000..2f3d586 --- /dev/null +++ b/scripts/raspbian-update.txt @@ -0,0 +1,233 @@ +#!/bin/bash + +# raspbian-update +# updates Raspbian to latest version, including NOOBS if installed + +[[ -f /usr/bin/raspi-config ]] && isRpi=1 || isRpi= + +if [[ ! $isRpi ]]; then + echo "This ain't a Raspberry Pi." + [[ $0 == "-bash" ]] && return 1 || exit 1 +fi + +skipRepoUpdate= +autoYes= +updateA2Cloud= +updateA2Server= +while [[ $1 ]]; do + if [[ $1 == "-r" ]]; then + shift + skipRepoUpdate="-r" + elif [[ $1 == "-y" ]]; then + shift + autoYes="-y" + elif [[ $1 == "-n" ]]; then + shift + noobsOnly="-n" + elif [[ $1 == "a2cloud" ]]; then + shift + updateA2Cloud=1 + elif [[ $1 == "a2server" ]]; then + shift + updateA2Server=1 + elif [[ $1 ]]; then + echo "options:" + echo "-y: auto-answer yes to all prompts and don't prompt for restart" + echo "-r: don't update package repositories" + echo "-n: update NOOBS only; don't update Raspbian" + echo "a2cloud : update A2CLOUD when complete" + echo "a2server: update A2SERVER when complete" + [[ $0 == "-bash" ]] && return 1 || exit 1 + fi +done + +noobs= +readarray -t partitions < <(sudo fdisk -l | grep '^/dev') +if [[ \ + ${partitions[0]:0:14} == "/dev/mmcblk0p1" && ${partitions[0]:57:2} == " e" && + ${partitions[1]:0:14} == "/dev/mmcblk0p2" && ${partitions[1]:57:2} == "85" && + ${partitions[2]:0:14} == "/dev/mmcblk0p3" && ${partitions[2]:57:2} == "83" && + ${partitions[3]:0:14} == "/dev/mmcblk0p5" && ${partitions[3]:57:2} == " c" && + ${partitions[4]:0:14} == "/dev/mmcblk0p6" && ${partitions[4]:57:2} == "83" ]]; then + noobs=" and the NOOBS install manager" +fi + +if [[ ! $autoYes ]]; then + echo + echo "You are about to update your SD card to the latest version of the" + echo "Raspbian operating system${noobs}." + echo + echo "This may take an hour or more, and will require restarting when complete." + echo "You might want a backup before continuing in case it doesn't go as planned." + echo + echo -n "Update Raspbian? " + read + if [[ ${REPLY:0:1} != "Y" && ${REPLY:0:1} != "y" ]]; then + [[ $0 == "-bash" ]] && return 2 || exit 2 + fi +fi + +origDir="$PWD" +cd /tmp + +if [[ ! $skipRepoUpdate ]]; then + echo "Updating package repositories..." + sudo apt-get -y update > /dev/null +else + echo "Not updating package repositories..." + echo +fi + +if [[ ! $noobsOnly ]]; then + { cd /tmp; sudo apt-get -y autoremove; sudo apt-get -y autoclean; sudo apt-get -y clean; } > /dev/null + freeSpace=$(df / | tail -1 | awk '{ print $4 }') + if (( $freeSpace < 400000 )); then + if dpkg -l | grep -q wolfram-engine; then + if [[ ! $autoYes ]]; then + echo "In order to create enough space on your SD card to upgrade," + echo "the Wolfram Language and Mathematica software packages must be removed." + echo "If you don't know what these are, this won't affect you at all." + echo + echo -n "Remove Wolfram software? " + read + if [[ ${REPLY:0:1} != "Y" && ${REPLY:0:1} != "y" ]]; then + [[ $0 == "-bash" ]] && return 2 || exit 2 + fi + sudo rm /opt/Wolfram/WolframEngine/10.0/SystemFiles/Java/Linux-ARM 2> /dev/null + sudo apt-get -y purge wolfram-engine + else + echo "Removing Wolfram software due to space constraints..." + sudo rm /opt/Wolfram/WolframEngine/10.0/SystemFiles/Java/Linux-ARM 2> /dev/null + sudo apt-get -y purge wolfram-engine + fi + else + echo "You don't have enough free space on your SD card to upgrade." + echo "Sorry, man. Delete some stuff or get a bigger card." + [[ $0 == "-bash" ]] && return 1 || exit 1 + fi + fi + + { cd /tmp; sudo apt-get -y autoremove; sudo apt-get -y autoclean; sudo apt-get -y clean; } > /dev/null + dpkg -l | grep -q a2pi && sudo apt-get -y --force-yes install a2pi + dpkg -l | grep -q apple2user && sudo apt-get -y --force-yes install apple2user gsport + if dpkg -l | grep -q wolfram-engine; then + sudo rm /opt/Wolfram/WolframEngine/10.0/SystemFiles/Java/Linux-ARM 2> /dev/null + if [[ $freeSpace -lt 750000 && $(apt-get -s install wolfram-engine | grep upgraded) ]]; then + sudo apt-get -y purge wolfram-engine + { cd /tmp; sudo apt-get -y autoremove; sudo apt-get -y autoclean; sudo apt-get -y clean; } > /dev/null + fi + sudo apt-get -y install wolfram-engine + { cd /tmp; sudo apt-get -y autoremove; sudo apt-get -y autoclean; sudo apt-get -y clean; } > /dev/null + fi + sudo DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" upgrade + { cd /tmp; sudo apt-get -y autoremove; sudo apt-get -y autoclean; sudo apt-get -y clean; } > /dev/null + sudo DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade + { cd /tmp; sudo apt-get -y autoremove; sudo apt-get -y autoclean; sudo apt-get -y clean; } > /dev/null + sudo apt-get -y install raspberrypi-ui-mods + { cd /tmp; sudo apt-get -y autoremove; sudo apt-get -y autoclean; sudo apt-get -y clean; } > /dev/null +fi + +if [[ $noobs ]]; then + echo "Updating NOOBS..." + + # update Partition 3 + mkdir -p /tmp/p3 + sudo mount /dev/mmcblk0p3 /tmp/p3 + sudo rm -rf /tmp/p3/os/* 2> /dev/null + if grep -q 'Raspple II' /tmp/p3/installed_os.json; then + echo "Downloading Raspple II lite..." + noobsUrl="ivanx.com/rasppleii/files/RasppleII_lite.zip" + noobsOSurl="ivanx.com/rasppleii/noobs-os" + distDir="Raspple_II" + sudo mkdir -p /tmp/p3/os/$distDir + sudo sed -i 's:/Raspbian:/Raspple_II:' /tmp/p3/installed_os.json + sudo wget -qO /tmp/p3/icon.png $noobsOSurl/Raspple_II.png + { wget -qO- $noobsOSurl/slidesAB.tar | sudo tar -C /tmp/p3/os/$distDir -x; } &> /dev/null + else + echo "Downloading NOOBS lite..." + noobsRoot="downloads.raspberrypi.org/NOOBS_lite/images/" + noobsDir=$(wget -qO- $noobsRoot | grep '^ /dev/null + fi + sudo rm -rf /tmp/p3/cache 2> /dev/null + releaseDate=$(wget -qO- $noobsOSurl/os.json | grep 'release_date' | cut -f 4 -d '"') + sudo sed -i 's/"release_date".*$/"release_date" : "'$releaseDate'"/' /tmp/p3/installed_os.json + sudo sed -i 's/keyboard_layout=gb/keyboard_layout=us/' /tmp/p3/noobs.conf + sudo sed -i 's:/mnt/:/settings/:' /tmp/p3/installed_os.json + sudo sed -i 's@"icon".*,@"icon" : "/settings/os/'$distDir'/icon.png",@' /tmp/p3/installed_os.json + sudo cp /tmp/p3/icon.png /tmp/p3/os/$distDir + sudo wget -qO /tmp/p3/os/$distDir/os.json $noobsOSurl/os.json + sudo wget -qO /tmp/p3/os/$distDir/partition_setup.sh $noobsOSurl/partition_setup.sh + sudo wget -qO /tmp/p3/os/$distDir/partitions.json $noobsOSurl/partitions.json + sudo umount /tmp/p3 + rmdir /tmp/p3 + + # update Partition 1 + mkdir -p /tmp/p1 + sudo mount /dev/mmcblk0p1 /tmp/p1 + wget -qO /tmp/noobs_lite.zip $noobsUrl + sudo rm -rf /tmp/p1/* + sudo unzip -d /tmp/p1 /tmp/noobs_lite.zip + sudo sed -i 's/^runinstaller //' /tmp/p1/recovery.cmdline + sudo sed -i 's/silentinstall//' /tmp/p1/recovery.cmdline + grep -q 'keyboard=us' /tmp/p1/recovery.cmdline || sudo sed -i '1 s/^\(.*\)$/\1 keyboard=us/' /tmp/p1/recovery.cmdline + grep -q 'disablesafemode' /tmp/p1/recovery.cmdline || sudo sed -i '1 s/^\(.*\)$/\1 disablesafemode/' /tmp/p1/recovery.cmdline + sudo umount /tmp/p1 + rmdir /tmp/p1 + + sudo sed -i 's/\(Raspple II release.*[^u]$\)/\1u/' /etc/issue +fi + +echo +echo "*** Raspbian update completed. ***" +echo + +cd /tmp + +if [[ $updateA2Cloud ]]; then + wget -qO /tmp/a2cloud-setup ivanx.com/a2cloud/setup/ + source /tmp/a2cloud-setup -y -r noSetGroups + if acmd -g /usr/share/gsport/disks/GSport\ Internet\ Starter\ Kit.2mg SYSTEM/FONTS/SIS.4.10 &> /dev/null; then + wget -qO /tmp/ua2.txt ivanx.com/rasppleii/files/a/ua2.txt + source /tmp/ua2.txt + fi + echo + echo "*** A2CLOUD update completed. ***" + echo +fi + +cd /tmp + +if [[ $updateA2Server ]]; then + wget -q -O /tmp/a2server-setup ivanx.com/a2server/setup/ + if ps aux | grep -q [s]mbd; then + source /tmp/a2server-setup -y -r -w + else + source /tmp/a2server-setup -y -r + fi + echo + echo "*** A2SERVER update completed. ***" + echo +fi + +cd "$origDir" + +if [[ ! $autoYes ]]; then + echo + echo + echo "Your system has been updated and needs to reboot to use its new software." + echo + echo -n "Reboot now (recommended)? " + read + if [[ ${REPLY:0:1} == "Y" || ${REPLY:0:1} == "y" ]]; then + sudo shutdown -r now + fi +else + echo "*** raspbian-update completed. ***" + sudo shutdown -r now +fi diff --git a/scripts/tools/a2server-aliases.txt b/scripts/tools/a2server-aliases.txt index a990860..07c7a7a 100755 --- a/scripts/tools/a2server-aliases.txt +++ b/scripts/tools/a2server-aliases.txt @@ -2,17 +2,17 @@ # vim: set tabstop=4 shiftwidth=4 expandtab filetype=sh: alias a2server-help="more /usr/local/etc/a2server-help.txt" -alias a2server-setup="wget -q -O /tmp/a2server-setup ${A2SERVER_SCRIPT_URL:-http://appleii.ivanx.com/a2server}$([[ "$A2SERVER_SCRIPT_URL" == */ ]] || echo -n "/")setup/ || { echo \"Can't download A2SERVER setup scripts. Do you has internet?\"; false; } && source /tmp/a2server-setup" +alias a2server-setup="wget -q -O /tmp/a2server-setup ${A2SERVER_SCRIPT_URL}setup/index.txt || { echo \"Can't download A2SERVER setup scripts. Do you has internet?\"; false; } && source /tmp/a2server-setup" alias a2server-version="cat /usr/local/etc/A2SERVER-version" -alias a2server-update="wget -q -O /tmp/a2server-update ${A2SERVER_SCRIPT_URL:-http://appleii.ivanx.com/a2server}$([[ "$A2SERVER_SCRIPT_URL" == */ ]] || echo -n "/")update/ || { echo \"Can't download A2SERVER setup scripts. Do you has internet?\"; false; } && source /tmp/a2server-update" +alias a2server-update="wget -q -O /tmp/a2server-update ${A2SERVER_SCRIPT_URL}update/index.txt || { echo \"Can't download A2SERVER setup scripts. Do you has internet?\"; false; } && source /tmp/a2server-update" alias system-shutdown='sudo shutdown -h now' alias system-restart='sudo shutdown -r now' alias raspi-config='[[ -f /usr/bin/raspi-config ]] && sudo /usr/bin/raspi-config || echo "raspi-config not found. Are you using a Raspberry Pi with Raspbian?"' -alias raspbian-update='wget -qO /tmp/raspbian-update ivanx.com/a2server/files/raspbian-update.txt; source /tmp/raspbian-update' +alias raspbian-update='wget -qO /tmp/raspbian-update ${A2SERVER_SCRIPT_URL}scripts/raspbian-update.txt; source /tmp/raspbian-update' alias rasppleii-update='raspbian-update a2cloud a2server' alias welcome-message-edit='sudo nano /etc/motd' diff --git a/scripts/tools/a2serverrc.txt b/scripts/tools/a2serverrc.txt index 30c74fc..4179b11 100755 --- a/scripts/tools/a2serverrc.txt +++ b/scripts/tools/a2serverrc.txt @@ -1,4 +1,6 @@ #! /bin/bash # vim: set tabstop=4 shiftwidth=4 expandtab filetype=sh: +export A2SERVER_SCRIPT_URL="${A2SERVER_SCRIPT_URL:-http://ivanx.com/a2server/}" +export A2SERVER_BINARY_URL="${A2SERVER_BINARY_URL:-http://ivanx.com/a2server/files/}" source /usr/local/etc/a2server-aliases diff --git a/setup/index.txt b/setup/index.txt index 13e61bd..e347f19 100755 --- a/setup/index.txt +++ b/setup/index.txt @@ -4,30 +4,41 @@ # A2SERVER master setup script, last update 17-Nov-15 # it downloads and executes several scripts related to the setup of # netatalk configured for Apple II use on Debian or Raspbian. -# more info is at http://appleii.ivanx.com/a2server +# more info is at http://ivanx.com/a2server # to download and execute, type: -# wget appleii.ivanx.com/a2server/setup; source setup +# wget ivanx.com/a2server/setup; source setup -a2serverVersion="128d3" +a2serverVersion="128" # Ensure URL we'll use ends in a / case "$A2SERVER_SCRIPT_URL" in */) scriptURL="$A2SERVER_SCRIPT_URL" ;; - *) scriptURL="${A2SERVER_SCRIPT_URL:-http://appleii.ivanx.com/a2server}/" ;; + *) scriptURL="${A2SERVER_SCRIPT_URL:-http://ivanx.com/a2server}/" ;; esac +case "$A2SERVER_BINARY_URL" in + */) binaryURL="$A2SERVER_BINARY_URL" ;; + *) binaryURL="${A2SERVER_BINARY_URL:-http://ivanx.com/a2server/files}/" ;; +esac +useExternalURL=1 +[[ $A2SERVER_NO_EXTERNAL ]] && useExternalURL= isRpi= [[ -f /usr/bin/raspi-config ]] && isRpi=1 isDebian= -[[ ( -f /etc/debian_version ) && ( $(cut -c 1-2 < /etc/debian_version) == "7." ) && ( $(uname -m) == "i686" ) ]] && isDebian=1 +lsb_release -a 2> /dev/null | grep -q 'Distributor ID:.Debian' && [[ ( -f /etc/debian_version ) && ( $(cut -c 1 < /etc/debian_version) -ge "7" ) ]] && isDebian=1 if [[ -f /usr/local/etc/A2SERVER-version ]]; then echo "A2SERVER version available: $a2serverVersion" echo "A2SERVER version installed: $(cat /usr/local/etc/A2SERVER-version)" fi +echo +[[ $scriptURL != *"ivanx.com"* ]] && echo "Using script URL: $scriptURL" +[[ $binaryURL != *"ivanx.com"* ]] && echo "Using binary URL: $binaryURL" +[[ ! $useExternalURL ]] && echo -e "Not using external URLs. Payloads must be in:\n ${binaryURL}external\n (See A2SERVER developer page for more information.)" + skipRepoUpdate= autoAnswerYes= setupNetBoot= @@ -78,7 +89,7 @@ done if [[ $updateRasppleII ]]; then echo "A2SERVER: Updating Raspple II (takes up to an hour)..." - wget -qO /tmp/raspbian-update "http://appleii.ivanx.com/a2server/files/raspbian-update.txt" + wget -qO /tmp/raspbian-update "${A2SERVER_SCRIPT_URL}scripts/raspbian-update.txt" source /tmp/raspbian-update a2cloud a2server $autoAnswerYes $skipRepoUpdate [[ $0 == "-bash" ]] && return 0 || exit 0 fi @@ -100,19 +111,33 @@ if [[ $isRpi ]]; then #supported Raspbian? (16-Feb-15, 20-Jun-14, 09-Jan-14, etc fwsupported="-8aca5762- -462f3e3f476f7b6- -c32bc633039cd9- -9d34d0475f9- -d4f5315cfac4e- -6f4a90c8cb8817f- -5dd9b4962e- -17c8799375- -960832a6c2590635216c296b6ee0bebf67b21d50-" - [[ "$fwsupported" == *-$fwhash-* ]] && unsupportedOS=0 - [[ ($fwhash == "8aca5762") || ($fwhash == "462f3e3f476f7b6") || ($fwhash == "c32bc633039cd9") || ($fwhash == "9d34d0475f9") || ($fwhash == "d4f5315cfac4e") || ($fwhash == "6f4a90c8cb8817f") || ($fwhash == "5dd9b4962e") || ($fwhash == "17c8799375") ]] && unsupportedOS=0 -elif [[ "$(lsb_release -rs 2> /dev/null)" == "7.3" || "$(lsb_release -rs 2> /dev/null)" == "7.6" || "$(lsb_release -rs 2> /dev/null)" == "7.8" ]]; then # tested Debian? - unsupportedOS=0 + [[ "$fwsupported" == *-$fwhash-* ]] && unsupportedOS= + # [[ ($fwhash == "8aca5762") || ($fwhash == "462f3e3f476f7b6") || ($fwhash == "c32bc633039cd9") || ($fwhash == "9d34d0475f9") || ($fwhash == "d4f5315cfac4e") || ($fwhash == "6f4a90c8cb8817f") || ($fwhash == "5dd9b4962e") || ($fwhash == "17c8799375") ]] && unsupportedOS= +elif [[ $isDebian ]]; then # supported Debian? + debianVersion=$(cat /etc/debian_version) + debianSupported="-8.2- -7.9- -7.8- -7.6- -7.3-" + [[ $debianSupported == *-$debianVersion-* ]] && unsupportedOS= fi -if (( unsupportedOS )); then +if [[ $unsupportedOS && $isRpi ]]; then echo - echo "WARNING: A2SERVER and its installer scripts have not been tested on this" - echo "operating system version. Continuing is probably fine, but might not be." + echo "A2SERVER and its installer scripts have been tested on Raspbian Wheezy and" + echo "Jessie, though not this specific firmware version ($fwhash). Just FYI." + unsupportedOS= +elif [[ $unsupportedOS && $isDebian ]]; then + echo + echo "A2SERVER and its installer scripts have been tested on Debian 7 and 8," + echo "though not this specific point release ($debianVersion). Just FYI." + unsupportedOS= +fi + +if [[ $unsupportedOS ]]; then + echo + echo "WARNING: A2SERVER and its installer scripts have only been tested on" + echo "Debian and Raspbian. Continuing is probably fine, but might not be." echo "Worst case could make your operating system no longer work properly," echo "or cause data to be lost." - echo "More information is at http://appleii.ivanx.com/a2server." + echo "More information is at http://ivanx.com/a2server." fi doSetup=1 @@ -132,7 +157,7 @@ if (( $doSetup )); then echo echo "a2server-setup modifies files and performs actions as the root user." - echo "For details, visit http://appleii.ivanx.com/a2server." + echo "For details, visit http://ivanx.com/a2server." echo if [[ ! $autoAnswerYes ]]; then echo -n "Continue? " @@ -230,7 +255,19 @@ if (( $doSetup )); then echo "On an Apple IIe, it should be accessible via \"Log In\" on the" echo "Workstation Card software. For IIgs users, it should be accessible" echo "via the AppleShare control panel." - echo + if [[ -f /srv/A2SERVER/A2FILES/System/Start.GS.OS ]]; then + echo + echo "You can network boot GS/OS. On a ROM 01 IIgs, set slot 1 or 2, and slot 7," + echo 'to AppleTalk, and Startup Slot to 7 or "Scan". On a ROM 3 IIgs, set' + echo "slot 1 or 2, and startup slot, to AppleTalk." + fi + if [[ -f /srv/A2SERVER/A2FILES/BASIC.System ]]; then + echo + echo "You can network boot ProDOS 8. On an Apple IIe, put your Workstation Card" + echo "in a slot above your disk controller card, or type PR#X with open-apple" + echo "held down, with X being the slot of your Workstation Card." + echo 'On a IIgs, press "8" during the initial procession of periods.' + fi echo echo "A2SERVER setup is complete! Go connect from your Apple II!" echo diff --git a/update/index.txt b/update/index.txt index e2b18a0..f62580a 100755 --- a/update/index.txt +++ b/update/index.txt @@ -4,7 +4,7 @@ # Ensure URL we'll use ends in a / case "$A2SERVER_SCRIPT_URL" in */) scriptURL="$A2SERVER_SCRIPT_URL" ;; - *) scriptURL="${A2SERVER_SCRIPT_URL:-http://appleii.ivanx.com/a2server}/" ;; + *) scriptURL="${A2SERVER_SCRIPT_URL:-http://ivanx.com/a2server}/" ;; esac currentVersion=$(wget -qO- "${scriptURL}setup/index.txt" | grep '^a2serverVersion' | cut -d '"' -f 2) diff --git a/update/versionhistory.txt b/update/versionhistory.txt index 8bb76ab..9fabdb2 100644 --- a/update/versionhistory.txt +++ b/update/versionhistory.txt @@ -51,7 +51,7 @@ 1.2.4: Jul 2015: offer to download A2CLOUD disk contents onto A2FILES volume 1.2.4+:Oct 2015: support for using A2SERVER scripts from a location other than - appleii.ivanx.com/a2server for development purposes + ivanx.com/a2server for development purposes [not released] 1.2.5: Nov 2015: netboot install option for GS/OS 6.0.2/3 @@ -80,5 +80,12 @@ fixes and tweaks [not released] -128d1: Dec 2015: moved /media/A2SHARED to /srv/A2SERVER +1.2.8: Dec 2015: moved /media/A2SHARED to /srv/A2SERVER + macipgw installed + files subdirectory reorganized + 64-bit Debian binaries + A2SERVER_SCRIPT_URL now works everywhere + A2SERVER_BINARY_URL can now be specified + self-hosted binaries fallback, or preferred with A2SERVER_NO_EXTERNAL + better information at start and end of install [not released]