4 Commits

Author SHA1 Message Date
Ivan X
4fb47b06ed documentation updates 2020-07-15 07:02:11 -07:00
Ivan X
a615ed1808 initial Buster compatibility 2020-07-15 06:06:44 -07:00
Ivan X
5e0feab69c support for Debian and Raspbian Stretch
suppress null byte read warnings in Bash 4.4
enable SSH server on Raspberry Pi if disabled
Internet Archive backup URL's for external downloads, where possible
compiles AppleTalk kernel if -c flag is specified, rather than downloading
better cleanup after AppleTalk kernel compile
notification if AppleTalk kernel module doesn't load
fixed download links for communication software
fixed bugs possibly preventing compile of macipgw and ciopfs
fixed minor bugs during initial setup prompts
os option (Raspbian update) removed from a2server-setup
2017-11-26 16:37:44 -05:00
Ivan X
a3a7a9479d set internal version to 1.5.1; expanded version history 2017-10-29 05:21:55 -04:00
15 changed files with 318 additions and 213 deletions

View File

@@ -1,5 +1,6 @@
# A2SERVER # A2SERVER
AppleTalk server for Apple // computers developed by Ivan Drucker AppleTalk server for Apple // computers developed by Ivan Drucker, with
substantial rework and by T. Joseph Carter
Documentation here is sparse for the moment; see [Ivan's site]() for Documentation here is sparse for the moment; see [Ivan's site]() for
information about A2SERVER and how it all works. There's a lot there and it's information about A2SERVER and how it all works. There's a lot there and it's
@@ -13,7 +14,14 @@ relatively modern piece of it. As such they should be preserved as they are.
## Developer note ## Developer note
To use the scripts on your own server, including your local machine: To use the scripts with a specific GitHub tag:
~~~ bash
export A2SERVER_SCRIPT_URL=https://raw.githubusercontent.com/RasppleII/a2server/TAG_GOES_HERE/
export A2SERVER_BINARY_URL=${A2SERVER_SCRIPT_URL}files
wget -O setup ${A2SERVER_SCRIPT_URL}setup/index.txt; source setup
~~~
Or, to use the scripts on your own server, including your local machine:
~~~ bash ~~~ bash
export A2SERVER_SCRIPT_URL=http://yoururl.com/ export A2SERVER_SCRIPT_URL=http://yoururl.com/

View File

@@ -23,15 +23,14 @@ wget -O files/external/appleii/PPPX.1.3d4.SHK http://www.apple2.org/marinetti/PP
wget -O files/external/appleii/dsk2file.shk http://www.dwheeler.com/6502/oneelkruns/dsk2file.zip wget -O files/external/appleii/dsk2file.shk http://www.dwheeler.com/6502/oneelkruns/dsk2file.zip
wget -O files/external/appleii/gshk11.sea http://www.nulib.com/library/gshk11.sea wget -O files/external/appleii/gshk11.sea http://www.nulib.com/library/gshk11.sea
wget -O files/external/appleii/shrinkit.sdk http://www.nulib.com/library/shrinkit.sdk wget -O files/external/appleii/shrinkit.sdk http://www.nulib.com/library/shrinkit.sdk
wget -O files/external/appleii/spectrum_gold_2mg.zip http://www.speccie.co.uk/speccie/software/spectrum_gold_2mg.zip wget -O files/external/appleii/spectrum_gold_2mg.zip http://speccie.uk/speccie/downloads/spectrum_gold_2mg.zip
wget -O files/external/appleii/uthernet2ll.bxy http://www.speccie.co.uk/speccie/software/uthernet2ll.bxy wget -O files/external/appleii/uthernet2ll.bxy http://speccie.uk/speccie/downloads/uthernet2ll.bxy
wget -O files/external/appleii/uthernetll.bxy http://www.speccie.co.uk/speccie/software/uthernetll.bxy wget -O files/external/appleii/uthernetll.bxy http://speccie.uk/speccie/downloads/uthernetll.bxy
unset safeUrl samUrl snapUrl safeVer samVer snapVer unset safeUrl samUrl snapUrl
html=$(wget -qO- http://speccie.co.uk/speccie/Site/Download_Centre_files/widget1_markup.html) safeUrl=$(wget -qO- http://speccie.uk/software/safe2/ | grep -i 'safe2.*bxy' | tr '<>' '\n' | grep href | cut -d '=' -f 2 | tr -d '"')
safeUrl=$(echo "$html" | grep -i 'safe2.*bxy' | tr '<>' '\n' | grep href | cut -d '=' -f 2 | tr -d '"') samUrl=$(wget -qO- http://speccie.uk/software/sam2/ | grep -i 'sam2.*bxy' | tr '<>' '\n' | grep href | cut -d '=' -f 2 | tr -d '"')
samUrl=$(echo "$html" | grep -i 'sam2.*bxy' | tr '<>' '\n' | grep href | cut -d '=' -f 2 | tr -d '"') snapUrl=$(wget -qO- http://speccie.uk/software/snap/ | grep -i 'snap.*bxy' | tr '<>' '\n' | grep href | cut -d '=' -f 2 | tr -d '"')
snapUrl=$(echo "$html" | grep -i 'snap.*bxy' | tr '<>' '\n' | grep href | cut -d '=' -f 2 | tr -d '"')
wget -O files/external/appleii/safe2.bxy "$safeUrl" wget -O files/external/appleii/safe2.bxy "$safeUrl"
wget -O files/external/appleii/sam2.bxy "$samUrl" wget -O files/external/appleii/sam2.bxy "$samUrl"
wget -O files/external/appleii/snap.bxy "$snapUrl" wget -O files/external/appleii/snap.bxy "$snapUrl"
@@ -39,7 +38,7 @@ wget -O files/external/appleii/snap.bxy "$snapUrl"
for gsosInstall in {1..3}; do for gsosInstall in {1..3}; do
activeDisk=0 activeDisk=0
mkdir -p files/external/appleii/gsos60${gsosInstall} mkdir -p files/external/appleii/gsos60${gsosInstall}
diskNames=( Install System.Disk SystemTools1 SystemTools2 Fonts synthLAB ) diskNames=( Install System.Disk SystemTools1 SystemTools2 Fonts synthLAB )
if (( $gsosInstall == 1 )); then if (( $gsosInstall == 1 )); then
gsosURL="http://download.info.apple.com/Apple_Support_Area/Apple_Software_Updates/English-North_American/Apple_II/Apple_IIGS_System_6.0.1/" gsosURL="http://download.info.apple.com/Apple_Support_Area/Apple_Software_Updates/English-North_American/Apple_II/Apple_IIGS_System_6.0.1/"

View File

@@ -66,13 +66,13 @@ atalk_startup() {
echo -n " atalkd" echo -n " atalkd"
fi fi
# prepare startup of file services # prepare startup of file services
if [ "x$CNID_METAD_RUN" = "xyes" -a -x /usr/local/sbin/cnid_metad ] ; then if [ "x$CNID_METAD_RUN" = "xyes" -a -x /usr/local/sbin/cnid_metad ] ; then
echo -n " cnid_metad" echo -n " cnid_metad"
/usr/local/sbin/cnid_metad $CNID_CONFIG /usr/local/sbin/cnid_metad $CNID_CONFIG
fi fi
if [ x"$AFPD_RUN" = x"yes" ]; then if [ x"$AFPD_RUN" = x"yes" ]; then
/usr/local/sbin/afpd $AFPD_UAMLIST -g $AFPD_GUEST -c $AFPD_MAX_CLIENTS \ /usr/local/sbin/afpd $AFPD_UAMLIST -g $AFPD_GUEST -c $AFPD_MAX_CLIENTS \
-n "$ATALK_NAME$ATALK_ZONE" -n "$ATALK_NAME$ATALK_ZONE"
@@ -111,12 +111,12 @@ case "$1" in
echo -n " cnid_metad" echo -n " cnid_metad"
start-stop-daemon --stop --quiet --oknodo --exec /usr/local/sbin/cnid_metad start-stop-daemon --stop --quiet --oknodo --exec /usr/local/sbin/cnid_metad
if test -x /usr/local/sbin/papd; then if test -x /usr/local/sbin/papd; then
echo -n " papd" echo -n " papd"
start-stop-daemon --stop --quiet --oknodo --exec /usr/local/sbin/papd start-stop-daemon --stop --quiet --oknodo --exec /usr/local/sbin/papd
fi fi
if test -x /usr/local/sbin/timelord; then if test -x /usr/local/sbin/timelord; then
echo -n " timelord" echo -n " timelord"
start-stop-daemon --stop --quiet --oknodo --exec /usr/local/sbin/timelord start-stop-daemon --stop --quiet --oknodo --exec /usr/local/sbin/timelord
@@ -126,10 +126,10 @@ case "$1" in
echo -n " atalkd" echo -n " atalkd"
start-stop-daemon --stop --quiet --oknodo --exec /usr/local/sbin/atalkd start-stop-daemon --stop --quiet --oknodo --exec /usr/local/sbin/atalkd
fi fi
echo "." echo "."
;; ;;
restart) restart)
$0 force-reload $0 force-reload
;; ;;
@@ -144,7 +144,7 @@ case "$1" in
echo "done." echo "done."
fi fi
;; ;;
*) *)
echo "Usage: $0 {start|stop|restart|force-reload}" >&2 echo "Usage: $0 {start|stop|restart|force-reload}" >&2
exit 1 exit 1

View File

@@ -22,7 +22,7 @@ if [[ ${REPLY:0:1} == "y" || ${REPLY:0:1} == "Y" ]]; then
echo -n "Press return to continue..."; read; echo echo -n "Press return to continue..."; read; echo
ls -1 /dev/sd? > /tmp/sd2 2> /dev/null ls -1 /dev/sd? > /tmp/sd2 2> /dev/null
# if exactly one drive has been inserted, exit loop # if exactly one drive has been inserted, exit loop
if { ! diff /tmp/sd1 /tmp/sd2 &> /dev/null; }; then if { ! diff /tmp/sd1 /tmp/sd2 &> /dev/null; }; then
# files are different, get dev name # files are different, get dev name
@@ -47,9 +47,9 @@ if [[ ${REPLY:0:1} == "y" || ${REPLY:0:1} == "Y" ]]; then
echo "No SD card found. Trying again..." echo "No SD card found. Trying again..."
echo echo
fi fi
done done
mkdir -p /tmp/sd mkdir -p /tmp/sd
sudo mount ${devName}6 /tmp/sd sudo mount ${devName}6 /tmp/sd
@@ -92,7 +92,7 @@ if [[ ${REPLY:0:1} == "y" || ${REPLY:0:1} == "Y" ]]; then
fi fi
done <<< "$(ls -1 /tmp/sd/lib/modules | sort -V)" done <<< "$(ls -1 /tmp/sd/lib/modules | sort -V)"
sudo umount /tmp/sd sudo umount /tmp/sd
echo kern:$kernelReplaced echo kern:$kernelReplaced
if [[ $kernelReplaced ]]; then if [[ $kernelReplaced ]]; then
echo echo
@@ -104,7 +104,7 @@ if [[ ${REPLY:0:1} == "y" || ${REPLY:0:1} == "Y" ]]; then
echo echo
echo "Okey doke. Half done. Remove your SD card, and put it back in your Pi." 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." echo "After it boots, log in and type 'a2server-setup' to complete the fix."
fi fi
echo "See the A2SERVER web site at http://ivanx.com/a2server for more help." 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 "(You can type 'sudo shutdown -h now' if you're done on this machine.)"
echo echo

View File

@@ -12,7 +12,7 @@ if [[ -d /media/A2SHARED ]]; then
sudo mv /media/A2SHARED /srv/A2SERVER sudo mv /media/A2SHARED /srv/A2SERVER
sudo sed -i 's|/media/A2SHARED|/srv/A2SERVER|g' /usr/local/etc/netatalk/AppleVolumes.default sudo sed -i 's|/media/A2SHARED|/srv/A2SERVER|g' /usr/local/etc/netatalk/AppleVolumes.default
[[ -f /etc/samba/smbd.conf ]] && sudo sed -i 's|/media/A2SHARED|/srv/A2SERVER|g' /etc/samba/smbd.conf [[ -f /etc/samba/smbd.conf ]] && sudo sed -i 's|/media/A2SHARED|/srv/A2SERVER|g' /etc/samba/smbd.conf
fi fi
# skip if we're already set up # skip if we're already set up

View File

@@ -34,7 +34,9 @@ fi
debianName= debianName=
if [[ $debianVersion ]]; then if [[ $debianVersion ]]; then
debianMajor=$(cut -d . -f 1 <<< $debianVersion) debianMajor=$(cut -d . -f 1 <<< $debianVersion)
if [[ $debianMajor == "8" ]]; then if [[ $debianMajor == "9" ]]; then
debianName="stretch"
elif [[ $debianMajor == "8" ]]; then
debianName="jessie" debianName="jessie"
elif [[ $debianMajor == "7" ]]; then elif [[ $debianMajor == "7" ]]; then
debianName="wheezy" debianName="wheezy"
@@ -62,7 +64,7 @@ if ! hash nulib2 &> /dev/null; then
if [[ $arch && ! -f /tmp/a2server-compileAlways ]]; then if [[ $arch && ! -f /tmp/a2server-compileAlways ]]; then
{ wget -qO- "${binaryURL}precompiled/nulib2-3.1.0a2-${arch}.tgz" | sudo tar Pzx; } &> /dev/null { wget -qO- "${binaryURL}precompiled/nulib2-3.1.0a2-${arch}.tgz" | sudo tar Pzx; } &> /dev/null
fi fi
if ! hash nulib2 &> /dev/null; then if ! hash nulib2 &> /dev/null; then
if [[ ! -f /tmp/a2server-packageReposUpdated ]]; then if [[ ! -f /tmp/a2server-packageReposUpdated ]]; then
@@ -124,7 +126,7 @@ if ! hash unar &> /dev/null; then
sudo apt-get -y install unar sudo apt-get -y install unar
sudo apt-get clean sudo apt-get clean
fi fi
if ! hash unar &> /dev/null; then if ! hash unar &> /dev/null; then
if [[ $arch && ! -f /tmp/a2server-compileAlways ]]; then if [[ $arch && ! -f /tmp/a2server-compileAlways ]]; then
# Dependencies: for unar # Dependencies: for unar

