a2cloud/setup/setup.txt
2015-11-23 14:16:22 -08:00

1994 lines
94 KiB
Bash
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#! /bin/bash
# vim: set tabstop=4 shiftwidth=4 expandtab filetype=sh:
version="190"
adtProVersion="2.0.1"
# Ensure URL we'll use ends in a /
case "$A2CLOUD_SCRIPT_URL" in
*/) scriptURL="$A2CLOUD_SCRIPT_URL" ;;
*) scriptURL="${A2CLOUD_SCRIPT_URL:-http://appleii.ivanx.com/a2cloud}/" ;;
esac
## ID-bashbyter routines
binToDec () {
# converts single-byte binary string (8 bits) value to decimal
# warning: no error checking
# arg: binary string up to 8 bits
# out: decimal value
dec=0
bits=$1
while (( ${#bits} < 8 )); do
bits="0$bits"
done
for n in {0..7}; do
(( dec+=( ${bits:$n:1} * ( 2**(7-$n) ) ) ))
done
echo -n $dec
}
writecharDec () {
# write corresponding character of single-byte decimal value into file
# arg1: filename
# arg2: offset (# of bytes to skip before writing)
# arg3: decimal number from 0-255
# exit: 8=extraneous arg, 11=missing arg1, 12=missing arg2,
# 13=missing arg3, 22=invalid arg2, 23=invalid arg3
# out: nothing
[[ $1 ]] || return 11; [[ $2 ]] || return 12; [[ $3 ]] || return 13
[[ $4 ]] && return 8
[[ ( $(printf %d "$2" 2> /dev/null) == $2 ) \
&& ( $2 -ge 0 ) ]] || return 22
[[ ( $(printf %d "$3" 2> /dev/null) == $3 ) \
&& ( $3 -ge 0 ) && ( $3 -lt 255 ) ]] || return 23
# args are valid
echo -n -e "\x$(printf %02X "$3")" | \
dd of="$1" bs=1 seek=$(($2)) conv=notrunc 2> /dev/null
}
writecharsHex () {
# write corresponding characters of hex values into file
# arg1: filename
# arg2: offset (# of bytes to skip before writing)
# arg3: string of two-digit hexadecimal numbers from 00-FF, period delimited (not checked!)
# out: nothing
# exit: 8=extraneous arg, 11=missing arg1, 12=missing arg2,
# 13=missing arg3, 22=invalid arg2, 23=invalid arg3
[[ $1 ]] || return 11; [[ $2 ]] || return 12; [[ $3 ]] || return 13
[[ $4 ]] && return 8
[[ ( $(printf %d "$2" 2> /dev/null) == $2 ) \
&& ( $2 -ge 0 ) ]] || return 22
p=0
offset=$2
len=${#3}
while (( p < len )); do
outByte=${3:$p:2}
[[ $(printf %02X "0x$outByte" 2> /dev/null) == \
$(echo -n "$outByte" | tr [a-z] [A-Z]) ]] || return 23
# args are valid
echo -n -e "\x$outByte" | \
dd of="$1" bs=1 seek=$offset conv=notrunc 2> /dev/null
(( p += 3 ))
(( offset++ ))
done
}
# A2CLOUD installer start
isRpi=
[[ -f /usr/bin/raspi-config ]] && isRpi=1
[[ $isRpi ]] && { me="Pi"; fullme="Raspberry Pi"; } || { me="computer"; fullme="computer"; }
isDebian=
[[ ( -f /etc/debian_version ) && ( $(cut -c 1-2 < /etc/debian_version) == "7." ) && ( $(uname -m) == "i686" ) ]] && isDebian=1
if [[ -f /usr/local/etc/A2CLOUD-version ]]; then
echo "A2CLOUD version available: $version"
echo "A2CLOUD version installed: $(cat /usr/local/etc/A2CLOUD-version)"
fi
args="$@"
buildA2CloudDisk=
downloadBinaries=1
noA2PiExtras=
skipRepoUpdate=
restartPrompt=
autoAnswerYes=
updateRasppleII=
slot6=
noSetGroups=
while [[ $1 ]]; do
if [[ $1 == "-b" ]]; then
shift
buildA2CloudDisk=1
elif [[ $1 == "-c" ]]; then
shift
downloadBinaries=
elif [[ $1 == "-p" ]]; then
shift
noA2PiExtras=1
elif [[ $1 == "-r" ]]; then
shift
skipRepoUpdate="-r"
elif [[ $1 == "-s" ]]; then
shift
restartPrompt=1
elif [[ $1 == "-y" ]]; then
shift
autoAnswerYes="-y"
elif [[ $1 == "-6" ]]; then
shift
slot6=1
elif [[ $1 == "-os" || $1 == "os" ]]; then
shift
updateRasppleII=1
elif [[ $1 == "-v" ]]; then
shift
if [[ ! -f /usr/local/etc/A2CLOUD-version ]]; then
echo "A2CLOUD version available: $version"
echo "A2CLOUD version installed: none"
fi
[[ $0 == "-bash" ]] && return 1 || exit 1
elif [[ $1 == "noSetGroups" ]]; then
shift
noSetGroups=1
elif [[ $1 ]]; then
echo "options:"
echo "-v: display installed and available versions, then exit"
echo "-y: auto-answer yes to all prompts"
echo "-r: don't update package lists"
echo "-s: prompt for restart after installation"
echo "-6: put blank 140K disk images in GSport and KEGS slot 6"
echo "-b: build A2CLOUD disks, rather than downloading premade images"
echo "-c: compile non-package items, rather than downloading binaries"
if [[ $isRpi ]]; then
echo "-p: don't install Apple II Pi extras"
echo "-os: update Raspbian OS, A2CLOUD, A2SERVER, and Apple II Pi"
fi
[[ $0 == "-bash" ]] && return 1 || exit 1
fi
done
if [[ $updateRasppleII ]]; then
echo "A2CLOUD: Updating Raspple II (takes up to an hour)..."
wget -qO /tmp/raspbian-update ${scriptURL}setup/raspbian-update.txt
source /tmp/raspbian-update a2cloud a2server $autoAnswerYes $skipRepoUpdate
[[ $0 == "-bash" ]] && return 0 || exit 0
fi
echo
echo "Your $fullme will be set up for A2CLOUD, providing you"
echo " with mass storage and online access for your Apple II!"
echo
echo "Answer yes to all prompts if you want to be able to do all the"
echo " stuff mentioned on the A2CLOUD web site."
echo
echo "If you already have A2CLOUD installed, you will be updated to the"
echo " latest version. Check out http://ivanx.com/a2cloud for details."
echo
echo "Full installation may take an hour or longer. Updates are usually"
echo " much quicker. Type 'a2cloud-setup -h' for installation options."
echo
echo "Some actions will be performed as the root user."
if [[ ! $autoAnswerYes ]]; then
echo
echo -n "Continue? "
read
if [[ ${REPLY:0:1} != "Y" && ${REPLY:0:1} != "y" ]]; then
[[ $0 == "-bash" ]] && return 2 || exit 2
fi
fi
echo
installAllFeatures=
if [[ ! $autoAnswerYes ]]; then
echo
echo -n "Do you want to install all A2CLOUD features? "
read
fi
[[ $autoAnswerYes || ${REPLY:0:1} == "Y" || ${REPLY:0:1} == "y" ]] && installAllFeatures=1
if [[ $installAllFeatures ]]; then
installADTPro=1
createBootDisk=1
setupSerialPortLogin=1
installCommTools=1
installArchiveTools=1
installEmulators=1
[[ $isRpi ]] && installA2Pi=1 || installA2Pi=
else
installADTPro=
echo
echo -n "Install ADTPro server, for virtual drives and floppy disk transfers"
if [[ ! -f /usr/bin/X ]]; then
echo
echo -n "(the X Window System and LXDE desktop environment will be installed)"
fi
echo -n "? "
read
[[ ${REPLY:0:1} == "Y" || ${REPLY:0:1} == "y" ]] && installADTPro=1
createBootDisk=
installArchiveTools=
newImageName=
imageSize=
if [[ $installADTPro ]]; then
echo
echo -n "Do you want to create A2CLOUD 140K and 800K boot disk images? "
read
if [[ ${REPLY:0:1} == "Y" || ${REPLY:0:1} == "y" ]]; then
createBootDisk=1
installArchiveTools=1
fi
if [[ ! -f /usr/local/adtpro/disks/Virtual.po || ( -f /usr/local/adtpro/adtpro.sh && -f /usr/local/adtpro/disks/Virtual.po && $(sha1sum /usr/local/adtpro/disks/Virtual.po | cut -f 1 -d ' ') == "a209a8b3a485c95c57bc691a8a58867a6c0ec628" ) ]]; then
while (( 1 )); do
echo
echo "The default blank disk in S2,D1 will be 800K. If you want a different size,"
echo -n " enter it in K (larger is slower when writing; max 8192): "
read
if (( ${REPLY}0 >= 1400 )); then
imageSize=$REPLY
echo -n "Enter new image file name: "
read
if [[ $REPLY ]]; then
reply="$REPLY"
[[ $(tr [:lower:] [:upper:] <<< ${reply:(-3)}) != ".PO" ]] && reply="$REPLY.PO"
if [[ ! -f /usr/local/adtpro/disks/"$reply" ]]; then
newImageName="$reply"
prodosVolName='0'
# test ProDOS name legality
while [[ ${#prodosVolName} -gt 15 || ! $(grep ^[A-Z][0-9A-Z\.]*$ <<< $prodosVolName) ]]; do
echo -n "Enter new image ProDOS volume name (or return for 'UNTITLED'): "
read
[[ $REPLY ]] && prodosVolName="$REPLY" || prodosVolName="UNTITLED"
prodosVolName=$(tr [:lower:] [:upper:] <<< $prodosVolName)
done
break
else
echo "A2CLOUD: Disk image already exists. Not creating."
fi
fi
else
break
fi
done
fi
fi
setupSerialPortLogin=
echo
echo -n "Do you want to set up your $me for serial port login? "
read
[[ ${REPLY:0:1} == "Y" || ${REPLY:0:1} == "y" ]] && setupSerialPortLogin=1
installCommTools=
echo
echo -n "Install internet access and file transfer tools on your $me? "
read
[[ ${REPLY:0:1} == "Y" || ${REPLY:0:1} == "y" ]] && installCommTools=1
if [[ ! $installArchiveTools ]]; then
echo
echo -n "Install utilities for Apple II archives and disk images? "
read
[[ ${REPLY:0:1} == "Y" || ${REPLY:0:1} == "y" ]] && installArchiveTools=1
fi
installEmulators=
echo
echo -n "Install Apple IIgs and IIe emulators? "
read
[[ ${REPLY:0:1} == "Y" || ${REPLY:0:1} == "y" ]] && installEmulators=1
installA2Pi=
if [[ $isRpi ]]; then
echo
echo -n "Install Apple II Pi? "
read
[[ ${REPLY:0:1} == "Y" || ${REPLY:0:1} == "y" ]] && installA2Pi=1
fi
fi
echo
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=
[[ $userPw == "$(echo 'raspberry' | perl -e '$_ = <STDIN>; chomp; print crypt($_, $ARGV[0])' "${userPw%"${userPw#\$*\$*\$}"}")" ]] && isRaspberryPw=1 || isRaspberryPw=
if [[ ! $isApple2Pw && ! -f /usr/local/etc/A2CLOUD-version ]]; then
if [[ ! $autoAnswerYes ]]; then
echo "To make A2CLOUD work smoothly, you are recommended"
echo "to change your password to 'apple2'."
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 "A2CLOUD: changing password for user '$USER' to 'apple2'..."
echo "$USER:apple2" | sudo chpasswd
isApple2Pw=1
fi
fi
thePassword="your password"
[[ $isApple2Pw ]] && thePassword="'apple2'"
[[ $isRaspberryPw ]] && thePassword="'raspberry'"
echo
echo "During this installation, enter ${thePassword}"
echo "if prompted for passwords."
echo
if [[ ! $autoAnswerYes ]]; then
echo -n "Press return to continue..."
read
fi
origDir="$PWD"
rm -rf /tmp/a2cloud-install &> /dev/null
mkdir -p /tmp/a2cloud-install
cd /tmp/a2cloud-install
echo
if [[ ! $skipRepoUpdate ]]; then
echo "A2CLOUD: Updating package lists..."
sudo apt-get -y update > /dev/null
else
echo "A2CLOUD: Not updating package lists..."
fi
# general commands and configuration
echo "A2CLOUD: Adding udev trigger to /etc/rc.local..."
grep udevadm /etc/rc.local > /dev/null || sudo sed -i 's/^exit 0$/[ -e \/dev\/ttyUSBupper ] \&\& ! [ -f \/tmp\/udev-ttyUSBupper-added ] \&\& udevadm trigger --action=change\n[ -e \/dev\/ttyUSBlower ] \&\& ! [ -f \/tmp\/udev-ttyUSBlower-added ] \&\& udevadm trigger --action=change\n\nexit 0/' /etc/rc.local
echo "A2CLOUD: Setting up dopo command..."
sudo wget -qO /usr/local/bin/dopo ${scriptURL}setup/dopo.txt
sudo chmod ugo+x /usr/local/bin/dopo
echo "A2CLOUD: Setting up cppo command..."
sudo wget -qO /usr/local/bin/cppo ${scriptURL}setup/cppo.txt
sudo chmod ugo+x /usr/local/bin/cppo
echo "A2CLOUD: Setting up a2cloud-help..."
sudo wget -qO /usr/local/etc/a2cloud-help.txt ${scriptURL}setup/a2cloud-help.txt
if [[ $isRpi ]]; then
sudo sed -i 's/^gsport.*$/gsport : GSport Apple IIgs emulator (or log in with user "apple2user")/' /usr/local/etc/a2cloud-help.txt
fi
# FIXME: We have "three" MOTD files in the A2CLOUD tree but we only use
# one. The other two come from the Raspple II tree. We should clean
# this up at some point.
echo "A2CLOUD: Setting up motd..."
if [[ $(grep Raspple /etc/motd) ]]; then
wget -qO- http://appleii.ivanx.com/rasppleii/motd-rasppleii.txt | sudo tee /etc/motd > /dev/null
elif [[ $(grep A2SERVER /etc/motd) ]]; then
wget -qO- http://appleii.ivanx.com/rasppleii/motd-vm.txt | sudo tee /etc/motd > /dev/null
else
wget -qO- ${scriptURL}setup/motd.txt | sudo tee /etc/motd > /dev/null
fi
if { lspci 2> /dev/null | grep -q VirtualBox; }; then
echo "A2CLOUD: Disabling VirtualBox console screen blanking..."
sudo sed -i 's/^BLANK_DPMS=off/BLANK_DPMS=on/' /etc/kbd/config
sudo sed -i 's/^BLANK_TIME=[^0].$/BLANK_TIME=0/' /etc/kbd/config
sudo /etc/init.d/kbd restart &> /dev/null
sudo /etc/init.d/console-setup restart &> /dev/null
fi
echo "A2CLOUD: Setting up control commands and environment variables..."
sudo wget -qO /usr/local/etc/a2cloud-aliases ${scriptURL}setup/a2cloud-aliases.txt
echo "A2CLOUD: Setting up login script..."
sudo sed -i "s/a2cloud-aliases/a2cloudrc/" /etc/bash.bashrc
sudo sed -i '/ttyUSB/d' /etc/bash.bashrc
[[ ! $(grep a2cloudrc /etc/bash.bashrc) ]] && echo "source /usr/local/etc/a2cloudrc" | sudo tee -a /etc/bash.bashrc > /dev/null
sudo wget -qO /usr/local/etc/a2cloudrc ${scriptURL}setup/a2cloudrc.txt
source /usr/local/etc/a2cloudrc
echo "A2CLOUD: Saving installer version..."
echo "$version" | sudo tee /usr/local/etc/A2CLOUD-version &> /dev/null
if [[ ! $(dpkg -l avahi-daemon 2> /dev/null | grep ^ii) || ! $(dpkg -l libnss-mdns 2> /dev/null | grep ^ii) ]]; then
echo "A2CLOUD: Installing avahi-daemon (mDNS)..."
sudo apt-get -y install avahi-daemon &> /dev/null
sudo apt-get -y clean
sudo sed -i 's/^\(hosts.*\)$/\1 mdns/' /etc/nsswitch.conf
else
echo "A2CLOUD: avahi-daemon (mDNS) is already installed."
fi
if [[ $installADTPro ]]; then
freeSpace=$(df / | tail -1 | awk '{ print $4 }')
java -version &> /dev/null
if (( $? == 127 && $freeSpace < 350000 )); then
echo "You do not have enough free space to install"
echo "Java, which is needed for ADTPro server."
if [[ $isRpi ]]; then
echo "If you haven't"
echo "yet expanded the file system to use the full capacity"
echo "of your SD card, type \"sudo raspi-config\" and do that."
else
echo "Free up some space."
fi
echo "Then try this installer again."
echo
[[ $0 == "-bash" ]] && return 3 || exit 3
fi
if [[ ! -f /usr/bin/X ]]; then
echo "A2CLOUD: Installing X Window System and LXDE..."
sudo apt-get -y install xorg lxde
sudo apt-get -y clean
# prevent automatically running at startup
sudo sed -i 's/^GRUB_CMDLINE_LINUX_DEFAULT=.*$/GRUB_CMDLINE_LINUX_DEFAULT="text"/' /etc/default/grub
sudo update-grub
else
echo "A2CLOUD: X Window System and LXDE are already installed."
fi
# if [[ ! -f /etc/xdg/autostart/lxterminal.desktop ]]; then
# echo "A2CLOUD: Setting terminal window to auto-open on desktop..."
# echo -e "\n[Desktop Entry]\nType=Application\nExec=/usr/bin/lxterminal" | sudo tee /etc/xdg/autostart/lxterminal.desktop > /dev/null
# else
# echo "A2CLOUD: Terminal window already set to auto-open on desktop."
# fi
if { lspci 2> /dev/null | grep -q VirtualBox; }; then
if { ! grep -q default /etc/xdg/lxsession/LXDE/autostart; }; then
echo "A2CLOUD: Setting desktop to 800x600 in VirtualBox console (no Additions)..."
echo -e "\nxrandr --output default --mode 800x600" | sudo tee -a /etc/xdg/lxsession/LXDE/autostart > /dev/null
else
echo "A2CLOUD: Desktop already set to 800x600 in VirtualBox console (no Additions)."
fi
if { ! grep -q VBOX0 /etc/xdg/lxsession/LXDE/autostart; }; then
echo "A2CLOUD: Setting desktop to 800x600 in VirtualBox console (with Additions)..."
echo -e "\nxrandr --output VBOX0 --mode 800x600" | sudo tee -a /etc/xdg/lxsession/LXDE/autostart > /dev/null
else
echo "A2CLOUD: Desktop already set to 800x600 in VirtualBox console (with Additions)."
fi
echo "A2CLOUD: Disabling screensaver and screen blanking in VirtualBox LXDE..."
sudo sed -i 's/^\(@xscreensaver.*\)$/#\1\n\nxset s noblank\nxset s off\nxset -dpms\n/' /etc/xdg/lxsession/LXDE/autostart
fi
if [[ $isRpi ]]; then
sudo sed -i 's/^.*VBOX0.*$//' /etc/xdg/lxsession/LXDE/autostart 2> /dev/null
sudo sed -i 's/^.*VBOX0.*$//' /etc/xdg/lxsession/LXDE-pi/autostart 2> /dev/null
fi
# install or update java
javaVersion=$(java -version 2>&1)
if [[ ( $? -eq 127 ) || ( $(head -1 <<< "$javaVersion" | cut -f 2 -d '.') -lt 8 ) ]]; then
echo "A2CLOUD: Installing Java (takes a while)..."
if [[ $isRpi ]]; then
if [[ $(apt-cache search '^oracle-java8-jdk$') ]]; then
sudo apt-get -y install oracle-java8-jdk
else
sudo apt-get -y install oracle-java7-jdk
fi
sudo apt-get -y clean
else
# from http://www.webupd8.org/2012/06/how-to-install-oracle-java-7-in-debian.html
if { ! grep -q webupd8team /etc/apt/sources.list; }; then
{
echo;
echo "# Oracle Java JDK";
echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu precise main";
echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu precise main";
} | sudo tee -a /etc/apt/sources.list > /dev/null
fi
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886
sudo apt-get -y update
echo debconf shared/accepted-oracle-license-v1-1 select true | sudo debconf-set-selections
sudo apt-get -y install oracle-java8-installer
sudo apt-get -y clean
fi
source /usr/local/etc/a2cloudrc
else
echo "A2CLOUD: Java is already installed."
fi
updateADTPro=
# check if update needed
if [ -f /usr/local/adtpro/lib/ADTPro-* ]; then
if [[ $(ls -1 /usr/local/adtpro/lib/ADTPro-*.jar | cut -f 6 -d '/') != "ADTPro-$adtProVersion.jar" ]]; then
echo
echo "ADTPro server should be updated. If you have made any customizations"
echo " to any of the files in /usr/local/adtpro, other than the 'disks' folder,"
echo " they will be lost. If you don't know what this means, then you don't"
echo -n " need to worry. Update now? "
read
if [[ ${REPLY:0:1} == "Y" || ${REPLY:0:1} == "y" ]]; then
updateADTPro=1
echo "A2CLOUD: removing old version of ADTPro server..."
sudo pkill -f [A]DTPro
sudo rm /usr/local/adtpro/disks/ADTPRO*.DSK &> /dev/null
sudo rm /usr/local/adtpro/disks/ADTPRO*.PO &> /dev/null
sudo rm /usr/local/adtpro/disks/VDRIVE*.DSK &> /dev/null
sudo rm -r /tmp/a2cloud-install/disks &> /dev/null
sudo mv /usr/local/adtpro/disks /tmp/a2cloud-install
sudo rm -r /usr/local/adtpro/ac.bat \
/usr/local/adtpro/ac.sh \
/usr/local/adtpro/adtpro.bat \
/usr/local/adtpro/adtpro.cmd \
/usr/local/adtpro/ADTPro.html \
/usr/local/adtpro/adtpro.sh \
/usr/local/adtpro/lib \
/usr/local/adtpro/LICENSE \
/usr/local/adtpro/README \
&> /dev/null
fi
else
echo "A2CLOUD: ADTPro server does not need updating."
fi
fi
if [[ ! -f /usr/local/adtpro/adtpro.sh || ! -f /usr/local/adtpro/ADTPro.html ]]; then
echo "A2CLOUD: installing ADTPro server..."
sudo pkill -f [A]DTPro
wget -qO /tmp/a2cloud-install/adtpro.tar.gz downloads.sourceforge.net/project/adtpro/adtpro/ADTPro-$adtProVersion/ADTPro-$adtProVersion.tar.gz
sudo mkdir -p /usr/local/adtpro
sudo tar --strip-components=1 -C /usr/local/adtpro -zxf /tmp/a2cloud-install/adtpro.tar.gz
sudo chmod -R ugo+w /usr/local/adtpro
sudo ln -s /usr/local/adtpro/lib/ADTPro*jar /usr/local/adtpro/lib/ADTPro.jar
sudo ln -s /usr/local/adtpro/lib/AppleCommander/AppleCommander*ac.jar /usr/local/adtpro/lib/AppleCommander/AppleCommander-ac.jar
echo "sudo /usr/local/adtpro/adtpro.sh \$@" | sudo tee /usr/local/bin/adtpro.sh > /dev/null
sudo chmod ugo+x /usr/local/bin/adtpro.sh
sudo usermod -a -G uucp $USER
sudo usermod -a -G uucp root
else
echo "A2CLOUD: ADTPro server is already installed."
fi
if [[ ! -f /usr/local/adtpro/lib/AppleCommander/AppleCommander-1.3.5.13id-ac.jar ]]; then
echo "A2CLOUD: Installing AppleCommander-1.3.5.13id..."
sudo mkdir -p /usr/local/adtpro/lib/AppleCommander
wget -qO /usr/local/adtpro/lib/AppleCommander/AppleCommander-1.3.5.13id-ac.jar http://downloads.sourceforge.net/project/applecommander/AppleCommander%20-%20Interim/testcase/AppleCommander-1.3.5.13id-ac.jar
rm /usr/local/adtpro/lib/AppleCommander/AppleCommander-ac.jar &> /dev/null
ln -s AppleCommander-1.3.5.13id-ac.jar /usr/local/adtpro/lib/AppleCommander/AppleCommander-ac.jar
else
echo "A2CLOUD: AppleCommander-1.3.5.13id is already installed."
fi
echo "A2CLOUD: Setting up customized adtpro.sh..."
wget -qO /usr/local/adtpro/adtpro.sh ivanx.com/a2cloud/setup/adtpro.sh.txt
sudo chmod ugo+rwx /usr/local/adtpro/adtpro.sh
if [[ $updateADTPro ]]; then
echo "A2CLOUD: Replacing disks folder..."
sudo mv /tmp/a2cloud-install/disks/* /usr/local/adtpro/disks
sudo rmdir /tmp/a2cloud-install/disks
fi
if [[ ! -f /usr/lib/jni/librxtxSerial.so ]]; then
echo "A2CLOUD: Installing serial port libraries..."
sudo apt-get -y install librxtx-java
sudo apt-get -y clean
else
echo "A2CLOUD: Serial port libraries are already installed."
fi
[[ ! -f /usr/lib/RXTXcomm.jar ]] && sudo ln -s /usr/share/java/RXTXcomm.jar /usr/lib &> /dev/null
[[ ! -d /usr/local/adtpro/lib/rxtx/rxtx-2.2pre2-local/arm ]] && ln -s /usr/lib/jni /usr/local/adtpro/lib/rxtx/rxtx-2.2pre2-local/arm &> /dev/null
if [[ ! -f /usr/bin/xvfb-run ]]; then
echo "A2CLOUD: Installing xvfb for headless operation..."cd
sudo apt-get -y install xvfb
sudo apt-get -y clean
else
echo "A2CLOUD: xvfb is already installed."
fi
if [[ -f /usr/local/sbin/afpd ]]; then # A2SERVER/netatalk installed
if [[ ! -d /media/A2SHARED/ADTDISKS || ! $(grep ADTDISKS /usr/local/etc/netatalk/AppleVolumes.default) ]]; then
echo "A2CLOUD: Setting up /usr/local/adtpro/disks for Apple file sharing..."
if [[ ! -d /media/A2SHARED/ADTDISKS ]]; then
ln -s /usr/local/adtpro/disks /media/A2SHARED/ADTDISKS 2> /dev/null
fi
if [[ ! $(grep ADTDISKS /usr/local/etc/netatalk/AppleVolumes.default) ]]; then
sudo sed -i 's@^# End of File@/media/A2SHARED/ADTDISKS ADTDISKS ea:ad\n\n# End of File@' /usr/local/etc/netatalk/AppleVolumes.default
fi
sudo /etc/init.d/netatalk restart
else
echo "A2CLOUD: /usr/local/adtpro/disks is already set up for Apple file sharing."
fi
if { grep -q A2SHARED /etc/samba/smb.conf 2> /dev/null; }; then
# SMB already enabled by A2SERVER
if { grep -q ADTDISKS /etc/samba/smb.conf 2>/dev/null; }; then
echo "A2CLOUD: /usr/local/adtpro/disks is already set up for Windows file sharing."
else
echo "A2CLOUD: Setting up /usr/local/adtpro/disks for Windows file sharing..."
echo "[ADTDISKS]" | sudo tee -a /etc/samba/smb.conf > /dev/null
echo " path = /media/A2SHARED/ADTDISKS" | sudo tee -a /etc/samba/smb.conf > /dev/null
echo " browsable = yes" | sudo tee -a /etc/samba/smb.conf > /dev/null
echo " guest ok = yes" | sudo tee -a /etc/samba/smb.conf > /dev/null
echo " read only = no" | sudo tee -a /etc/samba/smb.conf > /dev/null
echo " create mask = 0666" | sudo tee -a /etc/samba/smb.conf > /dev/null
echo " force user = $(whoami)" | sudo tee -a /etc/samba/smb.conf > /dev/null
fi
else
echo "A2CLOUD: Windows file sharing not in use."
fi
fi
echo "A2CLOUD: Setting up adtpro-start command..."
sudo wget -qO /usr/local/bin/adtpro-start ${scriptURL}setup/adtpro-start.txt
sudo chmod ugo+x /usr/local/bin/adtpro-start
echo "A2CLOUD: Setting up vsd1/vsd2 commands..."
sudo wget -qO /usr/local/bin/vsd ${scriptURL}setup/vsd.txt
sudo chmod ugo+x /usr/local/bin/vsd
echo "A2CLOUD: Setting up acmd command..."
sudo wget -qO /usr/local/bin/acmd ${scriptURL}setup/acmd.txt
sudo chmod ugo+x /usr/local/bin/acmd
echo "A2CLOUD: Setting up mkpo command..."
sudo wget -qO /usr/local/bin/mkpo ${scriptURL}setup/mkpo.txt
sudo chmod ugo+x /usr/local/bin/mkpo
echo "A2CLOUD: Setting up dos2pro command..."
sudo wget -qO /usr/local/bin/dos2pro ${scriptURL}setup/dos2pro.txt
sudo chmod ugo+x /usr/local/bin/dos2pro
fi
if command -v X >/dev/null; then
if dpkg-query -l xrdp; then
echo "A2CLOUD: Installing xrdp/tightvncserver..."
sudo apt-get -y install xrdp
sudo apt-get -y clean
else
echo "A2CLOUD: xrdp/tightvncserver is already installed."
fi
else
echo "A2CLOUD: X11 not found; not installing xrdp/tightvncserver."
fi
if [[ $setupSerialPortLogin ]]; then
echo "A2CLOUD: Setting GPIO serial login to 4800 bps, and disabling..."
# set console port login to 4800 bps (using RPi console cable) and comment it out
sudo sed -i 's/^\(T.*\)ttyAMA0 .* /#\1ttyAMA0 4800 /' /etc/inittab
sudo sed -i 's/ttyAMA0,[0-9]*/ttyAMA0,4800/g' /boot/cmdline.txt 2> /dev/null
if [[ ! -f /usr/bin/screen ]]; then
echo "A2CLOUD: Installing Screen for multiple terminals..."
sudo apt-get -y install screen
sudo apt-get -y clean
else
echo "A2CLOUD: Screen is already installed."
fi
echo "A2CLOUD: Disabling Screen welcome message..."
sudo sed -i 's/^#startup_message/startup_message/' /etc/screenrc
# use 8-bit (non-Unicode) character set for proper emulation in Apple II term programs
IFS='' defaultLang=$(grep ^LANG= /etc/default/locale | cut -f 2 -d '=')
langLatin1=${defaultLang%%.*}
if [[ ! $(grep "^$langLatin1.ISO" /usr/share/i18n/SUPPORTED) ]]; then
langLatin1="en_US"
fi
if [[ $(cat /usr/local/etc/a2cloud-lang 2> /dev/null) != $langLatin1 ]]; then
echo "A2CLOUD: Setting serial port login to use 8-bit character set..."
if [[ ! $(grep "^$langLatin1.ISO" /etc/locale.gen) ]]; then
echo "A2CLOUD: Generating locales..."
locs=$(IFS='' grep "^[^#]" /etc/locale.gen | while read -r thisLoc; do echo -n "$thisLoc, " ; done)
locISO=$(grep "$langLatin1.ISO" /usr/share/i18n/SUPPORTED | sort | head -1)
echo "locales locales/locales_to_be_generated multiselect $locs$locISO" | sudo debconf-set-selections
sudo rm /etc/locale.gen &> /dev/null
sudo dpkg-reconfigure -f noninteractive locales
else
echo "A2CLOUD: Locales have already been generated."
fi
# set LANG to ISO-8859 (8-bit) character set on TTY login
echo "${locISO%% *}" | sudo tee /usr/local/etc/a2cloud-lang > /dev/null
source /usr/local/etc/a2cloudrc
else
echo "A2CLOUD: Serial port login is already using 8-bit character set."
fi
echo "A2CLOUD: Setting up baud command..."
sudo wget -qO /usr/local/bin/baud ${scriptURL}setup/baud.txt
sudo chmod ugo+x /usr/local/bin/baud
echo "A2CLOUD: Setting up term command..."
sudo wget -qO /usr/local/bin/term ${scriptURL}setup/term.txt
sudo chmod ugo+x /usr/local/bin/term
echo "A2CLOUD: Setting up usbgetty command..."
sudo wget -qO /usr/local/sbin/usbgetty ${scriptURL}setup/usbgetty.txt
sudo chmod ugo+x /usr/local/sbin/usbgetty
echo "A2CLOUD: Removing ttyUSB0 shell login..."
sudo sed -i "s/^\([^#].*ttyUSB0.*\)$//" /etc/inittab
if [[ ! $(grep -e '-scanttyUSB' /etc/inittab) ]]; then
echo "A2CLOUD: Adding USB port shell login at 4800 bps..."
echo -e "\n\n#for USB-to-serial adapter\nT1:23:respawn:/usr/local/sbin/usbgetty -h -L -scanttyUSB 4800 vt100" | sudo tee -a /etc/inittab > /dev/null
sudo init q
sudo pkill -f "[g]etty.*ttyUSB"
else
echo "A2CLOUD: USB port shell login already added."
fi
fi
echo "A2CLOUD: Setting up USB port serial adapter handler..."
sudo wget -qO /usr/local/sbin/ttyusbhandler ${scriptURL}setup/ttyusbhandler.txt
sudo chmod ugo+x /usr/local/sbin/ttyusbhandler
if [[ ! -f /etc/udev/rules.d/50-usb.rules ]]; then
echo "A2CLOUD: Creating device rules for USB ports..."
udevLines=
if [[ $isRpi ]]; then
# assign ttyUSBupper, or ttyUSBupper_hubXX, for shell usb-to-serial adapter
# assign ttyUSBlower, or ttyUSBlower_hubXX, for ADTPro usb-to-serial adapter
# (A/A+ direct attach is always ttyUSBlower;
# hub attached to A/A+ will be ttyUSBupper on port 2, and ttyUSBlower on port 3)
udevLines+='KERNEL=="ttyUSB*", KERNELS=="1-1:1.0", SYMLINK+="ttyUSBlower", RUN+="/usr/local/sbin/ttyusbhandler add ttyUSBlower"\n'
udevLines+='ACTION=="remove", ENV{DEVPATH}=="*1-1:1.0*", RUN+="/usr/local/sbin/ttyusbhandler remove ttyUSBlower"\n'
udevLines+='KERNEL=="ttyUSB*", KERNELS=="1-1.2:1.0", SYMLINK+="ttyUSBupper", RUN+="/usr/local/sbin/ttyusbhandler add ttyUSBupper"\n'
udevLines+='ACTION=="remove", ENV{DEVPATH}=="*1-1.2:1.0*", RUN+="/usr/local/sbin/ttyusbhandler remove ttyUSBupper"\n'
udevLines+='KERNEL=="ttyUSB*", KERNELS=="1-1.3:1.0", SYMLINK+="ttyUSBlower", RUN+="/usr/local/sbin/ttyusbhandler add ttyUSBlower"\n'
udevLines+='ACTION=="remove", ENV{DEVPATH}=="*1-1.3:1.0*", RUN+="/usr/local/sbin/ttyusbhandler remove ttyUSBlower"\n'
for i in {1..25}; do
ii=$(printf %02d $i)
udevLines+='KERNEL=="ttyUSB*", KERNELS=="1-1.2.'$i':1.0", SYMLINK+="ttyUSBupper_hub'$ii'", RUN+="/usr/local/sbin/ttyusbhandler add ttyUSBupper_hub'$ii'"\n'
udevLines+='ACTION=="remove", ENV{DEVPATH}=="*1-1.2.'$i':1.0*", RUN+="/usr/local/sbin/ttyusbhandler remove ttyUSBupper_hub'$ii'"\n'
udevLines+='KERNEL=="ttyUSB*", KERNELS=="1-1.3.'$i':1.0", SYMLINK+="ttyUSBlower_hub'$ii'", RUN+="/usr/local/sbin/ttyusbhandler add ttyUSBlower_hub'$ii'"\n'
udevLines+='ACTION=="remove", ENV{DEVPATH}=="*1-1.3.'$i':1.0*", RUN+="/usr/local/sbin/ttyusbhandler remove ttyUSBlower_hub'$ii'"\n'
done
else
# on non-Pi installations, assign ttyUSBupper to ttyUSB0 and ttyUSBlower to ttyUSB1
udevLines+='KERNEL=="ttyUSB0", SYMLINK+="ttyUSBupper", RUN+="/usr/local/sbin/ttyusbhandler add ttyUSBupper"\n'
udevLines+='ACTION=="remove", ENV{DEVPATH}=="*ttyUSB0*", RUN+="/usr/local/sbin/ttyusbhandler remove ttyUSBupper"\n'
udevLines+='KERNEL=="ttyUSB1", SYMLINK+="ttyUSBlower", RUN+="/usr/local/sbin/ttyusbhandler add ttyUSBlower"\n'
udevLines+='ACTION=="remove", ENV{DEVPATH}=="*ttyUSB1*", RUN+="/usr/local/sbin/ttyusbhandler remove ttyUSBlower"\n'
fi
echo -e "$udevLines" | sudo tee /etc/udev/rules.d/50-usb.rules > /dev/null
else
echo "A2CLOUD: Device rules for USB ports already exist."
fi
if [[ $installCommTools ]]; then
if [[ ! -f /usr/bin/curl ]]; then
echo "A2CLOUD: Installing curl..."
sudo apt-get -y install curl
sudo apt-get -y clean
else
echo "A2CLOUD: curl is already installed."
fi
if [[ ! -f /usr/bin/sz ]]; then
echo "A2CLOUD: Installing rzsz for X/Y/Zmodem transfers..."
sudo apt-get -y install lrzsz
sudo apt-get -y clean
else
echo "A2CLOUD: rzsz is already installed."
fi
if [[ ! -f /usr/bin/ftp ]]; then
echo "A2CLOUD: Installing ftp..."
sudo apt-get -y install ftp
sudo apt-get -y clean
else
echo "A2CLOUD: ftp is already installed."
fi
if [[ ! -f /usr/local/bin/cftp ]]; then
echo "A2CLOUD: Installing cftp..."
cd /tmp/a2cloud-install
if [[ $downloadBinaries ]]; then
if [[ $isRpi ]]; then
wget -qO- http://appleii.ivanx.com/a2cloud/files/cftp-rpi.tgz | sudo tar Pzx
elif [[ $isDebian ]]; then
wget -qO- http://appleii.ivanx.com/a2cloud/files/cftp-debian7_x86.tgz | sudo tar Pzx
fi
fi
if [[ ! -f /usr/local/bin/cftp ]]; then
sudo apt-get -y install build-essential
sudo apt-get -y install ncurses-dev
sudo apt-get -y clean
rm -rf /tmp/a2cloud-install/cftp* &> /dev/null
mkdir -p /tmp/a2cloud-install/cftp
cd /tmp/a2cloud-install/cftp
wget -q -O cftp.tgz http://nih.at/cftp/cftp-0.12.tar.gz
tar zxf cftp.tgz
cd cftp-0.12
./configure
make
sudo make install
cd /tmp/a2cloud-install
rm -rf cftp
fi
else
echo "A2CLOUD: cftp is already installed."
fi
if [[ ! -f /usr/bin/lynx ]]; then
echo "A2CLOUD: Installing lynx..."
sudo apt-get -y install lynx
sudo apt-get -y clean
else
echo "A2CLOUD: lynx is already installed."
fi
if [[ ! -f /usr/bin/links ]]; then
echo "A2CLOUD: Installing links..."
sudo apt-get -y --force-yes install links
sudo apt-get -y clean
else
echo "A2CLOUD: links is already installed."
fi
sudo wget -qO /usr/local/bin/a2news ${scriptURL}setup/a2news.txt
sudo chmod ugo+x /usr/local/bin/a2news
if [[ ! -f /usr/bin/tin ]]; then
echo "A2CLOUD: Installing a2news/tin..."
sudo apt-get -y install tin
sudo apt-get -y clean
else
echo "A2CLOUD: a2news/tin is already installed."
fi
# have exim4 use IPv4 only to prevent log errors (IPv6 is off by default in Raspbian)
if [[ $(grep ' ; ::1' /etc/exim4/update-exim4.conf.conf) ]]; then
echo "A2CLOUD: Setting exim4 to use only IPv4 to prevent startup error messages..."
sudo sed -i 's/ ; ::1//' /etc/exim4/update-exim4.conf.conf
sudo update-exim4.conf
sudo rm /var/log/exim4/mainlog /var/log/exim4/paniclog &> /dev/null
fi
# restore exim4 log directory if occupied by a file put there by earlier A2CLOUD versions
if [[ -f /var/log/exim4 ]]; then
echo "A2CLOUD: Restoring exim4 log directory..."
sudo rm /var/log/exim4
sudo mkdir /var/log/exim4
sudo chown Debian-exim:adm /var/log/exim4
sudo chmod 2750 /var/log/exim4
fi
sudo wget -qO /usr/local/bin/a2chat ${scriptURL}setup/a2chat.txt
sudo chmod ugo+x /usr/local/bin/a2chat
if [[ ! -f /usr/bin/irssi ]]; then
echo "A2CLOUD: Installing a2chat/irssi..."
sudo apt-get -y install irssi
sudo apt-get -y clean
else
echo "A2CLOUD: a2chat/irssi is already installed."
fi
if [[ ! -f /usr/bin/telnet ]]; then
echo "A2CLOUD: Installing telnet..."
sudo apt-get -y install telnet
sudo apt-get -y clean
else
echo "A2CLOUD: telnet is already installed."
fi
if [[ ( ! -f /usr/bin/ttytter && ! -f /usr/local/bin/ttytter ) || ! -f "/usr/local/share/perl/5.14.2/Term/ReadLine/TTYtter.pm" ]]; then
echo "A2CLOUD: Installing TTYtter..."
sudo wget -qO /usr/local/bin/ttytter http://www.floodgap.com/software/ttytter/dist2/2.1.00.txt
sudo chmod ugo+x /usr/local/bin/ttytter
perlVersion=$(perl -e 'print $^V' | cut -c 2-)
if [[ ! -f "/usr/local/share/perl/$perlVersion/Term/ReadLine/TTYtter.pm" ]]; then
echo "A2CLOUD: Installing TTYtter readline module..."
if [[ $downloadBinaries && $perlVersion == "5.14.2" ]]; then
if [[ $isRpi ]]; then
wget -qO- http://appleii.ivanx.com/a2cloud/files/ttytter_readline-rpi.tgz | sudo tar Pzx
elif [[ $isDebian ]]; then
wget -qO- http://appleii.ivanx.com/a2cloud/files/ttytter_readline-debian7_x86.tgz | sudo tar Pzx
fi
fi
if [[ ! -f "/usr/local/share/perl/$perlVersion/Term/ReadLine/TTYtter.pm" ]]; then
if [[ ! -f "/usr/local/lib/perl/$perlVersion/Term/ReadKey.pm" ]]; then
cd /tmp/a2cloud-install
wget -qO TermReadKey-2.31.tar.gz http://www.cpan.org/authors/id/J/JS/JSTOWE/TermReadKey-2.31.tar.gz
tar zxf TermReadKey-2.31.tar.gz
cd TermReadKey-2.31
perl Makefile.PL &> /dev/null
make &> /dev/null
sudo make install &> /dev/null
cd /tmp/a2cloud-install
rm -rf TermReadKey-2.31
fi
cd /tmp/a2cloud-install
wget -qO Term-ReadLine-TTYtter-1.4.tar.gz http://www.cpan.org/authors/id/C/CK/CKAISER/Term-ReadLine-TTYtter-1.4.tar.gz
tar zxf Term-ReadLine-TTYtter-1.4.tar.gz
cd Term-ReadLine-TTYtter-1.4
perl Makefile.PL &> /dev/null
make &> /dev/null
sudo make install &> /dev/null
cd /tmp/a2cloud-install
rm -rf Term-ReadLine-TTYtter-1.4
fi
else
echo "A2CLOUD: TTYtter readline module is already installed."
fi
else
echo "A2CLOUD: TTYtter is already installed."
fi
fi
if [[ $installA2Pi ]]; then
if [[ ! -f /sbin/a2pid ]]; then
echo "A2CLOUD: Installing Apple II Pi..."
cd /tmp/a2cloud-install
if ! grep 'schmenk.is-a-geek.com' /etc/apt/sources.list; then
echo "deb http://schmenk.is-a-geek.com/raspbian wheezy contrib" | sudo tee -a /etc/apt/sources.list > /dev/null
sudo apt-get -y update > /dev/null
fi
sudo apt-get -y --force-yes install a2pi
sudo apt-get -y clean
else
echo "A2CLOUD: Apple II Pi is already installed."
fi
if [[ ! $noA2PiExtras ]]; then
if [[ ! $(dpkg -l | grep libpcap0.8-dev) ]]; then
sudo apt-get -y install libpcap0.8-dev
sudo apt-get -y clean
fi
if [[ ! -f /usr/bin/gsport ]]; then
# echo "A2CLOUD: Updating package repositories to include Apple II Pi..."
# sudo apt-get -y update > /dev/null
echo "A2CLOUD: Installing Apple II Pi extras (GSport)..."
sudo apt-get -y --force-yes install apple2user
sudo apt-get -y clean
else
echo "A2CLOUD: Apple II Pi extras (GSport) are already installed."
fi
fi
sudo sed -i 's/( $SSH_CLIENT || $REMOTEHOST )/( $(tty | grep ttyUSB) || $(tty | grep ttyAMA) || $SSH_CLIENT || $REMOTEHOST )/' /usr/bin/gsport
if [[ $slot6 ]]; then
echo "A2CLOUD: Putting blank disks in GSport slot 6..."
sudo sed -i 's@^s6d1.*$@s6d1 = /usr/share/gsport/disks/slot6drive1.po@' /usr/share/gsport/config.txt
sudo sed -i 's@^s6d2.*$@s6d2 = /usr/share/gsport/disks/slot6drive2.po@' /usr/share/gsport/config.txt
sudo sed -i 's@^s6d1.*$@s6d1 = /usr/share/gsport/disks/slot6drive1.po@' /home/apple2/config.txt
sudo sed -i 's@^s6d2.*$@s6d2 = /usr/share/gsport/disks/slot6drive2.po@' /home/apple2/config.txt
if [[ ! -f /usr/share/gsport/disks/slot6drive1.po || ! -f /usr/share/gsport/disks/slot6drive2.po ]]; then
wget -qO- ivanx.com/a2cloud/files/slot6-gsport-rpi.tgz | sudo tar Pzx 2> /dev/null
fi
fi
# set AppleTalk to turbo
if ! grep -q 'g_appletalk_turbo' /usr/share/gsport/config.txt; then
if grep -q 'bram1[00]' /usr/share/gsport/config.txt; then
sudo sed -i 's/^\(bram1\[00\]\)/g_appletalk_turbo = 1\n\n\1/' /usr/share/gsport/config.txt
else
echo -e '\ng_appletalk_turbo = 1' | sudo tee -a /usr/share/gsport/config.txt > /dev/null
fi
fi
sudo sed -i 's/^g_appletalk_turbo = 0/g_appletalk_turbo = 1/' /usr/share/gsport/config.txt
# enable Uthernet
if ! grep -q 'g_ethernet[^_]' /usr/share/gsport/config.txt; then
if grep -q 'bram1[00]' /usr/share/gsport/config.txt; then
sudo sed -i 's/^\(bram1\[00\]\)/g_ethernet = 1\n\n\1/' /usr/share/gsport/config.txt
else
echo -e '\ng_ethernet = 1' | sudo tee -a /usr/share/gsport/config.txt > /dev/null
fi
fi
sudo sed -i 's/^g_ethernet = 0/g_ethernet = 1/' /usr/share/gsport/config.txt
fi
if [[ $installEmulators ]]; then
# KEGS
if [[ ! -f /usr/local/bin/xkegs ]]; then
echo "A2CLOUD: Installing KEGS..."
cd /tmp/a2cloud-install
if [[ $downloadBinaries ]]; then
if [[ $isRpi ]]; then
wget -qO- http://appleii.ivanx.com/a2cloud/files/kegs-rpi.tgz | sudo tar Pzx 2> /dev/null
elif [[ $isDebian ]]; then
wget -qO- http://appleii.ivanx.com/a2cloud/files/kegs-debian7_x86.tgz | sudo tar Pzx
fi
fi
if [[ ! -f /usr/local/bin/xkegs ]]; then
echo "A2CLOUD: Building KEGS from source..."
sudo apt-get -y install build-essential &> /dev/null
sudo apt-get -y install libx11-dev libxext-dev xfonts-base &> /dev/null
sudo apt-get -y clean
mkdir -p /tmp/a2cloud-install/kegs
cd /tmp/a2cloud-install/kegs
wget -q -O kegs.tgz kegs.sourceforge.net/kegs.0.91.tar.gz
tar zxf kegs.tgz
cd kegs.0.91/src
rm vars 2> /dev/null
ln -s vars_x86linux vars
if [[ $isRpi ]]; then
sudo sed -i 's/march=pentium/march=armv6k/' vars_x86linux
fi
make &> /dev/null
gcc -o ../to_pro to_pro.c &> /dev/null
gcc -o ../partls partls.c &> /dev/null
sudo cp -P ../xkegs ../to_pro ../partls /usr/local/bin
sudo cp ../config.kegs /usr/local/lib
sudo chmod ugo+w /usr/local/lib/config.kegs
cd /tmp/a2cloud-install
rm -rf kegs
fi
if [[ $slot6 ]]; then
echo "A2CLOUD: Putting blank disks in KEGS slot 6..."
sudo sed -i 's@^s6d1.*$@s6d1 = /usr/local/share/gsdisks/slot6drive1.po@' /usr/local/lib/config.kegs
sudo sed -i 's@^s6d2.*$@s6d2 = /usr/local/share/gsdisks/slot6drive2.po@' /usr/local/lib/config.kegs
if [[ ! -f /usr/local/share/gsdisks/slot6drive1.po || ! -f /usr/local/share/gsdisks/slot6drive2.po ]]; then
wget -qO- http://appleii.ivanx.com/a2cloud/files/slot6.tgz | sudo tar Pzx 2> /dev/null
fi
fi
else
echo "A2CLOUD: KEGS is already installed."
fi
echo "A2CLOUD: Updating KEGS launch and setup files..."
sudo addgroup kegs &> /dev/null
sudo chgrp kegs /usr/local/bin/xkegs
sudo chmod u+s /usr/local/bin/xkegs
sudo wget -qO /usr/local/bin/kegs ${scriptURL}setup/kegs.txt
sudo chmod ugo+x /usr/local/bin/kegs
sudo wget -qO /usr/local/bin/kegs-setup ${scriptURL}setup/kegs-setup-shell.txt
sudo chmod ugo+x /usr/local/bin/kegs-setup
# GSport, if non-RPi
if [[ ! $isRpi && ! -f /usr/local/bin/gsport ]]; then
echo "A2CLOUD: Installing GSport..."
cd /tmp/a2cloud-install
if [[ $downloadBinaries ]]; then
sudo apt-get -y install libpcap0.8-dev &> /dev/null
sudo apt-get -y clean
if [[ $isDebian ]]; then
wget -qO- http://appleii.ivanx.com/a2cloud/files/gsport-debian7_x86.tgz | sudo tar Pzx 2> /dev/null
fi
fi
if [[ ! -f /usr/local/bin/gsport ]]; then
echo "A2CLOUD: Building GSport from source..."
sudo apt-get -y install build-essential &> /dev/null
sudo apt-get -y install libx11-dev libxext-dev xfonts-base libpcap0.8-dev &> /dev/null
sudo apt-get -y clean > /dev/null
mkdir -p /tmp/a2cloud-install/gsport
cd /tmp/a2cloud-install/gsport
wget -q -O gsport.tgz http://downloads.sourceforge.net/project/gsport/GSport-0.31/gsport_0.31.tar.gz
tar zxf gsport.tgz
cd gsport*/src
rm vars 2> /dev/null
ln -s vars_x86linux vars
make &> /dev/null
gcc -o ../to_pro to_pro.c &> /dev/null
gcc -o ../partls partls.c &> /dev/null
sudo cp -P ../gsportx ../to_pro ../partls /usr/local/bin
sudo cp ../config.txt /usr/local/lib
sudo chmod ugo+w /usr/local/lib/config.txt
make clean &> /dev/null
rm vars
cp vars_fbrpilinux vars
sed -i 's/-march=armv6/-march=i686/' vars
make &> /dev/null
sudo cp -P ../gsportfb /usr/local/bin
cd /usr/local/lib
sudo ln -s config.txt gsport_config.txt 2> /dev/null
cd /tmp/a2cloud-install
rm -rf gsport
fi
if [[ $slot6 ]]; then
echo "A2CLOUD: Putting blank disks in GSport slot 6..."
sudo sed -i 's@^s6d1.*$@s6d1 = /usr/local/share/gsdisks/slot6drive1.po@' /usr/local/lib/config.txt
sudo sed -i 's@^s6d2.*$@s6d2 = /usr/local/share/gsdisks/slot6drive2.po@' /usr/local/lib/config.txt
if [[ ! -f /usr/local/share/gsdisks/slot6drive1.po || ! -f /usr/local/share/gsdisks/slot6drive2.po ]]; then
wget -qO- http://appleii.ivanx.com/a2cloud/files/slot6.tgz | sudo tar Pzx 2> /dev/null
fi
fi
# enable AppleTalk
if ! grep -q 'g_appletalk_turbo' /usr/local/lib/config.txt; then
if grep -q 'bram1[00]' /usr/local/lib/config.txt; then
sudo sed -i 's/^\(bram1\[00\]\)/g_appletalk_turbo = 1\n\n\1/' /usr/local/lib/config.txt
else
echo -e '\ng_appletalk_turbo = 1' | sudo tee -a /usr/local/lib/config.txt > /dev/null
fi
fi
sudo sed -i 's/g_appletalk_turbo = 0/g_appletalk_turbo = 1/' /usr/local/lib/config.txt
# enable Uthernet
if ! grep -q 'g_ethernet[^_]' /usr/local/lib/config.txt; then
if grep -q 'bram1[00]' /usr/local/lib/config.txt; then
sudo sed -i 's/^\(bram1\[00\]\)/g_ethernet = 1\n\n\1/' config.txt
else
echo -e '\ng_ethernet = 1' | sudo tee -a /usr/local/lib/config.txt > /dev/null
fi
fi
sudo sed -i 's/g_ethernet = 0/g_ethernet = 1/' /usr/local/lib/config.txt
else
[[ ! $isRpi ]] && echo "A2CLOUD: GSport is already installed."
fi
if [[ ! $isRpi ]]; then
echo "A2CLOUD: Updating GSport launch and setup files..."
sudo addgroup gsport &> /dev/null
sudo chgrp gsport /usr/local/bin/gsportfb
sudo chmod u+s /usr/local/bin/gsportfb
sudo chgrp gsport /usr/local/bin/gsportx
sudo chmod u+s /usr/local/bin/gsportx
sudo wget -qO /usr/local/bin/gsport ${scriptURL}setup/gsport.txt
sudo chmod ugo+x /usr/local/bin/gsport
sudo wget -qO /usr/local/bin/gsport-setup ${scriptURL}setup/gsport-setup-shell.txt
sudo chmod ugo+x /usr/local/bin/gsport-setup
fi
# LinApple
if [[ ! -f /usr/local/linapple/linapple ]]; then
echo "A2CLOUD: Installing LinApple..."
cd /tmp/a2cloud-install
if [[ $downloadBinaries ]]; then
if [[ $isRpi ]]; then
wget -qO- http://appleii.ivanx.com/a2cloud/files/linapple-rpi.tgz | sudo tar Pzx
elif [[ $isDebian ]]; then
wget -qO- http://appleii.ivanx.com/a2cloud/files/linapple-debian7_x86.tgz | sudo tar Pzx
fi
fi
if [[ ! -f /usr/local/linapple/linapple ]]; then
sudo apt-get -y install build-essential
sudo apt-get -y install libsdl1.2-dev libcurl4-openssl-dev zlib1g-dev libzip-dev
sudo apt-get -y clean
rm -rf /tmp/a2cloud-install/linapple* &> /dev/null
mkdir -p /tmp/a2cloud-install/linapple
cd /tmp/a2cloud-install/linapple
wget -q -O linapple.tar.bz2 http://downloads.sourceforge.net/project/linapple/linapple/linapple-2a/linapple-src_2a.tar.bz2
tar jxf linapple.tar.bz2
cd linapple-src_2a/src
# doesn't compile with gcc 4.7, so use older version
if (( $(g++ --version | head -1 | rev | cut -f 1 -d ' ' | rev | tr -d '.') >= 470 )); then
sudo apt-get -y install g++-4.6
sudo apt-get -y clean
sed -i 's@CXX ?= c++@CXX = /usr/bin/g++-4.6@' Makefile
fi
make
sudo make install
cd /tmp/a2cloud-install
rm -rf linapple
fi
else
echo "A2CLOUD: LinApple is already installed."
fi
echo "A2CLOUD: Updating LinApple launch file..."
sudo wget -qO /usr/local/bin/linapple ${scriptURL}setup/linapple.txt
sudo chmod ugo+x /usr/local/bin/linapple
fi
if [[ $installArchiveTools ]]; then
if [[ ! -f /usr/local/bin/nulib2 || ! -f /usr/local/bin/sciibin || ! -f /usr/local/bin/usq ]]; then
echo "A2CLOUD: Installing nulib2, sciibin, unblu, unbit, unexec, usq..."
cd /tmp/a2cloud-install
if [[ $downloadBinaries ]]; then
if [[ $isRpi ]]; then
wget -qO- http://appleii.ivanx.com/a2cloud/files/nulib2-rpi.tgz | sudo tar Pzx
elif [[ $isDebian ]]; then
wget -qO- http://appleii.ivanx.com/a2cloud/files/nulib2-debian7_x86.tgz | sudo tar Pzx
fi
fi
if [[ ! -f /usr/local/bin/nulib2 ]]; then
sudo apt-get -y install build-essential
sudo apt-get -y install zlib1g-dev
sudo apt-get -y clean
# install nulib2
rm -rf nulib &> /dev/null
mkdir -p nulib
cd nulib
wget -qO nulib.tgz http://web.archive.org/web/20131031160750/http://www.nulib.com/downloads/nulibdist.tar.gz
tar zxf nulib.tgz
cd nufxlib*
./configure
make
sudo make install
cd ../nulib2*
./configure
make
sudo make install
cd /tmp/a2cloud-install
rm -rf nulib
fi
if [[ ! -f /usr/local/bin/sciibin || ! -f /usr/local/bin/usq ]]; then
# install sciibin/unblu/unbit/unexec/usq
sudo apt-get -y install build-essential
sudo apt-get -y clean
rm -rf undoit &> /dev/null
mkdir -p undoit
cd undoit
wget -q http://web.archive.org/web/20110619163030/http://fadden.com/dl-apple2/undoit.zip
unzip undoit.zip
make
sudo mv sciibin unbit unblu unexec usq /usr/local/bin
cd /tmp/a2cloud-install
rm -rf undoit
fi
else
echo "A2CLOUD: nulib2, sciibin, unblu, unbit, unexec, usq are already installed."
fi
echo "A2CLOUD: Setting up shk2image command..."
sudo wget -qO /usr/local/bin/shk2image ${scriptURL}setup/shk2image.txt
sudo chmod ugo+x /usr/local/bin/shk2image
# download and install The Unarchiver, for expanding apple.com disk images
# http://wakaba.c3.cx/s/apps/unarchiver.html
if ! command -v unar >/dev/null; then
echo "A2CLOUD: Installing The Unarchiver..."
if apt-cache show unar &>/dev/null; then
sudo apt-get -y install unar
else
cd /tmp/a2cloud-install
if [[ $downloadBinaries ]]; then
if [[ $isRpi || $isDebian ]]; then
sudo apt-get -y install libgnustep-base1.22
sudo apt-get -y clean
if [[ $isRpi ]]; then
wget -qO- http://appleii.ivanx.com/a2cloud/files/unar-rpi.tgz | sudo tar Pzx
elif [[ $isDebian ]]; then
wget -qO- http://appleii.ivanx.com/a2cloud/files/unar-debian7_x86.tgz | sudo tar Pzx
fi
fi
fi
if ! command -v unar >/dev/null; then
sudo apt-get -y install build-essential
sudo apt-get -y install libgnustep-base-dev libz-dev libbz2-dev
sudo apt-get -y install libssl-dev libicu-dev unzip
sudo apt-get -y clean
rm -rf unar &> /dev/null
mkdir -p unar
cd unar
wget -q -nc http://theunarchiver.googlecode.com/files/unar1.7_src.zip
unzip -o unar1.7_src.zip
cd The\ Unarchiver/XADMaster
make -f Makefile.linux
sudo mv lsar unar /usr/local/bin
cd ../Extra
sudo mkdir -p /usr/local/man/man1
sudo mv lsar.1 unar.1 /usr/local/man/man1
cd /tmp/a2cloud-install
rm -rf unar
fi
sudo mandb &> /dev/null
fi
else
echo "A2CLOUD: The Unarchiver is already installed."
fi
fi
# add shortcuts to LXDE desktop and menu
if command -v X >/dev/null; then
[[ -d /etc/xdg/lxsession/LXDE-pi ]] && lxde="lxde-pi" || lxde="lxde"
echo "A2CLOUD: Creating LXDE desktop and menu shortcuts..."
# remove auto-open Terminal window from pre-1.8.0
echo "A2CLOUD: removing auto-open LXDE terminal window (if present)..."
sudo rm /etc/xdg/autostart/lxterminal.desktop 2> /dev/null
# create "AppleII" category
mkdir -p ~/.config/menus
if [[ ! -f ~/.config/menus/${lxde}-applications.menu ]]; then
mkdir -p ~/.config/menus
echo -e "<!DOCTYPE Menu PUBLIC \"-//freedesktop//DTD Menu 1.0//EN\" \"http://www.freedesktop.org/standards/menu-spec/1.0/menu.dtd\">\n<Menu>\n <Name>A2CLOUD menu extension</Name>\n <MergeFile type=\"parent\">/etc/xdg/menus/${lxde}-applications.menu</MergeFile>\n <Menu>\n <Name>Apple II</Name>\n <Directory>lxde-appleii.directory</Directory>\n <Include>\n <And><Category>AppleII</Category></And>\n </Include>\n </Menu>\n</Menu>\n" > ~/.config/menus/${lxde}-applications.menu
else
grep -q AppleII ~/.config/menus/${lxde}-applications.menu || echo "A2CLOUD: LXDE child category file exists, not creating Apple II category."
fi
# create "Apple II" menu entry
sudo mkdir -p /usr/local/share/desktop-directories
echo -e "[Desktop Entry]\nName=Apple II\nComment=Programs and utilities related to the Apple II\nIcon=/usr/local/linapple/icon.bmp\nType=Directory\n" | sudo tee /usr/local/share/desktop-directories/lxde-appleii.directory > /dev/null
# create menu and desktop shortcuts
sudo mkdir -p /usr/local/share/applications
# create user desktop items folder
mkdir -p ~/Desktop
# GSport:
if [[ -f /usr/bin/gsport ]]; then
echo -e "[Desktop Entry]\nName=GSport\nComment=Apple IIgs Emulator\nExec=lxterminal -e /usr/bin/gsport\nIcon=/usr/local/share/gsport32.ico\nTerminal=false\nType=Application\nCategories=AppleII\n" | sudo tee /usr/local/share/applications/gsport.desktop > ~/Desktop/gsport.desktop
elif [[ -f /usr/local/bin/gsport ]]; then
echo -e "[Desktop Entry]\nName=GSport\nComment=Apple IIgs Emulator\nExec=lxterminal -e /usr/local/bin/gsport\nIcon=/usr/local/share/gsport32.ico\nTerminal=false\nType=Application\nCategories=AppleII\n" | sudo tee /usr/local/share/applications/gsport.desktop > ~/Desktop/gsport.desktop
fi
if [[ ! -f /usr/local/share/gsport32.ico ]]; then
sudo wget -qO /usr/local/share/gsport32.ico http://appleii.ivanx.com/a2cloud/files/gsport32.ico
fi
# KEGS:
if [[ -f /usr/local/bin/kegs ]]; then
echo -e "[Desktop Entry]\nName=KEGS\nComment=Apple IIgs Emulator\nExec=lxterminal -e /usr/local/bin/kegs\nIcon=/usr/local/share/kegsicon.png\nTerminal=false\nType=Application\nCategories=AppleII\n" | sudo tee /usr/local/share/applications/kegs.desktop > /dev/null
[[ ! -f ~/Desktop/gsport.desktop ]] && cp /usr/local/share/applications/kegs.desktop ~/Desktop/kegs.desktop
fi
if [[ ! -f /usr/local/share/kegsicon.png ]]; then
sudo wget -qO /usr/local/share/kegsicon.png http://appleii.ivanx.com/a2cloud/files/kegsicon.png
fi
# LinApple:
if [[ -f /usr/local/bin/linapple ]]; then
echo -e "[Desktop Entry]\nName=LinApple\nComment=Apple IIe Emulator\nExec=lxterminal -e /usr/local/bin/linapple\nIcon=/usr/local/linapple/icon.bmp\nTerminal=false\nType=Application\nCategories=AppleII\n" | sudo tee /usr/local/share/applications/linapple.desktop > ~/Desktop/linapple.desktop
fi
# ADTPro Server:
if [[ -f /usr/local/bin/adtpro.sh ]]; then
echo -e "[Desktop Entry]\nName=ADTPro Server\nComment=Floppy Transfer Utility\nExec=/usr/local/bin/adtpro.sh\nIcon=/usr/local/adtpro/lib/ADTPro.ico\nTerminal=false\nType=Application\nCategories=AppleII\n" | sudo tee /usr/local/share/applications/adtproserver.desktop > ~/Desktop/adtproserver.desktop
fi
# LXTerminal:
if [[ ! $(grep lxterminal.desktop /etc/xdg/lxpanel/profile/LXDE-pi/panels/panel 2> /dev/null) && ! -f ~/Desktop/lxterminal.desktop ]]; then
cp /usr/share/applications/lxterminal.desktop ~/Desktop/lxterminal.desktop
fi
# prevent PolicyKit error on GUI startup
sudo sed -i 's/^NotShowIn=GNOME;KDE;\?$/NotShowIn=GNOME;KDE;LXDE/' /etc/xdg/autostart/lxpolkit.desktop 2> /dev/null
sed -i 's/^NotShowIn=GNOME;KDE;\?$/NotShowIn=GNOME;KDE;LXDE/' /home/$USER/.config/autostart/lxpolkit.desktop 2> /dev/null
fi
# create A2CLOUD disk
if [[ ( $updateADTPro || $createBootDisk ) && -f /usr/local/bin/acmd ]]; then
a2CloudDisk=/usr/local/adtpro/disks/A2CLOUD.PO
else
a2CloudDisk=
fi
if [[ $a2CloudDisk ]]; then
echo
echo "A2CLOUD: Preparing A2CLOUD disk images..."
cd /tmp/a2cloud-install
a2CloudDisk140=${a2CloudDisk%%.*}.DSK
if [[ ! -f $a2CloudDisk && ! -f $a2CloudDisk140 ]]; then
makeA2CloudDisk=1
else
[[ -f $a2CloudDisk ]] && echo "A2CLOUD: $a2CloudDisk already exists."
[[ -f $a2CloudDisk140 ]] && echo "A2CLOUD: $a2CloudDisk140 already exists."
echo " If you want a fresh copy, please move or delete as needed."
makeA2CloudDisk=
fi
if [[ ! $makeA2CloudDisk ]]; then # not getting/building disks
a2CloudDiskUpdated=
if [[ $updateADTPro && -f "$a2CloudDisk" ]]; then # does existing 800K disk need updating?
sudo pkill -f [A]DTPro
echo "A2CLOUD: Updating ADTPro and VDrive on 800K A2CLOUD disk..."
acmd -g /usr/local/adtpro/disks/VDRIVE-*DSK VEDRIVE - | acmd -p "$a2CloudDisk" VEDRIVE SYS
acmd -g /usr/local/adtpro/disks/ADTPRO-*DSK ADTPROAUD - | acmd -p "$a2CloudDisk" ADTPROAUD SYS
acmd -g /usr/local/adtpro/disks/ADTPRO-*DSK ADTPROETH - | acmd -p "$a2CloudDisk" ADTPROETH SYS
acmd -g /usr/local/adtpro/disks/ADTPRO-*DSK ADTPRO.BIN - | acmd -p "$a2CloudDisk" ADTPRO.BIN BIN \$0800
acmd -g /usr/local/adtpro/disks/ADTPRO-*DSK ADTPROAUD.BIN - | acmd -p "$a2CloudDisk" ADTPROAUD.BIN SYS \$0800
acmd -g /usr/local/adtpro/disks/ADTPRO-*DSK ADTPROETH.BIN - | acmd -p "$a2CloudDisk" ADTPROETH.BIN SYS \$0800
acmd -g /usr/local/adtpro/disks/VDRIVE-*DSK VEDRIVE.CONFIG - | acmd -p "$a2CloudDisk" VEDRIVE.CONFIG BAS
acmd -g /usr/local/adtpro/disks/ADTPRO-*DSK ADTPRO - | acmd -p "$a2CloudDisk" ADTPRO SYS
acmd -g /usr/local/adtpro/disks/VDRIVE-*DSK VSDRIVE - | acmd -p "$a2CloudDisk" VSDRIVE SYS
acmd -g /usr/local/adtpro/disks/VDRIVE-*DSK VSDRIVE.LOW - | acmd -p "$a2CloudDisk" VSDRIVE.LOW SYS
a2CloudDiskUpdated=1
fi
if [[ $updateADTPro && -f "$a2CloudDisk140" ]]; then # does existing 140K disk need updating?
sudo pkill -f [A]DTPro
echo "A2CLOUD: Updating ADTPro and VDrive on 140K A2CLOUD disk..."
acmd -g /usr/local/adtpro/disks/ADTPRO-*DSK ADTPRO.BIN - | acmd -p "$a2CloudDisk140" ADTPRO.BIN BIN \$0800
acmd -g /usr/local/adtpro/disks/ADTPRO-*DSK ADTPRO - | acmd -p "$a2CloudDisk140" ADTPRO SYS
acmd -g /usr/local/adtpro/disks/VDRIVE-*DSK VSDRIVE - | acmd -p "$a2CloudDisk140" VSDRIVE SYS
acmd -g /usr/local/adtpro/disks/VDRIVE-*DSK VSDRIVE.LOW - | acmd -p "$a2CloudDisk140" VSDRIVE.LOW SYS
a2CloudDiskUpdated=1
fi
if [[ $a2CloudDiskUpdated ]]; then
echo
echo "Your A2CLOUD boot disk images have been updated. You may want"
echo " to update your boot floppy with their current contents using ADTPro."
fi
echo
else # building or downloading disks
sudo pkill -f [A]DTPro
if [[ ! $buildA2CloudDisk ]]; then
echo "A2CLOUD: Downloading 800K disk image..."
wget -qO $a2CloudDisk http://appleii.ivanx.com/a2cloud/files/A2CLOUD.PO
echo "A2CLOUD: Downloading 140K disk image..."
wget -qO $a2CloudDisk140 http://appleii.ivanx.com/a2cloud/files/A2CLOUD.DSK
fi
# build if we don't have a disk image
# (because download failed or -b argument was used)
if [[ ! -f $a2CloudDisk || ( $(wc -c $a2CloudDisk | cut -f 1 -d ' ') != "819200" ) ]]; then
# start with a disk image
echo "A2CLOUD: Creating 800K disk image..."
cp /usr/local/adtpro/disks/ADTPRO-*PO $a2CloudDisk
acmd -n $a2CloudDisk A2CLOUD
# ADTPro
echo "A2CLOUD: Preparing ADTPro..."
acmd -d "$a2CloudDisk" BASIC
acmd -d "$a2CloudDisk" STARTUP.SYSTEM
acmd -d "$a2CloudDisk" ADTPRO
# start from ADTPro distribution image and replace BASIC.SYSTEM 1.4.1 with 1.5
wget -qO Disk_3_of_7-SystemTools1.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_IIGS_System_6.0.1%2FDisk_3_of_7-SystemTools1.sea.bin
unar -k skip Disk_3_of_7-SystemTools1.sea.bin &> /dev/null
mv 'Disk 3 of 7-SystemTools1.sea' SystemTools1.dc42
acmd -g SystemTools1.dc42 BASIC.SYSTEM - | acmd -p "$a2CloudDisk" BASIC.SYSTEM SYS
# use our startup program
wget -qO- http://appleii.ivanx.com/a2cloud/files/STARTUP.BAS | acmd -p "$a2CloudDisk" STARTUP BAS
# VEDRIVE
echo "A2CLOUD: Copying VEDRIVE..."
acmd -g /usr/local/adtpro/disks/VDRIVE-*DSK VEDRIVE - | acmd -p "$a2CloudDisk" VEDRIVE SYS
acmd -g /usr/local/adtpro/disks/VDRIVE-*DSK VEDRIVE.CONFIG - | acmd -p "$a2CloudDisk" VEDRIVE.CONFIG BAS
# Apple System Utilities 3.1 support files
if command -v unar >/dev/null; then
echo "A2CLOUD: Downloading and copying System Utilities support files..."
cd /tmp/a2cloud-install
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
dd if='Apple II System Disk 3.2.sea' of=A2SYSDISK32.PO bs=1 skip=84 count=819200 2> /dev/null
acmd -g A2SYSDISK32.PO UTIL.0 - | acmd -p "$a2CloudDisk" UTIL.0 BIN \$0900
acmd -g A2SYSDISK32.PO UTIL.1 - | acmd -p "$a2CloudDisk" UTIL.1 BIN \$0E00
acmd -g A2SYSDISK32.PO UTIL.2 - | acmd -p "$a2CloudDisk" UTIL.2 BIN \$B400
else
echo "A2CLOUD: unar is not available; not installing System Utilities support files."
fi
# ProTERM
echo "A2CLOUD: Downloading ProTERM..."
wget --user-agent="Mozilla/5.0 (wget_A2CLOUD; rv:1.13.4) Gecko/20100101 Firefox/4.0.1" -qO /tmp/a2cloud-install/pt31.shk http://lostclassics.apple2.info/download/InTrec/PT31A2GM2K9.SHK
mkdir -p /tmp/a2cloud-install/pt31
cd /tmp/a2cloud-install/pt31
nulib2 -xse ../pt31.shk > /dev/null
# IIc slot 1 patch for ProTERM from Hugh Hood
echo "A2CLOUD: Patching ProTERM for IIc printer port use..."
writecharsHex "PT3.CODE0#060000" 1638 "41.70.70.6C.65.20.49.49.63.2F.49.49.63.2B.20.50.72.69.6E.74.65.72.20.50.6F.72.74.20.20.20.20.20.06.07.10.41.70.70.6C.65.20.49.49.63.2F.49.49.63.2B.20.4D.6F.64.65.6D.20.50.6F.72.74.20.20.20.20.20.20.20.06.07.20"
echo "A2CLOUD: Copying ProTERM..."
for thisFile in /tmp/a2cloud-install/pt31/*; do
filenameUnix="${thisFile##*/}"
filename="${filenameUnix%%#*}"
filetype="${filenameUnix##*#}"
if [[ $filename != "PT3.DIAL" && $filename != "ProDOS" && $filename != "PT3.BACKUP" && $filename != "PT3.SYSTEM" ]]; then
acmd -p "$a2CloudDisk" $filename \$${filetype:0:2} \$${filetype:2:4} < $thisFile
fi
done
acmd -p "$a2CloudDisk" PT3.DIAL/PTD.SPACEBAR COM \$8002 < /tmp/a2cloud-install/pt31/PT3.DIAL/"PTD.SPACEBAR#598002"
echo "A2CLOUD: Adding 115200 baud macros for ProTERM..."
wget -qO PT3.IIC.MACRO http://appleii.ivanx.com/a2cloud/files/PT3.IIC.MACRO.txt
cat "PT3.GLOBAL#040000" | tr '\r' '\n' | sed ':a;N;$!ba;s/\n\*\nOPTION-f : Unused & available.\n\*/~~~/' | sed -e '/~~~/r PT3.IIC.MACRO' -e 's///' | tr '\n' '\r' | acmd -p "$a2CloudDisk" PT3.IIC.GLOBAL TXT
wget -qO PT3.IIE.MACRO http://appleii.ivanx.com/a2cloud/files/PT3.IIE.MACRO.txt
cat "PT3.GLOBAL#040000" | tr '\r' '\n' | sed ':a;N;$!ba;s/\n\*\nOPTION-f : Unused & available.\n\*/~~~/' | sed -e '/~~~/r PT3.IIE.MACRO' -e 's///' | tr '\n' '\r' | acmd -p "$a2CloudDisk" PT3.IIE.GLOBAL TXT
wget -qO PT3.IIGS.MACRO http://appleii.ivanx.com/a2cloud/files/PT3.IIGS.MACRO.txt
cat "PT3.GLOBAL#040000" | tr '\r' '\n' | sed ':a;N;$!ba;s/\n\*\nOPTION-h : Unused & available.\n\*\n\n\*\nOPTION-H : Unused & available.\n\*/~~~/' | sed -e '/~~~/r PT3.IIGS.MACRO' -e 's///' | tr '\n' '\r' | acmd -p "$a2CloudDisk" PT3.IIGS.GLOBAL TXT
acmd -p "$a2CloudDisk" PROTERM SYS < /tmp/a2cloud-install/pt31/"PT3.SYSTEM#ff2000"
cd /tmp/a2cloud-install
rm -rf /tmp/a2cloud-install/pt31
# Z-Link
echo "A2CLOUD: Downloading and copying Z-Link..."
cd /tmp/a2cloud-install
wget -qO /tmp/a2cloud-install/zlink.shk "ftp://ftp.gno.org/pub/apple2/prodos/comm/term/zLink91.shk"
nulib2 -p zlink.shk z.link.system | acmd -p "$a2CloudDisk" Z.LINK SYS
# ShrinkIt
echo "A2CLOUD: Downloading and copying ShrinkIt..."
cd /tmp/a2cloud-install
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/a2cloud/files/shrinkit.sdk
nulib2 -xs shrinkit.sdk > /dev/null
acmd -g /tmp/a2cloud-install/SHRINKIT SHRINKIT - | acmd -p "$a2CloudDisk" SHRINKIT SYS
acmd -g /tmp/a2cloud-install/SHRINKIT SHRINKIT.SYSTEM - | acmd -p "$a2CloudDisk" SHRINKIT.SYS SYS
acmd -g /tmp/a2cloud-install/SHRINKIT IIPLUS.SHRINKIT - | acmd -p "$a2CloudDisk" IIPLUS.SHRINKIT SYS
acmd -g /tmp/a2cloud-install/SHRINKIT IIPLUS.UNSHRINK - | acmd -p "$a2CloudDisk" IIPLUS.UNSHRINK SYS
# DSK2FILE
echo "A2CLOUD: Downloading and copying DSK2FILE..."
cd /tmp/a2cloud-install
wget -q -O dsk2file.shk http://www.dwheeler.com/6502/oneelkruns/dsk2file.zip
nulib2 -p dsk2file.shk dsk2file58 | acmd -p "$a2CloudDisk" DSK2FILE SYS
# Apple System Utilities 3.1 launch file
if command -v unar >/dev/null; then
echo "A2CLOUD: Copying System Utilities launch file..."
acmd -g A2SYSDISK32.PO SYSUTIL.SYSTEM - | acmd -p "$a2CloudDisk" SYSUTIL SYS
else
echo "A2CLOUD: unar is not available; not installing System Utilities."
fi
# Filer
echo "A2CLOUD: Downloading and copying Filer..."
wget -qO /tmp/a2cloud-install/mmgr.prutil.sdk ftp://ftp.gno.org/pub/apple2/prodos/comm/term/modem.mgr/mmgr.prutil.sdk
cd /tmp/a2cloud-install
nulib2 -xs mmgr.prutil.sdk > /dev/null
acmd -g /tmp/a2cloud-install/MMGR FILER - | acmd -p "$a2CloudDisk" FILER SYS
# ADTPRO launch
echo "A2CLOUD: Copying ADTPro launch file..."
acmd -g /usr/local/adtpro/disks/ADTPRO-*DSK ADTPRO - | acmd -p "$a2CloudDisk" ADTPRO SYS
# VSDRIVE
if [[ ! $(acmd -ls "$a2CloudDisk" | grep '^VSDRIVE BIN') ]]; then
echo "A2CLOUD: Copying VSDRIVE..."
acmd -g /usr/local/adtpro/disks/VDRIVE-*DSK VSDRIVE - | acmd -p "$a2CloudDisk" VSDRIVE SYS
acmd -g /usr/local/adtpro/disks/VDRIVE-*DSK VSDRIVE.LOW - | acmd -p "$a2CloudDisk" VSDRIVE.LOW BIN \$2000
else
echo "A2CLOUD: VSDRIVE is already on the target disk image."
fi
fi
if [[ ! -f $a2CloudDisk140 || ( $(wc -c $a2CloudDisk140 | cut -f 1 -d ' ') != "143360" ) ]]; then
echo "A2CLOUD: Creating 140K disk image..."
mkpo "$a2CloudDisk140" A2CLOUD
dd bs=256 count=1 of="$a2CloudDisk140" conv=notrunc 2> /dev/null < /usr/local/adtpro/disks/ADTPRO-*DSK
dd bs=256 count=1 of="$a2CloudDisk140" skip=14 seek=14 conv=notrunc 2> /dev/null < /usr/local/adtpro/disks/ADTPRO-*DSK
acmd -g $a2CloudDisk BASIC.SYSTEM - | acmd -p $a2CloudDisk140 BASIC.SYSTEM SYS
acmd -g $a2CloudDisk PRODOS - | acmd -p $a2CloudDisk140 PRODOS SYS
acmd -g $a2CloudDisk STARTUP - | acmd -p $a2CloudDisk140 STARTUP BAS
acmd -g $a2CloudDisk ADTPRO.BIN - | acmd -p $a2CloudDisk140 ADTPRO.BIN BIN \$0800
acmd -g $a2CloudDisk Z.LINK - | acmd -p $a2CloudDisk140 Z.LINK SYS
acmd -g $a2CloudDisk IIPLUS.SHRINKIT - | acmd -p $a2CloudDisk140 IIPLUS.SHRINKIT SYS
acmd -g $a2CloudDisk IIPLUS.UNSHRINK - | acmd -p $a2CloudDisk140 IIPLUS.UNSHRINK SYS
acmd -g $a2CloudDisk FILER - | acmd -p $a2CloudDisk140 FILER SYS
acmd -g $a2CloudDisk ADTPRO - | acmd -p $a2CloudDisk140 ADTPRO SYS
acmd -g $a2CloudDisk VSDRIVE - | acmd -p $a2CloudDisk140 VSDRIVE SYS
acmd -g $a2CloudDisk VSDRIVE.LOW - | acmd -p $a2CloudDisk140 VSDRIVE.LOW BIN \$2000
fi
# A2PI
if [[ ! $(acmd -ls "$a2CloudDisk" | grep '^ A2PI BIN') ]]; then
echo "A2CLOUD: Downloading and copying A2PI client..."
mkdir -p /tmp/a2cloud-install/a2pi
cd /tmp/a2cloud-install/a2pi
wget -qO a2pi.deb http://schmenk.is-a-geek.com/tarfiles/a2pi_armhf.deb
# dpkg-deb --fsys-tarfile a2pi.deb | tar --strip-components=4 --wildcards -O -x ./usr/share/a2pi/A2PI*.PO > A2PI.PO
dpkg-deb --fsys-tarfile a2pi.deb | tar --strip-components=4 --wildcards -x ./usr/share/a2pi/A2PI*.PO
a2piImage=$(ls -1r A2PI*.PO | head -1)
mkdir a2pidisk
cppo -e "$a2piImage" a2pidisk &> /dev/null
mv a2pidisk/A2PI* a2pidisk/A2PI
cd a2pidisk/A2PI
rm PRODOS* *A3* BASIC.SYSTEM*
cd ..
nulib2 -a -r -e ../a2pi.shk A2PI &> /dev/null
cd ..
shk2image a2pi.shk $a2CloudDisk &> /dev/null
shk2image a2pi.shk $a2CloudDisk140 &> /dev/null
cd /tmp/a2cloud-install
rm -rf a2pi
else
echo "A2CLOUD: A2PI client is already on the target disk image."
fi
if [[ -f /usr/local/adtpro/disks/Virtual.po && ! -L /usr/local/adtpro/disks/Virtual.po ]]; then
mv /usr/local/adtpro/disks/Virtual.po /usr/local/adtpro/disks/defaultVirtual.po &> /dev/null
vsd1 -f /usr/local/adtpro/disks/defaultVirtual.po
fi
if [[ -f /usr/local/adtpro/disks/Virtual2.po && ! -L /usr/local/adtpro/disks/Virtual2.po ]]; then
if [[ $(sha1sum /usr/local/adtpro/disks/Virtual2.po | cut -d ' ' -f 1) == "41c178f9f596f94ea7607624672552137dccade2" ]]; then
rm /usr/local/adtpro/disks/Virtual2.po
else
mv /usr/local/adtpro/disks/Virtual2.po /usr/local/adtpro/disks/defaultVirtual2.po &> /dev/null
fi
fi
vsd2 -f $a2CloudDisk
# for compatibility with pre-1.6.7
ln -s /usr/local/adtpro/disks/A2CLOUD.PO /usr/local/adtpro/disks/A2CLOUD.HDV
echo
echo "Your A2CLOUD disk images are ready. They are called"
echo "A2CLOUD.DSK (140K) and A2CLOUD.PO (800K), and are stored in"
echo "/usr/local/adtpro/disks"
echo
echo "You can transfer to a floppy with ADTPro, or access"
echo "the 800K image with VSDRIVE at S2,D2."
echo
echo "See http://ivanx.com/a2cloud for more info."
echo
fi
fi
# make new blank disk of specified size
if [[ $newImageName ]]; then
echo "A2CLOUD: Creating new ${imageSize}K image for virtual drive 1 at"
echo " /usr/local/adtpro/disks/$newImageName..."
sudo pkill -f [A]DTPro
rm /usr/local/adtpro/disks/Virtual.po &> /dev/null
mkpo -b $(( $imageSize * 2 )) /usr/local/adtpro/disks/"$newImageName" $prodosVolName
vsd1 -f /usr/local/adtpro/disks/"$newImageName"
fi
echo "wget -qO /tmp/a2cloud-setup http://appleii.ivanx.com/a2cloud/setup; source /tmp/a2cloud-setup" | sudo tee /usr/local/bin/a2cloud-setup > /dev/null
sudo chmod ugo+x /usr/local/bin/a2cloud-setup
if [[ ! $restartPrompt ]]; then
adtpro-start 2> /dev/null #start ADTPro if not running and USB adapter attached
fi
echo
echo "A2CLOUD is now ready!"
echo "See http://ivanx.com/a2cloud for instructions."
sudo apt-get -y clean
if [[ $restartPrompt ]]; then
echo
echo -n "Restart your $me now (not required, but recommended)? "
read
if [[ ${REPLY:0:1} == "Y" || ${REPLY:0:1} == "y" ]]; then
doRestart=1
fi
fi
cd "$origDir"
rm setup &> /dev/null
rm a2cloud-setup &> /dev/null
rm -rf /tmp/a2cloud-install &> /dev/null
if command -v gsport >/dev/null || command -v kegs >/dev/null; then
sudo addgroup gsport &> /dev/null
sudo addgroup kegs &> /dev/null
sudo usermod -a -G audio,video,netdev,fuse,gsport,plugdev,kegs $USER &> /dev/null
[[ ! $noSetGroups ]] && { groups | grep -q 'kegs.*gsport\|gsport.*kegs' || exec sudo su -l $USER; }
fi
[[ $doRestart ]] && sudo shutdown -r now
# version history:
# future -- local links for everything
# email
# chromium
# version history:
# 1.8.1 -- set JAVA_HOME correctly for Java 8 (Pi, webupd8, Ubuntu for Pi 2B)
# A2PI 1.5 (PiDrive update) on A2CLOUD disk
# ADTPro 2.0.1 server, and 2.0.1 client on A2CLOUD disk
# 1.8.0d-- √ creates shortcuts on desktop for GSport, KEGS, LinApple, ADTPro server on x86
# √ adds LXTerminal to desktop for non-A2Pi version
# √ ProDOS instruction screen on GSOS install
# √ provide via downloaded program that is dd notrunc'd over PRODOS (instead of writeCharsHex)
# √ figure out why lines in autostart are supposed to start with @ (daemon; restarts command on crash)
# √ install AppleCommander-1.3.5.13id (so Spectrum installer will work)
# √ fix mouse not working in VirtualBox framebuffer
# √ requires uninstalling (or temporarily disabling, if possible) VirtualBox guest additions
# √ can be activated if vboxguest module is unloaded *while gsport is running*
# √ offer to uninstall vboxguestmodule if gsport is in run console
# √ rename slot6drive1 and 2 to not contain "-blank" in slot6.tgz and gsport and kegs (x86) archives
# √ add links browser
# √ fix webupd8team getting added twice to sources.list
# √ install GSport for non-Pi
# √ figure out how to replace Raspbian entry in OS json dynamically
# √ command "a2cloud-update rasppleii" to update raspple ii
# √ prevent samba update causing dialog to come up
# √ create rasppleii-update
# √ make rasppleii-update universal even for non-Raspple II installs -- it's just raspbian-update + a2cloud-update + a2server-update
# √ creates shortcuts on desktop for GSport, KEGS, LinApple, ADTPro server on Pi
# √ download gsport and kegs icons
# √ no longer opens terminal window (since icons exist)
# √ (remove /etc/xdg/autostart/lxterminal.desktop)
# √ create aliases for raspbian-update and rasppleii-update
# √ update A2CLOUD help file and aliases for GSport
# √ create raspbian-update
# √ update a2cloud-help
# √ update motd (vm, raspple ii/a2cloud-pi) for gsport
# √ see if shortcuts work in Raspple II 110
# √ check for /etc/xdg/lxsession/LXDE-pi; if so:
# √ create ~/.config/menus/lxde-pi-applications.menu, with reference to /etc/xdg/menus/lxde-pi-applications.menu
# √ no xrandr VBOX0 on the Pi; remove it if present (a2cloud 1.7.x may have put it there)
# √ user groups for pi user not only apple2
# √ gsport-setup and kegs post install text to say ctrl-F12 for reboot
# √ add "links" to motd and help
# √ put a -Xmx128m in acmd so gsport and kegs setup work on Pi A/A+ (256 MB)
# √ added 'disablesafemode' to NOOBS recovery.cmdline (also in raspbian-update) to make it work on (at least) my A+
# √ option for GISK rather than clean setup for GSport on x86
# √ provide actual command for clean GSOS + Spectrum install, which is what gsport runs if no HD available
# √ provide command for clean GSOS install for KEGS
# √ add Dave's preflight/postflight stuff (groups, ownership permissions) for gsport
# √ install libpcap0.8-dev as part of Apple II Pi, GSport install, and GSport launcher
# √ make kegs-setup
# √ make kegs splash text
# √ doesn't add VirtualBox 800x600 if installing on Pi
# √ stop xrandr from being added multiple times to autostart in VirtualBox
# √ only install vbox 800x600 if running in VirtualBox
# √ disable screen blanking in vbox console
# √ disable screensaver in vbox LXDE
# √ disable screen blanking in vbox LXDE
# √ don't create LXTerminal desktop shortcut if RPi
# √ -6 arg provides empty ProDOS disks in S6D1 and S6D2 to GSport to speed things up
# √ -6 arg provides empty ProDOS disks in S6D1 and S6D2 to KEGS to speed things up
# √ can test if password is "raspberry" or "apple2" and advise accordingly
# √ enable Uthernet by default in gsport-setup
# √ enable AppleTalk Turbo by default in gsport-setup
# √ make kegs run as root
# √ consolidate gsport-setup and kegs-setup
# √ gsport-setup is gsport, gsport-setup -k is kegs
# √ clean up KEGS/GSport installer sections to be consistent
# √ create kegs-setup placeholders that call gsport-setup -k
# √ gsport-setup only offer system disks/GSport if java/acmd are available
# √ suppress policykit error that appears after upgrade:
# √ http://www.raspberrypi.org/forums/viewtopic.php?t=98617
# √ see if uninstalling vbox additions is really necessary (nope)
# √ A2SERVER: creates symlink to /usr/local/etc/netatalk in /etc
# √ A2SERVER: -r no repo update option
# √ A2SERVER: can test if password is "raspberry" or "apple2" and advise accordingly
# √ A2SERVER: set AFP password to "apple2"
# √ A2SERVER: automated Windows Sharing install option -w
# √ A2SERVER: automate SMB password set
# √ A2SERVER: fix bug where turning off windows sharing then on again made it not restart at startup
# √ A2SERVER: turnkey (non-prompting) updater
# √ A2SERVER: show current and available versions on run
# √ A2SERVER: -v option to show version and exit
# √ A2SERVER: -h shows help
# √ A2SERVER: prefix status messages with A2SERVER:
# √ A2SERVER: fixed OS X connection problems by adding dhx2 uams files to rpi and x86 tarballs
# √ A2SERVER: set user password to "apple2"
# √ A2SERVER: support a2server-update rasppleii
# √ A2SERVER: automated netboot install option -b
# √ A2SERVER: deletes /tmp/a2server-packageReposUpdated at end
# √ A2SERVER: update help and aliases for raspbian-update
# √ A2SERVER: update a2server-setup rasppleii
# √ A2SERVER: add "a2server-update rasppleii"
# √ A2SERVER: disable screen blanking in Debian VM console
# √ A2SERVER: add raspbian-update and rasppleii-update
# NOOBS:
# √ get photo B slide into all NOOBS slides (even non-a version) and also upload to online
# √ make NOOBS default to US keyboard (recovery.cmdline append lang=en keyboard=us)
# √ make NOOBS-lite 1.4.0+ that can install Raspple II from net, use for upgrade
# √ (change URL and default OS in noobs-master/recovery/config.h
# √ change "raspple" option to 'os' or '-os'
# √ remove silentinstall in raspbian-update
# √ add 'disablesafemode' to recovery.cmdline in Raspple II and Raspple II Lite
# √ make raspbian-update NOOBS-aware, both for standard NOOBS and Raspple II
# 1.7.2 -- manually triggers udev rules during startup if ttyusbhandler script didn't execute (which it doesn't in Raspbian 31-Jan-2015/Kernel 3.18)
# doesn't provide Java space warning if java is already installed
# A/A+ support (vsdrive on direct attach or hub port 3, console on hub port 2)
# 1.7.1 -- full undoit (unblu/unexec/unbit/usq/sciibin)
# debian7_x86 and rpi binaries
# perl version for ttytter not hardcoded
# KEGS and LinApple support on debian_x86
# kegs launch script creates additional symlink called ROM
# linapple launch script sets up framebuffer and udev mouse rule
# apt-get clean after all installs
# installer option to compile all rather than download binaries
# login message mentions A2SERVER if it is installed
# LXDE terminal window now in global autostart (opens for any user)
# LXDE desktop defaults to 800x600 if running in VirtualBox VM
# 1.7.0 -- Java 8
# 1.6.9 -- ADTPro 2.0.0
# new A2CLOUD disks with A2PI client 1.8
# 1.6.8 -- ADTPro 1.3.0
# tests for adtpro existence with either adtpro.sh or ADTPro.html
# installs ttytter from its home page, not via apt-get (because it's in non-free, which is not enabled by default in debian)
# 1.6.7 -- cppo installed from a2cloud directory on web server (a2server has symlink)
# fixed cppo -e bug that always created a resource fork file even if there is no resource fork
# shk2image leaves nothing behind in /tmp
# wildcard copy all files on A2PI disk except PRODOS/BASIC.SYSTEM/*A3* to A2CLOUD disks when building
# @ √ new A2CLOUD disks with A2PI client 1.4
# % update before install for a2chat/a2news/kegs/kegs-setup/linapple/gsport/gsport-setup
# disables IPv6 for exim4 to properly prevent startup error messages; restores log folder if not there
# ^@ A2CLOUD.HDV is now A2CLOUD.PO (with symlink to A2CLOUD.HDV)
# √ renamed MACRO files on server to be .txt and moved to files
# ^@ √ new startup app on disk to make it easier to get to A2PI
# a2cloud-setup updates a2news/a2chat/kegs/kegs-setup/linapple wrappers
# added screen to a2cloud-help
# 1.6.6 -- installs Screen
# installs curl if not installed (for ttytter)
# ttytter alias works correctly if run under Screen
# a2cloudrc is now downloaded rather than created by script
# LANG is now set in /usr/local/etc/a2cloud-lang rather than in a2cloudrc
# fixed bug which checked for nulib2 instead of unar when seeing if needing to compile
# opens terminal window in lxde on startup
# setup -v displays available and installed versions
# setup -y now bypasses all prompts; -n removed
# % setup exits properly whether run via source or shell
# moved cftp to files
# support for x86 Debian/Ubuntu:
# compiles binaries rather than downloads if not running on Pi
# gets and supports Oracle x86 Java if not on Pi
# installs X11 and LXDE if not installed
# ttyUSBupper is always ttyUSB0, ttyUSBlower is always ttyUSB1
# adtpro.sh supports USB-to-serial on all architectures
# 1.6.5 -- term command accepts mono/color/none as synonyms for vt100/pcansi/dumb
# minor reorganization of configuration of a2cloudrc and screenrc
# 1.6.4 -- term command has -f argument to force action
# bash.bashrc now calls /usr/local/etc/a2cloudrc, which calls a2cloud-aliases
# support for screen command (preserves TERM environment variable in new screen)
# 1.6.3 -- sets ttytter to use ssl, and also 7-bit on serial port login, and ansi
# if using TERM=pcansi. Also provides Term::ReadLine::TTYtter for -readline option
# revised command line options and prompt for installing all or selective
# added appleiipi-update command
# 1.6.2 -- installs ISO-8859 (8-bit) character set for serial port login
# adds 'term' command for setting vt100 or ANSI emulation
# apt-get clean at end of A2CLOUD install
# installs sciibin and unblu
# a2cloud-update alias to a2cloud-setup
# 300 baud support by 'baud'
# prevents gsport (A2PI) from running when invoked from serial port
# cmd line option and prompt to install either all, or select individual
# revised intro language
# 1.6.1 -- installs telnet and ttytter
# prevents exim4 error messages after Tin installation
# 1.6.0 -- checks for ADTPro update
# updates ADTPro server and client software
# put adtpro version number into variable and removed hardcoding elsewhere
# asks for prodos volume name for new disk image; 8192 max
# fixed order of files on 140K disk to be consistent with 800K disk
# adtpro-start start now checks for USB adapter before starting
# restarts ADTPro server on vsd1/vsd2 after prompting
# created vsdsync alias to adtpro-restart; acmd warns if neeed
# acmd warns if vsd1/vsd2 changes, and advises vsdsync if so
# acmd now provides acmd help even on AppleCommander error
# 1.6.0 beta
#(unreleased)
# 1.5.3 -- gets motd from web
# prevents /var/log/exim4/paniclog from filling up
# sets password to apple2
# shares /usr/local/adtpro/disks to AFP & SMB
# don't prompt for restart after install by default
# avahi-daemon installed
# backup server for shrinkit
# 1.5.2 -- cleans up at end, downloads disks, full A2PI including extras,
# bug fixes, -h for options
# 1.5.1 -- added dos2pro
# 1.5 -- provides a2chat, a2news, kegs, linapple, a2pi
# 1.23 -- support for new A2PI client
# 1.22 -- downloads base gnustep library for unar/lsar, not full dev packages;
# will still download those and build if binary isn't available for some reason
# same goes for nulib2 and cftp. Should make for speedier install.
# adds A2PI client software to A2CLOUD disk
# disables console getty
# installs xrdp
# adds DSK2FILE to A2CLOUD disk
# 1.7.2 -- manually triggers udev rules during startup if ttyusbhandler script didn't execute (which it doesn't in Raspbian 31-Jan-2015/Kernel 3.18)
# doesn't provide Java space warning if java is already installed
# A/A+ support (vsdrive on direct attach or hub port 3, console on hub port 2)
# 1.7.1 -- full undoit (unblu/unexec/unbit/usq/sciibin)
# debian7_x86 and rpi binaries
# perl version for ttytter not hardcoded
# KEGS and LinApple support on debian_x86
# kegs launch script creates additional symlink called ROM
# linapple launch script sets up framebuffer and udev mouse rule
# apt-get clean after all installs
# installer option to compile all rather than download binaries
# login message mentions A2SERVER if it is installed
# LXDE terminal window now in global autostart (opens for any user)
# LXDE desktop defaults to 800x600 if running in VirtualBox VM
# 1.7.0 -- Java 8
# 1.6.9 -- ADTPro 2.0.0
# new A2CLOUD disks with A2PI client 1.8
# 1.6.8 -- ADTPro 1.3.0
# tests for adtpro existence with either adtpro.sh or ADTPro.html
# installs ttytter from its home page, not via apt-get (because it's in non-free, which is not enabled by default in debian)
# 1.6.7 -- cppo installed from a2cloud directory on web server (a2server has symlink)
# fixed cppo -e bug that always created a resource fork file even if there is no resource fork
# shk2image leaves nothing behind in /tmp
# wildcard copy all files on A2PI disk except PRODOS/BASIC.SYSTEM/*A3* to A2CLOUD disks when building
# @ √ new A2CLOUD disks with A2PI client 1.4
# % update before install for a2chat/a2news/kegs/kegs-setup/linapple/gsport/gsport-setup
# disables IPv6 for exim4 to properly prevent startup error messages; restores log folder if not there
# ^@ A2CLOUD.HDV is now A2CLOUD.PO (with symlink to A2CLOUD.HDV)
# √ renamed MACRO files on server to be .txt and moved to files
# ^@ √ new startup app on disk to make it easier to get to A2PI
# a2cloud-setup updates a2news/a2chat/kegs/kegs-setup/linapple wrappers
# added screen to a2cloud-help
# 1.6.6 -- installs Screen
# installs curl if not installed (for ttytter)
# ttytter alias works correctly if run under Screen
# a2cloudrc is now downloaded rather than created by script
# LANG is now set in /usr/local/etc/a2cloud-lang rather than in a2cloudrc
# fixed bug which checked for nulib2 instead of unar when seeing if needing to compile
# opens terminal window in lxde on startup
# setup -v displays available and installed versions
# setup -y now bypasses all prompts; -n removed
# % setup exits properly whether run via source or shell
# moved cftp to files
# support for x86 Debian/Ubuntu:
# compiles binaries rather than downloads if not running on Pi
# gets and supports Oracle x86 Java if not on Pi
# installs X11 and LXDE if not installed
# ttyUSBupper is always ttyUSB0, ttyUSBlower is always ttyUSB1
# adtpro.sh supports USB-to-serial on all architectures
# 1.6.5 -- term command accepts mono/color/none as synonyms for vt100/pcansi/dumb
# minor reorganization of configuration of a2cloudrc and screenrc
# 1.6.4 -- term command has -f argument to force action
# bash.bashrc now calls /usr/local/etc/a2cloudrc, which calls a2cloud-aliases
# support for screen command (preserves TERM environment variable in new screen)
# 1.6.3 -- sets ttytter to use ssl, and also 7-bit on serial port login, and ansi
# if using TERM=pcansi. Also provides Term::ReadLine::TTYtter for -readline option
# revised command line options and prompt for installing all or selective
# added appleiipi-update command
# 1.6.2 -- installs ISO-8859 (8-bit) character set for serial port login
# adds 'term' command for setting vt100 or ANSI emulation
# apt-get clean at end of A2CLOUD install
# installs sciibin and unblu
# a2cloud-update alias to a2cloud-setup
# 300 baud support by 'baud'
# prevents gsport (A2PI) from running when invoked from serial port
# cmd line option and prompt to install either all, or select individual
# revised intro language
# 1.6.1 -- installs telnet and ttytter
# prevents exim4 error messages after Tin installation
# 1.6.0 -- checks for ADTPro update
# updates ADTPro server and client software
# put adtpro version number into variable and removed hardcoding elsewhere
# asks for prodos volume name for new disk image; 8192 max
# fixed order of files on 140K disk to be consistent with 800K disk
# adtpro-start start now checks for USB adapter before starting
# restarts ADTPro server on vsd1/vsd2 after prompting
# created vsdsync alias to adtpro-restart; acmd warns if neeed
# acmd warns if vsd1/vsd2 changes, and advises vsdsync if so
# acmd now provides acmd help even on AppleCommander error
# 1.6.0 beta
#(unreleased)
# 1.5.3 -- gets motd from web
# prevents /var/log/exim4/paniclog from filling up
# sets password to apple2
# shares /usr/local/adtpro/disks to AFP & SMB
# don't prompt for restart after install by default
# avahi-daemon installed
# backup server for shrinkit
# 1.5.2 -- cleans up at end, downloads disks, full A2PI including extras,
# bug fixes, -h for options
# 1.5.1 -- added dos2pro
# 1.5 -- provides a2chat, a2news, kegs, linapple, a2pi
# 1.23 -- support for new A2PI client
# 1.22 -- downloads base gnustep library for unar/lsar, not full dev packages;
# will still download those and build if binary isn't available for some reason
# same goes for nulib2 and cftp. Should make for speedier install.
# adds A2PI client software to A2CLOUD disk
# disables console getty
# installs xrdp
# adds DSK2FILE to A2CLOUD disk