#!/usr/bin/env bash set -e # Some useful hints # ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ # • The critical mutt/neomutt files are in ’~/.config/mutt/’. # • Put whatever global settings you want in ’muttrc’. mutt-wizard will add some # lines to this file, which you shouldn't remove unless you know what you’re # doing, but you can move them up/down over your personal config lines, if you # need to. If you get binding conflict errors in mutt you might need to do this. # • Each of the accounts that mutt-wizard generates will have custom settings set # in a separate file in ’accounts/’. You can edit these freely if you want to # tinker with settings specific to an account. # • In ’/usr/share/mutt-wizard’ are several global config files, including mutt- # wizard’s default settings. You can overwride this in your muttrc if you wish. # • For Gmail accounts, remember also to enable third-party ("less secure") appli- # cations before attempting installation. # • Protonmail accounts will require you to set up "Protonmail Bridge" to access # PM's IMAP and SMTP servers. Configure that before running mutt-wizard. # • If you have a university email, or enterprise-hosted email for work, there # might be other hurdles or two-factor authentication you have to jump through. # Some, for example, will want you to create a separate IMAP password, etc. # • If you use an email server whose mailboxes are not in English, mutt-wizard # might not be able to guess which is which, so you may have to manually set # your Inbox, Sent, Trash, Drafts, etc. in your mutt config file. Do this after # running the wizard in accounts/NAME.muttrc. # isync # msmtp # neomutt # notmuch-runtime # pass # git # abook (optional) – contact store and tab completion # cronie (optional) – auto-sync mails - alt.: fcron # dunst (optional) – enable desktop notifications about new mail # fcron (optional) – auto-sync mails - alt.: cronie # libnotify (optional) – enable desktop notifications about new mail # pam-gnupg (optional) – automatically unlock gpg keys at session login # urlview (optional) – list URLs found in mails to open them in a browser # elinks (optional) – view HTML email inside of the neomutt TUI # links (optional) – view HTML email inside of the neomutt TUI # lynx (optional) – view HTML email inside of the neomutt TUI # w3m (optional) – view HTML email inside of the neomutt TUI # w3m-img (optional) – view images inside of the neomutt TUI # imagemagick (optional) – view images inside of the neomutt TUI #set -x apt install -y git neomutt urlscan w3m w3m-img ripmime isync msmtp vdirsyncer pass mailsync libnotify-bin lynx urlview # Shared variables for the heredocs BASE_URL='https://api.github.com/repos' USER='LukeSmithxyz' PROJECT='mutt-wizard' LICENSE_PAGE_URL="https://raw.githubusercontent.com/${USER}/${PROJECT}/master/LICENSE" #LICENSE=$(curl -s "${LICENSE_PAGE_URL}") LICENSE=GPL RELEASES_URL="${BASE_URL}/${USER}/${PROJECT}"/releases PRERELEASE=false ## No releases so no api page other than license so use git repo # CONTENT=$(curl -s ${RELEASES_URL}/latest) # LATEST_URL=$(echo "${CONTENT}" | jq --raw-output '.assets[] | select(.browser_download_url | test("Linux-x86_64")) | .browser_download_url') LATEST_URL=https://github.com/${USER}/${PROJECT} echo "LATEST_URL: " "${LATEST_URL}" #WORKDIR=$(mktemp -d -p $HOME/tmptmp -t mutt-wizard_build-XXXXXXX) || exit 1 #trap "rm -rf '${WORKDIR}'" EXIT WORKDIR="/var/tmp/mutt-wizard-workdir" # RELEASE=$(echo "${CONTENT}" | jq --raw-output '.tag_name') # LICENSE_URL=$(curl "${LICENSE_PAGE_URL}" | jq --raw-output '.download_url') # wget -c ${LICENSE_URL} VERSION=$( date +%Y-%m-%d_ )git VERSION=1.0 RELEASE=git ## Create directories and configuration files # '$ mw add' and follow the prompts. ALIAS_DIR=".zshrc.d" BUILD_DIR=/var/tmp/build_mutt-wizard MUTTWIZARDCONF="/usr/local/share/mutt-wizard" #MUTTDIR="$HOME/.config/mutt" MUTTDIR="${BUILD_DIR}/skel/.config/mutt" #MUTTDOCS="/usr/share/doc/mutt-wizard" MUTTDOCS="${BUILD_DIR}/doc-pak" EXAMPLES="${MUTTDOCS}/examples" ACCDIR="${MUTTDIR}/accounts" COLORSCHEMES="${MUTTDIR}/colorschemes" FONTS="${MUTTDIR}/fonts" # email settings PROFILE_NAME=example_profile EMAIL=foobar@foo.bar REAL_NAME="foo bar" ## Checkinstall variables - see defaults in /etc/checkinstallrc DOC_DIR=/usr/share/doc # make a new temporary directory for this use to avoid permission issues. BASE_TMP_DIR=~/tmptmp/checkinstall_tmp #------------------------------------------------------------------------------- wget -c -P ${MUTTDOCS} ${LICENSE_PAGE_URL} mkdir -p ${BUILD_DIR} # make a containing directory mkdir -p /var/tmp/${PROJECT}-"${RELEASE}" cd /var/tmp/${PROJECT}-"${RELEASE}" || exit #-------------------------------------------------------------------------------------- ## Create and populate the install scripts and documentation for checkinstall cat > ${BUILD_DIR}/description-pak << EOF mutt-wizard A system for automatically configuring mutt and isync with a simple interface and safe passwords EOF # | preinstall-pak | Run BEFORE the package is INSTALLED | cat > ${BUILD_DIR}/preinstall-pak << EOF #!/usr/bin/env bash EOF # | postinstall-pak | Run AFTER the package is INSTALLED | cat > ${BUILD_DIR}/postinstall-pak << EOF #!/usr/bin/env bash set -e set -x # For every user in /home/ ... for HOME_U in /home/*?; do # Obtain the username USER=$( basename ${HOME_U} ) # In case the user is active (exists in /etc/shadow) ... if [ $( grep -c "${USER}:.*:.*:.*:.*:.*:::" /etc/shadow ) == 1 ] \ && [ $( grep -c "${USER}:.*:.*:.*:.*:.*:/bin/.*sh" /etc/passwd ) == 1 ] \ && [ -d ${HOME_U}/.config ] \ && [ -d ${HOME_U} ]; then # Copies files a user has deleted that you want to put back again but does not update files that already exist. getent passwd | while IFS=: read username x uid gid gecos home shell do [[ "$username" == root || ! -d "$home" ]] && continue tar -cf - -C /etc/skel/.config/mutt . | sudo -Hu "$username" tar --skip-old-files -xf - done fi done EOF # | preremove-pak | Run BEFORE the package is REMOVED | cat > ${BUILD_DIR}/preremove-pak << EOF #!/usr/bin/env bash EOF # | postremove-pak | Run AFTER the package is REMOVED cat > ${BUILD_DIR}/postremove-pak << EOF #!/usr/bin/env bash EOF ## Make the doc-pak directory for README, INSTALL, COPYING, Changelog, TODO, CREDITS mkdir -p ${BUILD_DIR}/doc-pak #cp README INSTALL COPYING Changelog TODO CREDITS doc-pak cat > ${BUILD_DIR}/doc-pak/README << 'EOF' Some useful hints ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ • The critical mutt/neomutt files are in ’~/.config/mutt/’. • Put whatever global settings you want in ’muttrc’. mutt-wizard will add some lines to this file, which you shouldn't remove unless you know what you’re doing, but you can move them up/down over your personal config lines, if you need to. If you get binding conflict errors in mutt you might need to do this. • Each of the accounts that mutt-wizard generates will have custom settings set in a separate file in ’accounts/’. You can edit these freely if you want to tinker with settings specific to an account. • In ’/usr/share/mutt-wizard’ are several global config files, including mutt- wizard’s default settings. You can overwride this in your muttrc if you wish. • For Gmail accounts, remember also to enable third-party ("less secure") appli- cations before attempting installation. • Protonmail accounts will require you to set up "Protonmail Bridge" to access PM's IMAP and SMTP servers. Configure that before running mutt-wizard. • If you have a university email, or enterprise-hosted email for work, there might be other hurdles or two-factor authentication you have to jump through. Some, for example, will want you to create a separate IMAP password, etc. • If you use an email server whose mailboxes are not in English, mutt-wizard might not be able to guess which is which, so you may have to manually set your Inbox, Sent, Trash, Drafts, etc. in your mutt config file. Do this after running the wizard in accounts/NAME.muttrc. Help the project ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ • Try mutt-wizard out on weird machines and weird email addresses and report any errors. • Open a PR to add new server information into ’domains.csv’, so their users can more easily use mutt-wizard. • If nothing else, donate: https://paypal.me/LukeMSmith ! See Luke’s website: https://lukesmith.xyz/ - email him at: lukelukesmith.xyz --> mutt-wizard is free/libre software, licensed under the GPLv3 <-- EOF #-------------------------------------------------------------------------------------- ## Files and directories to be created: # /usr/local/share/mutt-wizard/mutt-wizard.muttrc # /usr/local/share/mutt-wizard/mutt-wizard-colors.muttrc # $HOME/.config/mutt/muttrc # $HOME/.config/mutt/colorschemes/colors-gruvbox-shuber-extended.muttrc # $HOME/.config/mutt/colorschemes/colors-gruvbox-shuber.muttrc # $HOME/.config/mutt/accounts/1-example_profile.muttrc #-------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------- cat > ${BUILD_DIR}/checkinstall_it.sh << FOE set -e #set -x echo "******************************" echo "ENTERING CHECKINSTALL" echo "******************************" echo "Making MUTTDIR: ${MUTTDIR} from ${PWD}" echo "Making MUTTDIR ${MUTTDIR}" mkdir -p ${MUTTDIR} echo "Making COLORSCHEMES ${COLORSCHEMES}" mkdir -p ${COLORSCHEMES} #echo "Making ACCDIR ${ACCDIR}" #mkdir -p ${ACCDIR} echo "Making MUTTDOCS ${MUTTDOCS}" mkdir -p ${MUTTDOCS} echo "Making FONTS ${FONTS}" mkdir -p ${FONTS} mkdir -p ${EXAMPLES} mkdir -p ${EXAMPLES}/colorschemes mkdir -p ${EXAMPLES}/accounts mkdir -p ${EXAMPLES}/fonts #--------------------------------------------------------------------------------- mkdir -p ${BUILD_DIR}/skel/${ALIAS_DIR}/ echo 'alias mutt="neomutt "' >> ${BUILD_DIR}/skel/${ALIAS_DIR}/002_neomutt.zsh #--------------------------------------------------------------------------------- ## git clone https://github.com/sheoak/neomutt-powerline-nerdfonts.git cat <> ${EXAMPLES}/colorschemes/gruvbox-powerline.neomuttrc # cancel theme colors color index color223 color234 ~Q color index color223 color234 ~P color index color223 color234 ~T color index color223 color234 ~O color index color223 color234 ~F color index color223 color234 ~N # add some nice custom coloring to the message list # thanks to new neomutt features # http://www.mutt.org/doc/manual/#patterns # https://neomutt.org/feature/index-color color index_subject color109 color234 "~P !~T !~D" color index_author color109 color234 "~P !~T !~D" color index_subject color243 color234 "~Q !~T !~D" color index_author color243 color234 "~Q !~T !~D" color index_subject brightcolor142 color234 "~N !~T !~D" color index_author brightcolor142 color234 "~N !~T !~D" color index_subject color142 color234 "~O !~T !~D" color index_author color142 color234 "~O !~T !~D" color index_subject color214 color234 "~F !~T !~D" color index_author color214 color234 "~F !~T !~D" color index_subject brightcolor214 color234 "~F ~N !~T !~D" color index_author brightcolor214 color234 "~F ~N !~T !~D" color index_subject color167 color234 "~= !~T !~D" color index_author color167 color234 "~= !~T !~D" color index_subject brightcolor109 color234 "~P ~N !~T !~D" color index_author brightcolor109 color234 "~P ~N !~T !~D" color index color234 color223 "~T" color index color229 color124 "~D" EOF cat <> ${EXAMPLES}/fonts/powerline.neomuttrc # ---------------------------------------------------------------------------- # Powerline / nerdfont # This is a bit "hackish" due to neomutt limitations # # Author: Sheoak # ---------------------------------------------------------------------------- set index_format=" %zs %zc %zt %{!%d %b} . %-28.28L %?M?(%1M)& ? %?X?&·? %s" set pager_format=" %n %zc  %T %s%*  %{!%d %b · %H:%M} %?X?  %X ? %P  " set status_format = " %f%?r? %r?   %m %?n?  %n ?  %?d?  %d ?%?t?  %t ?%?F?  %F? %> %?p?  %p ?" set vfolder_format = " %N %?n?%3n& ? %8m  · %f" set attach_format = "%u%D  %T%-75.75d %?T?%& ? %5s · %m/%M" # no addressed to me, to me, group, cc, sent by me, mailing list set to_chars="" # unchanged mailbox, changed, read only, attach mode set status_chars = " " ifdef crypt_chars set crypt_chars = " " set flag_chars = " " set hidden_tags = "unread,draft,flagged,passed,replied,attachment,signed,encrypted" tag-transforms "replied" "↻ " \ "encrytpted" "" \ "signed" "" \ "attachment" "" \ # The formats must start with 'G' and the entire sequence is case sensitive. tag-formats "replied" "GR" \ "encrypted" "GE" \ "signed" "GS" \ "attachment" "GA" \ color status white black # powerline status bar hack color status green black '' color status yellow black '' color status red black '' color status brightblack blue '(.*)' 1 color status blue black '.*()' 1 color status black blue '\s* [0-9]+\s*' color status blue black '().*$' 1 color status yellow black '()\s*\s*[0-9]+\s*' 1 color status black yellow '\s*\s*[0-9]+\s*' color status blue yellow '() ([0-9]+%|all|end) \s*' 1 color status black blue ' ([0-9]+%|all|end) \s*' color status yellow black '()\s*' 1 color status default black '' EOF wget -c -P ${COLORSCHEMES} https://raw.githubusercontent.com/neomutt/neomutt/master/contrib/colorschemes/neonwolf-256.neomuttrc wget -c -P ${COLORSCHEMES} https://raw.githubusercontent.com/neomutt/neomutt/master/contrib/colorschemes/zenburn.neomuttrc wget -c -P ${COLORSCHEMES} https://raw.githubusercontent.com/neomutt/neomutt/master/contrib/colorschemes/vombatidae.neomuttrc wget -c -P ${COLORSCHEMES} https://raw.githubusercontent.com/neomutt/neomutt/master/contrib/colorschemes/solarized-dark-256.neomuttrc #wget -c -P ${COLORSCHEMES} https://git.sthu.org/?p=shutils.git;a=blob_plain;f=dotfiles/mutt/colors-gruvbox-shuber.muttrc;hb=master #wget -c -P ${COLORSCHEMES} https://git.sthu.org/?p=shutils.git;a=blob_plain;f=dotfiles/mutt/colors-gruvbox-shuber-extended.muttrc;hb=master cp -a ${COLORSCHEMES} ${EXAMPLES}/colorschemes #cat >${COLORSCHEMES}/colors-gruvbox-shuber-extended.muttrc <> ${EXAMPLES}/colorschemes/colors-gruvbox-shuber-extended.muttrc color compose header color223 color234 color compose security_encrypt color175 color234 color compose security_sign color109 color234 color compose security_both color142 color234 color compose security_none color208 color234 EOF #cat >${COLORSCHEMES}/colors-gruvbox-shuber.muttrc <> ${EXAMPLES}/colorschemes/colors-gruvbox-shuber.muttrc # gruvbox dark (contrast dark): # bg0 = 234 # bg1 = 237 # bg2 = 239 # bg3 = 241 # bg4 = 243 # # gray = 245 # # fg0 = 229 # fg1 = 223 # fg2 = 250 # fg3 = 248 # fg4 = 246 # # red = 167 # green = 142 # yellow = 214 # blue = 109 # purple = 175 # aqua = 108 # orange = 208 # See http://www.mutt.org/doc/manual/#color color attachment color109 color234 color bold color229 color234 color error color167 color234 color hdrdefault color246 color234 color indicator color223 color237 color markers color243 color234 color normal color223 color234 color quoted color250 color234 color quoted1 color108 color234 color quoted2 color250 color234 color quoted3 color108 color234 color quoted4 color250 color234 color quoted5 color108 color234 color search color234 color208 color signature color108 color234 color status color234 color250 color tilde color243 color234 color tree color142 color234 color underline color223 color239 color sidebar_divider color250 color234 color sidebar_new color142 color234 color index color142 color234 ~N color index color108 color234 ~O color index color109 color234 ~P color index color214 color234 ~F color index color175 color234 ~Q color index color167 color234 ~= color index color234 color223 ~T color index color234 color167 ~D color header color214 color234 "^(To:|From:)" color header color142 color234 "^Subject:" color header color108 color234 "^X-Spam-Status:" color header color108 color234 "^Received:" color body color142 color234 "[a-z]{3,256}://[-a-zA-Z0-9@:%._\\+~#=/?&,]+" #color body color142 color234 "[a-zA-Z]([-a-zA-Z0-9_]+\\.){2,256}[-a-zA-Z0-9_]{2,256}" color body color208 color234 "[-a-z_0-9.%$]+@[-a-z_0-9.]+\\.[-a-z][-a-z]+" color body color208 color234 "mailto:[-a-z_0-9.]+@[-a-z_0-9.]+" color body color234 color214 "[;:]-*[)>( $ACCDIR/README <> ${MUTTDIR}/muttrc <<'EOF' cat <> ${EXAMPLES}/muttrc source /usr/local/share/mutt-wizard/mutt-wizard.muttrc set editor = nvim set sort = threads set sort_aux = reverse-last-date-received color progress white red source colorschemes/solarized-dark-256.neomuttrc source fonts/powerline.neomuttrc EOF #mkdir -p $ACCDIR/${PROFILE_NAME} ## Since this is an example not a working profile it just gets copied to the examples. cat > ${EXAMPLES}/accounts/1-${PROFILE_NAME}.muttrc < set folder = "$HOME/.local/share/mail/${PROFILE_NAME}" set header_cache = $HOME/.cache/mutt-wizard/${PROFILE_NAME}/headers set message_cachedir = $HOME/.cache/mutt-wizard/${PROFILE_NAME}/bodies set mbox_type = Maildir EOF ## Checkinstall variables - see defaults in /etc/checkinstallrc DOC_DIR=/usr/share/doc # make a new temporary directory for this use to avoid permission issues. BASE_TMP_DIR=~/tmptmp/checkinstall_tmp mkdir -p '${BASE_TMP_DIR}' # do your work checkinstall -y --fstrans \ --pkgname=mutt-wizard \ --pkgversion=${VERSION}\ --pkgrelease=${RELEASE} \ --pkgarch=amd64 \ --pkggroup=admin \ --pkglicense=LICENSE \ --pkgsource=${LATEST_URL} \ --maintainer=cyteen@ring-zero.co.uk \ --requires=neomutt,isync,msmtp,pass \ --recommends=abook,nomuch,lynx,libnotify-bin,urlview \ --suggests=mailsync \ -D \ bash ${BUILD_DIR}/install.sh FOE echo "Writing install.sh to: ${BUILD_DIR}/install.sh" cat > ${BUILD_DIR}/install.sh << FOE #!/usr/bin/env bash set -e #set -x ## Download and copy the latest version to /usr/local/bin and make executable echo "Creating temporary working directory ${WORKDIR}" mkdir -p ${WORKDIR} if [ -d "${WORKDIR}" ]; then echo "WORKDIR: ${WORKDIR} exists." if [ -d "${WORKDIR}"/mutt-wizard ]; then echo "Removing exist mutt-wizard directory" echo "ERROR:" echo "This script cannot delete this directory you will need to 'rm -rf ${WORKDIR}/mutt-wizard' from a terminal.'" exit 1 #rm -rf ${WORKDIR}/mutt-wizard fi echo "Cloning new repo with:" echo "git clone ${LATEST_URL} ${WORKDIR}" #GIT_INDEX_FILE="${WORKDIR}/index" git clone ${LATEST_URL} ${WORKDIR} git clone ${LATEST_URL} ${WORKDIR}/mutt-wizard cd ${WORKDIR}/mutt-wizard make install fi ## split the existing mutt-wizard.muttrc into two to separate the colours from everything else so other colourschemes can be used. if [ -f "${MUTTWIZARDCONF}"/mutt-wizard.muttrc ]; then cd ${MUTTWIZARDCONF} && \ csplit --suppress-matched ${MUTTWIZARDCONF}/mutt-wizard.muttrc '/^\(# Default index colors:\).*/' && \ if [ -f ${MUTTWIZARDCONF}/xx00 ]; then echo "Moving csplit ${BUILD_DIR}/xx00 to ${MUTTWIZARDCONF}/mutt-wizard.muttrc" mv ${MUTTWIZARDCONF}/xx00 ${MUTTWIZARDCONF}/mutt-wizard.muttrc | tee ${EXAMPLES}/mutt-wizard.muttrc else echo "ERROR: split file is missing." fi if [ -f ${MUTTWIZARDCONF}/xx01 ]; then echo "Moving csplit ${BUILD_DIR}/xx01 to ${MUTTWIZARDCONF}/mutt-wizard-colors.muttrc" mv ${MUTTWIZARDCONF}/xx01 ${MUTTWIZARDCONF}/mutt-wizard-colors.muttrc | tee ${EXAMPLES}/mutt-wizard-colors.muttrc else echo "ERROR: split file is missing." fi else echo "${MUTTWIZARDCONF}/mutt-wizard.muttrc is missing." fi ## Copy the local contents of the skel directory to /etc/skel if [ -d "${BUILD_DIR}"/skel ]; then echo "Copying files to /etc/skel from ${BUILD_DIR}/skel" cp -dr ${BUILD_DIR}/skel/.config/ /etc/skel/ else echo "Missing ${BUILD_DIR}/skel" fi FOE bash ${BUILD_DIR}/checkinstall_it.sh #mbsync ${PROFILE_NAME} dpkg -c /var/tmp/${PROJECT}-${RELEASE}/mutt-wizard_${VERSION}-${RELEASE}_amd64.deb #lsd --tree /usr/share/doc/mutt-wizard/ #lsd --tree /var/tmp/build_mutt-wizard/skel/.config/mutt #lsd --tree /etc/skel/.config/mutt