View File

@@ -16,12 +16,12 @@
# Ensure URL we'll use ends in a / # Ensure URL we'll use ends in a /
case "$A2SERVER_SCRIPT_URL" in case "$A2SERVER_SCRIPT_URL" in
*/) scriptURL="$A2SERVER_SCRIPT_URL" ;; */) scriptURL="$A2SERVER_SCRIPT_URL" ;;
*) scriptURL="${A2SERVER_SCRIPT_URL:-https://raw.githubusercontent.com/RasppleII/a2server/current}/" ;; *) scriptURL="${A2SERVER_SCRIPT_URL:-https://raw.githubusercontent.com/RasppleII/a2server/current}/" ;;
esac esac
case "$A2SERVER_BINARY_URL" in case "$A2SERVER_BINARY_URL" in
*/) binaryURL="$A2SERVER_BINARY_URL" ;; */) binaryURL="$A2SERVER_BINARY_URL" ;;
*) binaryURL="${A2SERVER_BINARY_URL:-http://ivanx.com/a2server/files}/" ;; *) binaryURL="${A2SERVER_BINARY_URL:-http://ivanx.com/a2server/files}/" ;;
esac esac
useExternalURL=1 useExternalURL=1
[[ $A2SERVER_NO_EXTERNAL ]] && useExternalURL= [[ $A2SERVER_NO_EXTERNAL ]] && useExternalURL=
@@ -44,7 +44,11 @@ fi
debianName= debianName=
if [[ $debianVersion ]]; then if [[ $debianVersion ]]; then
debianMajor=$(cut -d . -f 1 <<< $debianVersion) debianMajor=$(cut -d . -f 1 <<< $debianVersion)
if [[ $debianMajor == "8" ]]; then if [[ $debianMajor == "10" ]]; then
debianName="buster"
elif [[ $debianMajor == "9" ]]; then
debianName="stretch"
elif [[ $debianMajor == "8" ]]; then
debianName="jessie" debianName="jessie"
elif [[ $debianMajor == "7" ]]; then elif [[ $debianMajor == "7" ]]; then
debianName="wheezy" debianName="wheezy"
@@ -53,21 +57,29 @@ if [[ $debianVersion ]]; then
fi fi
fi fi
# enable SSH (disabled by default in Raspbian from late 2016 onward)
if [[ $isRpi && $debianMajor -ge 8 ]] && ! ps aux | grep -q '[s]shd'; then
echo "A2SERVER: Enabling ssh access..."
sudo systemctl enable ssh &> /dev/null && sudo systemctl start ssh &> /dev/null
else
echo "A2SERVER: ssh access is already enabled."
fi
# skip this if already done # skip this if already done
if [[ -f /usr/local/etc/A2SERVER-version ]] && (( $(head -c 3 /usr/local/etc/A2SERVER-version) >= 101 )); then if [[ -f /usr/local/etc/A2SERVER-version ]] && (( $(head -c 3 /usr/local/etc/A2SERVER-version) >= 101 )); then
echo "A2SERVER: Netatalk is already installed." echo "A2SERVER: Netatalk is already installed."
else else
echo "A2SERVER: Installing Netatalk (this will take a while)..." echo "A2SERVER: Installing Netatalk (this will take a while)..."
# stop Netatalk and samba if running (during upgrade) # stop Netatalk and samba if running (during upgrade)
if [[ $(ps --no-headers -C afpd) ]]; then if [[ $(ps --no-headers -C afpd) ]]; then
sudo /etc/init.d/netatalk stop &> /dev/null sudo /etc/init.d/netatalk stop &> /dev/null
sudo /etc/init.d/samba stop &> /dev/null sudo /etc/init.d/samba stop &> /dev/null
fi fi
if [[ ! -f /tmp/a2server-packageReposUpdated ]]; then if [[ ! -f /tmp/a2server-packageReposUpdated ]]; then
# prepare for installing packages # prepare for installing packages
sudo apt-get -y update sudo apt-get -y update
@@ -75,7 +87,7 @@ else
fi fi
# not being used as of 1.2.9, but it's available if full URL to .deb package is supplied # not being used as of 1.2.9, but it's available if full URL to .deb package is supplied
getOldPackage () { getOldPackage () {
for url in $@; do for url in $@; do
pkgFile=${url##*/} pkgFile=${url##*/}
pkgName=${pkgFile%%_*} pkgName=${pkgFile%%_*}
@@ -100,47 +112,81 @@ else
if [[ $(apt-cache search '^libdb5.1$') ]]; then # Wheezy if [[ $(apt-cache search '^libdb5.1$') ]]; then # Wheezy
# Dependencies: netatalk 2.2.4 # Dependencies: netatalk 2.2.4
sudo apt-get -y install libdb5.1 sudo apt-get -y install libdb5.1
elif [[ $(apt-cache search '^libdb5.3$') ]]; then # Jessie elif [[ $(apt-cache search '^libdb5.3$') ]]; then # Jessie or Stretch
# Dependencies: netatalk 2.2.4 # Dependencies: netatalk 2.2.4
sudo apt-get -y install libdb5.3 sudo apt-get -y install libdb5.3
else else
break break
fi fi
if [[ $(apt-cache search '^libssl1.0.0$') ]]; then if [[ $(apt-cache search '^libssl1.0.0$') ]]; then # Wheezy or Jessie
# Dependencies: netatalk 2.2.4 # Dependencies: netatalk 2.2.4
sudo apt-get -y install libssl1.0.0 sudo apt-get -y install libssl1.0.0
elif [[ $(apt-cache search '^libssl1.0.2$') ]]; then # Stretch
# Dependencies: netatalk 2.2.4
sudo apt-get -y install libssl1.0.2
elif [[ $(apt-cache search '^libssl1.1$') ]]; then # Buster
# Dependencies: netatalk 2.2.4
echo "deb http://deb.debian.org/debian/ oldstable main" | sudo tee -a /etc/apt/sources.list > /dev/null
sudo apt-get -y update
sudo apt-get -y install libssl1.0.2
sudo sed -i '$d' /etc/apt/sources.list
sudo apt-get -y update
else else
break break
fi fi
if [[ $(apt-cache search '^libgcrypt11$') ]]; then # Wheezy if [[ $(apt-cache search '^libgcrypt11$') ]]; then # Wheezy
# Dependencies: netatalk 2.2.4 # Dependencies: netatalk 2.2.4
sudo apt-get -y install libgcrypt11 sudo apt-get -y install libgcrypt11
elif [[ $(apt-cache search '^libgcrypt20$') ]]; then # Jessie elif [[ $(apt-cache search '^libgcrypt20$') ]]; then # Jessie, Stretch, Buster
# Dependencies: netatalk 2.2.4 # Dependencies: netatalk 2.2.4
sudo apt-get -y install libgcrypt20 sudo apt-get -y install libgcrypt20
else else
break break
fi fi
# install Netatalk # install Netatalk
if [[ $arch && ! -f /tmp/a2server-compileAlways ]]; then if [[ $arch && ! -f /tmp/a2server-compileAlways ]]; then
{ wget -qO- "${binaryURL}precompiled/netatalk224-${arch}_${debianName}.tgz" | sudo tar Pzx; } &> /dev/null { wget -qO- "${binaryURL}precompiled/netatalk226-${arch}_${debianName}.tgz" | sudo tar Pzx; } &> /dev/null
fi fi
sudo mandb &> /dev/null sudo mandb &> /dev/null
[[ -f /usr/local/sbin/atalkd ]] && compileFromSource= [[ -f /usr/local/sbin/atalkd ]] && compileFromSource=
break break
done done
if [[ $compileFromSource ]]; then if [[ $compileFromSource ]]; then
# Dependencies: build-deps for netatalk 2.2.4 # Dependencies: build-deps for netatalk 2.2.4
sudo apt-get -y install build-essential libssl-dev sudo apt-get -y install build-essential
if [[ $(dpkg -l | grep libssl-dev | tr -s ' ' | cut -d ' ' -f 3 | cut -c 1-3) == "1.1" ]]; then
echo "A2SERVER: WARNING: libssl-dev 1.1 is already installed; removing."
sudo apt-get -y purge libssl-dev
sudo apt -y autoremove
fi
if [[ $(apt-cache search '^libssl1.0-dev$') ]]; then # Stretch
# Dependencies: build-deps for netatalk 2.2.4
sudo apt-get -y install libssl1.0-dev
else # Jessie or Wheezy (libssl-dev 1.0.x) or Buster (absent)
if [[ $(apt-cache madison libssl-dev | grep '^libssl' | head -1 | cut -d '|' -f 2 | tr -d ' ' | cut -c 1-3) == "1.1" ]]; then # Buster, so pull from Stretch
echo "deb http://deb.debian.org/debian/ oldstable main" | sudo tee -a /etc/apt/sources.list > /dev/null
sudo apt-get -y update
sudo apt-get -y install libssl1.0.dev
sudo sed -i '$d' /etc/apt/sources.list
sudo apt-get -y update
else # Jessie or Wheezy
# Dependencies: build-deps for netatalk 2.2.4
sudo apt-get -y install libssl-dev
fi
fi
if [[ $(apt-cache search '^libdb5.1-dev$') ]]; then # Wheezy if [[ $(apt-cache search '^libdb5.1-dev$') ]]; then # Wheezy
# Dependencies: build-deps for netatalk 2.2.4 # Dependencies: build-deps for netatalk 2.2.4
sudo apt-get -y install libdb5.1-dev sudo apt-get -y install libdb5.1-dev
elif [[ $(apt-cache search '^libdb5.3-dev$') ]]; then # Jessie elif [[ $(apt-cache search '^libdb5.3-dev$') ]]; then # Jessie, Stretch, Buster
# Dependencies: build-deps for netatalk 2.2.4 # Dependencies: build-deps for netatalk 2.2.4
sudo apt-get -y install libdb5.3-dev sudo apt-get -y install libdb5.3-dev
else else
@@ -148,21 +194,30 @@ else
# Dependencies: build-deps for netatalk 2.2.4 # Dependencies: build-deps for netatalk 2.2.4
sudo apt-get -y install libdb-dev sudo apt-get -y install libdb-dev
fi fi
if [[ $(apt-cache search '^libgcrypt11-dev$') ]]; then # Jessie or Wheezy
if [[ $(apt-cache search '^libgcrypt11-dev$') ]]; then # Stretch, Jessie or Wheezy
# Dependencies: build-deps for netatalk 2.2.4 # Dependencies: build-deps for netatalk 2.2.4
sudo apt-get -y install libgcrypt11-dev sudo apt-get -y install libgcrypt11-dev
elif [[ $(apt-cache search '^libgcrypt20-dev$') ]]; then # Buster
# Dependencies: build-deps for netatalk 2.2.4
echo "deb http://deb.debian.org/debian/ oldstable main" | sudo tee -a /etc/apt/sources.list > /dev/null
sudo apt-get -y update
sudo apt-get -y install libgcrypt11-dev
sudo sed -i '$d' /etc/apt/sources.list
sudo apt-get -y update
else else
echo "A2SERVER: WARNING: unknown version of libgcrypt-dev is being installed." echo "A2SERVER: WARNING: unknown version of libgcrypt-dev is being installed."
# Dependencies: build-deps for netatalk 2.2.4 # Dependencies: build-deps for netatalk 2.2.4
sudo apt-get -y install $(apt-cache search '^libgcrypt.*dev$' | sort -r | head -1 | cut -d ' ' -f 1) sudo apt-get -y install $(apt-cache search '^libgcrypt.*dev$' | sort -r | head -1 | cut -d ' ' -f 1)
fi fi
sudo apt-get clean
sudo apt-get clean
# get Netatalk # get Netatalk
rm -rf /tmp/netatalk &> /dev/null rm -rf /tmp/netatalk &> /dev/null
mkdir /tmp/netatalk mkdir /tmp/netatalk
cd /tmp/netatalk cd /tmp/netatalk
if [[ $useExternalURL ]]; then 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" 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 tar zxf netatalk-2.2.4.tar.gz &> /dev/null
@@ -172,7 +227,7 @@ else
tar zxf netatalk-2.2.4.tar.gz &> /dev/null tar zxf netatalk-2.2.4.tar.gz &> /dev/null
fi fi
cd netatalk-2.2.4 cd netatalk-2.2.4
# Patch the source so file dates are preserved during a GS/OS folder copy, # Patch the source so file dates are preserved during a GS/OS folder copy,
# and the AsanteTalk bridge consistently starts up in AppleTalk Phase 2 # and the AsanteTalk bridge consistently starts up in AppleTalk Phase 2
# and the Dayna bridge doesn't crash GS/OS # and the Dayna bridge doesn't crash GS/OS
@@ -185,11 +240,11 @@ else
# uninstall Netatalk if already installed # uninstall Netatalk if already installed
[[ -f /usr/local/sbin/afpd ]] && sudo make uninstall [[ -f /usr/local/sbin/afpd ]] && sudo make uninstall
# compile and install Netatalk # compile and install Netatalk
make make
sudo make install sudo make install
# to remove the Netatalk source code (optional), type: # to remove the Netatalk source code (optional), type:
cd cd
rm -rf /tmp/netatalk rm -rf /tmp/netatalk
@@ -199,11 +254,11 @@ fi
# --- Install MacIPgw # --- Install MacIPgw
if ! hash macipgw &> /dev/null; then if ! hash macipgw &> /dev/null; then
echo "A2SERVER: Installing TCP over AppleTalk (MacIP)..." echo "A2SERVER: Installing TCP over AppleTalk (MacIP)..."
if [[ $arch && ! -f /tmp/a2server-compileAlways ]]; then if [[ $arch && ! -f /tmp/a2server-compileAlways ]]; then
{ wget -qO- "${binaryURL}precompiled/macipgw-${arch}.tgz" | sudo tar Pzx; } 2> /dev/null { wget -qO- "${binaryURL}precompiled/macipgw-${arch}.tgz" | sudo tar Pzx; } 2> /dev/null
fi fi
if ! hash macipgw &> /dev/null; then if ! hash macipgw &> /dev/null; then
wd="$PWD" wd="$PWD"
sudo apt-get -y install build-essential sudo apt-get -y install build-essential
@@ -215,7 +270,7 @@ if ! hash macipgw &> /dev/null; then
unzip macipgw.zip 2> /dev/null unzip macipgw.zip 2> /dev/null
rm macipgw.zip &> /dev/null rm macipgw.zip &> /dev/null
fi fi
if [[ ! -d macipgw-master ]]; then if [ ! -d macipgw* ]; then
wget -qO macipgw.zip "${binaryURL}external/source/macipgw.zip" wget -qO macipgw.zip "${binaryURL}external/source/macipgw.zip"
unzip macipgw.zip 2> /dev/null unzip macipgw.zip 2> /dev/null
rm macipgw.zip &> /dev/null rm macipgw.zip &> /dev/null
@@ -229,7 +284,7 @@ if ! hash macipgw &> /dev/null; then
else else
echo "A2SERVER: TCP over AppleTalk (MacIP) has already been installed." echo "A2SERVER: TCP over AppleTalk (MacIP) has already been installed."
fi fi
# --- Configuring Netatalk # --- Configuring Netatalk
echo "A2SERVER: Configuring Netatalk..." echo "A2SERVER: Configuring Netatalk..."
@@ -421,11 +476,16 @@ if ! hash ciopfs &> /dev/null; then
cd /tmp/ciopfs cd /tmp/ciopfs
if [[ $useExternalURL ]]; then if [[ $useExternalURL ]]; then
wget -q -O ciopfs-0.4.tar.gz http://www.brain-dump.org/projects/ciopfs/ciopfs-0.4.tar.gz wget -q -O ciopfs-0.4.tar.gz http://www.brain-dump.org/projects/ciopfs/ciopfs-0.4.tar.gz
if (( $? != 0 )); then
wget -q -O ciopfs-0.4.tar.gz http://web.archive.org/web/20160911102924/http://www.brain-dump.org/projects/ciopfs/ciopfs-0.4.tar.gz
fi
tar zxf ciopfs-0.4.tar.gz &> /dev/null tar zxf ciopfs-0.4.tar.gz &> /dev/null
rm ciopfs-0.4.tar.gz &> /dev/null
fi fi
if [ ! -f ciopfs*/ciopfs.c ]; then # single brackets required for glob if [ ! -f ciopfs*/ciopfs.c ]; then # single brackets required for glob
wget -q -O ciopfs-0.4.tar.gz ${binaryURL}external/source/ciopfs-0.4.tar.gz wget -q -O ciopfs-0.4.tar.gz ${binaryURL}external/source/ciopfs-0.4.tar.gz
tar zxf ciopfs-0.4.tar.gz &> /dev/null tar zxf ciopfs-0.4.tar.gz &> /dev/null
rm ciopfs-0.4.tar.gz &> ?dev/null
fi fi
cd ciopfs* cd ciopfs*
make make
@@ -448,7 +508,7 @@ if [[ ! -d /srv/A2SERVER/A2FILES/.AppleDesktop ]]; then
mkdir .AppleDesktop mkdir .AppleDesktop
fi fi
# set up ADTDISKS share (ADTPro disk image folder, if A2CLOUD is installed) # set up ADTDISKS share (ADTPro disk image folder, if A2CLOUD is installed)
# classic Mac OS file names are allowed (31 chars, mixed case, everything but colons) # classic Mac OS file names are allowed (31 chars, mixed case, everything but colons)
if [[ -d /usr/local/adtpro/disks ]]; then # A2CLOUD/ADTPro installed if [[ -d /usr/local/adtpro/disks ]]; then # A2CLOUD/ADTPro installed
if [[ ! -d /srv/A2SERVER/ADTDISKS ]]; then if [[ ! -d /srv/A2SERVER/ADTDISKS ]]; then
@@ -479,7 +539,7 @@ else
echo echo
echo "A2SERVER: Setting up AFP password 'apple2' for Apple II and Mac clients..." echo "A2SERVER: Setting up AFP password 'apple2' for Apple II and Mac clients..."
# echo "A2SERVER: Enter 'apple2' or another password of up to eight characters." # echo "A2SERVER: Enter 'apple2' or another password of up to eight characters."
echo echo
# set registered user login using RandNum authentication # set registered user login using RandNum authentication
sudo afppasswd -c sudo afppasswd -c
sudo sed -i "s/^\(${USER}\).*$/\1:6170706C65320000:****************:********/" /usr/local/etc/netatalk/afppasswd sudo sed -i "s/^\(${USER}\).*$/\1:6170706C65320000:****************:********/" /usr/local/etc/netatalk/afppasswd
@@ -529,7 +589,7 @@ if [[ -f "/lib/modules/$kernelRelease/kernel/drivers/net/appletalk/ipddp.ko" ]];
sudo mv /lib/modules/$kernelRelease/kernel/net/appletalk/appletalk.ko /tmp 2> /dev/null sudo mv /lib/modules/$kernelRelease/kernel/net/appletalk/appletalk.ko /tmp 2> /dev/null
if [[ ${arch%_*} == "debian" ]]; then if [[ ! $compileFromSource && ${arch%_*} == "debian" ]]; then
echo "A2SERVER: Fetching AppleTalk kernel module for Debian..." echo "A2SERVER: Fetching AppleTalk kernel module for Debian..."
wget -qO /tmp/appletalk.tgz ${binaryURL}precompiled/appletalk-$kernelRelease-${arch}.tgz wget -qO /tmp/appletalk.tgz ${binaryURL}precompiled/appletalk-$kernelRelease-${arch}.tgz
if [[ $? -eq 0 ]]; then if [[ $? -eq 0 ]]; then
@@ -542,9 +602,12 @@ if [[ -f "/lib/modules/$kernelRelease/kernel/drivers/net/appletalk/ipddp.ko" ]];
sudo sed -i "s/ATALKD_RUN=no/ATALKD_RUN=yes/" /etc/default/netatalk sudo sed -i "s/ATALKD_RUN=no/ATALKD_RUN=yes/" /etc/default/netatalk
sudo /etc/init.d/netatalk restart &> /dev/null sudo /etc/init.d/netatalk restart &> /dev/null
else else
echo "A2SERVER: failed to load AppleTalk kernel module"
# if we didn't load it successfully, remove it # if we didn't load it successfully, remove it
sudo rm /lib/modules/$kernelRelease/kernel/net/appletalk/appletalk.ko 2> /dev/null sudo rm /lib/modules/$kernelRelease/kernel/net/appletalk/appletalk.ko 2> /dev/null
fi fi
else # download failed, so premade kernel not found, remove empty file
rm /tmp/appletalk.tgz 2>/dev/null
fi fi
fi fi
@@ -562,6 +625,7 @@ if [[ -f "/lib/modules/$kernelRelease/kernel/drivers/net/appletalk/ipddp.ko" ]];
[[ -f /boot/config-$kernelRelease ]] || break [[ -f /boot/config-$kernelRelease ]] || break
sudo apt-get -y install linux-headers-$kernelRelease linux-source-$kernelMajorMinor || break sudo apt-get -y install linux-headers-$kernelRelease linux-source-$kernelMajorMinor || break
sudo apt-get -y install build-essential sudo apt-get -y install build-essential
sudo apt-get -y install libelf-dev # required as of kernel 4.14.12, apparently
cd /usr/src cd /usr/src
kernelSrc=$(find linux-source-${kernelMajorMinor}*) kernelSrc=$(find linux-source-${kernelMajorMinor}*)
if [[ ${kernelSrc##*.} == "xz" ]]; then if [[ ${kernelSrc##*.} == "xz" ]]; then
@@ -592,6 +656,7 @@ if [[ -f "/lib/modules/$kernelRelease/kernel/drivers/net/appletalk/ipddp.ko" ]];
sudo rm /usr/src/$kernelSrc sudo rm /usr/src/$kernelSrc
sudo rm -r /usr/src/linux-source-$kernelMajorMinor sudo rm -r /usr/src/linux-source-$kernelMajorMinor
sudo apt-get -y purge linux-source-$kernelMajorMinor sudo apt-get -y purge linux-source-$kernelMajorMinor
sudo apt -y autoremove
done done
fi fi
@@ -625,8 +690,8 @@ echo "A2SERVER: Netatalk is installed, configured, and running."
echo echo
# if atalkd isn't running (no AppleTalk), and this is a Rasbperry Pi: # if atalkd isn't running (no AppleTalk), and this is a Rasbperry Pi:
if [[ ( ! $(ps aux | grep [a]talkd) ) && ( $isRpi ) ]]; then if [[ ( ! $(ps aux | grep [a]talkd) ) && ( $isRpi ) ]]; then
# if AppleTalk module exists, try to load it # if AppleTalk module exists, try to load it
if [[ -f /lib/modules/$kernelRelease/kernel/net/appletalk/appletalk.ko ]]; then # module present, but not loaded? if [[ -f /lib/modules/$kernelRelease/kernel/net/appletalk/appletalk.ko ]]; then # module present, but not loaded?
sudo depmod sudo depmod

View File

@@ -30,6 +30,7 @@ diskToolsP8Dir=$p8Dir/Disk.Tools.P8
commDir="/srv/A2SERVER/A2FILES/Comm" commDir="/srv/A2SERVER/A2FILES/Comm"
gsosURL="http://download.info.apple.com/Apple_Support_Area/Apple_Software_Updates/English-North_American/Apple_II/Apple_IIGS_System_6.0.1/" gsosURL="http://download.info.apple.com/Apple_Support_Area/Apple_Software_Updates/English-North_American/Apple_II/Apple_IIGS_System_6.0.1/"
# alernate: http://web.archive.org/web/20080907081050/http://download.info.apple.com/Apple_Support_Area/Apple_Software_Updates/English-North_American/Apple_II/Apple_IIGS_System_6.0.1/
gsosBackupURL="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_IIGS_System_6.0.1%2F" gsosBackupURL="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_IIGS_System_6.0.1%2F"
# --- bashByter library routines # --- bashByter library routines
@@ -88,7 +89,7 @@ checkP8YearTables () {
return $? return $?
} }
updateP8YearTables () { updateP8YearTables () {
# JC: Geoff Body and Andrew Roughan helped Joseph Carter with this one # JC: Geoff Body and Andrew Roughan helped Joseph Carter with this one
# Update ProDOS 8 year table (and spalsh date because may as well) # Update ProDOS 8 year table (and spalsh date because may as well)
# Effectively, we're turning p8 into the 6.0.2 or 6.0.3 version here. # Effectively, we're turning p8 into the 6.0.2 or 6.0.3 version here.
@@ -128,18 +129,18 @@ updateP8YearTables () {
files=("p8" "ProDOS16 Image" "Apple :2f:2fe Boot Blocks" "$gsosDir/System/P8") files=("p8" "ProDOS16 Image" "Apple :2f:2fe Boot Blocks" "$gsosDir/System/P8")
offset1=(3958 7030 7071 3958) # splash screen date offset1=(3958 7030 7071 3958) # splash screen date
offset2=(38 3110 79 38) # year table offset2=(38 3110 79 38) # year table
i=0 i=0
if [[ $check ]]; then if [[ $check ]]; then
# check if patched -- we're not actually doing this any more; we're always patching # check if patched -- we're not actually doing this any more; we're always patching
patched=0 # 0 is true in this case since it's the return value patched=0 # 0 is true in this case since it's the return value
while (( $i < ${#files[@]} )); do while (( $i < ${#files[@]} )); do
[[ ! -f "${files[$i]}" ]] && { (( i++ )); continue; } [[ ! -f "${files[$i]}" ]] && { (( i++ )); continue; }
if [[ ! $patch1 || $patch1 != $(sudo dd if="${files[$i]}" skip=${offset1[$i]} bs=1 count=7 2> /dev/null) ]]; then if [[ ! $patch1 || $patch1 != $(sudo dd if="${files[$i]}" skip=${offset1[$i]} bs=1 count=7 2> /dev/null | tr -d '\0') ]]; then
patched=1 # 1 is false patched=1 # 1 is false
break break
fi fi
if [[ ! $patch2 || $patch2 != $(sudo dd if="${files[$i]}" skip=${offset2[$i]} bs=1 count=9 2> /dev/null) ]]; then if [[ ! $patch2 || $patch2 != $(sudo dd if="${files[$i]}" skip=${offset2[$i]} bs=1 count=9 2> /dev/null | tr -d '\0') ]]; then
patched=1 # 1 is false patched=1 # 1 is false
break break
fi fi
@@ -156,7 +157,7 @@ updateP8YearTables () {
patched=0 # 0 is true patched=0 # 0 is true
fi fi
return $patched return $patched
# echo -n -e "\xb0\xb2\xad\xc1\xf5\xe7\xad\xb1\xb5" | sudo dd of="p8" bs=38 seek=1 conv=notrunc 2> /dev/null # echo -n -e "\xb0\xb2\xad\xc1\xf5\xe7\xad\xb1\xb5" | sudo dd of="p8" bs=38 seek=1 conv=notrunc 2> /dev/null
# echo -n -e "\x12\x11\x0b\x10\x0f\x0e\x0d" | sudo dd of="p8" bs=3958 seek=1 conv=notrunc 2> /dev/null # echo -n -e "\x12\x11\x0b\x10\x0f\x0e\x0d" | sudo dd of="p8" bs=3958 seek=1 conv=notrunc 2> /dev/null
# echo -n -e "\xb0\xb2\xad\xc1\xf5\xe7\xad\xb1\xb5" | sudo dd of="ProDOS16 Image" bs=3110 seek=1 conv=notrunc 2> /dev/null # echo -n -e "\xb0\xb2\xad\xc1\xf5\xe7\xad\xb1\xb5" | sudo dd of="ProDOS16 Image" bs=3110 seek=1 conv=notrunc 2> /dev/null
@@ -191,17 +192,17 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
else else
echo "A2SERVER is already set up to boot Apple II computers over the network." echo "A2SERVER is already set up to boot Apple II computers over the network."
fi fi
fi fi
if [[ $autoAnswerYes || ${REPLY:0:1} == "Y" || ${REPLY:0:1} == "y" ]]; then if [[ $autoAnswerYes || ${REPLY:0:1} == "Y" || ${REPLY:0:1} == "y" ]]; then
nbmode=1 nbmode=1
echo echo
sudo true sudo true
mkdir -p /tmp/netboot mkdir -p /tmp/netboot
rm -r /tmp/netboot/* 2> /dev/null rm -r /tmp/netboot/* 2> /dev/null
cd /tmp/netboot cd /tmp/netboot
# this will get "Disk 7" (Apple II Setup) as a raw (block dump) image # this will get "Disk 7" (Apple II Setup) as a raw (block dump) image
if [[ ! -f /usr/local/etc/netatalk/a2boot/ProDOS16\ Boot\ Blocks ]] \ if [[ ! -f /usr/local/etc/netatalk/a2boot/ProDOS16\ Boot\ Blocks ]] \
|| [[ ! -f /usr/local/etc/netatalk/a2boot/ProDOS16\ Image ]] \ || [[ ! -f /usr/local/etc/netatalk/a2boot/ProDOS16\ Image ]] \
@@ -210,7 +211,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
|| [[ ! -f /usr/local/etc/netatalk/a2boot/Basic.System ]]; then || [[ ! -f /usr/local/etc/netatalk/a2boot/Basic.System ]]; then
echo "A2SERVER: Downloading Apple II Boot Blocks..." echo "A2SERVER: Downloading Apple II Boot Blocks..."
cd /tmp/netboot cd /tmp/netboot
if [[ $useExternalURL ]]; then 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 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 unar -k skip Disk_7_of_7-Apple_II_Setup.sea.bin &> /dev/null
@@ -225,7 +226,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
fi fi
truncate -s 819284 'Disk 7 of 7-Apple II Setup.sea' 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 dd if='Disk 7 of 7-Apple II Setup.sea' of=APPLE2SETUP.HDV bs=84 skip=1 2> /dev/null
mkdir -p a2setup mkdir -p a2setup
sudo mount -t hfs -o ro,loop APPLE2SETUP.HDV a2setup sudo mount -t hfs -o ro,loop APPLE2SETUP.HDV a2setup
sudo mkdir -p /usr/local/etc/netatalk/a2boot sudo mkdir -p /usr/local/etc/netatalk/a2boot
@@ -233,8 +234,8 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
sudo cp -p a2setup/System\ Folder/* /usr/local/etc/netatalk/a2boot sudo cp -p a2setup/System\ Folder/* /usr/local/etc/netatalk/a2boot
sudo umount a2setup sudo umount a2setup
sudo mv /usr/local/etc/netatalk/a2boot/Apple* /usr/local/etc/netatalk/a2boot/'Apple :2f:2fe Boot Blocks' sudo mv /usr/local/etc/netatalk/a2boot/Apple* /usr/local/etc/netatalk/a2boot/'Apple :2f:2fe Boot Blocks'
cd /usr/local/etc/netatalk/a2boot cd /usr/local/etc/netatalk/a2boot
# thanks to Geoff Body for these Boot Blocks patches # thanks to Geoff Body for these Boot Blocks patches
# fix cleartext password login bug # fix cleartext password login bug
echo -n -e "\xA8\xA2\x01\xBD\x80\x38\x99\xA0\x38\xC8\xE8\xE0\x09\x90\xF4" | \ echo -n -e "\xA8\xA2\x01\xBD\x80\x38\x99\xA0\x38\xC8\xE8\xE0\x09\x90\xF4" | \
@@ -248,7 +249,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
sudo dd of='ProDOS16 Image' bs=1661 seek=1 conv=notrunc 2> /dev/null sudo dd of='ProDOS16 Image' bs=1661 seek=1 conv=notrunc 2> /dev/null
fi fi
echo "A2SERVER: Boot Blocks have been installed." echo "A2SERVER: Boot Blocks have been installed."
# get a2server-tools if necessary # get a2server-tools if necessary
if [[ ! -f /usr/local/bin/mkatinit ]] \ if [[ ! -f /usr/local/bin/mkatinit ]] \
|| [[ ! -f /usr/local/bin/afptype ]] \ || [[ ! -f /usr/local/bin/afptype ]] \
@@ -261,12 +262,12 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
/tmp/2.tools /tmp/2.tools
rm /tmp/2.tools rm /tmp/2.tools
fi fi
# put BASIC.SYSTEM at root for ProDOS 8 startup # put BASIC.SYSTEM at root for ProDOS 8 startup
cp -p /usr/local/etc/netatalk/a2boot/Basic.System $gsosDir/BASIC.System cp -p /usr/local/etc/netatalk/a2boot/Basic.System $gsosDir/BASIC.System
afpsync -v $gsosDir > /dev/null afpsync -v $gsosDir > /dev/null
afptype -p SYS -q $gsosDir/BASIC.System afptype -p SYS -q $gsosDir/BASIC.System
# create tools for setting GS/OS or ProDOS 8 boot in battery RAM and rebooting. Props yet again to Geoff Body. # create tools for setting GS/OS or ProDOS 8 boot in battery RAM and rebooting. Props yet again to Geoff Body.
if [[ ! -f $p8Dir/NETBOOT.P8 ]]; then if [[ ! -f $p8Dir/NETBOOT.P8 ]]; then
echo echo
@@ -287,7 +288,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
afpsync -v $gsosDir > /dev/null afpsync -v $gsosDir > /dev/null
afptype -p SYS -q $gsosDir/NETBOOT.GSOS afptype -p SYS -q $gsosDir/NETBOOT.GSOS
fi fi
mkatinit -gs -d -f # GS/OS registered user and Guest starts up with SYSTEM/FINDER mkatinit -gs -d -f # GS/OS registered user and Guest starts up with SYSTEM/FINDER
mkatinit -d -f guest # ProDOS 8 Guest starts up with BASIC.SYSTEM (no registered user) mkatinit -d -f guest # ProDOS 8 Guest starts up with BASIC.SYSTEM (no registered user)
@@ -329,7 +330,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
afpsync &> /dev/null afpsync &> /dev/null
echo echo
break break
fi fi
fi fi
else else
gsosInstall=1 gsosInstall=1
@@ -363,7 +364,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
[[ $autoAnswerYes ]] && gsosVersion=1 [[ $autoAnswerYes ]] && gsosVersion=1
if [[ $REPLY == "1" || $REPLY == "2" || $REPLY == "3" ]]; then if [[ $REPLY == "1" || $REPLY == "2" || $REPLY == "3" ]]; then
gsosInstall=$REPLY gsosInstall=$REPLY
if [[ gsosInstall -gt 1 ]]; then if [[ gsosInstall -gt 1 ]]; then
updateP8YearTables updateP8YearTables
fi fi
@@ -379,7 +380,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
mkdir -p $imagesDir mkdir -p $imagesDir
mkdir -p $netInstallDir mkdir -p $netInstallDir
activeDisk=0 activeDisk=0
diskNames=( Install System.Disk SystemTools1 SystemTools2 Fonts synthLAB ) diskNames=( Install System.Disk SystemTools1 SystemTools2 Fonts synthLAB )
if (( $gsosInstall == 1 )); then if (( $gsosInstall == 1 )); then
: :
@@ -390,12 +391,12 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
elif (( $gsosInstall == 3 )); then elif (( $gsosInstall == 3 )); then
gsosURL="ftp://ftp.apple.asimov.net/pub/apple_II/images/gs/os/gsos/Apple_IIGS_System_6.0.3/" gsosURL="ftp://ftp.apple.asimov.net/pub/apple_II/images/gs/os/gsos/Apple_IIGS_System_6.0.3/"
fi fi
# delete previously downloaded installer # delete previously downloaded installer
rm "$imagesDir/* $imagesDir/.AppleDouble"/* 2> /dev/null rm "$imagesDir/* $imagesDir/.AppleDouble"/* 2> /dev/null
rm "$netInstallDir/* $netInstallDir/.AppleDouble"/* 2> /dev/null rm "$netInstallDir/* $netInstallDir/.AppleDouble"/* 2> /dev/null
afpsync -v $gsosDir > /dev/null afpsync -v $gsosDir > /dev/null
for diskname in ${diskNames[@]}; do for diskname in ${diskNames[@]}; do
outfile="$imagesDir/$diskname.po" outfile="$imagesDir/$diskname.po"
(( activeDisk++ )) (( activeDisk++ ))
@@ -434,9 +435,9 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
done done
rm *.sea* &> /dev/null rm *.sea* &> /dev/null
sed -i "s/\([^\\]\r:\)/\1A2FILES:GSOS.Installer:Net.Install:/g" $netInstallDir/Install/Scripts/* sed -i "s/\([^\\]\r:\)/\1A2FILES:GSOS.Installer:Net.Install:/g" $netInstallDir/Install/Scripts/*
afpsync -v $gsosDir > /dev/null afpsync -v $gsosDir > /dev/null
# install GS/OS # install GS/OS
# spec for GS/OS installer scripts: GS/OS Tech Note #64 # spec for GS/OS installer scripts: GS/OS Tech Note #64
# http://www.1000bit.it/support/manuali/apple/technotes/iigs/tn.iigs.064.html # http://www.1000bit.it/support/manuali/apple/technotes/iigs/tn.iigs.064.html
@@ -463,7 +464,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
targetFile=${targetPath##*/} targetFile=${targetPath##*/}
sourceParent=${sourcePath%/*} sourceParent=${sourcePath%/*}
sourceFile=${sourcePath##*/} sourceFile=${sourcePath##*/}
if [[ $action == 1 || $action == 2 ]]; then if [[ $action == 1 || $action == 2 ]]; then
mkdir -p $targetParent mkdir -p $targetParent
echo "copying: $sourcePathMixed" echo "copying: $sourcePathMixed"
@@ -484,12 +485,12 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
done done
unset IFS unset IFS
} }
mkdir -p /tmp/netboot mkdir -p /tmp/netboot
rm -r /tmp/netboot/* 2> /dev/null rm -r /tmp/netboot/* 2> /dev/null
cd /tmp/netboot cd /tmp/netboot
echo "A2SERVER: Preparing GS/OS installer scripts..." echo "A2SERVER: Preparing GS/OS installer scripts..."
# work through installer scripts # work through installer scripts
echo "Script: Install.Sys.File" echo "Script: Install.Sys.File"
processScript $netInstallDir/Install/Scripts/Instal.Sys.File processScript $netInstallDir/Install/Scripts/Instal.Sys.File
@@ -503,14 +504,14 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
processScript $netInstallDir/Install/Scripts/Appleshare processScript $netInstallDir/Install/Scripts/Appleshare
echo "Script: Server.Sys.File" echo "Script: Server.Sys.File"
processScript $netInstallDir/Install/Scripts/Server.Sys.File processScript $netInstallDir/Install/Scripts/Server.Sys.File
# sync netatalk database # sync netatalk database
afpsync -v $gsosDir > /dev/null afpsync -v $gsosDir > /dev/null
else else
gsosInstall= gsosInstall=
fi fi
fi fi
# if [[ ! $autoAnswerYes && (! $gsosInstall || $gsosInstall -lt 2) ]] && ! checkP8YearTables 603; then # if [[ ! $autoAnswerYes && (! $gsosInstall || $gsosInstall -lt 2) ]] && ! checkP8YearTables 603; then
# echo # echo
# echo -n "Do you want to update the ProDOS 8 Thunderclock year table? " # echo -n "Do you want to update the ProDOS 8 Thunderclock year table? "
@@ -556,11 +557,11 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
fi fi
if [[ $gsosInstalled ]]; then if [[ $gsosInstalled ]]; then
if [[ $autoAnswerYes || ${REPLY:0:1} == "Y" || ${REPLY:0:1} == "y" ]]; then if [[ $autoAnswerYes || ${REPLY:0:1} == "Y" || ${REPLY:0:1} == "y" ]]; then
# download image tools and put them in IMAGE.TOOLS # download image tools and put them in IMAGE.TOOLS
echo "A2SERVER: Downloading GS/OS disk image utilities..." echo "A2SERVER: Downloading GS/OS disk image utilities..."
mkdir -p $imageToolsDir mkdir -p $imageToolsDir
# get Asimov2 (for GS/OS) # get Asimov2 (for GS/OS)
echo -n "Asimov 2.0" echo -n "Asimov 2.0"
if [[ -f $imageToolsDir/Asimov ]]; then if [[ -f $imageToolsDir/Asimov ]]; then
@@ -570,6 +571,9 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
cd /tmp/netboot cd /tmp/netboot
if [[ $useExternalURL ]]; then if [[ $useExternalURL ]]; then
wget -qO Asimov.shk http://www.ninjaforce.com/downloads/Asimov.shk wget -qO Asimov.shk http://www.ninjaforce.com/downloads/Asimov.shk
if (( $? != 0 )); then
wget -qO Asimov.shk http://web.archive.org/web/20160330184627/http://www.ninjaforce.com/downloads/Asimov.shk
fi
nulib2 -x -s Asimov.shk &> /dev/null nulib2 -x -s Asimov.shk &> /dev/null
fi fi
if [[ ! -d Asimov ]]; then if [[ ! -d Asimov ]]; then
@@ -581,7 +585,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
cat Asimov/Asimov_rsrc_ >> $imageToolsDir/.AppleDouble/Asimov cat Asimov/Asimov_rsrc_ >> $imageToolsDir/.AppleDouble/Asimov
afptype -p S16 -q $imageToolsDir/Asimov afptype -p S16 -q $imageToolsDir/Asimov
fi fi
echo -n "GS-ShrinkIt 1.1" echo -n "GS-ShrinkIt 1.1"
# get GS-ShrinkIt # get GS-ShrinkIt
if [[ -f $imageToolsDir/GSHK ]]; then if [[ -f $imageToolsDir/GSHK ]]; then
@@ -607,8 +611,8 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
afptype -p S16 -a DB07 -q $imageToolsDir/GSHK afptype -p S16 -a DB07 -q $imageToolsDir/GSHK
cd /tmp/netboot cd /tmp/netboot
fi fi
echo -n "MountIt 1.4" echo -n "MountIt 1.4"
# get MountIt (for GS/OS) # get MountIt (for GS/OS)
if [[ -f $gsosDir/System/System.Setup/MountIt ]]; then if [[ -f $gsosDir/System/System.Setup/MountIt ]]; then
echo " is already installed." echo " is already installed."
@@ -641,7 +645,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
echo "A2SERVER: Downloading ProDOS 8 disk image utilities..." echo "A2SERVER: Downloading ProDOS 8 disk image utilities..."
mkdir -p $diskToolsP8Dir mkdir -p $diskToolsP8Dir
echo -n "ShrinkIt 3.4" echo -n "ShrinkIt 3.4"
# get ShrinkIt 3.4 (for ProDOS 8) # get ShrinkIt 3.4 (for ProDOS 8)
if [[ -f $diskToolsP8Dir/SHRINKIT ]]; then if [[ -f $diskToolsP8Dir/SHRINKIT ]]; then
@@ -663,7 +667,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
cppo -s -ad "SHRINKIT#000118i" /SHRINKIT/SHRINKIT $diskToolsP8Dir &> /dev/null cppo -s -ad "SHRINKIT#000118i" /SHRINKIT/SHRINKIT $diskToolsP8Dir &> /dev/null
afpsync -v $sharepath > /dev/null afpsync -v $sharepath > /dev/null
fi fi
echo -n "DSK2FILE 5.8" echo -n "DSK2FILE 5.8"
# get DSK2FILE (for ProDOS 8) # get DSK2FILE (for ProDOS 8)
if [[ -f $diskToolsP8Dir/DSK2FILE ]]; then if [[ -f $diskToolsP8Dir/DSK2FILE ]]; then
@@ -673,6 +677,9 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
cd /tmp/netboot cd /tmp/netboot
if [[ $useExternalURL ]]; then if [[ $useExternalURL ]]; then
wget -q -O dsk2file.shk http://www.dwheeler.com/6502/oneelkruns/dsk2file.zip wget -q -O dsk2file.shk http://www.dwheeler.com/6502/oneelkruns/dsk2file.zip
if (( $? != 0 )); then
wget -q -O dsk2file.shk http://web.archive.org/web/20120726132356/http://www.dwheeler.com/6502/oneelkruns/dsk2file.zip
fi
nulib2 -x -s dsk2file.shk &> /dev/null nulib2 -x -s dsk2file.shk &> /dev/null
fi fi
if [[ ! -f DSK2FILE58 ]]; then if [[ ! -f DSK2FILE58 ]]; then
@@ -683,7 +690,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
afpsync -v $sharepath > /dev/null afpsync -v $sharepath > /dev/null
afptype -p SYS -q $diskToolsP8Dir/DSK2FILE afptype -p SYS -q $diskToolsP8Dir/DSK2FILE
fi fi
echo -n "Apple System Utilities 3.1" echo -n "Apple System Utilities 3.1"
if [[ -f $diskToolsP8Dir/SYSUTIL ]]; then if [[ -f $diskToolsP8Dir/SYSUTIL ]]; then
echo " is already installed." echo " is already installed."
@@ -709,7 +716,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
cppo -s -ad A2SYSDISK32.HDV /UTILITIES/UTIL.2 $diskToolsP8Dir &> /dev/null cppo -s -ad A2SYSDISK32.HDV /UTILITIES/UTIL.2 $diskToolsP8Dir &> /dev/null
afpsync -v $sharepath > /dev/null afpsync -v $sharepath > /dev/null
fi fi
fi fi
p8CommInstalled= p8CommInstalled=
@@ -735,7 +742,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
fi fi
fi fi
if [[ $autoAnswerYes || ${REPLY:0:1} == "Y" || ${REPLY:0:1} == "y" ]]; then if [[ $autoAnswerYes || ${REPLY:0:1} == "Y" || ${REPLY:0:1} == "y" ]]; then
echo "A2SERVER: Downloading communications software..." echo "A2SERVER: Downloading communications software..."
mkdir -p $commDir mkdir -p $commDir
@@ -744,17 +751,15 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
unset safeUrl samUrl snapUrl safeVer samVer snapVer unset safeUrl samUrl snapUrl safeVer samVer snapVer
if [[ $useExternalURL ]]; then if [[ $useExternalURL ]]; then
html=$(wget -qO- http://speccie.co.uk/speccie/Site/Download_Centre_files/widget1_markup.html) safeUrl=$(wget -qO- http://speccie.uk/software/safe2/ | grep -i 'safe2.*bxy' | tr '<>' '\n' | grep href | cut -d '=' -f 2 | tr -d '"')
safeUrl=$(echo "$html" | grep -i 'safe2.*bxy' | tr '<>' '\n' | grep href | cut -d '=' -f 2 | tr -d '"') samUrl=$(wget -qO- http://speccie.uk/software/sam2/ | grep -i 'sam2.*bxy' | tr '<>' '\n' | grep href | cut -d '=' -f 2 | tr -d '"')
samUrl=$(echo "$html" | grep -i 'sam2.*bxy' | tr '<>' '\n' | grep href | cut -d '=' -f 2 | tr -d '"') snapUrl=$(wget -qO- http://speccie.uk/software/snap/ | grep -i 'snap.*bxy' | tr '<>' '\n' | grep href | cut -d '=' -f 2 | tr -d '"')
snapUrl=$(echo "$html" | grep -i 'snap.*bxy' | tr '<>' '\n' | grep href | cut -d '=' -f 2 | tr -d '"') safeVer=$(echo $safeUrl | rev | cut -d '/' -f 1 | cut -d '.' -f 2 | rev | cut -c 5- | sed 's/./.&/g' | cut -c 2-)
safeVer=$(echo $safeUrl | rev | cut -d '/' -f 1 | cut -d '.' -f 2 | rev | cut -c 5- | sed 's/./.&/g' | cut -c 2-) samVer=$(echo $samUrl | rev | cut -d '/' -f 1 | cut -d '.' -f 2 | rev | cut -c 4- | sed 's/./.&/g' | cut -c 2-)
samVer=$(echo $samUrl | rev | cut -d '/' -f 1 | cut -d '.' -f 2 | rev | cut -c 4- | sed 's/./.&/g' | cut -c 2-) snapVer=$(echo $snapUrl | rev | cut -d '/' -f 1 | cut -d '.' -f 2 | rev | cut -c 5- | sed 's/./.&/g' | cut -c 2-)
snapVer=$(echo $snapUrl | rev | cut -d '/' -f 1 | cut -d '.' -f 2 | rev | cut -c 5- | sed 's/./.&/g' | cut -c 2-)
spectrumVer=$(echo "$html" | grep 'Spectrum.*Gold.2mg' | tr '<>' '\n' | grep '^Spectrum.*2mg$' | cut -d ' ' -f 2)
fi fi
echo -n "Spectrum $spectrumVer" echo -n "Spectrum"
# get Spectrum # get Spectrum
if [[ -f $commDir/Spectrum/Spectrum ]]; then if [[ -f $commDir/Spectrum/Spectrum ]]; then
echo " is already installed." echo " is already installed."
@@ -768,7 +773,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
mkdir -p /tmp/netboot/spectrum mkdir -p /tmp/netboot/spectrum
cd /tmp/netboot/spectrum cd /tmp/netboot/spectrum
if [[ $useExternalURL ]]; then if [[ $useExternalURL ]]; then
wget -qO spectrum_gold_2mg.zip http://www.speccie.co.uk/speccie/software/spectrum_gold_2mg.zip wget -qO spectrum_gold_2mg.zip http://speccie.uk/speccie/downloads/spectrum_gold_2mg.zip
unzip spectrum_gold_2mg.zip Spectrum.Gold.2mg &> /dev/null unzip spectrum_gold_2mg.zip Spectrum.Gold.2mg &> /dev/null
fi fi
if [[ ! -f Spectrum.Gold.2mg || $(wc -c < Spectrum.Gold.2mg) -eq 0 ]]; then if [[ ! -f Spectrum.Gold.2mg || $(wc -c < Spectrum.Gold.2mg) -eq 0 ]]; then
@@ -777,7 +782,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
fi fi
cppo -s -ad Spectrum.Gold.2mg . &> /dev/null cppo -s -ad Spectrum.Gold.2mg . &> /dev/null
userFolder=$(tr [:lower:] [:upper:] <<< $USER) userFolder=$(tr [:lower:] [:upper:] <<< $USER)
for thisFolder in \ for thisFolder in \
Installer/Extras/CDEvs^System/CDevs \ Installer/Extras/CDEvs^System/CDevs \
Installer/Extras/Tools^System/Tools \ Installer/Extras/Tools^System/Tools \
@@ -816,6 +821,9 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
# TCP/IP update (3.0b8) # TCP/IP update (3.0b8)
if [[ $useExternalURL ]]; then if [[ $useExternalURL ]]; then
wget -qO Marinetti3.0b8.po http://www.a2retrosystems.com/downloads/Marinetti3.0b8.po wget -qO Marinetti3.0b8.po http://www.a2retrosystems.com/downloads/Marinetti3.0b8.po
if (( $? != 0 )); then
wget -qO Marinetti3.0b8.po http://web.archive.org/web/20171105043713/http://a2retrosystems.com/downloads/Marinetti3.0b8.po
fi
fi fi
if [[ $? != 0 || ! -f Marinetti3.0b8.po || $(wc -c < Marinetti3.0b8.po) != "819200" ]]; then if [[ $? != 0 || ! -f Marinetti3.0b8.po || $(wc -c < Marinetti3.0b8.po) != "819200" ]]; then
wget -qO Marinetti3.0b8.po ${binaryURL}external/appleii/Marinetti3.0b8.po wget -qO Marinetti3.0b8.po ${binaryURL}external/appleii/Marinetti3.0b8.po
@@ -827,6 +835,9 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
if [[ $useExternalURL ]]; then if [[ $useExternalURL ]]; then
wget -qO PPPX.1.3d4.SHK http://www.apple2.org/marinetti/PPPX.1.3d4.SHK wget -qO PPPX.1.3d4.SHK http://www.apple2.org/marinetti/PPPX.1.3d4.SHK
fi fi
if (( $? != 0 )); then
wget -qO PPPX.1.3d4.SHK http://web.archive.org/web/20160331231844/http://www.apple2.org/marinetti/PPPX.1.3d4.SHK
fi
if [[ $? != 0 || ! -f PPPX.1.3d4.SHK || $(wc -c < PPPX.1.3d4.SHK) != "22068" ]]; then if [[ $? != 0 || ! -f PPPX.1.3d4.SHK || $(wc -c < PPPX.1.3d4.SHK) != "22068" ]]; then
wget -qO PPPX.1.3d4.SHK ${binaryURL}external/appleii/PPPX.1.3d4.SHK wget -qO PPPX.1.3d4.SHK ${binaryURL}external/appleii/PPPX.1.3d4.SHK
fi fi
@@ -840,7 +851,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
# Uthernet Link Layer # Uthernet Link Layer
if [[ $useExternalURL ]]; then if [[ $useExternalURL ]]; then
wget -qO uthernetll.bxy http://www.speccie.co.uk/speccie/software/uthernetll.bxy wget -qO uthernetll.bxy http://speccie.uk/speccie/downloads/uthernetll.bxy
fi fi
if [[ $? != 0 || ! -f uthernetll.bxy || $(wc -c < uthernetll.bxy) -eq 0 ]]; then if [[ $? != 0 || ! -f uthernetll.bxy || $(wc -c < uthernetll.bxy) -eq 0 ]]; then
wget -qO uthernetll.bxy ${binaryURL}external/appleii/uthernetll.bxy wget -qO uthernetll.bxy ${binaryURL}external/appleii/uthernetll.bxy
@@ -849,7 +860,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
# Uthernet II Link Layer # Uthernet II Link Layer
if [[ $useExternalURL ]]; then if [[ $useExternalURL ]]; then
wget -qO uthernet2ll.bxy http://www.speccie.co.uk/speccie/software/uthernet2ll.bxy wget -qO uthernet2ll.bxy http://speccie.uk/speccie/downloads/uthernet2ll.bxy
fi fi
if [[ $? != 0 || ! -f uthernet2ll.bxy || $(wc -c < uthernet2ll.bxy) -eq 0 ]]; then if [[ $? != 0 || ! -f uthernet2ll.bxy || $(wc -c < uthernet2ll.bxy) -eq 0 ]]; then
wget -qO uthernet2ll.bxy ${binaryURL}external/appleii/uthernet2ll.bxy wget -qO uthernet2ll.bxy ${binaryURL}external/appleii/uthernet2ll.bxy
@@ -871,7 +882,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
mkdir -p /tmp/netboot/safe2 mkdir -p /tmp/netboot/safe2
cd /tmp/netboot/safe2 cd /tmp/netboot/safe2
if [[ $useExternalURL ]]; then if [[ $useExternalURL ]]; then
[[ ! $safeUrl ]] && safeUrl="http://www.speccie.co.uk/speccie/software/safe229.bxy" [[ ! $safeUrl ]] && safeUrl="http://speccie.uk/speccie/downloads/safe230.bxy"
wget -qO safe2.bxy "$safeUrl" wget -qO safe2.bxy "$safeUrl"
cppo -s -ad safe2.bxy . &> /dev/null cppo -s -ad safe2.bxy . &> /dev/null
fi fi
@@ -905,7 +916,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
mkdir -p /tmp/netboot/sam2 mkdir -p /tmp/netboot/sam2
cd /tmp/netboot/sam2 cd /tmp/netboot/sam2
if [[ $useExternalURL ]]; then if [[ $useExternalURL ]]; then
[[ ! $samUrl ]] && samUrl="http://www.speccie.co.uk/speccie/software/sam205.bxy" [[ ! $samUrl ]] && samUrl="http://speccie.uk/speccie/downloads/sam206.bxy"
wget -qO sam2.bxy "$samUrl" wget -qO sam2.bxy "$samUrl"
cppo -s -ad sam2.bxy . &> /dev/null cppo -s -ad sam2.bxy . &> /dev/null
fi fi
@@ -942,7 +953,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
mkdir -p /tmp/netboot/snap mkdir -p /tmp/netboot/snap
cd /tmp/netboot/snap cd /tmp/netboot/snap
if [[ $useExternalURL ]]; then if [[ $useExternalURL ]]; then
[[ ! $snapUrl ]] && snapUrl="http://www.speccie.co.uk/speccie/software/snap118.bxy" [[ ! $snapUrl ]] && snapUrl="http://speccie.uk/speccie/downloads/snap118.bxy"
wget -qO snap.bxy "$snapUrl" wget -qO snap.bxy "$snapUrl"
cppo -s -ad snap.bxy . &> /dev/null cppo -s -ad snap.bxy . &> /dev/null
fi fi
@@ -987,7 +998,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
cd .AppleDouble cd .AppleDouble
mv *PT3* *PROTERM* $commDir/ProTERM/.AppleDouble mv *PT3* *PROTERM* $commDir/ProTERM/.AppleDouble
afpsync -v $gsosDir > /dev/null afpsync -v $gsosDir > /dev/null
fi fi
echo -n "Z-Link 12-15-91" echo -n "Z-Link 12-15-91"
# get A2CLOUD disk and copy from there # get A2CLOUD disk and copy from there
@@ -1002,7 +1013,7 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
cd .AppleDouble cd .AppleDouble
mv Z.LINK $commDir/Z.Link/.AppleDouble mv Z.LINK $commDir/Z.Link/.AppleDouble
afpsync -v $gsosDir > /dev/null afpsync -v $gsosDir > /dev/null
fi fi
echo -n "ADTPro 2.0.1" echo -n "ADTPro 2.0.1"
if [[ -f $commDir/ADTPro/ADTPRO ]]; then if [[ -f $commDir/ADTPro/ADTPRO ]]; then
@@ -1016,23 +1027,23 @@ if [[ ! $autoAnswerYes || -f /tmp/a2server-setupNetBoot ]]; then
cd .AppleDouble cd .AppleDouble
mv *ADTPRO* *VEDRIVE* *VSDRIVE* $commDir/ADTPro/.AppleDouble mv *ADTPRO* *VEDRIVE* *VSDRIVE* $commDir/ADTPro/.AppleDouble
afpsync -v $gsosDir > /dev/null afpsync -v $gsosDir > /dev/null
fi fi
fi fi
# clean up # clean up
cd cd
# rock and roll! # rock and roll!
echo echo
echo echo
if [[ $gsosInstall ]]; then if [[ $gsosInstall ]]; then
echo "GS/OS network boot (for registered user and Guest) and" echo "GS/OS network boot (for registered user and Guest) and"
fi fi
echo "ProDOS 8 network boot (for Guest only) is now configured." echo "ProDOS 8 network boot (for Guest only) is now configured."
echo "See http://ivanx.com/a2server for info using it." echo "See http://ivanx.com/a2server for info using it."
fi fi
REPLY= REPLY=

View File

@@ -71,7 +71,7 @@ def find_slash_pos(day): # 799 REM Finds position of /
for i in range(0,3): # 810 FOR I = 1 TO 3 for i in range(0,3): # 810 FOR I = 1 TO 3
if day[i:i+1] == "/": x = i; break # 820 IF MID$ (DAY$,I,1) = "/" THEN X = I:I = 3 if day[i:i+1] == "/": x = i; break # 820 IF MID$ (DAY$,I,1) = "/" THEN X = I:I = 3
# 830 NEXT I # 830 NEXT I
return x # 840 RETURN return x # 840 RETURN
while True: # 999 REM get the user's input and convert while True: # 999 REM get the user's input and convert
if not day: if not day:
@@ -110,7 +110,7 @@ while True: # 999 REM get the user's input
mo == 2 and mo == 2 and
da > 28): x = -1; continue da > 28): x = -1; continue
input_ok = True input_ok = True
if x != -1: break if x != -1: break
else: dow_str = ""; day = "" else: dow_str = ""; day = ""
while True: while True:

View File

@@ -48,7 +48,7 @@ if [[ \
${partitions[1]:0:14} == "/dev/mmcblk0p2" && ${partitions[1]:57:2} == "85" && ${partitions[1]:0:14} == "/dev/mmcblk0p2" && ${partitions[1]:57:2} == "85" &&
${partitions[2]:0:14} == "/dev/mmcblk0p3" && ${partitions[2]:57:2} == "83" && ${partitions[2]:0:14} == "/dev/mmcblk0p3" && ${partitions[2]:57:2} == "83" &&
${partitions[3]:0:14} == "/dev/mmcblk0p5" && ${partitions[3]:57:2} == " c" && ${partitions[3]:0:14} == "/dev/mmcblk0p5" && ${partitions[3]:57:2} == " c" &&
${partitions[4]:0:14} == "/dev/mmcblk0p6" && ${partitions[4]:57:2} == "83" ]]; then ${partitions[4]:0:14} == "/dev/mmcblk0p6" && ${partitions[4]:57:2} == "83" ]]; then
noobs=" and the NOOBS install manager" noobs=" and the NOOBS install manager"
fi fi
@@ -82,7 +82,7 @@ if [[ ! $noobsOnly ]]; then
{ cd /tmp; sudo apt-get -y autoremove; sudo apt-get -y autoclean; sudo apt-get -y clean; } > /dev/null { 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 }') freeSpace=$(df / | tail -1 | awk '{ print $4 }')
if (( $freeSpace < 400000 )); then if (( $freeSpace < 400000 )); then
if dpkg -l | grep -q wolfram-engine; then if dpkg -l | grep -q wolfram-engine; then
if [[ ! $autoYes ]]; then if [[ ! $autoYes ]]; then
echo "In order to create enough space on your SD card to upgrade," 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 "the Wolfram Language and Mathematica software packages must be removed."
@@ -179,7 +179,7 @@ if [[ $noobs ]]; then
grep -q 'disablesafemode' /tmp/p1/recovery.cmdline || sudo sed -i '1 s/^\(.*\)$/\1 disablesafemode/' /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 sudo umount /tmp/p1
rmdir /tmp/p1 rmdir /tmp/p1
sudo sed -i 's/\(Raspple II release.*[^u]$\)/\1u/' /etc/issue sudo sed -i 's/\(Raspple II release.*[^u]$\)/\1u/' /etc/issue
fi fi

View File

@@ -158,7 +158,7 @@ readchars () {
&& ( $3 -ge 0 ) ]] || return 23; } && ( $3 -ge 0 ) ]] || return 23; }
# args are valid # args are valid
dd if="$1" bs=1 skip=$(($2)) $([[ $3 ]] && echo -n "count=$3") \ dd if="$1" bs=1 skip=$(($2)) $([[ $3 ]] && echo -n "count=$3") \
2> /dev/null 2> /dev/null | tr -d ' \0'
} }
readcharDec () { readcharDec () {
@@ -175,7 +175,7 @@ readcharDec () {
&& ( $2 -ge 0 ) ]] || return 22; } && ( $2 -ge 0 ) ]] || return 22; }
# args are valid # args are valid
charX="$(dd if="$1" bs=1 skip=$(($2)) \ charX="$(dd if="$1" bs=1 skip=$(($2)) \
count=1 2> /dev/null; echo -n X)" count=1 2> /dev/null | tr -d '\0'; echo -n X)"
[[ ${#charX} -gt 1 ]] || { echo -n 0; return 0; } [[ ${#charX} -gt 1 ]] || { echo -n 0; return 0; }
echo -n "${charX:0:1}" | od -t u1 | \ echo -n "${charX:0:1}" | od -t u1 | \
head -1 | sed 's/[0\ ]*//' | tr -d ' \n' head -1 | sed 's/[0\ ]*//' | tr -d ' \n'
@@ -195,7 +195,7 @@ readcharHex () {
&& ( $2 -ge 0 ) ]] || return 22; } && ( $2 -ge 0 ) ]] || return 22; }
# args are valid # args are valid
charX="$(dd if="$1" bs=1 skip=$(($2)) \ charX="$(dd if="$1" bs=1 skip=$(($2)) \
count=1 2> /dev/null; echo -n X)" count=1 2> /dev/null | tr -d '\0'; echo -n X)"
[[ ${#charX} -gt 1 ]] || { echo -n "00"; return 0; } [[ ${#charX} -gt 1 ]] || { echo -n "00"; return 0; }
printf %02X $(echo -n "${charX:0:1}" | od -t u1 | \ printf %02X $(echo -n "${charX:0:1}" | od -t u1 | \
head -1 | sed 's/[0\ ]*//' | tr -d ' \n') head -1 | sed 's/[0\ ]*//' | tr -d ' \n')

View File

@@ -13,7 +13,7 @@ options:
-e : Nulib2-compatible filenames with type/auxtype and resource forks. -e : Nulib2-compatible filenames with type/auxtype and resource forks.
-uc : Copy GS/OS mixed case filenames as uppercase. -uc : Copy GS/OS mixed case filenames as uppercase.
-pro: Adapt DOS 3.3 names to ProDOS and remove addr/len from file data. -pro: Adapt DOS 3.3 names to ProDOS and remove addr/len from file data.
/extract/path examples: /extract/path examples:
/FULL/PRODOS/PATH (ProDOS image source) /FULL/PRODOS/PATH (ProDOS image source)
"MY FILENAME" (DOS 3.3 image source) "MY FILENAME" (DOS 3.3 image source)
@@ -125,7 +125,7 @@ def unixDateToADDate(arg1):
# returns byte position in disk image file # returns byte position in disk image file
def getStartPos(arg1, arg2): def getStartPos(arg1, arg2):
if g.D33: if g.D33:
return (ts(arg1) + (35 * (arg2 % 7)) + 11) return (ts(arg1) + (35 * (arg2 % 7)) + 11)
else: # ProDOS else: # ProDOS
return ( (arg1 * 512) + return ( (arg1 * 512) +
(39 * ((arg2 + (arg2 > 11)) % 13)) + (39 * ((arg2 + (arg2 > 11)) % 13)) +
@@ -154,7 +154,7 @@ def getFileName(arg1, arg2):
for i in range(0, len(fileName)): for i in range(0, len(fileName)):
if (caseMask[i] == "1"): if (caseMask[i] == "1"):
fileName = (fileName[:i] + fileName = (fileName[:i] +
fileName[i:i+1].lower() + fileName[i:i+1].lower() +
fileName[i+1:]) fileName[i+1:])
return fileName return fileName
@@ -208,7 +208,7 @@ def getKeyPointer(arg1, arg2):
start = getStartPos(arg1, arg2) start = getStartPos(arg1, arg2)
if g.D33: if g.D33:
return [readcharDec(g.imageData, start+0), return [readcharDec(g.imageData, start+0),
readcharDec(g.imageData, start+1)] readcharDec(g.imageData, start+1)]
else: # ProDOS else: # ProDOS
return (readcharDec(g.imageData, start+17) + return (readcharDec(g.imageData, start+17) +
readcharDec(g.imageData, start+18)*256) readcharDec(g.imageData, start+18)*256)
@@ -228,7 +228,7 @@ def getFileLength(arg1, arg2):
elif (fileType == 'FC' or fileType == 'FA'): # BAS (A) or INT (I) elif (fileType == 'FC' or fileType == 'FA'): # BAS (A) or INT (I)
# file length is in first two bytes of file data # file length is in first two bytes of file data
return ((readcharDec(g.imageData, ts(fileStart)+0) + return ((readcharDec(g.imageData, ts(fileStart)+0) +
readcharDec(g.imageData, ts(fileStart)+1)*256) + 2) readcharDec(g.imageData, ts(fileStart)+1)*256) + 2)
else: # TXT (T) or other else: # TXT (T) or other
# sadly, we have to walk the whole file # sadly, we have to walk the whole file
# length is determined by sectors in TSlist, minus wherever # length is determined by sectors in TSlist, minus wherever
@@ -338,7 +338,7 @@ def getWorkingDirName(arg1, arg2=None):
for i in range(0, len(workingDirName)): for i in range(0, len(workingDirName)):
if (caseMask[i] == "1"): if (caseMask[i] == "1"):
workingDirName = (workingDirName[:i] + workingDirName = (workingDirName[:i] +
workingDirName[i:i+1].lower() + workingDirName[i:i+1].lower() +
workingDirName[i+1:]) workingDirName[i+1:])
return workingDirName return workingDirName
@@ -399,7 +399,7 @@ def ts(track, sector=None):
if isinstance(sector, type("".encode("L1").decode("L1"))): # hex-ustr if isinstance(sector, type("".encode("L1").decode("L1"))): # hex-ustr
sector = int(sector, 16) sector = int(sector, 16)
return (track*16*256)+(sector*256) return (track*16*256)+(sector*256)
# --- main logic functions # --- main logic functions
def copyFile(arg1, arg2): def copyFile(arg1, arg2):
@@ -409,7 +409,7 @@ def copyFile(arg1, arg2):
# ShrinkIt: directory path / file name # ShrinkIt: directory path / file name
# copies file or dfork to g.outFileData, rfork if any to g.exFileData # copies file or dfork to g.outFileData, rfork if any to g.exFileData
g.activeFileBytesCopied = 0 g.activeFileBytesCopied = 0
if g.SHK: if g.SHK:
with open(os.path.join(arg1, arg2), 'rb') as infile: with open(os.path.join(arg1, arg2), 'rb') as infile:
g.outFileData += infile.read() g.outFileData += infile.read()
@@ -523,7 +523,7 @@ def processEntry(arg1, arg2):
getFileLength(arg1, arg2), getAuxType(arg1, arg2), getFileLength(arg1, arg2), getAuxType(arg1, arg2),
getCreationDate(arg1, arg2), getModifiedDate(arg1, arg2)) getCreationDate(arg1, arg2), getModifiedDate(arg1, arg2))
''' '''
eTargetName = None eTargetName = None
g.exFileData = None g.exFileData = None
g.outFileData = bytearray(b'') g.outFileData = bytearray(b'')
@@ -541,7 +541,7 @@ def processEntry(arg1, arg2):
if (not g.PDOSPATH_INDEX or if (not g.PDOSPATH_INDEX or
g.activeFileName.upper() == g.PDOSPATH_SEGMENT.upper()): g.activeFileName.upper() == g.PDOSPATH_SEGMENT.upper()):
# if ProDOS directory, not file # if ProDOS directory, not file
if (not g.SHK and getStorageType(arg1, arg2) == 13): if (not g.SHK and getStorageType(arg1, arg2) == 13):
if not g.PDOSPATH_INDEX: if not g.PDOSPATH_INDEX:
@@ -620,7 +620,7 @@ def processEntry(arg1, arg2):
writecharsHex(g.exFileData, writecharsHex(g.exFileData,
654, 654,
getFileType(arg1, arg2) + getFileType(arg1, arg2) +
getAuxType(arg1, arg2)) getAuxType(arg1, arg2))
writechars(g.exFileData, 657, b'pdos') writechars(g.exFileData, 657, b'pdos')
saveFile(ADfilePath, g.exFileData) saveFile(ADfilePath, g.exFileData)
touch(saveName, modifiedDate) touch(saveName, modifiedDate)
@@ -632,7 +632,7 @@ def processEntry(arg1, arg2):
(g.extractFile and (g.extractFile and
(g.extractFile.lower() == origFileName.lower()))): (g.extractFile.lower() == origFileName.lower()))):
quitNow(0) quitNow(0)
g.targetName = None g.targetName = None
#else: #else:
#print(g.activeFileName + " doesn't match " + g.PDOSPATH_SEGMENT) #print(g.activeFileName + " doesn't match " + g.PDOSPATH_SEGMENT)
@@ -791,7 +791,7 @@ def binToDec(arg1):
# arg: binary string up to 8 bits # arg: binary string up to 8 bits
# out: decimal value # out: decimal value
return to_dec([arg1]) return to_dec([arg1])
def binToHex(arg1): def binToHex(arg1):
# converts single-byte binary string (8 bits) value to hex # converts single-byte binary string (8 bits) value to hex
# warning: no error checking # warning: no error checking
@@ -994,10 +994,10 @@ def to_bytes(val):
else: else:
raise Exception( raise Exception(
"to_bytes() requires hex-ustr, int/long, or [bin-ustr]") "to_bytes() requires hex-ustr, int/long, or [bin-ustr]")
def shift(items): def shift(items):
"""Shift list items to left, losing the first item. """Shift list items to left, losing the first item.
in : list in : list
out: list out: list
""" """
@@ -1005,7 +1005,7 @@ def shift(items):
items[i] = items[i+1] items[i] = items[i+1]
del items[-1] del items[-1]
return items return items
def s(string): def s(string):
"""Perform local variable substution, e.g. 'total: {num} items'""" """Perform local variable substution, e.g. 'total: {num} items'"""
# http://stackoverflow.com/questions/2960772/ # http://stackoverflow.com/questions/2960772/
@@ -1101,14 +1101,14 @@ while True: # breaks when there are no more arguments starting with dash
if (len(args) == 1): if (len(args) == 1):
usage() usage()
if (slyce(args[1],0,1) != "-"): if (slyce(args[1],0,1) != "-"):
break break
if (args[1] == "-s"): if (args[1] == "-s"):
g.nomsg = 1 g.nomsg = 1
args = args[1:] #shift args = args[1:] #shift
elif (args[1] == "-n"): elif (args[1] == "-n"):
g.nodir = 1 g.nodir = 1
args = args[1:] #shift args = args[1:] #shift
@@ -1121,7 +1121,7 @@ while True: # breaks when there are no more arguments starting with dash
g.AD = 1 g.AD = 1
g.PNAME = 1 g.PNAME = 1
args = args[1:] #shift args = args[1:] #shift
elif (args[1] == "-shk"): elif (args[1] == "-shk"):
g.SHK = 1 g.SHK = 1
args = args[1:] #shift args = args[1:] #shift
@@ -1191,7 +1191,7 @@ else:
if not os.path.isdir(args[2]): if not os.path.isdir(args[2]):
print("Target directory not found.") print("Target directory not found.")
quitNow(2) quitNow(2)
if g.SHK: if g.SHK:
g.PNAME = 0 g.PNAME = 0
if not g.CAT: if not g.CAT:
@@ -1284,7 +1284,7 @@ if g.SHK:
quitNow(0) quitNow(0)
# end script if SHK # end script if SHK
g.imageData = loadFile(g.imageFile) g.imageData = loadFile(g.imageFile)
# detect if image is 2mg and remove 64-byte header if so # detect if image is 2mg and remove 64-byte header if so
@@ -1345,7 +1345,7 @@ if (len(g.imageData) == 143360):
#print("saving fixed order file as outfile.dsk") #print("saving fixed order file as outfile.dsk")
#saveFile("outfile.dsk", g.imageData) #saveFile("outfile.dsk", g.imageData)
#print("saved") #print("saved")
if not prodosDisk and not g.D33: if not prodosDisk and not g.D33:
print("Warning: Unable to determine disk format, assuming ProDOS.") print("Warning: Unable to determine disk format, assuming ProDOS.")

View File

@@ -1,7 +1,7 @@
#! /bin/bash #! /bin/bash
# vim: set tabstop=4 shiftwidth=4 expandtab filetype=sh: # vim: set tabstop=4 shiftwidth=4 expandtab filetype=sh:
# A2SERVER master setup script, last update 17-Nov-15 # A2SERVER master setup script, last update 15-Jul-20
# it downloads and executes several scripts related to the setup of # it downloads and executes several scripts related to the setup of
# netatalk configured for Apple II use on Debian or Raspbian. # netatalk configured for Apple II use on Debian or Raspbian.
# more info is at http://ivanx.com/a2server # more info is at http://ivanx.com/a2server
@@ -9,7 +9,7 @@
# to download and execute, type: # to download and execute, type:
# wget ivanx.com/a2server/setup; source setup # wget ivanx.com/a2server/setup; source setup
a2serverVersion="150" a2serverVersion="153"
# Ensure URL we'll use ends in a / # Ensure URL we'll use ends in a /
case "$A2SERVER_SCRIPT_URL" in case "$A2SERVER_SCRIPT_URL" in
@@ -29,6 +29,7 @@ isRpi=
isDebian= isDebian=
lsb_release -a 2> /dev/null | grep -q 'Distributor ID:.Debian' && [[ ( -f /etc/debian_version ) && ( $(cut -d . -f 1 < /etc/debian_version) -ge "7" ) ]] && isDebian=1 lsb_release -a 2> /dev/null | grep -q 'Distributor ID:.Debian' && [[ ( -f /etc/debian_version ) && ( $(cut -d . -f 1 < /etc/debian_version) -ge "7" ) ]] && isDebian=1
installedVersion=
if [ -f /usr/local/etc/A2SERVER-version ]; then if [ -f /usr/local/etc/A2SERVER-version ]; then
installedVersion="$(cat /usr/local/etc/A2SERVER-version)" installedVersion="$(cat /usr/local/etc/A2SERVER-version)"
fi fi
@@ -46,7 +47,6 @@ installAll=
setupNetBoot= setupNetBoot=
setupWindowsSharing= setupWindowsSharing=
compileAlways= compileAlways=
updateRasppleII=
rm /tmp/a2server-* 2> /dev/null rm /tmp/a2server-* 2> /dev/null
while [[ $1 ]]; do while [[ $1 ]]; do
if [[ $1 == "-r" ]]; then if [[ $1 == "-r" ]]; then
@@ -72,10 +72,6 @@ while [[ $1 ]]; do
shift shift
compileAlways="-c" compileAlways="-c"
touch /tmp/a2server-compileAlways touch /tmp/a2server-compileAlways
elif [[ $1 == "-os" || $1 == "os" ]]; then
# elif [[ ${1,,} == "rasppleii" || ${1,,} == "raspple" || ${1,,} == "rasappleii" || ${1,,} == "rasapple" || ${1,,} == "raspple2" || ${1,,} == "rasapple2" ]]; then
shift
updateRasppleII=1
elif [[ $1 == "-v" ]]; then elif [[ $1 == "-v" ]]; then
shift shift
# Version was already printed # Version was already printed
@@ -89,20 +85,10 @@ while [[ $1 ]]; do
echo "-b: auto-setup network boot (use with -y)" echo "-b: auto-setup network boot (use with -y)"
echo "-w: auto-setup Windows file sharing (use with -y)" echo "-w: auto-setup Windows file sharing (use with -y)"
echo "-c: compile non-package items, rather than downloading binaries" echo "-c: compile non-package items, rather than downloading binaries"
if [[ $isRpi ]]; then
echo "-os: update Raspbian OS, A2CLOUD, A2SERVER, and Apple II Pi"
fi
[[ $0 == "-bash" ]] && return 1 || exit 1 [[ $0 == "-bash" ]] && return 1 || exit 1
fi fi
done done
if [[ $updateRasppleII ]]; then
echo "A2SERVER: Updating Raspple II (takes up to an hour)..."
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
if { [[ -f /usr/local/etc/A2SERVER-version ]] && (( $(head -c 3 /usr/local/etc/A2SERVER-version) < 110 )); }; then if { [[ -f /usr/local/etc/A2SERVER-version ]] && (( $(head -c 3 /usr/local/etc/A2SERVER-version) < 110 )); }; then
echo echo
echo "WARNING: The current A2SERVER installer scripts haven't been tested for" echo "WARNING: The current A2SERVER installer scripts haven't been tested for"
@@ -114,7 +100,7 @@ fi
a2server_update=0 a2server_update=0
doSetup=1 doSetup=1
if { [[ -f /usr/local/etc/A2SERVER-version ]] && (( $(head -c 3 /usr/local/etc/A2SERVER-version) < 150 )); }; then if { [[ -f /usr/local/etc/A2SERVER-version ]] && (( $(head -c 3 /usr/local/etc/A2SERVER-version) < 152 )); }; then
a2server_update=1 a2server_update=1
fi fi
@@ -124,23 +110,25 @@ if [[ $isRpi ]]; then #supported Raspbian? (16-Feb-15, 20-Jun-14, 09-Jan-14, etc
fwsupported="-8aca5762- -462f3e3f476f7b6- -c32bc633039cd9- -9d34d0475f9- fwsupported="-8aca5762- -462f3e3f476f7b6- -c32bc633039cd9- -9d34d0475f9-
-d4f5315cfac4e- -6f4a90c8cb8817f- -5dd9b4962e- -17c8799375- -d4f5315cfac4e- -6f4a90c8cb8817f- -5dd9b4962e- -17c8799375-
-960832a6c2590635216c296b6ee0bebf67b21d50- -960832a6c2590635216c296b6ee0bebf67b21d50-
-2a329e0c7d8ea19c085bac5633aa4fccee0f21be-" -2a329e0c7d8ea19c085bac5633aa4fccee0f21be-
-b2420fc150ae4616f5d9ec24bdaedc630586a529-"
[[ "$fwsupported" == *-$fwhash-* ]] && unsupportedOS= [[ "$fwsupported" == *-$fwhash-* ]] && unsupportedOS=
# [[ ($fwhash == "8aca5762") || ($fwhash == "462f3e3f476f7b6") || ($fwhash == "c32bc633039cd9") || ($fwhash == "9d34d0475f9") || ($fwhash == "d4f5315cfac4e") || ($fwhash == "6f4a90c8cb8817f") || ($fwhash == "5dd9b4962e") || ($fwhash == "17c8799375") ]] && unsupportedOS= # [[ ($fwhash == "8aca5762") || ($fwhash == "462f3e3f476f7b6") || ($fwhash == "c32bc633039cd9") || ($fwhash == "9d34d0475f9") || ($fwhash == "d4f5315cfac4e") || ($fwhash == "6f4a90c8cb8817f") || ($fwhash == "5dd9b4962e") || ($fwhash == "17c8799375") ]] && unsupportedOS=
elif [[ $isDebian ]]; then # supported Debian? elif [[ $isDebian ]]; then # supported Debian?
debianVersion=$(cat /etc/debian_version) debianVersion=$(cat /etc/debian_version)
debianSupported="-8.2- -7.9- -7.8- -7.6- -7.3-" debianSupported="-10.4- -9.2- -8.2- -7.9- -7.8- -7.6- -7.3-"
[[ $debianSupported == *-$debianVersion-* ]] && unsupportedOS= [[ $debianSupported == *-$debianVersion-* ]] && unsupportedOS=
fi fi
if [[ $unsupportedOS && $isRpi ]]; then if [[ $unsupportedOS && $isRpi ]]; then
echo echo
echo "A2SERVER and its installer scripts have been tested on Raspbian Wheezy and" echo "A2SERVER and its installer scripts have been tested on Raspbian Buster,"
echo "Jessie, though not this specific firmware version ($fwhash). Just FYI." echo "Stretch, Jessie, and Wheezy, though not this specific firmware version"
echo "(${fwhash:0:7}). Just FYI."
unsupportedOS= unsupportedOS=
elif [[ $unsupportedOS && $isDebian ]]; then elif [[ $unsupportedOS && $isDebian ]]; then
echo echo
echo "A2SERVER and its installer scripts have been tested on Debian 7 and 8," echo "A2SERVER and its installer scripts have been tested on Debian 7/8/9/10,"
echo "though not this specific point release ($debianVersion). Just FYI." echo "though not this specific point release ($debianVersion). Just FYI."
unsupportedOS= unsupportedOS=
fi fi
@@ -180,34 +168,38 @@ if (( $doSetup )); then
if (( $doSetup )); then if (( $doSetup )); then
userPw=$(sudo grep "^$USER" /etc/shadow | cut -f 2 -d ':') checkPw=1
[[ $userPw == "$(echo 'apple2' | perl -e '$_ = <STDIN>; chomp; print crypt($_, $ARGV[0])' "${userPw%"${userPw#\$*\$*\$}"}")" ]] && isApple2Pw=1 || isApple2Pw= while [[ $checkPw ]] ; do
[[ $userPw == "$(echo 'raspberry' | perl -e '$_ = <STDIN>; chomp; print crypt($_, $ARGV[0])' "${userPw%"${userPw#\$*\$*\$}"}")" ]] && isRaspberryPw=1 || isRaspberryPw= userPw=$(sudo grep "^$USER" /etc/shadow | cut -f 2 -d ':')
[[ $userPw == "$(echo 'apple2' | perl -e '$_ = <STDIN>; chomp; print crypt($_, $ARGV[0])' "${userPw%"${userPw#\$*\$*\$}"}")" ]] && isApple2Pw=1 || isApple2Pw=
password="your password" [[ $userPw == "$(echo 'raspberry' | perl -e '$_ = <STDIN>; chomp; print crypt($_, $ARGV[0])' "${userPw%"${userPw#\$*\$*\$}"}")" ]] && isRaspberryPw=1 || isRaspberryPw=
[[ $isApple2Pw ]] && password="'apple2'"
[[ $isRaspberryPw ]] && password="'raspberry'" password="your password"
[[ $isApple2Pw ]] && password="apple2"
[[ $isRaspberryPw ]] && password="raspberry"
[[ $isRpi ]] && a2server="your Raspberry Pi" || a2server="A2SERVER" checkPw=
if [[ ! $isApple2Pw && ! -f /usr/local/etc/A2SERVER-version ]]; then
if [[ ! $autoAnswerYes ]]; then [[ $isRpi ]] && a2server="your Raspberry Pi" || a2server="A2SERVER"
echo if [[ ! $isApple2Pw && ! -f /usr/local/etc/A2SERVER-version ]]; then
echo "To ensure that all client computers are able to connect to" if [[ ! $autoAnswerYes ]]; then
echo "${a2server} using the same password, you probably want" echo
echo "to change your user password to 'apple2'." echo "To ensure that all client computers are able to connect to"
echo echo "${a2server} using the same password, you probably want"
echo -n "Do you want to change the password for user '$USER' to 'apple2' now? " echo "to change your user password to 'apple2'."
read echo
echo -n "Do you want to change the password for user '$USER' to 'apple2' now? "
read
fi
if [[ $autoAnswerYes || ${REPLY:0:1} == "Y" || ${REPLY:0:1} == "y" ]]; then
echo "A2SERVER: changing password for user '$USER' to 'apple2'..."
echo "$USER:apple2" | sudo chpasswd
checkPw=1
fi
fi fi
if [[ $autoAnswerYes || ${REPLY:0:1} == "Y" || ${REPLY:0:1} == "y" ]]; then done
echo "A2SERVER: changing password for user '$USER' to 'apple2'..."
echo "$USER:apple2" | sudo chpasswd
fi
fi
echo echo
echo "During this installation, enter ${password} if prompted for passwords." echo "During this installation, enter '${password}' if prompted for passwords."
echo echo
sudo true sudo true
@@ -279,7 +271,7 @@ if (( $doSetup )); then
echo "Workstation Card software. For IIgs users, it should be accessible" echo "Workstation Card software. For IIgs users, it should be accessible"
echo "via the AppleShare control panel." echo "via the AppleShare control panel."
if [[ -f /srv/A2SERVER/A2FILES/System/Start.GS.OS ]]; then if [[ -f /srv/A2SERVER/A2FILES/System/Start.GS.OS ]]; then
echo echo
echo "You can network boot GS/OS." echo "You can network boot GS/OS."
echo "On a ROM 01 IIgs, set slot 1 (printer port), or slot 2 (modem port)" echo "On a ROM 01 IIgs, set slot 1 (printer port), or slot 2 (modem port)"
echo "to Your Card, and slot 7 to AppleTalk, and Startup Slot to 7 or Scan." echo "to Your Card, and slot 7 to AppleTalk, and Startup Slot to 7 or Scan."
@@ -327,7 +319,7 @@ if (( $doSetup )); then
echo "by typing 'appletalk-on'." echo "by typing 'appletalk-on'."
echo echo
fi fi
if [[ -f /tmp/noMacIP ]]; then if [[ -f /tmp/noMacIP ]]; then
echo echo
echo "MacIP connections may be unavailable. If you know how, try" echo "MacIP connections may be unavailable. If you know how, try"

View File

@@ -68,7 +68,7 @@
1.2.6: Nov 2015: full, ready to use install of Spectrum; install unzip 1.2.6: Nov 2015: full, ready to use install of Spectrum; install unzip
[unannounced] [unannounced]
1.2.6+:Nov 2015: merged Ivan's 1.2.6 (into github master branch) 1.2.6+:Nov 2015: merged Ivan's 1.2.6 (into github master branch)
[unannounced] [unannounced]
@@ -80,11 +80,11 @@
1.2.8: Dec 2015: can specify alternate host for binaries and external files; 1.2.8: Dec 2015: can specify alternate host for binaries and external files;
[unannounced] 64-bit Debian precompiled binaries; move /media/A2SHARED/* [unannounced] 64-bit Debian precompiled binaries; move /media/A2SHARED/*
to /srv/A2SERVER; internet access (MacIP support); to /srv/A2SERVER; internet access (MacIP support);
1.2.9: Jan 2016: cppo supports ShrinkIt, DOS 3.3, DSK, 2MG; MountIt fully 1.2.9: Jan 2016: cppo supports ShrinkIt, DOS 3.3, DSK, 2MG; MountIt fully
[unannounced] installed; nulib2 fixes handling empty forks (thanks Andy); [unannounced] installed; nulib2 fixes handling empty forks (thanks Andy);
-c installer option compiles all software (no binaries) -c installer option compiles all software (no binaries)
1.3.0: Jan 2016: Marinetti 3.0b8 installed, with preconfigured MacIP 1.3.0: Jan 2016: Marinetti 3.0b8 installed, with preconfigured MacIP
[unannounced] [unannounced]
@@ -93,9 +93,28 @@
1.3.2: Jan 2016: install SAFE2, SAM2, and SNAP, configured for Apple II sites; 1.3.2: Jan 2016: install SAFE2, SAM2, and SNAP, configured for Apple II sites;
[unannounced] -i installer option reinstalls A2SERVER [unannounced] -i installer option reinstalls A2SERVER
1.5.0: Jan 2016: defaults to GitHub for location of installer scripts 1.5.0: Jan 2016: defaults to GitHub for location of installer scripts
[unannounced] [unannounced]
1.5.1: May 2016: changed URLs from rawgit.com to raw.githubusercontent.com 1.5.1: May 2016: changed URLs from rawgit.com to raw.githubusercontent.com
to resolve https problems during install to resolve https problems during install; OS X temp dir
path corrected; added getexternal.sh to repo;
cppo changes; minor text changes (JTC); better Debian
version checking (JTC)
[unannounced]
1.5.1r2: Oct 2017: set internal version to 1.5.1; expanded version history
[unannounced]
1.5.2: Nov 2017: support for Stretch; suppress null byte read warnings in
Bash 4.4; enable SSH server on Raspberry Pi if disabled;
use Internet Archive backup URL's for external downloads if
possible; compile AppleTalk kernel if -c flag is
specified (rather than downloading); better cleanup after
AppleTalk kernel compile; notification if AppleTalk kernel
module doesn't load; fixed download links for comm software;
bug fixes when compiling macipgw and ciopfs;
os option (Raspbian update) removed from a2server-setup
1.5.3a1: July 2020: initial support for Debian/Raspbian Buster

View File

@@ -56,7 +56,7 @@
1.2.6: Nov 2015: full, ready to use install of Spectrum 1.2.6: Nov 2015: full, ready to use install of Spectrum
[unannounced; released briefly, then withdrawn] [unannounced; released briefly, then withdrawn]
1.5.0: Jan 2016: mixed case filenames for A2FILES; remove GSFILES if empty; 1.5.0: Jan 2016: mixed case filenames for A2FILES; remove GSFILES if empty;
install Marinetti 3.0b8 with internet access via MacIP; install Marinetti 3.0b8 with internet access via MacIP;
fully install Spectrum, SAFE2, SAM2, SNAP, MountIt; install fully install Spectrum, SAFE2, SAM2, SNAP, MountIt; install
DOS3.3 and TEACH; remove Ubuntu support; move/media/A2SHARED/* DOS3.3 and TEACH; remove Ubuntu support; move/media/A2SHARED/*
@@ -67,8 +67,17 @@
for current date; install from any host URL for development; for current date; install from any host URL for development;
source code at GitHub (thanks Joseph) source code at GitHub (thanks Joseph)
1.5.0r2: Jan 16: fixed GitHub URLs to prevent https errors during installation 1.5.1: Jan 2016: fixed GitHub URLs to prevent https errors during installation
(thanks to http://blogs.yahoo.co.jp/ushi_cow/57459736.html) (thanks to http://blogs.yahoo.co.jp/ushi_cow/57459736.html);
bug fixes and minor text changes
1.5.1r2: Oct 2017: corrected version number
1.5.2: Nov 2017: support for Debian/Raspbian Stretch; fixes minor bugs during
install; enable SSH server if disabled on Raspberry Pi; fixes
changed download links for GS/OS communication software
1.5.3a2: July 2020: initial support for Debian/Raspbian Buster
Big thanks to: Anthony Martino, Henry Courbis, Joseph Carter, Jason King, Big thanks to: Anthony Martino, Henry Courbis, Joseph Carter, Jason King,
Andy McFadden, Steven Hirsch, Geoff Body, Peter Wong, Tony Diaz, David Schmidt, Andy McFadden, Steven Hirsch, Geoff Body, Peter Wong, Tony Diaz, David Schmidt,