mirror of
https://github.com/RasppleII/a2cloud.git
synced 2024-12-25 17:29:29 +00:00
1984 lines
94 KiB
Plaintext
1984 lines
94 KiB
Plaintext
|
#!/bin/bash
|
|||
|
|
|||
|
version="182"
|
|||
|
adtProVersion="2.0.1"
|
|||
|
|
|||
|
## 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
|
|||
|
# elif [[ ${1,,} == "rasppleii" || ${1,,} == "raspple" || ${1,,} == "rasappleii" || ${1,,} == "rasapple" || ${1,,} == "raspple2" || ${1,,} == "rasapple2" || ${1,,} == "-rasppleii" || ${1,,} == "-raspple" || ${1,,} == "-rasappleii" || ${1,,} == "-rasapple" || ${1,,} == "-raspple2" || ${1,,} == "-rasapple2" ]]; 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 ivanx.com/a2cloud/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 ] \&\& $(ps aux | grep "sleep 86399" > \/dev\/null) \&\& udevadm trigger --action=change\n[ -e \/dev\/ttyUSBlower ] \&\& ! $(ps aux | grep [a]dtpro > \/dev\/null) \&\& udevadm trigger --action=change\n\nexit 0/' /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 ivanx.com/a2cloud/setup/dopo.txt
|
|||
|
sudo chmod ugo+x /usr/local/bin/dopo
|
|||
|
|
|||
|
echo "A2CLOUD: Setting up cppo command..."
|
|||
|
sudo wget -qO /usr/local/bin/cppo ivanx.com/a2cloud/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 ivanx.com/a2cloud/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
|
|||
|
|
|||
|
echo "A2CLOUD: Setting up motd..."
|
|||
|
if [[ $(grep Raspple /etc/motd) ]]; then
|
|||
|
wget -qO- ivanx.com/rasppleii/motd-rasppleii.txt | sudo tee /etc/motd > /dev/null
|
|||
|
elif [[ $(grep A2SERVER /etc/motd) ]]; then
|
|||
|
wget -qO- ivanx.com/rasppleii/motd-vm.txt | sudo tee /etc/motd > /dev/null
|
|||
|
else
|
|||
|
wget -qO- ivanx.com/a2cloud/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 ivanx.com/a2cloud/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 ivanx.com/a2cloud/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 ivanx.com/a2cloud/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 ivanx.com/a2cloud/setup/vsd.txt
|
|||
|
sudo chmod ugo+x /usr/local/bin/vsd
|
|||
|
|
|||
|
echo "A2CLOUD: Setting up acmd command..."
|
|||
|
sudo wget -qO /usr/local/bin/acmd ivanx.com/a2cloud/setup/acmd.txt
|
|||
|
sudo chmod ugo+x /usr/local/bin/acmd
|
|||
|
|
|||
|
echo "A2CLOUD: Setting up mkpo command..."
|
|||
|
sudo wget -qO /usr/local/bin/mkpo ivanx.com/a2cloud/setup/mkpo.txt
|
|||
|
sudo chmod ugo+x /usr/local/bin/mkpo
|
|||
|
|
|||
|
echo "A2CLOUD: Setting up dos2pro command..."
|
|||
|
sudo wget -qO /usr/local/bin/dos2pro ivanx.com/a2cloud/setup/dos2pro.txt
|
|||
|
sudo chmod ugo+x /usr/local/bin/dos2pro
|
|||
|
|
|||
|
fi
|
|||
|
|
|||
|
if [[ -f /usr/bin/X ]]; then
|
|||
|
if [[ ! -f /usr/sbin/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: /usr/bin/X 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 ivanx.com/a2cloud/setup/baud.txt
|
|||
|
sudo chmod ugo+x /usr/local/bin/baud
|
|||
|
|
|||
|
echo "A2CLOUD: Setting up term command..."
|
|||
|
sudo wget -qO /usr/local/bin/term ivanx.com/a2cloud/setup/term.txt
|
|||
|
sudo chmod ugo+x /usr/local/bin/term
|
|||
|
|
|||
|
echo "A2CLOUD: Setting up usbgetty command..."
|
|||
|
sudo wget -qO /usr/local/sbin/usbgetty ivanx.com/a2cloud/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 ivanx.com/a2cloud/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- ivanx.com/a2cloud/files/cftp-rpi.tgz | sudo tar Pzx
|
|||
|
elif [[ $isDebian ]]; then
|
|||
|
wget -qO- 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 ivanx.com/a2cloud/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 ivanx.com/a2cloud/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- ivanx.com/a2cloud/files/ttytter_readline-rpi.tgz | sudo tar Pzx
|
|||
|
elif [[ $isDebian ]]; then
|
|||
|
wget -qO- 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
|
|||
|
# wget -qO a2pi_armhf.deb schmenk.is-a-geek.com/tarfiles/a2pi_armhf.deb
|
|||
|
# sudo dpkg -i a2pi_armhf.deb &> /dev/null
|
|||
|
# rm a2pi_armhf.deb &> /dev/null
|
|||
|
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- ivanx.com/a2cloud/files/kegs-rpi.tgz | sudo tar Pzx 2> /dev/null
|
|||
|
elif [[ $isDebian ]]; then
|
|||
|
wget -qO- 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- 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 ivanx.com/a2cloud/setup/kegs.txt
|
|||
|
sudo chmod ugo+x /usr/local/bin/kegs
|
|||
|
sudo wget -qO /usr/local/bin/kegs-setup ivanx.com/a2cloud/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- 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 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- 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 ivanx.com/a2cloud/setup/gsport.txt
|
|||
|
sudo chmod ugo+x /usr/local/bin/gsport
|
|||
|
sudo wget -qO /usr/local/bin/gsport-setup ivanx.com/a2cloud/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- ivanx.com/a2cloud/files/linapple-rpi.tgz | sudo tar Pzx
|
|||
|
elif [[ $isDebian ]]; then
|
|||
|
wget -qO- 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 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 ivanx.com/a2cloud/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- ivanx.com/a2cloud/files/nulib2-rpi.tgz | sudo tar Pzx
|
|||
|
elif [[ $isDebian ]]; then
|
|||
|
wget -qO- 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 ivanx.com/a2cloud/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 [[ ! -f /usr/local/bin/unar ]]; then
|
|||
|
echo "A2CLOUD: Installing The Unarchiver..."
|
|||
|
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- ivanx.com/a2cloud/files/unar-rpi.tgz | sudo tar Pzx
|
|||
|
elif [[ $isDebian ]]; then
|
|||
|
wget -qO- ivanx.com/a2cloud/files/unar-debian7_x86.tgz | sudo tar Pzx
|
|||
|
fi
|
|||
|
fi
|
|||
|
fi
|
|||
|
if [[ ! -f /usr/local/bin/unar ]]; 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
|
|||
|
else
|
|||
|
echo "A2CLOUD: The Unarchiver is already installed."
|
|||
|
fi
|
|||
|
fi
|
|||
|
|
|||
|
# add shortcuts to LXDE desktop and menu
|
|||
|
if [[ -f /usr/bin/X ]]; 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 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 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 ivanx.com/a2cloud/files/A2CLOUD.PO
|
|||
|
echo "A2CLOUD: Downloading 140K disk image..."
|
|||
|
wget -qO $a2CloudDisk140 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- 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 [[ -f /usr/local/bin/unar ]]; 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 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 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 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 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 [[ -f /usr/local/bin/unar ]]; 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 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 [[ -f /usr/local/bin/gsport || -f /usr/bin/gsport || -f /usr/local/bin/kegs ]]; 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
|