echo "$0: $(date): starting now)"
# see example of usage to understand.
end_msg() {
- local y
- IFS= read -r -d '' y ||:
- end_msg_var+="$y"
+ local y
+ IFS= read -r -d '' y ||:
+ end_msg_var+="$y"
}
spa() { # simple package add
- simple_packages+=($@)
+ simple_packages+=($@)
}
distro=$(distro-name)
pending_reboot=false
#### initial packages
pup
if isdeb; then
- pi aptitude
+ pi aptitude
fi
########### begin section including li ################
conflink
case $distro in
- arch) sgo cronie ;;
+ arch) sgo cronie ;;
esac
case $distro in
- arch) sgo atd ;;
+ arch) sgo atd ;;
esac
case $distro in
- arch) sgo ntpd ;;
+ arch) sgo ntpd ;;
esac
# no equivalent in other distros:
case $distro in
- debian|trisquel|ubuntu)
- if ! dpkg -s apt-file &>/dev/null; then
- # this condition is just a speed optimization
- pi apt-file
- s apt-file update
- fi
- ;;
+ debian|trisquel|ubuntu)
+ if ! dpkg -s apt-file &>/dev/null; then
+ # this condition is just a speed optimization
+ pi apt-file
+ s apt-file update
+ fi
+ ;;
esac
# disable motd junk.
case $distro in
- debian)
- # allows me to pipe with ssh -t, and gets rid of spam
- # http://forums.debian.net/viewtopic.php?f=5&t=85822
- # i'd rather disable the service than comment the init file
- # this says disabling the service, it will still get restarted
- # but this script doesn't do anything on restart, so it should be fine
- s dd of=/var/run/motd.dynamic if=/dev/null
- # stretch doesn't have initscripts pkg installed by default
- if [[ $(debian-codename) == jessie ]]; then
- s update-rc.d motd disable
- fi
- ;;
- trisquel|ubuntu)
- # this isn't a complete solution. It still shows me when updates are available,
- # but it's no big deal.
- s t /etc/update-motd.d/10-help-text /etc/update-motd.d/00-header
- ;;
+ debian)
+ # allows me to pipe with ssh -t, and gets rid of spam
+ # http://forums.debian.net/viewtopic.php?f=5&t=85822
+ # i'd rather disable the service than comment the init file
+ # this says disabling the service, it will still get restarted
+ # but this script doesn't do anything on restart, so it should be fine
+ s dd of=/var/run/motd.dynamic if=/dev/null
+ # stretch doesn't have initscripts pkg installed by default
+ if [[ $(debian-codename) == jessie ]]; then
+ s update-rc.d motd disable
+ fi
+ ;;
+ trisquel|ubuntu)
+ # this isn't a complete solution. It still shows me when updates are available,
+ # but it's no big deal.
+ s t /etc/update-motd.d/10-help-text /etc/update-motd.d/00-header
+ ;;
esac
# automatic updates
# /usr/share/doc/unattended-upgrades# cat README.md
# /etc/apt/apt.conf.d/50unattended-upgrades
if isdebian; then
- setup-debian-auto-update
+ setup-debian-auto-update
fi
### begin docker install ####
if isdeb; then
- # https://store.docker.com/editions/community/docker-ce-server-debian?tab=description
- pi software-properties-common apt-transport-https
- curl -fsSL https://download.docker.com/linux/$(distro-name-compat)/gpg | sudo apt-key add -
- sudo add-apt-repository \
- "deb [arch=amd64] https://download.docker.com/linux/$(distro-name-compat) \
+ # https://store.docker.com/editions/community/docker-ce-server-debian?tab=description
+ pi software-properties-common apt-transport-https
+ curl -fsSL https://download.docker.com/linux/$(distro-name-compat)/gpg | sudo apt-key add -
+ sudo add-apt-repository \
+ "deb [arch=amd64] https://download.docker.com/linux/$(distro-name-compat) \
$(debian-codename-compat) \
stable"
- p update
- pi docker-ce
- sgo docker
- # other distros unknown
+ p update
+ pi docker-ce
+ sgo docker
+ # other distros unknown
fi
### end docker install ####
### begin certbot install ###
case $distro in
- debian)
- # note, need python-certbot-nginx for nginx, but it depends on nginx,
- # and I'm not installing nginx by default right now.
- # note python-certbot-apache is in suggests, but so is a doc package that brought in xorg
- if [[ $(debian-codename) == jessie ]]; then
- pi -t jessie-backports certbot python-certbot-apache
- else
- pi certbot python-certbot-apache
- fi
- ;;
- trisquel|ubuntu)
- # not packaged in xenial or flidas
- pi software-properties-common
- # this fails with:
- #
- # gpg: key 75BCA694: public key "Launchpad PPA for certbot" imported
- # gpg: Total number processed: 1
- # gpg: imported: 1
- # gpg: no valid OpenPGP data found.
- # Failed to add key.
- #
- # but it seems to work fine, perhaps it's only failing on the second run.
- s add-apt-repository -y ppa:certbot/certbot ||:
- p update
- pi python-certbot-apache
- ;;
- # todo: other distros unknown
+ debian)
+ # note, need python-certbot-nginx for nginx, but it depends on nginx,
+ # and I'm not installing nginx by default right now.
+ # note python-certbot-apache is in suggests, but so is a doc package that brought in xorg
+ if [[ $(debian-codename) == jessie ]]; then
+ pi -t jessie-backports certbot python-certbot-apache
+ else
+ pi certbot python-certbot-apache
+ fi
+ ;;
+ trisquel|ubuntu)
+ # not packaged in xenial or flidas
+ pi software-properties-common
+ s add-apt-repository -y ppa:certbot/certbot ||:
+ p update
+ pi python-certbot-apache
+ ;;
+ # todo: other distros unknown
esac
# make a version of the certbot timer that emails me.
x=/systemd/system/certbot
# dogcam setup
case $HOSTNAME in
- lj|li)
- /a/bin/webcam/install-server
- ;;
- kw)
- /a/bin/webcam/install-client
- ;;
+ lj|li)
+ /a/bin/webcam/install-server
+ ;;
+ kw)
+ /a/bin/webcam/install-client
+ ;;
esac
# website setup
case $HOSTNAME in
- lj|li)
- case $HOSTNAME in
- lj) domain=iank.bid; exit 0 ;;
- li) domain=iankelling.org ;;
- esac
- /a/h/setup.sh $domain
- /a/h/build.rb
-
- sudo -E /a/bin/mediawiki-setup/mw-setup-script
-
- pi-nostart mumble-server
- s $sed -ri "s/^ *(serverpassword=).*/\1$(< /a/bin/bash_unpublished/mumble_pass)/" /etc/mumble-server.ini
-
- # do certificate to avoid warning about unsigned cert,
- # which is overkill for my use, but hey, I'm cool, I know
- # how to do this.
- web-conf apache2 mumble.iankelling.org
- s rm -f /etc/apache2/sites-enabled/mumble.iankelling.org
- sudo -i <<'EOF'
+ lj|li)
+ case $HOSTNAME in
+ lj) domain=iank.bid; exit 0 ;;
+ li) domain=iankelling.org ;;
+ esac
+ /a/h/setup.sh $domain
+ /a/h/build.rb
+
+ sudo -E /a/bin/mediawiki-setup/mw-setup-script
+
+ pi-nostart mumble-server
+ s $sed -ri "s/^ *(serverpassword=).*/\1$(< /a/bin/bash_unpublished/mumble_pass)/" /etc/mumble-server.ini
+
+ # do certificate to avoid warning about unsigned cert,
+ # which is overkill for my use, but hey, I'm cool, I know
+ # how to do this.
+ web-conf apache2 mumble.iankelling.org
+ s rm -f /etc/apache2/sites-enabled/mumble.iankelling.org
+ sudo -i <<'EOF'
export RENEWED_LINEAGE=/etc/letsencrypt/live/mumble.iankelling.org
/a/bin/distro-setup/certbot-renew-hook
EOF
- sgo mumble-server
+ sgo mumble-server
- vpn-server-setup -rd
- s tee /etc/openvpn/client-config/mail <<'EOF'
+ vpn-server-setup -rd
+ s tee /etc/openvpn/client-config/mail <<'EOF'
ifconfig-push 10.8.0.4 255.255.255.0
EOF
- # it\'s strange. docker seems to make the default for forward
- # be drop, but then I set it to accept and it\'s stuck that way,
- # I dun know why. But, let\'s make sure we can forward anyways.
- s DEBIAN_FRONTEND=noninteractive pi iptables-persistent
- rm /etc/iptables/rules.v6
- s tee /etc/iptables/rules.v4 <<'EOF'
+ # it\'s strange. docker seems to make the default for forward
+ # be drop, but then I set it to accept and it\'s stuck that way,
+ # I dun know why. But, let\'s make sure we can forward anyways.
+ s DEBIAN_FRONTEND=noninteractive pi iptables-persistent
+ rm /etc/iptables/rules.v6
+ s tee /etc/iptables/rules.v4 <<'EOF'
*filter
-A FORWARD -i tun+ -o eth0 -j ACCEPT
-A FORWARD -i eth0 -o tun+ -j ACCEPT
EOF
- sudo dd of=/etc/systemd/system/vpnmail.service <<EOF
+ sudo dd of=/etc/systemd/system/vpnmail.service <<EOF
[Unit]
Description=Turns on iptables mail nat
[Install]
WantedBy=openvpn.service
EOF
- ser daemon-reload
- ser enable vpnmail.service
- # needed for li's local mail delivery.
- tu /etc/hosts <<<"10.8.0.4 mail.iankelling.org"
- if [[ -e /lib/systemd/system/openvpn-server@.service ]]; then
- vpn_service=openvpn-server@server
- else
- vpn_service=openvpn@server
- fi
- sgo $vpn_service
- # setup let's encrypt cert
- web-conf apache2 mail.iankelling.org
- s rm /etc/apache2/sites-enabled/mail.iankelling.org{,-redir}.conf
- ser reload apache2
-
- domain=cal.iankelling.org
- web-conf -f 10.8.0.4:5232 - apache2 $domain <<'EOF'
+ ser daemon-reload
+ ser enable vpnmail.service
+ # needed for li's local mail delivery.
+ tu /etc/hosts <<<"10.8.0.4 mail.iankelling.org"
+ if [[ -e /lib/systemd/system/openvpn-server@.service ]]; then
+ vpn_service=openvpn-server@server
+ else
+ vpn_service=openvpn@server
+ fi
+ sgo $vpn_service
+ # setup let's encrypt cert
+ web-conf apache2 mail.iankelling.org
+ s rm /etc/apache2/sites-enabled/mail.iankelling.org{,-redir}.conf
+ ser reload apache2
+
+ domain=cal.iankelling.org
+ web-conf -f 10.8.0.4:5232 - apache2 $domain <<'EOF'
#https://httpd.apache.org/docs/2.4/mod/mod_authn_core.html#authtype
# https://stackoverflow.com/questions/5011102/apache-reverse-proxy-with-basic-authentication
<Location />
Require valid-user
</Location>
EOF
- # nginx version of above would be:
- # auth_basic "Not currently available";
- # auth_basic_user_file /etc/nginx/caldav/htpasswd;
+ # nginx version of above would be:
+ # auth_basic "Not currently available";
+ # auth_basic_user_file /etc/nginx/caldav/htpasswd;
- ########## begin pump.io setup ##########
+ ########## begin pump.io setup ##########
- # once pump adds a logrotation script, turn off nologger,
- # and add
- # "logfile": "/var/log/pumpio/pumpio.log",
- #
- s dd of=/etc/pump.io.json <<'EOF'
+ # once pump adds a logrotation script, turn off nologger,
+ # and add
+ # "logfile": "/var/log/pumpio/pumpio.log",
+ #
+ s dd of=/etc/pump.io.json <<'EOF'
{
"secret": "SECRET_REPLACE_ME",
"driver": "mongodb",
"sockjs": false
}
EOF
- s sed -i "s#SECRET_REPLACE_ME#$(cat /p/c/machine_specific/li/pump-secret)#" /etc/pump.io.json
-
- # stretch node is too old
- # https://nodejs.org/en/download/package-manager/
- curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
- pi nodejs graphicsmagick mongodb
- cd /home/iank
- if [[ -e pump.io ]]; then
- cd pump.io
- git pull
- else
- git clone https://github.com/pump-io/pump.io.git
- cd pump.io
- fi
- # note: doing this or the npm install pump.io as root had problems.
- npm install
- npm run build
- # normally, next command would be
- # s npm install -g odb
- # but it\'s this until a bug in pump gets fixed
- # https://github.com/pump-io/pump.io/issues/1287
- s npm install -g databank-mongodb@0.19.2
- if ! getent passwd pumpio &>/dev/null; then
- s useradd -m -s /bin/false pumpio
- fi
- sudo -u pumpio mkdir -p /home/pumpio/pumpdata
- # for testing browser when only listening to localhost,
- # in the pump.io.json, set hostname localhost, urlPort 5233
- #ssh -L 5233:localhost:5233 li
+ s sed -i "s#SECRET_REPLACE_ME#$(cat /p/c/machine_specific/li/pump-secret)#" /etc/pump.io.json
+
+ # stretch node is too old
+ # https://nodejs.org/en/download/package-manager/
+ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
+ pi nodejs graphicsmagick mongodb
+ cd /home/iank
+ if [[ -e pump.io ]]; then
+ cd pump.io
+ git pull
+ else
+ git clone https://github.com/pump-io/pump.io.git
+ cd pump.io
+ fi
+ # note: doing this or the npm install pump.io as root had problems.
+ npm install
+ npm run build
+ # normally, next command would be
+ # s npm install -g odb
+ # but it\'s this until a bug in pump gets fixed
+ # https://github.com/pump-io/pump.io/issues/1287
+ s npm install -g databank-mongodb@0.19.2
+ if ! getent passwd pumpio &>/dev/null; then
+ s useradd -m -s /bin/false pumpio
+ fi
+ sudo -u pumpio mkdir -p /home/pumpio/pumpdata
+ # for testing browser when only listening to localhost,
+ # in the pump.io.json, set hostname localhost, urlPort 5233
+ #ssh -L 5233:localhost:5233 li
- s mkdir -p /var/log/pumpio/
- s chown pumpio:pumpio /var/log/pumpio/
+ s mkdir -p /var/log/pumpio/
+ s chown pumpio:pumpio /var/log/pumpio/
- web-conf - apache2 pump.iankelling.org <<'EOF'
+ web-conf - apache2 pump.iankelling.org <<'EOF'
# currently a bug in pump that we cant terminate ssl
SSLProxyEngine On
ProxyPreserveHost On
</Location>
EOF
- sudo -i <<'EOF'
+ sudo -i <<'EOF'
export RENEWED_LINEAGE=/etc/letsencrypt/live/pump.iankelling.org
/a/bin/distro-setup/certbot-renew-hook
EOF
- s dd of=/etc/systemd/system/pump.service <<'EOF'
+ s dd of=/etc/systemd/system/pump.service <<'EOF'
[Unit]
Description=pump.io
-After=syslog.target network.target
+After=syslog.target network.target mongodb.service
+Requires=mongodb.service
[Service]
Type=simple
[Install]
WantedBy=multi-user.target
EOF
- ser daemon-reload
- sgo pump
- ########## end pump.io setup ############
+ ser daemon-reload
+ sgo pump
+ ########## end pump.io setup ############
- ############# begin setup mastodon ##############
+ ############# begin setup mastodon ##############
- # main doc is Docker-Guide.md in docs repo
+ # main doc is Docker-Guide.md in docs repo
- # I'd like to try gnu social just cuz of gnu, but it's not being
- # well maintained, for example, simple pull requests
- # languishing:
- # https://git.gnu.io/gnu/gnu-social/merge_requests/143
- # and I submitted my own bugs, basic docs are broken
- # https://git.gnu.io/gnu/gnu-social/issues/269
+ # I'd like to try gnu social just cuz of gnu, but it's not being
+ # well maintained, for example, simple pull requests
+ # languishing:
+ # https://git.gnu.io/gnu/gnu-social/merge_requests/143
+ # and I submitted my own bugs, basic docs are broken
+ # https://git.gnu.io/gnu/gnu-social/issues/269
- # note, docker required, but we installed it earlier
+ # note, docker required, but we installed it earlier
- # i subscrubed to https://github.com/docker/compose/releases.atom
- # to see release notes.
- # i had some problems upgrading. blew things away with
- # docker-compose down
- # docker rmi $(docker images -q)
- # s reboot now
- # when running docker-compose run, kernel stack traces are printed to the journal.
- # things seem to succeed, google says nothing, so ignoring them.
- curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` | s dd of=/usr/local/bin/docker-compose
- s chmod +x /usr/local/bin/docker-compose
+ # i subscrubed to https://github.com/docker/compose/releases.atom
+ # to see release notes.
+ # i had some problems upgrading. blew things away with
+ # docker-compose down
+ # docker rmi $(docker images -q)
+ # s reboot now
+ # when running docker-compose run, kernel stack traces are printed to the journal.
+ # things seem to succeed, google says nothing, so ignoring them.
+ curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` | s dd of=/usr/local/bin/docker-compose
+ s chmod +x /usr/local/bin/docker-compose
- cd ~
- s rm -rf mastodon
- i clone https://github.com/tootsuite/mastodon
- cd mastodon
- # subbed to atom feed to deal with updates
- git checkout $(git tag | grep -v rc | tail -n1)
+ cd ~
+ s rm -rf mastodon
+ i clone https://github.com/tootsuite/mastodon
+ cd mastodon
+ # subbed to atom feed to deal with updates
+ git checkout $(git tag | grep -v rc | tail -n1)
- # per instructions, uncomment redis/postgres persistence in docker-compose.yml
- sed -i 's/^#//' docker-compose.yml
+ # per instructions, uncomment redis/postgres persistence in docker-compose.yml
+ sed -i 's/^#//' docker-compose.yml
- cat >.env.production <<'EOF'
+ cat >.env.production <<'EOF'
REDIS_HOST=redis
REDIS_PORT=6379
DB_HOST=db
SMTP_DELIVERY_METHOD=smtp
EOF
- for key in PAPERCLIP_SECRET SECRET_KEY_BASE OTP_SECRET; do
- # 1 minute 7 seconds to run this docker command
- # to generate a secret, and it has ^M chars at the end. wtf. really dumb
- printf "%s=%s\n" $key "$(docker-compose run --rm web rake secret|dos2unix|tail -n1)" >>.env.production
- done
- found=false
- while read -r domain port pass; do
- if [[ $domain == mail.iankelling.org ]]; then
- found=true
- # remove the username part
- pass="${pass#*:}"
- printf "SMTP_PASSWORD=%s\n" "$pass" >>.env.production
- break
- fi
- done < <(s cat /etc/mailpass)
- if ! $found; then
- echo "$0: error, failed to find mailpass domain for mastadon"
- exit 1
- fi
+ for key in PAPERCLIP_SECRET SECRET_KEY_BASE OTP_SECRET; do
+ # 1 minute 7 seconds to run this docker command
+ # to generate a secret, and it has ^M chars at the end. wtf. really dumb
+ printf "%s=%s\n" $key "$(docker-compose run --rm web rake secret|dos2unix|tail -n1)" >>.env.production
+ done
+ found=false
+ while read -r domain port pass; do
+ if [[ $domain == mail.iankelling.org ]]; then
+ found=true
+ # remove the username part
+ pass="${pass#*:}"
+ printf "SMTP_PASSWORD=%s\n" "$pass" >>.env.production
+ break
+ fi
+ done < <(s cat /etc/mailpass)
+ if ! $found; then
+ echo "$0: error, failed to find mailpass domain for mastadon"
+ exit 1
+ fi
- # docker compose makes an interface named like br-8f3e208558f2. we need mail to
- # get routed to us.
- if ! s /sbin/iptables -t nat -C PREROUTING -i br-+ -p tcp -m tcp --dport 25 -j DNAT --to-destination 10.8.0.4:25; then
- s /sbin/iptables -t nat -A PREROUTING -i br-+ -p tcp -m tcp --dport 25 -j DNAT --to-destination 10.8.0.4:25
- fi
+ # docker compose makes an interface named like br-8f3e208558f2. we need mail to
+ # get routed to us.
+ if ! s /sbin/iptables -t nat -C PREROUTING -i br-+ -p tcp -m tcp --dport 25 -j DNAT --to-destination 10.8.0.4:25; then
+ s /sbin/iptables -t nat -A PREROUTING -i br-+ -p tcp -m tcp --dport 25 -j DNAT --to-destination 10.8.0.4:25
+ fi
- docker-compose run --rm web rake mastodon:webpush:generate_vapid_key | grep -E '^VAPID_PUBLIC_KEY=|^VAPID_PRIVATE_KEY=' >> .env.production
- logq docker-compose run --rm web rake db:migrate
- docker-compose run --rm web rails assets:precompile
+ docker-compose run --rm web rake mastodon:webpush:generate_vapid_key | grep -E '^VAPID_PUBLIC_KEY=|^VAPID_PRIVATE_KEY=' >> .env.production
+ logq docker-compose run --rm web rake db:migrate
+ docker-compose run --rm web rails assets:precompile
- # avatar failed to upload, did
- # docker logs mastodon_web_1
- # google lead me to this
- s chown -R 991:991 public/system
+ # avatar failed to upload, did
+ # docker logs mastodon_web_1
+ # google lead me to this
+ s chown -R 991:991 public/system
- # docker daemon takes care of starting on boot.
- docker-compose up -d
+ # docker daemon takes care of starting on boot.
+ docker-compose up -d
- s a2enmod proxy_wstunnel headers
- web-conf -f 3000 - apache2 mast.iankelling.org <<'EOF'
+ s a2enmod proxy_wstunnel headers
+ web-conf -f 3000 - apache2 mast.iankelling.org <<'EOF'
ProxyPreserveHost On
RequestHeader set X-Forwarded-Proto "https"
ProxyPass /500.html !
EOF
- ############### !!!!!!!!!!!!!!!!!
- ############### manual steps:
-
- # only following 2 people atm, so not bothering to figure out backups
- # when mastodon has not documented it at all.
- #
- # fsf@status.fsf.org
- # cwebber@toot.cat
- # dbd@status.fsf.org
- # johns@status.fsf.org
-
- # sign in page is at https://mast.iankelling.org/auth/sign_in
- # register as iank, then
- # https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Administration-guide.md
- # docker-compose run --rm web bundle exec rails mastodon:make_admin USERNAME=iank
-
- ############# end setup mastodon ##############
-
- # we use nsupdate to update the ip of home
- pi bind9
-
- pi znc
- # znc config generated by doing
- # znc --makeconf
- # selected port is also used in erc config
- # comma separated channel list worked.
- # while figuring things out, running znc -D for debug in foreground.
- # to exit and save config:
- # /msg *status shutdown
- # configed auth on freenode by following
- # https://wiki.znc.in/Sasl
- # created the system service after, and had to do
- # mv /home/iank/.znc/* /var/lib/znc
- # sed -i 's,/home/iank/.znc/,/var/lib/znc,' /var/lib/znc/config/znc.conf
- # and made a copy of the config files into /p/c
- # added LoadModule = log -sanitize to the top level
- # to get into the web interface,
- # cat /etc/letsencrypt/live/iankelling.org/{privkey,cert,chain}.pem > /var/lib/znc/znc.pem
- # then use non-main browser or else it doesn't allow it based on ocsp stapling from my main site.
- # i'm going to figure out how to automate this when it expires. i know i can hook a script into the renewal. https://wiki.znc.in/FAQ seems to imply that znc doesn\'t need restart.
- # todo: in config file AllowWeb = true should be false. better security if that is off unless we need it.
- # todo: figure out how to make playback in erc happe.n
- s useradd --create-home -d /var/lib/znc --system --shell /sbin/nologin --comment "Account to run ZNC daemon" --user-group znc || [[ $? == 9 ]] # 9 if it exists already
- chmod 700 /var/lib/znc
- s chown -R znc:znc /var/lib/znc/config
- s dd of=/etc/systemd/system/znc.service 2>/dev/null <<'EOF'
+ ############### !!!!!!!!!!!!!!!!!
+ ############### manual steps:
+
+ # only following 2 people atm, so not bothering to figure out backups
+ # when mastodon has not documented it at all.
+ #
+ # fsf@status.fsf.org
+ # cwebber@toot.cat
+ # dbd@status.fsf.org
+ # johns@status.fsf.org
+
+ # sign in page is at https://mast.iankelling.org/auth/sign_in
+ # register as iank, then
+ # https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Administration-guide.md
+ # docker-compose run --rm web bundle exec rails mastodon:make_admin USERNAME=iank
+
+ ############# end setup mastodon ##############
+
+ # we use nsupdate to update the ip of home
+ pi bind9
+
+ pi znc
+ # znc config generated by doing
+ # znc --makeconf
+ # selected port is also used in erc config
+ # comma separated channel list worked.
+ # while figuring things out, running znc -D for debug in foreground.
+ # to exit and save config:
+ # /msg *status shutdown
+ # configed auth on freenode by following
+ # https://wiki.znc.in/Sasl
+ # created the system service after, and had to do
+ # mv /home/iank/.znc/* /var/lib/znc
+ # sed -i 's,/home/iank/.znc/,/var/lib/znc,' /var/lib/znc/config/znc.conf
+ # and made a copy of the config files into /p/c
+ # added LoadModule = log -sanitize to the top level
+ # to get into the web interface,
+ # cat /etc/letsencrypt/live/iankelling.org/{privkey,cert,chain}.pem > /var/lib/znc/znc.pem
+ # then use non-main browser or else it doesn't allow it based on ocsp stapling from my main site.
+ # i'm going to figure out how to automate this when it expires. i know i can hook a script into the renewal. https://wiki.znc.in/FAQ seems to imply that znc doesn\'t need restart.
+ # todo: in config file AllowWeb = true should be false. better security if that is off unless we need it.
+ # todo: figure out how to make playback in erc happe.n
+ s useradd --create-home -d /var/lib/znc --system --shell /sbin/nologin --comment "Account to run ZNC daemon" --user-group znc || [[ $? == 9 ]] # 9 if it exists already
+ chmod 700 /var/lib/znc
+ s chown -R znc:znc /var/lib/znc/config
+ s dd of=/etc/systemd/system/znc.service 2>/dev/null <<'EOF'
[Unit]
Description=ZNC, an advanced IRC bouncer
After=network-online.target
[Install]
WantedBy=multi-user.target
EOF
- ser daemon-reload
- sgo znc
+ ser daemon-reload
+ sgo znc
- echo "$0: $(date): ending now)"
- exit 0
- ;;
+ echo "$0: $(date): ending now)"
+ exit 0
+ ;;
esac
########### end section including li/lj ###############
pi ${p4[@]} $(apt-cache search ruby[.0-9]+-doc| awk '{print $1}')
+case $distro in
+ trisquel|ubuntu)
+ l="deb http://ppa.launchpad.net/ansible/ansible/ubuntu xenial main"
+ f=/etc/apt/sources.list.d/ansible-ubuntu-ansible-xenial.list
+ if ! grep -qF "$l" $f; then
+ s add-apt-repository -y ppa:ansible/ansible
+ p update
+ fi
+ pi ansible
+ ;;
+esac
+
case $distro in
- debian)
- pi chromium ;;
- xenial|ubuntu)
- wget -qO - https://downloads.iridiumbrowser.de/ubuntu/iridium-release-sign-01.pub|sudo apt-key add -
- cat <<EOF | sudo tee /etc/apt/sources.list.d/iridium-browser.list
+ debian)
+ pi chromium ;;
+ trisquel|ubuntu)
+ wget -qO - https://downloads.iridiumbrowser.de/ubuntu/iridium-release-sign-01.pub|sudo apt-key add -
+ cat <<EOF | sudo tee /etc/apt/sources.list.d/iridium-browser.list
deb [arch=amd64] https://downloads.iridiumbrowser.de/deb/ stable main
#deb-src https://downloads.iridiumbrowser.de/deb/ stable main
EOF
- p update
- pi iridium-browser
- ;;
+ p update
+ pi iridium-browser
+ ;;
esac
s sed -i --follow-symlinks 's/10.8./10.9./g;s/^\s*port\s.*/port 1196/' /etc/openvpn/server/server.conf
if [[ $HOSTNAME == tp ]]; then
- if [[ -e /lib/systemd/system/openvpn-server@.service ]]; then
- vpn_service=openvpn-server@server
- else
- vpn_service=openvpn@server
- fi
- sgo $vpn_service
+ if [[ -e /lib/systemd/system/openvpn-server@.service ]]; then
+ vpn_service=openvpn-server@server
+ else
+ vpn_service=openvpn@server
+ fi
+ sgo $vpn_service
fi
### end vpn server setup
-if [[ $HOSTNAME == tp ]]; then
- ##### rss2email
- # note, see bashrc for more documentation.
- pi rss2email
- s dd of=/etc/systemd/system/rss2email.service <<'EOF'
+##### rss2email
+# note, see bashrc for more documentation.
+pi rss2email
+s dd of=/etc/systemd/system/rss2email.service <<'EOF'
[Unit]
Description=rss2email
After=multi-user.target
# we pass options to use different location.
ExecStart=/a/bin/log-quiet/sysd-mail-once -288 rss2email r2e -d /p/c/rss2email.json -c /p/c/rss2email.cfg run
EOF
- s dd of=/etc/systemd/system/rss2email.timer <<'EOF'
+s dd of=/etc/systemd/system/rss2email.timer <<'EOF'
[Unit]
Description=rss2email
[Install]
WantedBy=timers.target
EOF
- s systemctl daemon-reload
- sgo rss2email.timer
-fi
+s systemctl daemon-reload
######### begin pump.io periodic backup #############
if [[ $HOSTNAME == frodo ]]; then
- s dd of=/etc/systemd/system/pumpbackup.service <<'EOF'
+ s dd of=/etc/systemd/system/pumpbackup.service <<'EOF'
[Unit]
Description=pump li backup
After=multi-user.target
Type=oneshot
ExecStart=/a/bin/log-quiet/sysd-mail-once pump-backup /a/bin/distro-setup/pump-backup
EOF
- s dd of=/etc/systemd/system/pumpbackup.timer <<'EOF'
+ s dd of=/etc/systemd/system/pumpbackup.timer <<'EOF'
[Unit]
Description=pump li backup hourly
[Install]
WantedBy=timers.target
EOF
- s systemctl daemon-reload
- sgo pumpbackup.timer
+ s systemctl daemon-reload
+ sgo pumpbackup.timer
fi
######### end pump.io periodic backup #############
case $distro in
- debian|trisquel|ubuntu)
- # suggests because we want the resolvconf package. however, i install it earlier
- # as well, so this is redundant.
- # todo: check other distros to make sure it\'s installed
- pi-nostart --install-suggests openvpn
- # pi-nostart does not disable
- ser disable openvpn
- ;;
- *) pi openvpn;;
+ debian|trisquel|ubuntu)
+ # suggests because we want the resolvconf package. however, i install it earlier
+ # as well, so this is redundant.
+ # todo: check other distros to make sure it\'s installed
+ pi-nostart --install-suggests openvpn
+ # pi-nostart does not disable
+ ser disable openvpn
+ ;;
+ *) pi openvpn;;
esac
/a/bin/distro-setup/radicale-setup
############# begin syncthing setup ###########
if [[ $HOSTNAME == frodo ]]; then
- # It\'s simpler to just worry about running it in one place for now.
- # I assume it would work to clone it\'s config to another non-phone
- # and just run it in one place instead of the normal having a
- # separate config. I lean toward using the same config, since btrfs
- # syncs between comps.
- case $distro in
- arch) pi syncthing ;;
- trisquel|ubuntu|debian)
- # testing has relatively up to date packages
- if ! isdebian-testing; then
- # based on error when doing apt-get update:
- # E: The method driver /usr/lib/apt/methods/https could not be found.
- pi apt-transport-https
- # google led me here:
- # https://apt.syncthing.net/
- curl -s https://syncthing.net/release-key.txt | sudo apt-key add -
- s="deb http://apt.syncthing.net/ syncthing release"
- if [[ $(cat /etc/apt/sources.list.d/syncthing.list) != $s ]]; then
- echo "$s" | s dd of=/etc/apt/sources.list.d/syncthing.list
- p update
- fi
- fi
- pi syncthing
- ;;
- esac
- lnf -T /w/syncthing /home/iank/.config/syncthing
- ser daemon-reload # syncthing likely not properly packaged
- sgo syncthing@iank # runs as iank
-
- # these things persist in ~/.config/syncthing, which I save in
- # /w/syncthing (not in /p, because syncthing should continue to
- # run on home server even when using laptop as primary device)
- # open http://localhost:8384/
- # change listen address from default to tcp://:22001,
- # this is because we do port forward so it doesn\'t have to use
- # some external server, but the syncthing is broken for port forward,
- # you get a message, something "like connected to myself, this should not happen"
- # when connecting to other local devices, so I bump the port up by 1,
- # based on
- # https://forum.syncthing.net/t/connected-to-myself-should-not-happen/1763/19.
- # Without this, it was being stuck syncing at 0%.
- # Set gui username and password.
- #
- # install syncthing via f-droid,
- # folder setting, turn off send only.
- # on phone, add device, click bar code icon
- # on dekstop, top right, actions, device id
- # after adding, notification will appear on desktop to confirm
- #
- # syncing folder. from phone to desktop: select desktop in the
- # folder on phone\'s sync options, notification will appear in
- # desktop\'s web ui within a minute. For the reverse, the
- # notification will appear in android\'s notifications, you have to
- # swipe down and tap it to add the folder. It won\'t appear in the
- # syncthing ui, which would be intuitive, but don\'t wait for it
- # there. The notification may not work, instead open the web gui
- # from in the app, there should be a notification within there.
- #
- # On phone, set settings to run syncthing all the time, and
- # show no notification.
- #
- # Folder versioning would make sense if I didn\'t already use btrfs
- # for backups. I would choose staggered, or trash can for more space.
- #
- # if needed to install on a remote comp:
- # ssh -L 8384:localhost:8384 -N frodo
- # open http://localhost:8384/
- #
- # Note, the other thing i did was port forward port 22000,
- # per https://docs.syncthing.net/users/firewall.html
+ # It\'s simpler to just worry about running it in one place for now.
+ # I assume it would work to clone it\'s config to another non-phone
+ # and just run it in one place instead of the normal having a
+ # separate config. I lean toward using the same config, since btrfs
+ # syncs between comps.
+ case $distro in
+ arch) pi syncthing ;;
+ trisquel|ubuntu|debian)
+ # testing has relatively up to date packages
+ if ! isdebian-testing; then
+ # based on error when doing apt-get update:
+ # E: The method driver /usr/lib/apt/methods/https could not be found.
+ pi apt-transport-https
+ # google led me here:
+ # https://apt.syncthing.net/
+ curl -s https://syncthing.net/release-key.txt | sudo apt-key add -
+ s="deb http://apt.syncthing.net/ syncthing release"
+ if [[ $(cat /etc/apt/sources.list.d/syncthing.list) != $s ]]; then
+ echo "$s" | s dd of=/etc/apt/sources.list.d/syncthing.list
+ p update
+ fi
+ fi
+ pi syncthing
+ ;;
+ esac
+ lnf -T /w/syncthing /home/iank/.config/syncthing
+ ser daemon-reload # syncthing likely not properly packaged
+ sgo syncthing@iank # runs as iank
+
+ # these things persist in ~/.config/syncthing, which I save in
+ # /w/syncthing (not in /p, because syncthing should continue to
+ # run on home server even when using laptop as primary device)
+ # open http://localhost:8384/
+ # change listen address from default to tcp://:22001,
+ # this is because we do port forward so it doesn\'t have to use
+ # some external server, but the syncthing is broken for port forward,
+ # you get a message, something "like connected to myself, this should not happen"
+ # when connecting to other local devices, so I bump the port up by 1,
+ # based on
+ # https://forum.syncthing.net/t/connected-to-myself-should-not-happen/1763/19.
+ # Without this, it was being stuck syncing at 0%.
+ # Set gui username and password.
+ #
+ # install syncthing via f-droid,
+ # folder setting, turn off send only.
+ # on phone, add device, click bar code icon
+ # on dekstop, top right, actions, device id
+ # after adding, notification will appear on desktop to confirm
+ #
+ # syncing folder. from phone to desktop: select desktop in the
+ # folder on phone\'s sync options, notification will appear in
+ # desktop\'s web ui within a minute. For the reverse, the
+ # notification will appear in android\'s notifications, you have to
+ # swipe down and tap it to add the folder. It won\'t appear in the
+ # syncthing ui, which would be intuitive, but don\'t wait for it
+ # there. The notification may not work, instead open the web gui
+ # from in the app, there should be a notification within there.
+ #
+ # On phone, set settings to run syncthing all the time, and
+ # show no notification.
+ #
+ # Folder versioning would make sense if I didn\'t already use btrfs
+ # for backups. I would choose staggered, or trash can for more space.
+ #
+ # if needed to install on a remote comp:
+ # ssh -L 8384:localhost:8384 -N frodo
+ # open http://localhost:8384/
+ #
+ # Note, the other thing i did was port forward port 22000,
+ # per https://docs.syncthing.net/users/firewall.html
fi
############# end syncthing setup ###########
cabal install --upgrade-dependencies --force-reinstalls arbtt
lnf -T /m/arbtt-capture.log ~/.arbtt/capture.log
+primary-setup
+
if [[ ! -e ~/.linphonerc && -e /p/.linphonerc-initial ]]; then
- cp /p/.linphonerc-initial ~/.linphonerc
+ cp /p/.linphonerc-initial ~/.linphonerc
fi
# newer distro had gpg2 as default, older one, flidas, need to make it that way
x=$(which gpg2)
if [[ $x ]]; then
- s lnf -T $x /usr/local/bin/gpg
+ s mkdir -p /usr/local/spdhackfix
+ s lnf -T $x /usr/local/spdhackfix/gpg
fi
### end spd install
if [[ $HOSTNAME == kw ]]; then
- cat <<'EOF'
+ cat <<'EOF'
NOTE: after this finishes, i did
s nmtui-connect
# remove br from auto:
case $distro in
- debian|trisquel|ubuntu)
- # it asks if it should make users in it's group capture packets without root,
- # which is arguably more secure than running wireshark as root. default is no,
- # which is what i prefer, since I plan to use tcpdump to input to wireshark.
- s DEBIAN_FRONTEND=noninteractive pi wireshark-gtk
- ;;
- # others unknown
+ debian|trisquel|ubuntu)
+ # it asks if it should make users in it's group capture packets without root,
+ # which is arguably more secure than running wireshark as root. default is no,
+ # which is what i prefer, since I plan to use tcpdump to input to wireshark.
+ s DEBIAN_FRONTEND=noninteractive pi wireshark-gtk
+ ;;
+ # others unknown
esac
# /run and /dev/shm are listed as required for pulseaudio. All 4 in the group
EOF
mkschroot() {
- n=$1
- shift
- apps=($@)
- d=/nocow/schroot/$n
- s dd of=/etc/schroot/chroot.d/$n.conf <<EOF
+ n=$1
+ shift
+ apps=($@)
+ d=/nocow/schroot/$n
+ s dd of=/etc/schroot/chroot.d/$n.conf <<EOF
[$n]
description=$n
type=directory
preserve-environment=true
users=$USER,traci
EOF
- if [[ -e $d/bin ]]; then
- s chroot $d apt-get update
- s chroot $d apt-get -y dist-upgrade --purge --auto-remove
- cd; s schroot -c $n -- apt-get install --allow-unauthenticated -y ${apps[@]}
- else
- s mkdir -p $d
- s debootstrap $n $d http://deb.debian.org/debian/
- cd; s schroot -c $n -- apt-get install --allow-unauthenticated -y ${apps[@]}
- fi
- s cp -P {,$d}/etc/localtime
+ if [[ -e $d/bin ]]; then
+ s chroot $d apt-get update
+ s chroot $d apt-get -y dist-upgrade --purge --auto-remove
+ cd; s schroot -c $n -- apt-get install --allow-unauthenticated -y ${apps[@]}
+ else
+ s mkdir -p $d
+ s debootstrap $n $d http://deb.debian.org/debian/
+ cd; s schroot -c $n -- apt-get install --allow-unauthenticated -y ${apps[@]}
+ fi
+ s cp -P {,$d}/etc/localtime
}
s dd of=/etc/systemd/system/schrootupdate.service <<'EOF'
[Unit]
# for my roommate
case $distro in
- trisquel)
- mkschroot stretch firefox-esr pulseaudio chromium
- ;;
+ trisquel)
+ mkschroot stretch firefox-esr pulseaudio chromium
+ ;;
esac
s mkdir -p /nocow/user
s chown $USER:$USER /nocow/user
case $distro in
- debian)
- case $(debian-codename) in
- jessie)
- pi anki
- ;;
- *)
- mkschroot jessie anki pulsaudio mplayer
- ;;
- esac
- ;;
- trisquel|ubuntu)
+ debian)
+ case $(debian-codename) in
+ jessie)
pi anki
;;
- # others unknown
+ *)
+ mkschroot jessie anki pulsaudio mplayer
+ ;;
+ esac
+ ;;
+ trisquel|ubuntu)
+ pi anki
+ ;;
+ # others unknown
esac
case $distro in
- debian|trisquel|ubuntu)
- # note i had to do this, which is persistent:
- # cd /i/k
- # s chgrp debian-transmission torrents partial-torrents
-
- # syslog says things like
- # 'Failed to set receive buffer: requested 4194304, got 425984'
- # google suggets giving it even more than that
- tu /etc/sysctl.conf<<'EOF'
+ debian|trisquel|ubuntu)
+ # note i had to do this, which is persistent:
+ # cd /i/k
+ # s chgrp debian-transmission torrents partial-torrents
+
+ # syslog says things like
+ # 'Failed to set receive buffer: requested 4194304, got 425984'
+ # google suggets giving it even more than that
+ tu /etc/sysctl.conf<<'EOF'
net.core.rmem_max = 67108864
net.core.wmem_max = 16777216
EOF
- s sysctl -p
-
- # some reason it doesn\'t seem to start automatically anyways
- pi-nostart transmission-daemon
-
- # the folder was moved here after an install around 02/2017.
- # it contains runtime data,
- # plus a simple symlink to the config file which it\'s
- # not worth separating out.
- # between comps, the uid can change
- f=/i/transmission-daemon
- s lnf -T $f /var/lib/transmission-daemon/.config/transmission-daemon
- if [[ -e $f ]]; then
- s chown -R debian-transmission:debian-transmission $f
- fi
- for f in /i/k/partial-torrents /i/k/torrents; do
- if [[ -e $f ]]; then
- s chown -R debian-transmission:traci $f
- fi
- done
- s chown -R debian-transmission:debian-transmission /var/lib/transmission-daemon
- #
- # config file documented here, and it\'s the same config
- # for daemon vs client, so it\'s documented in the gui.
- # https://trac.transmissionbt.com/wiki/EditConfigFiles#Options
- #
- # I originaly setup rpc-whitelist, but after using
- # routing to a network namespace, it doesn\'t see the
- # real source address, so it\'s disabled.
- #
- # Changed the cache-size to 256 mb, reduces disk use.
- # It is a read & write cache.
- #
- s ruby <<'EOF'
+ s sysctl -p
+
+ # some reason it doesn\'t seem to start automatically anyways
+ pi-nostart transmission-daemon
+
+ # the folder was moved here after an install around 02/2017.
+ # it contains runtime data,
+ # plus a simple symlink to the config file which it\'s
+ # not worth separating out.
+ # between comps, the uid can change
+ f=/i/transmission-daemon
+ s lnf -T $f /var/lib/transmission-daemon/.config/transmission-daemon
+ if [[ -e $f ]]; then
+ s chown -R debian-transmission:debian-transmission $f
+ fi
+ for f in /i/k/partial-torrents /i/k/torrents; do
+ if [[ -e $f ]]; then
+ s chown -R debian-transmission:traci $f
+ fi
+ done
+ s chown -R debian-transmission:debian-transmission /var/lib/transmission-daemon
+ #
+ # config file documented here, and it\'s the same config
+ # for daemon vs client, so it\'s documented in the gui.
+ # https://trac.transmissionbt.com/wiki/EditConfigFiles#Options
+ #
+ # I originaly setup rpc-whitelist, but after using
+ # routing to a network namespace, it doesn\'t see the
+ # real source address, so it\'s disabled.
+ #
+ # Changed the cache-size to 256 mb, reduces disk use.
+ # It is a read & write cache.
+ #
+ s ruby <<'EOF'
require 'json'
p = '/etc/transmission-daemon/settings.json'
File.write(p, JSON.pretty_generate(JSON.parse(File.read(p)).merge({
})) + "\n")
EOF
- # make sure its not enabled, not sure if this is needed
- ser disable transmission-daemon
- ;;
- # todo: others unknown
+ # make sure its not enabled, not sure if this is needed
+ ser disable transmission-daemon
+ ;;
+ # todo: others unknown
esac
# adapted from /var/lib/dpkg/info/transmission-daemon.postinst
if ! getent passwd debian-transmission > /dev/null; then
- case $distro in
- arch)
- s useradd \
- --system \
- --create-home \
- --home-dir /var/lib/transmission-daemon \
- --shell /bin/false \
- debian-transmission
- ;;
- *)
- s adduser --quiet \
- --system \
- --group \
- --no-create-home \
- --disabled-password \
- --home /var/lib/transmission-daemon \
- debian-transmission
- ;;
- esac
+ case $distro in
+ arch)
+ s useradd \
+ --system \
+ --create-home \
+ --home-dir /var/lib/transmission-daemon \
+ --shell /bin/false \
+ debian-transmission
+ ;;
+ *)
+ s adduser --quiet \
+ --system \
+ --group \
+ --no-create-home \
+ --disabled-password \
+ --home /var/lib/transmission-daemon \
+ debian-transmission
+ ;;
+ esac
fi
# trisquel 8 = openvpn, debian stretch = openvpn-client
vpn_ser=openvpn-client
if [[ ! -e /lib/systemd/system/openvpn-client@.service ]]; then
- vpn_ser=openvpn
+ vpn_ser=openvpn
fi
s dd of=/etc/systemd/system/transmission-daemon-nn.service <<EOF
ser daemon-reload
if [[ $HOSTNAME == frodo ]]; then
- sgo transmission-daemon-nn
+ sgo transmission-daemon-nn
fi
######### begin transmission client setup ######
if [[ -e /p/transmission-rpc-pass ]]; then
- # arch had a default config,
- # debian had nothing until you start it.
- # With a little trial an error, here is a minimal config
- # taken from the generated one, plus changes that the
- # settings ui does, without a bunch of ui crap settings.
- #
- # only settings I set were
- # hostname
- # auto-connect
- # password
-
- # the password is randomly generated on first run, i copied it out
- # so it could be used by other hosts.
- s ruby <<'EOF'
+ # arch had a default config,
+ # debian had nothing until you start it.
+ # With a little trial an error, here is a minimal config
+ # taken from the generated one, plus changes that the
+ # settings ui does, without a bunch of ui crap settings.
+ #
+ # only settings I set were
+ # hostname
+ # auto-connect
+ # password
+
+ # the password is randomly generated on first run, i copied it out
+ # so it could be used by other hosts.
+ s ruby <<'EOF'
require 'json'
p = '/etc/transmission-daemon/settings.json'
s = JSON.parse(File.read(p))
File.write p, JSON.pretty_generate(s)
EOF
- rpc_pass=$(</p/transmission-rpc-pass)
- for f in /home/*; do
- d=$f/.config/transmission-remote-gtk
- u=${f##*/}
- s -u $u mkdir -p $d
- s -u $u dd of=$d/config.json <<EOF
+ rpc_pass=$(</p/transmission-rpc-pass)
+ for f in /home/*; do
+ d=$f/.config/transmission-remote-gtk
+ u=${f##*/}
+ s -u $u mkdir -p $d
+ s -u $u dd of=$d/config.json <<EOF
{
"profiles" : [
{
"add-options-dialog" : false
}
EOF
- done
+ done
fi
######### end transmission client setup ######
# dunno why it\'s there, but get rid of it
case $HOSTNAME in
- li|lj) s rm -rf /home/linode ;;
+ li|lj) s rm -rf /home/linode ;;
esac
### printer setup
case $distro in
- arch)
- pi cups ghostscript gsfonts # from arch wiki cups page
- pi hplip # from google
- s gpasswd -a $USER sys # from arch wiki
- sgo org.cups.cupsd.service
- # goto http://127.0.0.1:631
- # administration tab, add new printer button.
- # In debian, I could use hte recommended driver,
- # in arch, I had to pick out the 6L driver.
- ;;
- debian|trisquel|ubuntu)
- spa hplip
- ;;
- # other distros unknown
+ arch)
+ pi cups ghostscript gsfonts # from arch wiki cups page
+ pi hplip # from google
+ s gpasswd -a $USER sys # from arch wiki
+ sgo org.cups.cupsd.service
+ ;;
+ debian|trisquel|ubuntu)
+ s gpasswd -a $USER lpadmin # based on ubuntu wiki
+ spa hplip
+ ;;
+ # other distros unknown
esac
+# goto http://127.0.0.1:631
+# administration tab, add new printer button.
+# In debian, I could use hte recommended driver,
+# in arch, I had to pick out the 6L driver.
case $distro in
- trisquel|ubuntu|debian) pi --no-install-recommends mairix notmuch ;;
- fedora|arch) spa mairix notmuch ;;
+ trisquel|ubuntu|debian) pi --no-install-recommends mairix notmuch ;;
+ fedora|arch) spa mairix notmuch ;;
esac
# allow user to run vms, from debian handbook
# general known for debian/ubuntu, not for fedora
case $distro in
- debian|trisquel|ubuntu)
- # a bit of googling, and added settings to bashrc
- go get -u github.com/mvdan/fdroidcl/cmd/fdroidcl
- ;;
+ debian|trisquel|ubuntu)
+ # a bit of googling, and added settings to bashrc
+ go get -u github.com/mvdan/fdroidcl/cmd/fdroidcl
+ ;;
esac
case $distro in
- arch)
- # otherwise we get error about accessing kvm module.
- # seems like there might be a better way, but google was a bit vague.
- s $sed -ri '/^ *user *=/d' /etc/libvirt/qemu.conf
- echo 'user = "root"' | s tee -a /etc/libvirt/qemu.conf
- # https://bbs.archlinux.org/viewtopic.php?id=206206
- # # this should prolly go in the wiki
- sgo virtlogd.socket
- # guessing this is not needed
- #sgo virtlogd.service
- sgo libvirtd
- ;;
+ arch)
+ # otherwise we get error about accessing kvm module.
+ # seems like there might be a better way, but google was a bit vague.
+ s $sed -ri '/^ *user *=/d' /etc/libvirt/qemu.conf
+ echo 'user = "root"' | s tee -a /etc/libvirt/qemu.conf
+ # https://bbs.archlinux.org/viewtopic.php?id=206206
+ # # this should prolly go in the wiki
+ sgo virtlogd.socket
+ # guessing this is not needed
+ #sgo virtlogd.service
+ sgo libvirtd
+ ;;
esac
case $distro in
- fedora)
- cd $(mktemp -d)
- wget ftp://ftp.gnu.org/pub/gnu/global/global-6.5.7.tar.gz
- ex global*
- cd global-6.5.7
- # based on https://github.com/leoliu/ggtags
- ./configure --with-exuberant-ctags=/usr/bin/ctags
- make
- s make install
- s pip install pygments
- ;;
- *)
- pi global
- ;;&
- arch)
- pi python2-pygments
- ;;
- debian|trisquel|ubuntu)
- pi python-pygments
- ;;
+ fedora)
+ cd $(mktemp -d)
+ wget ftp://ftp.gnu.org/pub/gnu/global/global-6.5.7.tar.gz
+ ex global*
+ cd global-6.5.7
+ # based on https://github.com/leoliu/ggtags
+ ./configure --with-exuberant-ctags=/usr/bin/ctags
+ make
+ s make install
+ s pip install pygments
+ ;;
+ *)
+ pi global
+ ;;&
+ arch)
+ pi python2-pygments
+ ;;
+ debian|trisquel|ubuntu)
+ pi python-pygments
+ ;;
esac
# Trying to run as user instance, but $XDG_RUNTIME_DIR is not set
if isdebian-testing; then
- # as of 7/2016, has no unstable deps, and is not in testing anymore.
- pi synergy/unstable
+ # as of 7/2016, has no unstable deps, and is not in testing anymore.
+ pi synergy/unstable
else
- pi synergy
+ pi synergy
fi
# case $distro in
# have system config file setup too.
sudo adduser $USER dialout
case $distro in
- arch)
- sudo usermod -a -G uucp $USER
- ;;
+ arch)
+ sudo usermod -a -G uucp $USER
+ ;;
esac
# this is for the mail command too. update-alternatives is kind of misleading
# on grub upgrade, we get prompts unless we do this
devs=()
for dev in $(s btrfs fi show /boot | sed -nr 's#.*path\s+(\S+)$#\1#p'); do
- devs+=($(devbyid $dev),)
+ devs+=($(devbyid $dev),)
done
devs[-1]=${devs[-1]%,} # jonied by commas
s debconf-set-selections <<EOF
case $distro in
- trisquel|ubuntu|debian)
- # unison-gtk second, i want it to be default, not sure if that works
- # with spa. note, I used to install from testing repo when using stable,
- # but it shouldn't be needed since I wrote a script to handle mismatching
- # compilers.
- spa unison unison-gtk
- ;;
-arch)
+ trisquel|ubuntu|debian)
+ # unison-gtk second, i want it to be default, not sure if that works
+ # with spa. note, I used to install from testing repo when using stable,
+ # but it shouldn't be needed since I wrote a script to handle mismatching
+ # compilers.
+ spa unison unison-gtk
+ ;;
+ arch)
spa unison gtk2
;;
esac
case $distro in
- arch)
- # default is alsa, doesn\'t work with with pianobar
- s dd of=/etc/libao.conf <<'EOF'
+ arch)
+ # default is alsa, doesn\'t work with with pianobar
+ s dd of=/etc/libao.conf <<'EOF'
default_driver=pulse
EOF
- ;;
+ ;;
esac
# note, for jessie, it depends on a higher version of btrfs-tools.
EOF
case $distro in
- debian)
- # remove dep that came in with desktop
- pu transmission-gtk
- ;;
- esac
+ debian)
+ # remove dep that came in with desktop
+ pu transmission-gtk
+ ;;
+esac
case $distro in
- debian|trisquel|ubuntu) s gpasswd -a iank adm ;; #needed for reading logs
+ debian|trisquel|ubuntu) s gpasswd -a iank adm ;; #needed for reading logs
esac
/a/bin/buildscripts/pithosfly
#### tor
case $distro in
- # based on
- # https://www.torproject.org/docs/rpms.html.en
- # https://www.torproject.org/docs/debian.html.en
- # todo: figure out if the running service needs to be restarted upon updates
- # todo on fedora: setup non-dev packages
- fedora)
- s dd of=/etc/yum.repos.d/torproject.repo <<'EOF'
+ # based on
+ # https://www.torproject.org/docs/rpms.html.en
+ # https://www.torproject.org/docs/debian.html.en
+ # todo: figure out if the running service needs to be restarted upon updates
+ # todo on fedora: setup non-dev packages
+ fedora)
+ s dd of=/etc/yum.repos.d/torproject.repo <<'EOF'
[tor]
name=Tor experimental repo
enabled=1
gpgkey=http://deb.torproject.org/torproject.org/rpm/RPM-GPG-KEY-torproject.org.asc
EOF
- # to be secure, take a look at the fingerprint reported from the following install, and see if it matches from the link above:
- # 3B9E EEB9 7B1E 827B CF0A 0D96 8AF5 653C 5AC0 01F1
- sgo tor
- /a/bin/buildscripts/tor-browser
- ;;
- ubuntu)
- tu /etc/apt/sources.list "deb http://deb.torproject.org/torproject.org $(debian-codename) main"
- gpg --keyserver keys.gnupg.net --recv 886DDD89
- gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | sudo apt-key add -
- p update
- pi deb.torproject.org-keyring
- pi tor
- /a/bin/buildscripts/tor-browser
- ;;
- debian)
- pi tor
- /a/bin/buildscripts/tor-browser
- ;;
- arch)
- pi tor tor-browser-en
- sgo tor
- ;;
- # ubuntu unknown
+ # to be secure, take a look at the fingerprint reported from the following install, and see if it matches from the link above:
+ # 3B9E EEB9 7B1E 827B CF0A 0D96 8AF5 653C 5AC0 01F1
+ sgo tor
+ /a/bin/buildscripts/tor-browser
+ ;;
+ ubuntu)
+ tu /etc/apt/sources.list "deb http://deb.torproject.org/torproject.org $(debian-codename) main"
+ gpg --keyserver keys.gnupg.net --recv 886DDD89
+ gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | sudo apt-key add -
+ p update
+ pi deb.torproject.org-keyring
+ pi tor
+ /a/bin/buildscripts/tor-browser
+ ;;
+ debian)
+ pi tor
+ /a/bin/buildscripts/tor-browser
+ ;;
+ arch)
+ pi tor tor-browser-en
+ sgo tor
+ ;;
+ # ubuntu unknown
esac
# nfs server
case $distro in
- fedora)
- end_msg <<'EOF'
+ fedora)
+ end_msg <<'EOF'
fedora todo: disable the firewall or find a way to automate it.
there's an unused section in t.org for tramikssion firewall setup
EOF
- pi nfs-utils
- sgo nfs-server
- ;;
- debian|trisquel|ubuntu)
- pi nfs-server
- ;;
- arch)
- pi nfs-utils || pending_reboot=true
- sgo rpcbind
- # this failed until I rebooted
- sgo nfs-server
- ;;
+ pi nfs-utils
+ sgo nfs-server
+ ;;
+ debian|trisquel|ubuntu)
+ pi nfs-server
+ ;;
+ arch)
+ pi nfs-utils || pending_reboot=true
+ sgo rpcbind
+ # this failed until I rebooted
+ sgo nfs-server
+ ;;
esac
if [[ $HOSTNAME == frodo ]]; then
- # nohide = export filesystems mounted deeper than the export point
- # fsid=0 makes this export the "root" export
- # not documented in the man page, but this means
- # 1. it can be mounted with a shorthand of server:/
- # 2. exports that are subdirectories of this one will automatically be mounted
- tu /etc/exports <<'EOF'
+ # nohide = export filesystems mounted deeper than the export point
+ # fsid=0 makes this export the "root" export
+ # not documented in the man page, but this means
+ # 1. it can be mounted with a shorthand of server:/
+ # 2. exports that are subdirectories of this one will automatically be mounted
+ tu /etc/exports <<'EOF'
/k 192.168.1.0/24(rw,fsid=0,nohide,no_root_squash,async,no_subtree_check,insecure)
EOF
- s exportfs -rav
+ s exportfs -rav
fi
# if I was going to create a persistent vm, i might do it like this:
# variant=something # from: virt-install --os-variant list
# s virt-install --noautoconsole --graphics spice,listen=0.0.0.0 \
- # --disk=/a/images/some_name.qcow2,bus=virtio --vcpus 2 -r 4096 -w bridge=br0 \
- # -n some_name --import --os-variant $variant --cpu host-model-only
+ # --disk=/a/images/some_name.qcow2,bus=virtio --vcpus 2 -r 4096 -w bridge=br0 \
+ # -n some_name --import --os-variant $variant --cpu host-model-only
if $pending_reboot; then
- echo "$0: pending reboot and then finished. doing it now."
- s reboot now
+ echo "$0: pending reboot and then finished. doing it now."
+ s reboot now
else
- echo "$0: $(date): ending now)"
+ echo "$0: $(date): ending now)"
fi
exit 0
[[ $EUID == 0 ]] || exec sudo -E "$BASH_SOURCE" "$@"
usage() {
- cat <<EOF
+ cat <<EOF
Usage: ${0##*/} exim4|postfix
Setup exim4 / postfix / dovecot
-h|--help Print help and exit.
EOF
- exit $1
+ exit $1
}
type=$1
exim() { [[ $type == exim4 ]]; }
if ! exim && ! postfix; then
- usage 1
+ usage 1
fi
if [[ ! $SUDO_USER ]]; then
- echo "$0: error: requires running as nonroot or sudo"
+ echo "$0: error: requires running as nonroot or sudo"
fi
u=$SUDO_USER
postconfin() {
- local MAPFILE
- mapfile -t
- local s
- postconf -ev "${MAPFILE[@]}"
+ local MAPFILE
+ mapfile -t
+ local s
+ postconf -ev "${MAPFILE[@]}"
}
e() { printf "%s\n" "$*"; }
pi() { # package install
- local s f
- if dpkg -s -- "$@" &> /dev/null; then
- return 0;
- fi;
- while fuser /var/lib/dpkg/lock &>/dev/null; do sleep 1; done
- f=/var/cache/apt/pkgcache.bin;
- if [[ ! -r $f ]] || (( $(( $(date +%s) - $(stat -c %Y $f ) )) > 60*60*12 )); then
- apt-get update
- fi
- apt-get -y install --purge --auto-remove "$@"
+ local s f
+ if dpkg -s -- "$@" &> /dev/null; then
+ return 0;
+ fi;
+ while fuser /var/lib/dpkg/lock &>/dev/null; do sleep 1; done
+ f=/var/cache/apt/pkgcache.bin;
+ if [[ ! -r $f ]] || (( $(( $(date +%s) - $(stat -c %Y $f ) )) > 60*60*12 )); then
+ apt-get update
+ fi
+ apt-get -y install --purge --auto-remove "$@"
}
postmaster=$u
# trisquel 8 = openvpn, debian stretch = openvpn-client
vpn_ser=openvpn-client
if [[ ! -e /lib/systemd/system/openvpn-client@.service ]]; then
- vpn_ser=openvpn
+ vpn_ser=openvpn
fi
if [[ $HOSTNAME == $MAIL_HOST ]]; then
- # afaik, these will get ignored because they are routing to my own
- # machine, but rm them is safer
- rm -f $(eval echo ~$postmaster)/.forward /root/.forward
+ # afaik, these will get ignored because they are routing to my own
+ # machine, but rm them is safer
+ rm -f $(eval echo ~$postmaster)/.forward /root/.forward
else
- # this can\'t be a symlink and has permission restrictions
- # it might work in /etc/aliases, but this seems more proper.
- install -m 644 {-o,-g}$postmaster <(e $forward) $(eval echo ~$postmaster)/.forward
+ # this can\'t be a symlink and has permission restrictions
+ # it might work in /etc/aliases, but this seems more proper.
+ install -m 644 {-o,-g}$postmaster <(e $forward) $(eval echo ~$postmaster)/.forward
fi
# offlineimap uses this too, it is much easier to use one location than to
# condition it\'s config and postfix\'s config
if [[ -f /etc/fedora-release ]]; then
- /a/exe/lnf -T ca-certificates.crt /etc/ssl/ca-bundle.trust.crt
+ /a/exe/lnf -T ca-certificates.crt /etc/ssl/ca-bundle.trust.crt
fi
if postfix; then
- # dunno why, but debian installed postfix with builddep emacs
- # but I will just explicitly install it here since
- # I use it for sending mail in emacs.
- if command -v apt-get &> /dev/null; then
- debconf-set-selections <<EOF
+ # dunno why, but debian installed postfix with builddep emacs
+ # but I will just explicitly install it here since
+ # I use it for sending mail in emacs.
+ if command -v apt-get &> /dev/null; then
+ debconf-set-selections <<EOF
postfix postfix/main_mailer_type select Satellite system
postfix postfix/mailname string $HOSTNAME
postfix postfix/relayhost string $relayhost
postfix postfix/root_address string $postmaster
EOF
- if dpkg -s postfix &>/dev/null; then
- while fuser /var/lib/dpkg/lock &>/dev/null; do sleep 1; done
- dpkg-reconfigure -u -fnoninteractive postfix
- else
- pi postfix
- fi
+ if dpkg -s postfix &>/dev/null; then
+ while fuser /var/lib/dpkg/lock &>/dev/null; do sleep 1; done
+ dpkg-reconfigure -u -fnoninteractive postfix
else
- source /a/bin/distro-functions/src/package-manager-abstractions
- pi postfix
- # Settings from reading the output when installing on debian,
- # then seeing which were different in a default install on arch.
- # I assume the same works for fedora.
- postconfin <<EOF
+ pi postfix
+ fi
+ else
+ source /a/bin/distro-functions/src/package-manager-abstractions
+ pi postfix
+ # Settings from reading the output when installing on debian,
+ # then seeing which were different in a default install on arch.
+ # I assume the same works for fedora.
+ postconfin <<EOF
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
relayhost = $relayhost
inet_interfaces = loopback-only
EOF
- systemctl enable postfix
- systemctl start postfix
- fi
- # i\'m assuming mail just won\'t work on systems without the sasl_passwd.
- postconfin <<'EOF'
+ systemctl enable postfix
+ systemctl start postfix
+ fi
+ # i\'m assuming mail just won\'t work on systems without the sasl_passwd.
+ postconfin <<'EOF'
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
inet_protocols = ipv4
EOF
- # msg_size_limit: I ran into a log file not sending cuz of size. double from 10 to 20 meg limit
- # inet_protocols: without this, I\'ve had postfix try an ipv6 lookup then gives
- # up and fail forever. snippet from syslog: type=AAAA: Host not found, try again
-
-
- f=/etc/postfix/sasl_passwd
- install -m 600 /dev/null $f
- cat /etc/mailpass| while read -r domain port pass; do
- # format: domain port user:pass
- # mailpass is just a name i made up, since postfix and
- # exim both use a slightly crazy format to translate to
- # each other, it\'s easier to use my own format.
- printf "[%s]:%s %s" "$domain" "$port" "${pass/@/#}" >>$f
- done
- postmap hash:/etc/postfix/sasl_passwd
- # need restart instead of reload when changing
- # inet_protocols
- service postfix restart
+ # msg_size_limit: I ran into a log file not sending cuz of size. double from 10 to 20 meg limit
+ # inet_protocols: without this, I\'ve had postfix try an ipv6 lookup then gives
+ # up and fail forever. snippet from syslog: type=AAAA: Host not found, try again
+
+
+ f=/etc/postfix/sasl_passwd
+ install -m 600 /dev/null $f
+ cat /etc/mailpass| while read -r domain port pass; do
+ # format: domain port user:pass
+ # mailpass is just a name i made up, since postfix and
+ # exim both use a slightly crazy format to translate to
+ # each other, it\'s easier to use my own format.
+ printf "[%s]:%s %s" "$domain" "$port" "${pass/@/#}" >>$f
+ done
+ postmap hash:/etc/postfix/sasl_passwd
+ # need restart instead of reload when changing
+ # inet_protocols
+ service postfix restart
else # begin exim. has debian specific stuff for now
- pi openvpn
-
- if [[ -e /p/c/filesystem ]]; then
- # allow failure of these commands when our internet is down, they are likely not needed,
- # we check that a valid cert is there already.
- # to put the hostname in the known hosts
- if ! ssh -o StrictHostKeyChecking=no root@li.iankelling.org :; then
- openssl x509 -checkend $(( 60 * 60 * 24 * 3 )) -noout -in /etc/openvpn/mail.crt
- else
- # note, man openvpn implies we could just call mail-route on vpn startup/shutdown with
- # systemd, buuut it can remake the tun device unexpectedly, i got this in the log
- # after my internet was down for a bit:
- # NOTE: Pulled options changed on restart, will need to close and reopen TUN/TAP device.
- /a/exe/vpn-mk-client-cert -b mail -n mail -s /b/ds/mail-route li.iankelling.org
- fi
+ pi openvpn
+
+ if [[ -e /p/c/filesystem ]]; then
+ # allow failure of these commands when our internet is down, they are likely not needed,
+ # we check that a valid cert is there already.
+ # to put the hostname in the known hosts
+ if ! ssh -o StrictHostKeyChecking=no root@li.iankelling.org :; then
+ openssl x509 -checkend $(( 60 * 60 * 24 * 3 )) -noout -in /etc/openvpn/mail.crt
+ else
+ # note, man openvpn implies we could just call mail-route on vpn startup/shutdown with
+ # systemd, buuut it can remake the tun device unexpectedly, i got this in the log
+ # after my internet was down for a bit:
+ # NOTE: Pulled options changed on restart, will need to close and reopen TUN/TAP device.
+ /a/exe/vpn-mk-client-cert -b mail -n mail -s /b/ds/mail-route li.iankelling.org
fi
+ fi
- cat >/etc/systemd/system/offlineimapsync.timer <<'EOF'
+ cat >/etc/systemd/system/offlineimapsync.timer <<'EOF'
[Unit]
Description=Run offlineimap-sync once every min
WantedBy=timers.target
EOF
- cat >/etc/systemd/system/offlineimapsync.service <<EOF
+ cat >/etc/systemd/system/offlineimapsync.service <<EOF
[Unit]
Description=Offlineimap sync
After=multi-user.target
Type=oneshot
ExecStart=/a/bin/log-quiet/sysd-mail-once offlineimap-sync /a/bin/distro-setup/offlineimap-sync
EOF
- systemctl daemon-reload
-
- # wording of question from dpkg-reconfigure exim4-config
- # 1. internet site; mail is sent and received directly using SMTP
- # 2. mail sent by smarthost; received via SMTP or fetchmail
- # 3. mail sent by smarthost; no local mail
- # 4. local delivery only; not on a network
- # 5. no configuration at this time
- #
- # Note, I have used option 2 in the past for receiving mail
- # from lan hosts, sending external mail via another smtp server.
- #
- # Note, other than configtype, we could set all the options in
- # both types of configs without harm, they would either be
- # ignored or be disabled by other settings, but the default
- # local_interfaces definitely makes things more secure.
-
- # most of these settings get translated into settings
- # in /etc/exim4/update-exim4.conf.conf
- # how /etc/exim4/update-exim4.conf.conf translates into actual exim settings is
- # documented in man update-exim4.conf, which outputs to the config that
- # exim actually reads. except the man page is not perfect, for example,
- # it doesn't document that it sets
- # DCconfig_${dc_eximconfig_configtype}" "1"
- # which is a line from update-exim4.conf, which is a relatively short bash script.
- # mailname setting sets /etc/mailname
-
- debconf-set-selections <<EOF
+ systemctl daemon-reload
+
+ # wording of question from dpkg-reconfigure exim4-config
+ # 1. internet site; mail is sent and received directly using SMTP
+ # 2. mail sent by smarthost; received via SMTP or fetchmail
+ # 3. mail sent by smarthost; no local mail
+ # 4. local delivery only; not on a network
+ # 5. no configuration at this time
+ #
+ # Note, I have used option 2 in the past for receiving mail
+ # from lan hosts, sending external mail via another smtp server.
+ #
+ # Note, other than configtype, we could set all the options in
+ # both types of configs without harm, they would either be
+ # ignored or be disabled by other settings, but the default
+ # local_interfaces definitely makes things more secure.
+
+ # most of these settings get translated into settings
+ # in /etc/exim4/update-exim4.conf.conf
+ # how /etc/exim4/update-exim4.conf.conf translates into actual exim settings is
+ # documented in man update-exim4.conf, which outputs to the config that
+ # exim actually reads. except the man page is not perfect, for example,
+ # it doesn't document that it sets
+ # DCconfig_${dc_eximconfig_configtype}" "1"
+ # which is a line from update-exim4.conf, which is a relatively short bash script.
+ # mailname setting sets /etc/mailname
+
+ debconf-set-selections <<EOF
exim4-config exim4/use_split_config boolean true
EOF
- source /a/bin/bash_unpublished/source-semi-priv
- exim_main_dir=/etc/exim4/conf.d/main
- mkdir -p $exim_main_dir
+ source /a/bin/bash_unpublished/source-semi-priv
+ exim_main_dir=/etc/exim4/conf.d/main
+ mkdir -p $exim_main_dir
- #### begin mail cert setup ###
- f=/usr/local/bin/mail-cert-cron
- cat >$f <<'EOF'
+ #### begin mail cert setup ###
+ f=/usr/local/bin/mail-cert-cron
+ cat >$f <<'EOF'
set -eE -o pipefail
trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR
fi
exit 0
EOF
- chmod 755 $f
+ chmod 755 $f
- cat >/etc/systemd/system/mailcert.service <<'EOF'
+ cat >/etc/systemd/system/mailcert.service <<'EOF'
[Unit]
Description=Mail cert rsync
After=multi-user.target
ExecStart=/a/bin/log-quiet/sysd-mail-once mailcert /usr/local/bin/mail-cert-cron
EOF
- cat >/etc/systemd/system/mailcert.timer <<'EOF'
+ cat >/etc/systemd/system/mailcert.timer <<'EOF'
[Unit]
Description=Run mail-cert once a day
[Install]
WantedBy=timers.target
EOF
- systemctl daemon-reload
- systemctl start mailcert
- systemctl restart mailcert.timer
- systemctl enable mailcert.timer
+ systemctl daemon-reload
+ systemctl start mailcert
+ systemctl restart mailcert.timer
+ systemctl enable mailcert.timer
- ##### end mailcert setup #####
+ ##### end mailcert setup #####
- if [[ $HOSTNAME == $MAIL_HOST ]]; then
+ if [[ $HOSTNAME == $MAIL_HOST ]]; then
- debconf-set-selections <<EOF
+ debconf-set-selections <<EOF
# Mail Server configuration
# -------------------------
# Delivery method for local mail: 2
exim4-config exim4/dc_localdelivery select Maildir format in home directory
EOF
- # MAIN_HARDCODE_PRIMARY_HOSTNAME might mess up the
- # smarthost config type, not sure. all other settings
- # would be unused in that config type.
- cat >$exim_main_dir/000_localmacros <<EOF
+ # MAIN_HARDCODE_PRIMARY_HOSTNAME might mess up the
+ # smarthost config type, not sure. all other settings
+ # would be unused in that config type.
+ cat >$exim_main_dir/000_localmacros <<EOF
# i don't have ipv6 setup for my tunnel yet.
disable_ipv6 = true
EOF
- ####### begin dovecot setup ########
- # based on a little google and package search, just the dovecot
- # packages we need instead of dovecot-common.
- #
- # dovecot-lmtpd is for exim to deliver to dovecot instead of maildir
- # directly. The reason to do this is to use dovecot\'s sieve, which
- # has extensions that allow it to be almost equivalent to exim\'s
- # filter capabilities, some ways probably better, some worse, and
- # sieve has the benefit of being supported in postfix and
- # proprietary/weird environments, so there is more examples on the
- # internet. I was torn about whether to do this or not, meh.
- pi dovecot-core dovecot-imapd dovecot-sieve dovecot-lmtpd
-
- # if we changed 90-sieve.conf and removed the active part of the
- # sieve option, we wouldn\'t need this, but I\'d rather not modify a
- # default config if not needed. This won\'t work as a symlink in /a/c
- # unfortunately.
- sudo -u $postmaster /a/exe/lnf -T sieve/main.sieve $(eval echo ~$postmaster)/.dovecot.sieve
-
- sed -ri -f - /etc/dovecot/conf.d/10-mail.conf <<'EOF'
+ ####### begin dovecot setup ########
+ # based on a little google and package search, just the dovecot
+ # packages we need instead of dovecot-common.
+ #
+ # dovecot-lmtpd is for exim to deliver to dovecot instead of maildir
+ # directly. The reason to do this is to use dovecot\'s sieve, which
+ # has extensions that allow it to be almost equivalent to exim\'s
+ # filter capabilities, some ways probably better, some worse, and
+ # sieve has the benefit of being supported in postfix and
+ # proprietary/weird environments, so there is more examples on the
+ # internet. I was torn about whether to do this or not, meh.
+ pi dovecot-core dovecot-imapd dovecot-sieve dovecot-lmtpd
+
+ # if we changed 90-sieve.conf and removed the active part of the
+ # sieve option, we wouldn\'t need this, but I\'d rather not modify a
+ # default config if not needed. This won\'t work as a symlink in /a/c
+ # unfortunately.
+ sudo -u $postmaster /a/exe/lnf -T sieve/main.sieve $(eval echo ~$postmaster)/.dovecot.sieve
+
+ sed -ri -f - /etc/dovecot/conf.d/10-mail.conf <<'EOF'
1i mail_location = maildir:/m/md:LAYOUT=fs:INBOX=/m/md/INBOX
/^\s*mail_location\s*=/d
EOF
- cat >/etc/dovecot/conf.d/20-lmtp.conf <<EOF
+ cat >/etc/dovecot/conf.d/20-lmtp.conf <<EOF
protocol lmtp {
#per https://wiki2.dovecot.org/Pigeonhole/Sieve/Configuration
mail_plugins = \$mail_plugins sieve
EOF
- cat >/etc/dovecot/local.conf <<'EOF'
+ cat >/etc/dovecot/local.conf <<'EOF'
# so I can use a different login that my shell login for mail. this is
# worth doing solely for the reason that if this login is compromised,
# it won't also compromise my shell password.
# auth_verbose=yes
#mail_debug=yes
EOF
- ####### end dovecot setup ########
-
-
- systemctl enable offlineimapsync.timer
- systemctl start offlineimapsync.timer
- systemctl restart $vpn_ser@mail
- systemctl enable $vpn_ser@mail
- systemctl enable dovecot
- systemctl restart dovecot
-
- else # $HOSTNAME != $MAIL_HOST
- systemctl disable offlineimapsync.timer &>/dev/null ||:
- systemctl stop offlineimapsync.timer &>/dev/null ||:
- systemctl disable $vpn_ser@mail
- systemctl stop $vpn_ser@mail
- systemctl disable dovecot ||:
- systemctl stop dovecot ||:
- #
- #
- # would only exist because I wrote it i the previous condition,
- # it\'s not part of exim
- rm -f $exim_main_dir/000_localmacros
- debconf-set-selections <<EOF
+ ####### end dovecot setup ########
+
+
+ systemctl enable offlineimapsync.timer
+ systemctl start offlineimapsync.timer
+ systemctl restart $vpn_ser@mail
+ systemctl enable $vpn_ser@mail
+ systemctl enable dovecot
+ systemctl restart dovecot
+
+ else # $HOSTNAME != $MAIL_HOST
+ systemctl disable offlineimapsync.timer &>/dev/null ||:
+ systemctl stop offlineimapsync.timer &>/dev/null ||:
+ systemctl disable $vpn_ser@mail
+ systemctl stop $vpn_ser@mail
+ systemctl disable dovecot ||:
+ systemctl stop dovecot ||:
+ #
+ #
+ # would only exist because I wrote it i the previous condition,
+ # it\'s not part of exim
+ rm -f $exim_main_dir/000_localmacros
+ debconf-set-selections <<EOF
exim4-config exim4/dc_eximconfig_configtype select mail sent by smarthost; no local mail
exim4-config exim4/dc_smarthost string $smarthost
# the default, i think is from /etc/mailname. better to set it to
exim4-config exim4/mailname string $(hostname -f)
EOF
- fi # end $HOSTNAME != $MAIL_HOST
-
- # if we already have it installed, need to reconfigure, without being prompted
- if dpkg -s exim4-config &>/dev/null; then
- # gotta remove this, otherwise the set-selections are completely
- # ignored. It woulda been nice if this was documented somewhere!
- rm -f /etc/exim4/update-exim4.conf.conf
- while fuser /var/lib/dpkg/lock &>/dev/null; do sleep 1; done
- dpkg-reconfigure -u -fnoninteractive exim4-config
- fi
-
- # i have the spool directory be common to distro multi-boot, so
- # we need the uid to be the same. 608 cuz it's kind of in the middle
- # of the free system uids.
- IFS=:; read _ _ uid _ < <(getent passwd Debian-exim ); unset IFS
- IFS=:; read _ _ gid _ < <(getent group Debian-exim ); unset IFS
- if [[ ! $uid ]]; then
- # from /var/lib/dpkg/info/exim4-base.postinst, plus uid and gid options
- adduser --uid 608 --gid 608 --system --group --quiet --home /var/spool/exim4 \
- --no-create-home --disabled-login --force-badname Debian-exim
- elif [[ $uid != 608 ]]; then
- systemctl stop exim4 ||:
- usermod -u 608 Debian-exim
- groupmod -g 608 Debian-exim
- usermod -g 608 Debian-exim
- find / /nocow -xdev -uid $uid -exec chown -h 608 {} +
- find / /nocow -xdev -gid $gid -exec chgrp -h 608 {} +
- fi
-
- # light version of exim does not have sasl auth support.
- pi exim4-daemon-heavy spamassassin
-
-
+ fi # end $HOSTNAME != $MAIL_HOST
-
- ##### begin spamassassin config
- systemctl enable spamassassin
- # per readme.debian
- sed -i '/^\s*CRON\s*=/d' /etc/default/spamassassin
- e CRON=1 >>/etc/default/spamassassin
- # just noticed this in the config file, seems like a good idea.
- sed -i '/^\s*NICE\s*=/d' /etc/default/spamassassin
- e 'NICE="--nicelevel 15"' >>/etc/default/spamassassin
- systemctl start spamassassin
- systemctl reload spamassassin
-
- cat >/etc/systemd/system/spamddnsfix.service <<'EOF'
+ # if we already have it installed, need to reconfigure, without being prompted
+ if dpkg -s exim4-config &>/dev/null; then
+ # gotta remove this, otherwise the set-selections are completely
+ # ignored. It woulda been nice if this was documented somewhere!
+ rm -f /etc/exim4/update-exim4.conf.conf
+ while fuser /var/lib/dpkg/lock &>/dev/null; do sleep 1; done
+ dpkg-reconfigure -u -fnoninteractive exim4-config
+ fi
+
+ # i have the spool directory be common to distro multi-boot, so
+ # we need the uid to be the same. 608 cuz it's kind of in the middle
+ # of the free system uids.
+ IFS=:; read _ _ uid _ < <(getent passwd Debian-exim ); unset IFS
+ IFS=:; read _ _ gid _ < <(getent group Debian-exim ); unset IFS
+ if [[ ! $uid ]]; then
+ # from /var/lib/dpkg/info/exim4-base.postinst, plus uid and gid options
+ adduser --uid 608 --gid 608 --system --group --quiet --home /var/spool/exim4 \
+ --no-create-home --disabled-login --force-badname Debian-exim
+ elif [[ $uid != 608 ]]; then
+ systemctl stop exim4 ||:
+ usermod -u 608 Debian-exim
+ groupmod -g 608 Debian-exim
+ usermod -g 608 Debian-exim
+ find / /nocow -xdev -uid $uid -exec chown -h 608 {} +
+ find / /nocow -xdev -gid $gid -exec chgrp -h 608 {} +
+ fi
+
+ # light version of exim does not have sasl auth support.
+ pi exim4-daemon-heavy spamassassin
+
+
+
+
+ ##### begin spamassassin config
+ systemctl enable spamassassin
+ # per readme.debian
+ sed -i '/^\s*CRON\s*=/d' /etc/default/spamassassin
+ e CRON=1 >>/etc/default/spamassassin
+ # just noticed this in the config file, seems like a good idea.
+ sed -i '/^\s*NICE\s*=/d' /etc/default/spamassassin
+ e 'NICE="--nicelevel 15"' >>/etc/default/spamassassin
+ systemctl start spamassassin
+ systemctl reload spamassassin
+
+ cat >/etc/systemd/system/spamddnsfix.service <<'EOF'
[Unit]
Description=spamd dns bug fix cronjob
Type=oneshot
ExecStart=/a/bin/distro-setup/spamd-dns-fix
EOF
- # 2017-09, debian closed the bug on this saying upstream had fixed it.
- # remove this when i\'m using the newer package, ie, debian 10, or maybe
- # ubuntu 18.04.
- cat >/etc/systemd/system/spamddnsfix.timer <<'EOF'
+ # 2017-09, debian closed the bug on this saying upstream had fixed it.
+ # remove this when i\'m using the newer package, ie, debian 10, or maybe
+ # ubuntu 18.04.
+ cat >/etc/systemd/system/spamddnsfix.timer <<'EOF'
[Unit]
Description=run spamd bug fix script every 10 minutes
[Install]
WantedBy=timers.target
EOF
- systemctl daemon-reload
- systemctl restart spamddnsfix.timer
- systemctl enable spamddnsfix.timer
- #
- ##### end spamassassin config
+ systemctl daemon-reload
+ systemctl restart spamddnsfix.timer
+ systemctl enable spamddnsfix.timer
+ #
+ ##### end spamassassin config
- cat >/etc/exim4/rcpt_local_acl <<'EOF'
+ cat >/etc/exim4/rcpt_local_acl <<'EOF'
# Only hosts we control send to mail.iankelling.org, so make sure
# they are all authed.
# Note, if we wanted authed senders for all domains,
!authenticated = *
domains = mail.iankelling.org
EOF
- cat >/etc/exim4/data_local_acl <<'EOF'
+ cat >/etc/exim4/data_local_acl <<'EOF'
# Except for the "condition =", this was
# a comment in the check_data acl. The comment about this not
# being suitable is mostly bs. The only thing related I found was to
X-Spam_report: $spam_report
EOF
- cat >/etc/exim4/conf.d/auth/29_exim4-config_auth <<'EOF'
+ cat >/etc/exim4/conf.d/auth/29_exim4-config_auth <<'EOF'
# from 30_exim4-config_examples
plain_server:
.endif
EOF
- cat >/etc/exim4/conf.d/router/900_exim4-config_local_user <<'EOF'
+ cat >/etc/exim4/conf.d/router/900_exim4-config_local_user <<'EOF'
### router/900_exim4-config_local_user
#################################
transport = LOCAL_DELIVERY
cannot_route_message = Unknown user
EOF
- cat >/etc/exim4/conf.d/transport/30_exim4-config_dovecot_lmtp <<'EOF'
+ cat >/etc/exim4/conf.d/transport/30_exim4-config_dovecot_lmtp <<'EOF'
dovecot_lmtp:
driver = lmtp
socket = /var/run/dovecot/lmtp
batch_max = 200
EOF
- cat >/etc/exim4/conf.d/router/190_exim4-config_fsfsmarthost <<'EOF'
+ cat >/etc/exim4/conf.d/router/190_exim4-config_fsfsmarthost <<'EOF'
# smarthost for fsf mail
# ian: copied from /etc/exim4/conf.d/router/200_exim4-config_primary, and added senders = and
# replaced DCsmarthost with mail.fsf.org
no_more
EOF
- # https://blog.dhampir.no/content/make-exim4-on-debian-respect-forward-and-etcaliases-when-using-a-smarthost
- # i only need .forwards, so just doing that one.
- cd /etc/exim4/conf.d/router
- b=userforward_higher_priority
- # replace the router name so it is unique
- sed -r s/^\\S+:/$b:/ 600_exim4-config_userforward >175_$b
-
- # begin setup passwd.client
- f=/etc/exim4/passwd.client
- rm -f /etc/exim4/passwd.client
- install -m 640 -g Debian-exim /dev/null $f
- cat /etc/mailpass| while read -r domain port pass; do
- # reference: exim4_passwd_client(5)
- printf "%s:%s\n" "$domain" "$pass" >>$f
- done
- # end setup passwd.client
-
- # by default, only 10 days of logs are kept. increase that.
- sed -ri 's/^(\s*rotate\s).*/\11000/' /etc/logrotate.d/exim4-base
-
- systemctl restart exim4
-
- fi #### end if exim4
-
- # /etc/alias setup is debian specific, and
- # exim config sets up an /etc/alias from root to the postmaster, which i
- # config to ian, as long as there exists an entry for root, or there was
- # no preexisting aliases file. based on the postinst file. postfix
- # won\'t set up a root to $postmaster alias if it\'s already installed.
- # Since postfix is not the greatest, just set it ourselves.
- if [[ $postmaster != root ]]; then
- sed -i --follow-symlinks -f - /etc/aliases <<EOF
+ # https://blog.dhampir.no/content/make-exim4-on-debian-respect-forward-and-etcaliases-when-using-a-smarthost
+ # i only need .forwards, so just doing that one.
+ cd /etc/exim4/conf.d/router
+ b=userforward_higher_priority
+ # replace the router name so it is unique
+ sed -r s/^\\S+:/$b:/ 600_exim4-config_userforward >175_$b
+
+ # begin setup passwd.client
+ f=/etc/exim4/passwd.client
+ rm -f /etc/exim4/passwd.client
+ install -m 640 -g Debian-exim /dev/null $f
+ cat /etc/mailpass| while read -r domain port pass; do
+ # reference: exim4_passwd_client(5)
+ printf "%s:%s\n" "$domain" "$pass" >>$f
+ done
+ # end setup passwd.client
+
+ # by default, only 10 days of logs are kept. increase that.
+ sed -ri 's/^(\s*rotate\s).*/\11000/' /etc/logrotate.d/exim4-base
+
+ systemctl restart exim4
+
+fi #### end if exim4
+
+# /etc/alias setup is debian specific, and
+# exim config sets up an /etc/alias from root to the postmaster, which i
+# config to ian, as long as there exists an entry for root, or there was
+# no preexisting aliases file. based on the postinst file. postfix
+# won\'t set up a root to $postmaster alias if it\'s already installed.
+# Since postfix is not the greatest, just set it ourselves.
+if [[ $postmaster != root ]]; then
+ sed -i --follow-symlinks -f - /etc/aliases <<EOF
\$a root: $postmaster
/^root:/d
EOF
- newaliases
- fi
-
- # put spool dir in directory that spans multiple distros.
- # based on http://www.postfix.org/qmgr.8.html and my notes in gnus
- #
- # todo: I\'m suspicious of uids for Debian-exim being the same across
- # distros. It would be good to test this.
- dir=/nocow/$type
- sdir=/var/spool/$type
- # we only do this if our system has $dir
- if [[ -e /nocow && $(readlink -f $sdir) != $dir ]]; then
- systemctl stop $type
- if [[ ! -e $dir && -d $sdir ]]; then
- mv $sdir $dir
- fi
- /a/exe/lnf -T $dir $sdir
- fi
-
- systemctl restart $type
- systemctl enable $type
-
- # MAIL_HOST also does radicale, and easier to start and stop it here
- # for when MAIL_HOST changes, so radicale gets the synced files and
- # does not stop us from remounting /o.
- if dpkg -s radicale &>/dev/null; then
- if [[ $HOSTNAME == $MAIL_HOST ]]; then
- systemctl restart radicale
- systemctl enable radicale
- if [[ -e /etc/logrotate.d/radicale.disabled ]]; then
- mv /etc/logrotate.d/radicale{.disabled,}
- fi
- else
- systemctl stop radicale
- systemctl disable radicale
- # weekly logrotate tries to restart radicale even if it's a disabled service in flidas.
- if [[ -e /etc/logrotate.d/radicale ]]; then
- mv /etc/logrotate.d/radicale{,.disabled}
- fi
- fi
- fi
- exit 0
-
- # if I wanted the from address to be renamed and sent to a different address,
- # echo "sdx@localhost development@localhost" | sudo dd of=/etc/postfix/recipient_canonical
- # sudo postmap hash:/etc/postfix/recipient_canonical
- # sudo service postfix reload
+ newaliases
+fi
+
+# put spool dir in directory that spans multiple distros.
+# based on http://www.postfix.org/qmgr.8.html and my notes in gnus
+#
+# todo: I\'m suspicious of uids for Debian-exim being the same across
+# distros. It would be good to test this.
+dir=/nocow/$type
+sdir=/var/spool/$type
+# we only do this if our system has $dir
+if [[ -e /nocow && $(readlink -f $sdir) != $dir ]]; then
+ systemctl stop $type
+ if [[ ! -e $dir && -d $sdir ]]; then
+ mv $sdir $dir
+ fi
+ /a/exe/lnf -T $dir $sdir
+fi
+
+systemctl restart $type
+systemctl enable $type
+
+# MAIL_HOST also does radicale, and easier to start and stop it here
+# for when MAIL_HOST changes, so radicale gets the synced files and
+# does not stop us from remounting /o.
+if dpkg -s radicale &>/dev/null; then
+ if [[ $HOSTNAME == $MAIL_HOST ]]; then
+ systemctl restart radicale
+ systemctl enable radicale
+ if [[ -e /etc/logrotate.d/radicale.disabled ]]; then
+ mv /etc/logrotate.d/radicale{.disabled,}
+ fi
+ else
+ systemctl stop radicale
+ systemctl disable radicale
+ # weekly logrotate tries to restart radicale even if it's a disabled service in flidas.
+ if [[ -e /etc/logrotate.d/radicale ]]; then
+ mv /etc/logrotate.d/radicale{,.disabled}
+ fi
+ fi
+fi
+exit 0
+:
+# if I wanted the from address to be renamed and sent to a different address,
+# echo "sdx@localhost development@localhost" | sudo dd of=/etc/postfix/recipient_canonical
+# sudo postmap hash:/etc/postfix/recipient_canonical
+# sudo service postfix reload