From db211c7f310a5de18c7803a1ebfbb7ab2b1e3f0d Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Fri, 29 Jul 2016 20:06:28 +0200 Subject: make my dotfiles location independent This is achieved by storing the absolute path to the dotfile directory in the variable $DOTFILES_LOCATION. And change every hardcoded location into the dotfiles with this var. The Variable $DOTFILES_LOCATION populated with the output of get_dotfiles_location.sh at 3 places: 1) config.fish | zshrc 2) xinitrc (should be allready exported) get_dotfiles_location uses the assumption that it is symlinked into the dotfiles directory. offlineimap: * include patch for offlineimap * change config to the small one * include environment file in systemd unit setup.py: * handle offlineimap situation * print a warning and prompt for proceeding * write the environment file for the systemd unit * add pseudo dependency (get_dotfiles_location) to [fish-config, offlineimap, i3] * print errors on stderr * don't exit if a function fails config.fish: * export $DOTFILES_LOCATION * change hardcoded links * add perl tools to path * export some yaourt specific vars if yaourt is available zshrc: export $DOTFILES_LOCATION xinitrc: export $DOTFILES_LOCATION i3/*: change hardcoded links scripts/* change hardcoded links README.md: mention $DOTFILES_LOCATION --- README.md | 27 +- config/fish/config.fish | 26 +- get_dotfiles_location.sh | 6 + i3/config | 22 +- i3/conkyrc.json | 4 +- offlineimap/expandvars.patch | 13 + offlineimap/offlineimap@.service | 1 + offlineimap/offlineimaprc | 1128 +------------------------------------- scripts/media_control.sh | 2 +- scripts/media_status.sh | 6 +- setup.py | 81 ++- xinitrc | 6 + zshrc | 3 + 13 files changed, 163 insertions(+), 1162 deletions(-) create mode 100755 get_dotfiles_location.sh create mode 100644 offlineimap/expandvars.patch diff --git a/README.md b/README.md index ac5a6dd..2ff0c0b 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,26 @@ --- ## Installation -Some scripts use a hardcoded location so please locate the dotfile repo -at $HOME/.dotfiles. -To do this run -```git clone https://github.com/fischerling/dotfiles $HOME/.dotfiles```. + +For some scripts/snippets you don't know where they will be executed. +Whenever a absolute path into the dotfile directory is needed the environment +variable `DOTFILES_LOCATION` is used. + +The variable is exported in zshrc or config.fish or xinitrc. +If you don't set it that way, please remember to export `DOTFILES_LOCATION` +somewhere else. + +Good places are: + ++ shell configs ++ at session start + + +### Easy Installation + +If you just want to install all my dotfiles without customisation run: +```sh +git clone https://github.com/fischerling/dotfiles ~/.dotfiles +cd ~/.dotfiles +./setup.py +``` diff --git a/config/fish/config.fish b/config/fish/config.fish index 322df54..bcc608c 100644 --- a/config/fish/config.fish +++ b/config/fish/config.fish @@ -1,10 +1,16 @@ +# export the path to our dotfiles +if not set -q $DOTFILES_LOCATION + set -Ux DOTFILES_LOCATION (get_dotfiles_location) +end + + # autoload functions and completions in .dotfiles -set fish_function_path $HOME/.dotfiles/config/fish/functions $fish_function_path -set fish_complete_path $HOME/.dotfiles/config/fish/completions $fish_complete_path +set fish_function_path $DOTFILES_LOCATION/config/fish/functions $fish_function_path +set fish_complete_path $DOTFILES_LOCATION/config/fish/completions $fish_complete_path # add git-alias subdirectory to functions path -set fish_function_path $HOME/.dotfiles/config/fish/functions/git-alias $fish_function_path +set fish_function_path $DOTFILES_LOCATION/config/fish/functions/git-alias $fish_function_path if not set -q __fish_git_prompt_show_informative_status @@ -27,6 +33,16 @@ if not set -q SSH_KEY_PATH set -Ux SSH_KEY_PATH $HOME/.ssh/rsa_id end +# set yaourt specific VARS +if type -q yaourt + if not set -q AURUSEGIT + set -Ux AURUSEGIT 1 + end + if not set -q AURSHOWDIFF + set -Ux AURSHOWDIFF 1 + end +end + # PATH Stuff # include cargo binaries @@ -38,6 +54,10 @@ if type -q multirust end end +if not contains /bin/core_perl $PATH + set PATH /bin/core_perl $PATH +end + if not contains ~/.local/bin $PATH set PATH ~/.local/bin $PATH end diff --git a/get_dotfiles_location.sh b/get_dotfiles_location.sh new file mode 100755 index 0000000..98bebde --- /dev/null +++ b/get_dotfiles_location.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +# see: +# http://stackoverflow.com/questions/59895/can-a-bash-script-tell-which-directory-it-is-stored-in + +echo $(dirname "$(readlink -f "$0")") diff --git a/i3/config b/i3/config index f28591b..0cb16a4 100644 --- a/i3/config +++ b/i3/config @@ -47,9 +47,9 @@ bindsym $mod+Shift+q kill # bindsym $mod+d exec --no-startup-id i3-dmenu-desktop # programm starter -bindsym $mod+d exec ~/.dotfiles/scripts/program_starter.sh +bindsym $mod+d exec $DOTFILES_LOCATION/scripts/program_starter.sh # ssh starter -bindsym $mod+Shift+d exec ~/.dotfiles/scripts/ssh_starter.sh +bindsym $mod+Shift+d exec $DOTFILES_LOCATION/scripts/ssh_starter.sh # change focus bindsym $mod+$left focus left @@ -174,20 +174,20 @@ bar { # Audio shortcuts # # Volume -bindsym XF86AudioLowerVolume exec ~/.dotfiles/scripts/audio_control.sh -5 -bindsym XF86AudioRaiseVolume exec ~/.dotfiles/scripts/audio_control.sh +5 -bindsym XF86AudioMute exec ~/.dotfiles/scripts/audio_control.sh toggle +bindsym XF86AudioLowerVolume exec $DOTFILES_LOCATION/scripts/audio_control.sh -5 +bindsym XF86AudioRaiseVolume exec $DOTFILES_LOCATION/scripts/audio_control.sh +5 +bindsym XF86AudioMute exec $DOTFILES_LOCATION/scripts/audio_control.sh toggle # # Music -bindsym XF86AudioPrev exec ~/.dotfiles/scripts/media_control.sh prev -bindsym XF86AudioPlay exec ~/.dotfiles/scripts/media_control.sh toggle -bindsym XF86AudioNext exec ~/.dotfiles/scripts/media_control.sh next +bindsym XF86AudioPrev exec $DOTFILES_LOCATION/scripts/media_control.sh prev +bindsym XF86AudioPlay exec $DOTFILES_LOCATION/scripts/media_control.sh toggle +bindsym XF86AudioNext exec $DOTFILES_LOCATION/scripts/media_control.sh next ## brightnescontroll bindsym XF86MonBrightnessUp exec /usr/bin/xbacklight +10 bindsym XF86MonBrightnessDown exec /usr/bin/xbacklight -10 # Toogle Touchpad with Batterybutton -bindsym XF86Battery exec ~/.dotfiles/scripts/toggle_syn_touchpad.sh +bindsym XF86Battery exec $DOTFILES_LOCATION/scripts/toggle_syn_touchpad.sh #hide broders new_window pixel 3 @@ -198,10 +198,10 @@ new_window pixel 3 exec --no-startup-id xrandr --output HDMI1 --right-of eDP1 # set i3lock as xscreensaver -exec --no-startup-id xss-lock -- i3lock -i ~/.dotfiles/wallpapers/blue_screen.png #-lock +exec --no-startup-id xss-lock -- i3lock -i $DOTFILES_LOCATION/wallpapers/blue_screen.png #-lock # Autostart Programms -exec --no-startup-id feh --bg-fill ~/.dotfiles/wallpapers/nsa_wallpaper.png +exec --no-startup-id feh --bg-fill $DOTFILES_LOCATION/wallpapers/nsa_wallpaper.png exec --no-startup-id syndaemon -i 1 -d #exec --no-startup-id nm-applet exec --no-startup-id owncloud diff --git a/i3/conkyrc.json b/i3/conkyrc.json index 7a3ff39..96d791a 100644 --- a/i3/conkyrc.json +++ b/i3/conkyrc.json @@ -44,7 +44,7 @@ TEXT ############### music/ spotify/ mpd ################### ${if_match "${nodename_short}"!="fishbowl"} - {"name":"music", "color": "\#ffffff", "full_text": "${exec ~/.dotfiles/scripts/media_status.sh}"}, + {"name":"music", "color": "\#ffffff", "full_text": "${exec $DOTFILES_LOCATION/scripts/media_status.sh}"}, ${endif} @@ -73,7 +73,7 @@ TEXT ################ Volume ######################## {"name": "volume status", "color": "\#ffffff", "full_text": - "${exec ~/.dotfiles/scripts/audio_status.sh}"}, + "${exec $DOTFILES_LOCATION/scripts/audio_status.sh}"}, ################# Battery #################### diff --git a/offlineimap/expandvars.patch b/offlineimap/expandvars.patch new file mode 100644 index 0000000..3f36fae --- /dev/null +++ b/offlineimap/expandvars.patch @@ -0,0 +1,13 @@ +diff --git a/offlineimap/repository/IMAP.py b/offlineimap/repository/IMAP.py +index e61f53d..8da0e19 100644 +--- a/offlineimap/repository/IMAP.py ++++ b/offlineimap/repository/IMAP.py +@@ -378,7 +378,7 @@ class IMAPRepository(BaseRepository): + # 3. read password from file specified in Repository 'remotepassfile' + passfile = self.getconf('remotepassfile', None) + if passfile != None: +- fd = codecs.open(os.path.expanduser(passfile), 'r', 'UTF-8') ++ fd = codecs.open(os.path.expandvars(os.path.expanduser(passfile)), 'r', 'UTF-8') + password = fd.readline().strip() + fd.close() + return password.encode('UTF-8') diff --git a/offlineimap/offlineimap@.service b/offlineimap/offlineimap@.service index 7b85df0..5868c1b 100644 --- a/offlineimap/offlineimap@.service +++ b/offlineimap/offlineimap@.service @@ -5,6 +5,7 @@ After=network.target [Service] User=%i +EnvironmentFile=/etc/systemd/system/offlineimap@fischerling.env ExecStart=/usr/bin/offlineimap KillSignal=SIGUSR2 Restart=always diff --git a/offlineimap/offlineimaprc b/offlineimap/offlineimaprc index 23be1b0..d1204c8 100644 --- a/offlineimap/offlineimaprc +++ b/offlineimap/offlineimaprc @@ -1,1142 +1,26 @@ -# Offlineimap sample configuration file - -# This file documents *all* possible options and can be quite scary. -# Looking for a quick start? Take a look at offlineimap.conf.minimal. -# More details can be found at http://www.offlineimap.org . - -################################################## -# Overview -################################################## - -# The default configuration file is "~/.offlineimaprc". -# -# OfflineIMAP ships with a file named "offlineimap.conf" that you should copy to -# that location and then edit. -# -# OfflineIMAP also ships a file named "offlineimap.conf.minimal" that you can -# also try. It's useful if you want to get started with the most basic feature -# set, and you can read about other features later with "offlineimap.conf". -# -# If you want to be XDG-compatible, you can put your configuration file into -# "$XDG_CONFIG_HOME/offlineimap/config". - -################################################## -# General definitions -################################################## - -# NOTE 1: Settings generally support python interpolation. This means -# values can contain python format strings which refer to other values -# in the same section, or values in a special DEFAULT section. This -# allows you for example to use common settings for multiple accounts: -# -# [Repository Gmail1] -# trashfolder: %(gmailtrashfolder)s -# -# [Repository Gmail2] -# trashfolder: %(gmailtrashfolder)s -# -# [DEFAULT] -# gmailtrashfolder = [Gmail]/Papierkorb -# -# would set the trashfolder setting for your German Gmail accounts. - -# NOTE 2: Above feature implies that any '%' needs to be encoded as '%%' - -# NOTE 3: Any variable that is subject to the environment variables -# ($NAME) and tilde (~username/~) expansions will receive tilde -# expansion first and only after the environment variable will be -# expanded in the resulting string. This behaviour is intentional -# as it coincides with typical shell expansion strategy. - -# NOTE 4: multiple same-named sections. -# The library used to parse the configuration file has known issue when multiple -# sections have the same name. In such case, only the last section is considered. -# It is strongly discouraged to have multiple sections with the same name. -# See https://github.com/OfflineIMAP/offlineimap/issues/143 for more details. +# Sample minimal config file. Copy this to ~/.offlineimaprc and edit to +# get started fast. [general] - -# This specifies where OfflineIMAP is to store its metadata. -# This directory will be created if it does not already exist. -# -# Tilde and environment variable expansions will be performed. -# -#metadata = ~/.offlineimap - - -# This option stands in the [general] section. -# -# This variable specifies which accounts are defined. Separate them with commas. -# Account names should be alphanumeric only. You will need to specify one -# section per account below. You may not use "general" for an account name. -# -# Always use ASCII characters only. -# accounts = FAUMail - -# This option stands in the [general] section. -# -# Offlineimap can synchronize more than one account at a time. If you want to -# enable this feature, set the below value to something greater than 1. To -# force it to synchronize only one account at a time, set it to 1. -# -# NOTE: if you are using autorefresh and have more than one account, you must -# set this number to be >= to the number of accounts you have; since any given -# sync run never "finishes" due to a timer, you will never sync your additional -# accounts if this is 1. -# -#maxsyncaccounts = 1 - - -# This option stands in the [general] section. -# -# You can specify one or more user interface. OfflineIMAP will try the first in -# the list, and if it fails, the second, and so forth. -# -# The pre-defined options are: -# Blinkenlights -- A fancy (terminal) interface -# TTYUI -- a text-based (terminal) interface -# Basic -- Noninteractive interface suitable for cron'ing -# Quiet -- Noninteractive interface, generates no output -# except for errors. -# MachineUI -- Interactive interface suitable for machine -# parsing. -# -# See also offlineimapui(7) -# -# You can override this with a command-line option -u. -# -#ui = basic - - -# This option stands in the [general] section. -# -# If you try to synchronize messages to a folder which the IMAP server -# considers read-only, OfflineIMAP will generate a warning. If you want -# to suppress these warnings, set ignore-readonly to yes. Read-only -# IMAP folders allow reading but not modification, so if you try to -# change messages in the local copy of such a folder, the IMAP server -# will prevent OfflineIMAP from propagating those changes to the IMAP -# server. Note that ignore-readonly is UNRELATED to the "readonly" -# setting which prevents a repository from being modified at all. -# -#ignore-readonly = no - - -########## Advanced settings - -# This option stands in the [general] section. -# -# You can give a Python source filename here and all config file -# python snippets will be evaluated in the context of that file. -# This allows you to e.g. define helper functions in the Python -# source file and call them from this config file. You can find -# an example of this in the manual. -# -# Tilde and environment variable expansions will be performed. -# -#pythonfile = ~/.offlineimap.py - - -# This option is in the [general] section. -# -# By default, OfflineIMAP will not exit due to a network error until the -# operating system returns an error code. Operating systems can sometimes take -# forever to notice this. Here you can activate a timeout on the socket. This -# timeout applies to individual socket reads and writes, not to an overall sync -# operation. You could perfectly well have a 30s timeout here and your sync -# still take minutes. -# -# Values in the 30-120 second range are reasonable. -# -# The default is to have no timeout beyond the OS. Times are given in seconds. -# -#socktimeout = 60 - - -# This option stands in the [general] section. -# -# By default, OfflineIMAP will use fsync() to force data out to disk at -# opportune times to ensure consistency. This can, however, reduce performance. -# Users where /home is on SSD (Flash) may also wish to reduce write cycles. -# Therefore, you can disable OfflineIMAP's use of fsync(). Doing so will come -# at the expense of greater risk of message duplication in the event of a system -# crash or power loss. Default is true. Set it to false to disable fsync. -# -#fsync = true - - -################################################## -# Mailbox name recorder -################################################## - -[mbnames] - -# OfflineIMAP can record your mailbox names in a format you specify. -# You can define the header, each mailbox item, the separator, -# and the footer. Here is an example for Mutt. -# If enabled is yes, all six setting must be specified, even if they -# are just the empty string "". -# -# The header, peritem, sep, and footer are all Python expressions passed -# through eval, so you can (and must) use Python quoting. -# -# The incremental setting controls whether the file is written after each -# account completes or once all synced accounts are complete. This is usefull if -# an account is sightly slower than the other. It allows keeping the previous -# file rather than having it partially written. -# This works best with "no" if in one-shot mode started by cron or systemd -# timers. Default: no. -# -# The following hash key are available to the expansion for 'peritem': -# - accountname: the name of the corresponding account; -# - foldername: the name of the folder; -# - localfolders: path to the local directory hosting all Maildir -# folders for the account. -# -# Tilde and environment variable expansions will be performed -# for "filename" knob. -# -#enabled = no -#filename = ~/Mutt/muttrc.mailboxes -#header = "mailboxes " -#peritem = "+%(accountname)s/%(foldername)s" -#sep = " " -#footer = "\n" -#incremental = no - - -# This option stands in the [mbnames] section. -# -# You can also specify a folderfilter. It will apply to the *translated* folder -# name here, and it takes TWO arguments: accountname and foldername. In all -# other ways, it will behave identically to the folderfilter for accounts. -# Please see the folderfilter option for more information and examples. -# -# This filter can be used only to further restrict mbnames to a subset of -# folders that pass the account's folderfilter. -# -# You can customize the order in which mailbox names are listed in the generated -# file by specifying a sort_keyfunc, which takes a single dict argument -# containing keys 'accountname' and 'foldername'. This function will be called -# once for each mailbox, and should return a suitable sort key that defines this -# mailbox' position in the custom ordering. -# -# This is useful with e.g. Mutt-sidebar, which uses the mailbox order from the -# generated file when listing mailboxes in the sidebar. -# -# Default setting is: -#sort_keyfunc = lambda d: (d['accountname'], d['foldername']) - - -################################################## -# Accounts -################################################## - -# This is an account definition clause. You'll have one of these for each -# account listed in the "accounts" option in [general] section (above). - [Account FAUMail] - -# These settings specify the two folders that you will be syncing. -# You'll need to have a "Repository ..." section for each one. - localrepository = Local remoterepository = Remote - -########## Advanced settings - -# This option stands in the [Account Test] section. -# -# You can have OfflineIMAP continue running indefinitely, automatically syncing -# your mail periodically. If you want that, specify how frequently to do that -# (in minutes) here. Fractional minutes (ie, 3.25) is allowed. -# -autorefresh = 1 - - -# This option stands in the [Account Test] section. -# -# OfflineImap can replace a number of full updates by quick synchronizations. -# This option is ignored if maxage or startdate are used. -# -# It only synchronizes a folder if -# -# 1) a Maildir folder has changed -# -# or -# -# 2) if an IMAP folder has received new messages or had messages deleted, ie -# it does not update if only IMAP flags have changed. -# -# Full updates need to fetch ALL flags for all messages, so this makes quite a -# performance difference (especially if syncing between two IMAP servers). -# -# Specify 0 for never, -1 for always (works even in non-autorefresh mode) -# -# A positive integer to do quick updates before doing another full -# synchronization (requires autorefresh). Updates are always performed after -# minutes, be they quick or full. -# -quick = 10 - - -# This option stands in the [Account Test] section. -# -# You can specify a pre and post sync hook to execute a external command. In -# this case a call to imapfilter to filter mail before the sync process starts -# and a custom shell script after the sync completes. -# -# The pre sync script has to complete before a sync to the account will start. -# -#presynchook = imapfilter -c someotherconfig.lua -#postsynchook = notifysync.sh - - -# This option stands in the [Account Test] section. -# -# You can specify a newmail hook to execute an external command upon receipt -# of new mail in the INBOX. -# -# This example plays a sound file of your chosing when new mail arrives. -# -#newmail_hook = lambda: os.system("cvlc --play-and-stop --play-and-exit /path/to/sound/file.mp3" + -# " > /dev/null 2>&1") - - -# This option stands in the [Account Test] section. -# -# OfflineImap caches the state of the synchronisation to e.g. be able to -# determine if a mail has been added or deleted on either side. -# -# The default and historical backend is 'plain' which writes out the -# state in plain text files. On Repositories with large numbers of -# mails, the performance might not be optimal, as we write out the -# complete file for each change. Another new backend 'sqlite' is -# available which stores the status in sqlite databases. -# -# If you switch the backend, you may want to delete the old cache -# directory in ~/.offlineimap/Account-/LocalStatus manually -# once you are sure that things work. -# -#status_backend = plain - - -# This option stands in the [Account Test] section. -# -# If you have a limited amount of bandwidth available you can exclude larger -# messages (e.g. those with large attachments etc). If you do this it will -# appear to OfflineIMAP that these messages do not exist at all. They will not -# be copied, have flags changed etc. For this to work on an IMAP server the -# server must have server side search enabled. This works with Gmail and most -# imap servers (e.g. cyrus etc) -# -# The maximum size should be specified in bytes - e.g. 2000000 for approx 2MB -# -#maxsize = 2000000 - - -# This option stands in the [Account Test] section. -# -# maxage enables you to sync only recent messages. There are two ways to specify -# what "recent" means: if maxage is given as an integer, then only messages from -# the last maxage days will be synced. If maxage is given as a date, then only -# messages later than that date will be synced. -# -# Messages older than the cutoff will not be synced, their flags will not be -# changed, they will not be deleted, etc. For OfflineIMAP it will be like these -# messages do not exist. This will perform an IMAP search in the case of IMAP or -# Gmail and therefore requires that the server support server side searching. -# -# Known edge cases are described in offlineimap(1). -# -# maxage is allowed only when the local folder is of type Maildir. It can't be -# used with startdate. -# -# The maxage option expects an integer (for the number of days) or a date of the -# form yyyy-mm-dd. -# -#maxage = 3 -#maxage = 2015-04-01 - - -# This option stands in the [Account Test] section. -# -# Maildir file format uses colon (:) separator between uniq name and info. -# Unfortunatelly colon is not allowed character in windows file name. If you -# enable maildir-windows-compatible option, OfflineIMAP will be able to store -# messages on windows drive, but you will probably loose compatibility with -# other programs working with the maildir. -# -#maildir-windows-compatible = no - - -# This option stands in the [Account Test] section. -# -# Specifies if we want to sync GMail labels with the local repository. -# Effective only for GMail IMAP repositories. -# -# Non-ASCII characters in labels are bad handled or won't work at all. -# -#synclabels = no - - -# This option stands in the [Account Test] section. -# -# Name of the header to use for label storage. Format for the header -# value differs for different headers, because there are some de-facto -# "standards" set by popular clients: -# -# - X-Label or Keywords keep values separated with spaces; for these -# you, obviously, should not have label values that contain spaces; -# -# - X-Keywords use comma (',') as the separator. -# -# To be consistent with the usual To-like headers, for the rest of header -# types we use comma as the separator. -# -# Use ASCII characters only. -# -#labelsheader = X-Keywords - - -# This option stands in the [Account Test] section. -# -# Set of labels to be ignored. Comma-separated list. GMail-specific -# labels all start with backslash ('\'). -# -# Use ASCII characters only. -# -#ignorelabels = \Inbox, \Starred, \Sent, \Draft, \Spam, \Trash, \Important - - -# This option stands in the [Account Test] section. -# -# OfflineIMAP can strip off some headers when your messages are propagated -# back to the IMAP server. This option carries the comma-separated list -# of headers to trim off. Header name matching is case-sensitive. -# -# This knob is respected only by IMAP-based accounts. Value of labelsheader -# for GMail-based accounts is automatically added to this list, you don't -# need to specify it explicitely. -# -# Use ASCII characters only. -# -#filterheaders = X-Some-Weird-Header - - -# This option stands in the [Account Test] section. -# -# Use proxy connection for this account. Usefull to bypass the GFW in China. -# To specify a proxy connection, join proxy type, host and port with colons. -# Available proxy types are SOCKS5, SOCKS4, HTTP. -# You also need to install PySocks through pip. -# -# Currently, this feature leaks DNS support. -# -#proxy = SOCKS5:IP:9999 - [Repository Local] - -# Each repository requires a "type" declaration. The types supported for -# local repositories are Maildir, GmailMaildir and IMAP. -# type = Maildir - - -# This option stands in the [Repository LocalExample] section. -# -# Specify local repository. Your IMAP folders will be synchronized -# to maildirs created under this path. OfflineIMAP will create the -# maildirs for you as needed. -# localfolders = ~/Mail - -# This option stands in the [Repository LocalExample] section. -# -# You can specify the "folder separator character" used for your Maildir -# folders. It is inserted in-between the components of the tree. If you -# want your folders to be nested directories, set it to "/". 'sep' is -# ignored for IMAP repositories, as it is queried automatically. -# Otherwise, default value is ".". -# -# Don't use quotes. -# -#sep = . - - -# This option stands in the [Repository LocalExample] section. -# -# startdate syncs mails starting from a given date. It applies the date -# restriction to LocalExample only. The remote repository MUST be empty -# at the first sync where this option is used. -# -# Unlike maxage, this is supported for IMAP-IMAP sync. -# -# startdate can't be used with maxage. -# -# The startdate option expects a date in the format yyyy-mm-dd. -# -#startdate = 2015-04-01 - - -# This option stands in the [Repository LocalExample] section. -# -# Some users may not want the atime (last access time) of folders to be -# modified by OfflineIMAP. If 'restoreatime' is set to yes, OfflineIMAP -# will restore the atime of the "new" and "cur" folders in each maildir -# folder to their original value after each sync. -# -# In nearly all cases, the default should be fine. -# -#restoreatime = no - - -# This option stands in the [Repository LocalExample] section. -# -# Set modification time of messages basing on the message's "Date" header. This -# option makes sense for the Maildir type, only. -# -# This is useful if you are doing some processing/finding on your Maildir (for -# example, finding messages older than 3 months), without parsing each -# file/message content. -# -# If enabled, this forbid the -q (quick mode) CLI option to work correctly. -# -# Default: no. -# -#utime_from_header = no - - -# This option stands in the [Repository LocalExample] section. -# -# This option is similar to "utime_from_header" and could be use as a -# complementary feature to keep track of a message date. This option only -# makes sense for the Maildir type. -# -# By default each message is stored in a file which prefix is the fetch -# timestamp and an order rank such as "1446590057_0". In a multithreading -# environment message are fetched in a random order, then you can't trust -# the file name to sort your boxes. -# -# If set to "yes" the file name prefix if build on the message "Date" header -# (which should be present) or the "Received-date" if "Date" is not -# found. If neither "Received-date" nor "Date" is found, the current system -# date is used. Now you can quickly sort your messages using their file -# names. -# -# Used in combination with "utime_from_header" all your message would be in -# order with the correct mtime attribute. -# -#filename_use_mail_timestamp = no - -# This option stands in the [Repository LocalExample] section. -# -# Map IMAP [user-defined] keywords to lowercase letters, similar to Dovecot's -# format described in http://wiki2.dovecot.org/MailboxFormat/Maildir . This -# option makes sense for the Maildir type, only. -# -# Configuration example: -# customflag_x = some_keyword -# -# With the configuration example above enabled, all IMAP messages that have -# 'some_keyword' in their FLAGS field will have an 'x' in the flags part of the -# maildir filename: -# 1234567890.M20046P2137.mailserver,S=4542,W=4642:2,Sx -# -# Valid fields are customflag_[a-z], valid values are whatever the IMAP server -# allows. -# -# Comparison in offlineimap is case-sensitive. -# -#customflag_a = some_keyword -#customflag_b = $OtherKeyword -#customflag_c = NonJunk -#customflag_d = ToDo - -[Repository GmailLocalExample] - -# This type of repository enables syncing of Gmail. All Maildir -# configuration settings are also valid here. -# -# This is a separate Repository type from Maildir because it involves -# some extra overhead which sometimes may be significant. We look for -# modified tags in local messages by looking only to the files -# modified since last run. This is usually rather fast, but the first -# time OfflineIMAP runs with synclabels enabled, it will have to check -# the contents of all individual messages for labels and this may take -# a while. -# -type = GmailMaildir - - [Repository Remote] - -# The remote repository. We only support IMAP or Gmail here. -# type = IMAP - - -# This option stands in the [Repository RemoteExample] section. -# -# Configure which address family to use for the connection. If not specified, -# AF_UNSPEC is used as a fallback (default). -# -# AF_INET6: -#ipv6 = True -# -# AF_INET: -#ipv6 = False - - -# These options stands in the [Repository RemoteExample] section. -# -# The following can fetch the account credentials via a python expression that -# is parsed from the pythonfile parameter. For example, a function called -# "getcredentials" that parses a file "filename" and returns the account -# details for "hostname". -# -#remotehosteval = getcredentials("filename", "hostname", "hostname") -#remoteporteval = getcredentials("filename", "hostname", "port") -#remoteusereval = getcredentials("filename", "hostname", "user") -#remotepasseval = getcredentials("filename", "hostname", "passwd") - - -# This option stands in the [Repository RemoteExample] section. -# -# Specify the remote hostname. -# remotehost = faumail.uni-erlangen.de - - -# This option stands in the [Repository RemoteExample] section. -# -# Whether or not to use SSL. -# -# Note: be care to configure the 'remotehost' line with the domain name defined -# in the certificate. E.g., if you trust your provider and want to use the -# certificate it provides on a shared server. Otherwise, OfflineIMAP will stop -# and say that the domain is not named in the certificate. -# -ssl = yes - - -# This option stands in the [Repository RemoteExample] section. -# -# SSL Client certificate (optional). -# -# Tilde and environment variable expansions will be performed. -# -#sslclientcert = /path/to/file.crt - - -# This option stands in the [Repository RemoteExample] section. -# -# SSL Client key (optional). -# -# Tilde and environment variable expansions will be performed. -# -#sslclientkey = /path/to/file.key - - -# This option stands in the [Repository RemoteExample] section. -# -# SSL CA Cert(s) to verify the server cert against (optional). -# No SSL verification is done without this option. If it is -# specified, the CA Cert(s) need to verify the Server cert AND -# match the hostname (* wildcard allowed on the left hand side) -# The certificate should be in PEM format. -# -# Tilde and environment variable expansions will be performed. -# -# Special value OS-DEFAULT makes OfflineIMAP to automatically -# determine system-wide location of standard trusted CA roots file -# for known OS distributions and use the first bundle encountered -# (if any). If no system-wide CA bundle is found, OfflineIMAP -# will refuse to continue; this is done to prevent creation -# of false security expectations ("I had configured CA bundle, -# thou certificate verification shalt be present"). -# -# You can also use fingerprint verification via cert_fingerprint. -# See below for more verbose explanation. -# -#sslcacertfile = /path/to/cacertfile.crt - - -# This option stands in the [Repository RemoteExample] section. -# -# If you connect via SSL/TLS (ssl = yes) and you have no CA certificate -# specified, OfflineIMAP will refuse to sync as it connects to a server -# with an unknown "fingerprint". If you are sure you connect to the -# correct server, you can then configure the presented server -# fingerprint here. OfflineIMAP will verify that the server fingerprint -# has not changed on each connect and refuse to connect otherwise. -# -# You can also configure fingerprint validation in addition to -# CA certificate validation above and it will check both: -# OfflineIMAP fill verify certificate first and if things will be fine, -# fingerprint will be validated. -# -# Multiple fingerprints can be specified, separated by commas. -# -# In Windows, Microsoft uses the term "thumbprint" instead of "fingerprint". -# -# Fingerprints must be in hexadecimal form without leading '0x': -# 40 hex digits like bbfe29cf97acb204591edbafe0aa8c8f914287c9. -# -cert_fingerprint = BB9EE687E92693794C752F57C53483076DEF2755 - - -# This option stands in the [Repository RemoteExample] section. -# -# Set SSL version to use (optional). -# -# It is best to leave this unset, in which case the correct version will be -# automatically detected. In rare cases, it may be necessary to specify a -# particular version from: tls1, ssl2, ssl3, ssl23. -# -# ssl23 is the highest protocol version that both the client and server support. -# Despite the name, this option can select “TLS” protocols as well as “SSL”. -# -# See the configuration option tls_level to automatically disable insecure -# protocols. -# -#ssl_version = ssl23 - - -# This option stands in the [Repository RemoteExample] section. -# -# TLS support level (optional). -# -# Specify the level of support that should be allowed for this repository. -# Can be used to disallow insecure SSL versions as defined by IETF -# (see https://tools.ietf.org/html/rfc6176). -# -# Supported values are: -# tls_secure, tls_no_ssl, tls_compat (the default). -# -#tls_level = tls_compat - - -# This option stands in the [Repository RemoteExample] section. -# -# Specify the port. If not specified, use a default port. -# remoteport = 993 - - -# This option stands in the [Repository RemoteExample] section. -# -# Specify the remote user name. -# remoteuser = aj46ezos +remotepassfile = $DOTFILES_LOCATION/decrypted/FAU.IMAP.PASS +ssl=yes +cert_fingerprint = BB9EE687E92693794C752F57C53483076DEF2755 -# This option stands in the [Repository RemoteExample] section. -# -# Specify the user to be authorized as. Sometimes we want to -# authenticate with our login/password, but tell the server that we -# really want to be treated as some other user; perhaps server will -# allow us to do that (or maybe not). Some IMAP servers migrate -# account names using this functionality: your credentials remain -# intact, but remote identity changes. -# -# Currently this variable is used only for SASL PLAIN authentication -# mechanism, so consider using auth_mechanisms to prioritize PLAIN -# or even make it the only mechanism to be tried. -# -#remote_identity = authzuser - - -# This option stands in the [Repository RemoteExample] section. -# -# Specify which authentication/authorization mechanisms we should try and the -# order in which OfflineIMAP will try them. -# -# NOTE: any given mechanism will be tried ONLY if it is supported by the remote -# IMAP server. -# -# Default value is ranged is from strongest to more weak ones. Due to technical -# limitations, if GSSAPI is set, it will be tried first, no matter where it was -# specified in the list. -# -#auth_mechanisms = GSSAPI, CRAM-MD5, XOAUTH2, PLAIN, LOGIN - - -# This option stands in the [Repository RemoteExample] section. -# -# XOAuth2 authentication (for instance, to use with Gmail). -# -# This option was tested on Gmail only, but should work -# with type = IMAP for compatible servers. -# -# Mandatory parameters are "oauth2_client_id", "oauth2_client_secret" and -# either "oauth2_refresh_token" or "oauth2_access_token". -# See below to learn how to get those. -# -# Specify the OAuth2 client id and secret to use for the connection.. -# Here's how to register an OAuth2 client for Gmail, as of 10-2-2016: -# - Go to the Google developer console -# https://console.developers.google.com/project -# - Create a new project -# - In API & Auth, select Credentials -# - Setup the OAuth Consent Screen -# - Then add Credentials of type OAuth 2.0 Client ID -# - Choose application type Other; type in a name for your client -# - You now have a client ID and client secret -# -#oauth2_client_id = YOUR_CLIENT_ID -#oauth2_client_secret = YOUR_CLIENT_SECRET - -# Specify the refresh token to use for the connection to the mail server. -# Here's an example of a way to get a refresh token: -# - Clone this project: https://github.com/google/gmail-oauth2-tools -# - Type the following command-line in a terminal and follow the instructions -# python python/oauth2.py --generate_oauth2_token \ -# --client_id=YOUR_CLIENT_ID --client_secret=YOUR_CLIENT_SECRET -# - Access token can be obtained using refresh token with command -# python python/oauth2.py --user=YOUR_EMAIL --client_id=YOUR_CLIENT_ID -# --client_secret=YOUR_CLIENT_SECRET --refresh_token=REFRESH_TOKEN -# -#oauth2_refresh_token = REFRESH_TOKEN -#oauth2_access_token = ACCESS_TOKEN - -########## Passwords - -# There are six ways to specify the password for the IMAP server: -# -# 1. No password at all specified in the config file. -# If a matching entry is found in ~/.netrc (see netrc (5) for -# information) this password will be used. Do note that netrc only -# allows one entry per hostname. If there is no ~/.netrc file but -# there is an /etc/netrc file, the password will instead be taken -# from there. Otherwise you will be prompted for the password when -# OfflineIMAP starts when using a UI that supports this. -# -# 2. The remote password stored in this file with the remotepass -# option. Any '%' needs to be encoded as '%%'. Example: -# remotepass = mypassword -# -# 3. The remote password stored as a single line in an external -# file, which is referenced by the remotefile option. Example: -# remotepassfile = ~/Password.IMAP.Account1 -# -# 4. With a preauth tunnel. With this method, you invoke an external -# program that is guaranteed *NOT* to ask for a password, but rather -# to read from stdin and write to stdout an IMAP procotol stream that -# begins life in the PREAUTH state. When you use a tunnel, you do -# NOT specify a user or password (if you do, they'll be ignored.) -# Instead, you specify a preauthtunnel, as this example illustrates -# for Courier IMAP on Debian: -# preauthtunnel = ssh -q imaphost '/usr/bin/imapd ./Maildir' -# -# 5. If you are using Kerberos and have the Python Kerberos package -# installed, you should not specify a remotepass. If the user has a -# valid Kerberos TGT, OfflineIMAP will figure out the rest all by -# itself, and fall back to password authentication if needed. -# -# 6. Using arbitrary python code. With this method, you invoke a -# function from your pythonfile. To use this method assign the name -# of the function to the variable 'remotepasseval'. Example: -# remotepasseval = get_password("imap.example.net") -# You can also query for the username: -# remoteusereval = get_username("imap.example.net") -# This method can be used to design more elaborate setups, e.g. by -# querying the gnome-keyring via its python bindings. - -remotepassfile = ~/.dotfiles/decrypted/FAU.IMAP.PASS - -########## Advanced settings - - -# These options stands in the [Repository RemoteExample] section. -# -# Tunnels. There are two types: -# -# - preauth: they teleport your connection to the remote system -# and you don't need to authenticate yourself there; the sole -# fact that you succeeded to get the tunnel running is enough. -# This tunnel type was explained above in the 'Passwords' section. -# -# - transport: the just provide the transport (probably encrypted) -# to the IMAP server, but you still need to authenticate at the -# IMAP server. -# -# Tunnels are currently working only with IMAP servers and their -# derivatives (GMail currently). Additionally, for GMail accounts -# preauth tunnel settings are ignored: we don't believe that there -# are ways to preauthenticate at Google mail system IMAP servers. -# -# You must choose at most one tunnel type, be wise M'Lord! -# -#preauthtunnel = ssh -q imaphost '/usr/bin/imapd ./Maildir' -#transporttunnel = openssl s_client -host myimap -port 993 -quiet - - -# This option stands in the [Repository RemoteExample] section. -# -# Some IMAP servers need a "reference" which often refers to the "folder root". -# -# This is most commonly needed with UW IMAP, where you might need to specify the -# directory in which your mail is stored. The 'reference' value will be prefixed -# to all folder paths refering to that repository. E.g. accessing folder 'INBOX' -# with "reference = Mail" will try to access Mail/INBOX. -# -# The nametrans and folderfilter functions will apply to the full path, -# including the reference prefix. Most users will not need this. -# -#reference = Mail - - -# This option stands in the [Repository RemoteExample] section. -# -# IMAP defines an encoding for non-ASCII ("international") characters. Enable -# this option if you want to decode them to the nowadays ubiquitous UTF-8. -# -# Note that the IMAP 4rev1 specification (RFC 3501) allows both UTF-8 and -# modified UTF-7 folder names. -# -# WARNING: with this option enabled: -# - compatibility with any other version is NOT GUARANTED (including newer); -# - no support is provided. -# -#decodefoldernames = no - - -# This option stands in the [Repository RemoteExample] section. -# -# In between synchronisations, OfflineIMAP can monitor mailboxes for new -# messages using the IDLE command. If you want to enable this, specify here the -# folders you wish to monitor. IMAP protocol requires a separate connection for -# each folder monitored in this way, so setting this option will force settings -# for: -# -# - maxconnections: to be at least the number of folders you give -# - holdconnectionopen: to be true -# - keepalive: to be 29 minutes unless you specify otherwise -# -# This feature isn't complete and may well have problems. See the "Known Issues" -# entry in the manual for more details. -# -# This option should return a Python list. For example -# -#idlefolders = ['INBOX', 'INBOX.Alerts'] - - -# This option stands in the [Repository RemoteExample] section. -# -# OfflineIMAP can use a compressed connection to the IMAP server. -# This can result in faster downloads for some cases. -# -#usecompression = yes - - -# This option stands in the [Repository RemoteExample] section. -# -# OfflineIMAP can use multiple connections to the server in order -# to perform multiple synchronization actions simultaneously. -# This may place a higher burden on the server. In most cases, -# setting this value to 2 or 3 will speed up the sync, but in some -# cases, it may slow things down. The safe answer is 1. You should -# probably never set it to a value more than 5. -# -#maxconnections = 2 - - -# This option stands in the [Repository RemoteExample] section. -# -# OfflineIMAP normally closes IMAP server connections between refreshes if -# the global option autorefresh is specified. If you wish it to keep the -# connection open, set this to true. If not specified, the default is -# false. Keeping the connection open means a faster sync start the -# next time and may use fewer server resources on connection, but uses -# more server memory. This setting has no effect if autorefresh is not set. -# holdconnectionopen = yes - - -# This option stands in the [Repository RemoteExample] section. -# -# If you want to have "keepalives" sent while waiting between syncs, specify the -# amount of time IN SECONDS between keepalives here. Note that sometimes more -# than this amount of time might pass, so don't make it tight. This setting has -# no effect if autorefresh and holdconnectionopen are not both set. -# -keepalive = 120 - - -# This option stands in the [Repository RemoteExample] section. -# -# Normally, OfflineIMAP will expunge deleted messages from the server. You can -# disable that if you wish. This means that OfflineIMAP will mark them deleted -# on the server, but not actually delete them. You must use some other IMAP -# client to delete them if you use this setting; otherwise, the messages will -# just pile up there forever. Therefore, this setting is definitely NOT -# recommended for a long term. -# -#expunge = no - - -# This option stands in the [Repository RemoteExample] section. -# -# Specify whether to process all mail folders on the server, or only -# those listed as "subscribed". -# -#subscribedonly = no - - -# This option stands in the [Repository RemoteExample] section. -# -# You can specify a folder translator. This must be a eval-able. -# -# Python expression that takes a foldername arg and returns the new value. A -# lambda function is suggested. -# -# WARNING: you MUST construct it so that it NEVER returns the same value for two -# folders, UNLESS the second values are filtered out by folderfilter below. -# Failure to follow this rule will result in undefined behavior. -# -# If you enable nametrans, you will likely need to set the reversed nametrans on -# the other side. See the user documentation for details and use cases. They -# are also online at: http://www.offlineimap.org/doc/nametrans.html -# -# This example below will remove "INBOX." from the leading edge of folders -# (great for Courier IMAP users). -# -#nametrans = lambda foldername: re.sub('^INBOX\.', '', foldername) -# -# Using Courier remotely and want to duplicate its mailbox naming locally? Try -# this: -# -#nametrans = lambda foldername: re.sub('^INBOX\.*', '.', foldername) - - -# This option stands in the [Repository RemoteExample] section. -# -# Determines if folderfilter will be invoked on each run (dynamic folder -# filtering) or filtering status will be determined at startup (default -# behaviour). -# -#dynamic_folderfilter = False - - -# This option stands in the [Repository RemoteExample] section. -# -# You can specify which folders to sync using the folderfilter setting. You can -# provide any python function (e.g. a lambda function) which will be invoked for -# each foldername. If the filter function returns True, the folder will be -# synced, if it returns False, it. -# -# The folderfilter operates on the *UNTRANSLATED* name (before any nametrans -# translation takes place). -# -# Example 1: synchronizing only INBOX and Sent. -# -#folderfilter = lambda foldername: foldername in ['INBOX', 'Sent'] -# -# Example 2: synchronizing everything except Trash. -# -#folderfilter = lambda foldername: foldername not in ['Trash'] -# -# Example 3: Using a regular expression to exclude Trash and all folders -# containing the characters "Del". -# -#folderfilter = lambda foldername: not re.search('(^Trash$|Del)', foldername) -# -# If folderfilter is not specified, ALL remote folders will be synchronized. -# -# You can span multiple lines by indenting the others. (Use backslashes at the -# end when required by Python syntax) For instance: -# -#folderfilter = lambda foldername: foldername in [ -# 'INBOX', 'Sent Mail', -# 'Deleted Items', 'Received'] - - -# This option stands in the [Repository RemoteExample] section. -# -# You can specify folderincludes to include additional folders. It should -# return a Python list. This might be used to include a folder that was -# excluded by your folderfilter rule, to include a folder that your server does -# not specify with its LIST option, or to include a folder that is outside your -# basic reference. -# -# The 'reference' value will not be prefixed to this folder name, even if you -# have specified one. For example: -# -#folderincludes = ['debian.user', 'debian.personal'] - - -# This option stands in the [Repository RemoteExample] section. -# -# If you do not want to have any folders created on this repository, -# set the createfolders variable to False, the default is True. Using -# this feature you can e.g. disable the propagation of new folders to -# the new repository. -# -#createfolders = True - - -# This option stands in the [Repository RemoteExample] section. -# -# 'foldersort' determines how folders are sorted. -# -# This affects order of synchronization and mbnames. The expression should -# return -1, 0, or 1, as the default Python cmp() does. The two arguments, x -# and y, are strings representing the names of the folders to be sorted. The -# sorting is applied *AFTER* nametrans, if any. The default is to sort IMAP -# folders alphabetically (case-insensitive). Usually, you should never have to -# modify this. To eg. reverse the sort: -# -#foldersort = lambda x, y: -cmp(x, y) - - -# This option stands in the [Repository RemoteExample] section. -# -# Enable 1-way synchronization. When setting 'readonly' to True, this -# repository will not be modified during synchronization. Usefull to -# e.g. backup an IMAP server. The readonly setting can be applied to any -# type of Repository (Maildir, Imap, etc). -# -#readonly = False - - -[Repository GmailExample] - -# A repository using Gmail's IMAP interface. -# -# Any configuration parameter of "IMAP" type repositories can be used here. -# Only "remoteuser" (or "remoteusereval" ) is mandatory. Default values for -# other parameters are OK, and you should not need fiddle with those. -# -# The Gmail repository will use hard-coded values for "remotehost", -# "remoteport", "tunnel" and "ssl". Any attempt to set those parameters will be -# silently ignored. For details, see -# -# http://mail.google.com/support/bin/answer.py?answer=78799&topic=12814 -# -# To enable GMail labels synchronisation, set the option "synclabels" -# in the corresponding "Account" section. -# -type = Gmail - - -# This option stands in the [Repository GmailExample] section. -# -# Specify the Gmail user name. This is the only mandatory parameter. -# -remoteuser = username@gmail.com - - -# This option stands in the [Repository GmailExample] section. -# -# The trash folder name may be different from [Gmail]/Trash due to localization. -# You should look for the localized names of the spam folder too: "spamfolder" -# tunable will help you to override the standard name. -# -# For example on German Gmail, this setting should be: -# -#trashfolder = [Gmail]/Papierkorb +keepalive = 180 diff --git a/scripts/media_control.sh b/scripts/media_control.sh index d8f7f79..ae883db 100755 --- a/scripts/media_control.sh +++ b/scripts/media_control.sh @@ -53,7 +53,7 @@ then exit fi - spotify_playing=$($HOME/.dotfiles/scripts/media_is_spotify_playing.sh) + spotify_playing=$($DOTFILES_LOCATION/scripts/media_is_spotify_playing.sh) if mpc | grep "\[playing\]" &> /dev/null then mpd_playing=true diff --git a/scripts/media_status.sh b/scripts/media_status.sh index a7218ee..a2a7530 100755 --- a/scripts/media_status.sh +++ b/scripts/media_status.sh @@ -1,6 +1,6 @@ #!/bin/bash mpd_playing=$(mpc 2>/dev/null | grep "\[playing\]") -spotify_playing=$($HOME/.dotfiles/scripts/media_is_spotify_playing.sh) +spotify_playing=$($DOTFILES_LOCATION/scripts/media_is_spotify_playing.sh) if [[ $spotify_playing == "true" ]] then @@ -14,7 +14,7 @@ then then echo "Spotify: ad :/" else - echo Spotify: "▶" $($HOME/.dotfiles/scripts/media_print_spotify_info.sh) + echo Spotify: "▶" $($DOTFILES_LOCATION/scripts/media_print_spotify_info.sh) fi fi elif [[ $mpd_playing != "" ]] @@ -27,7 +27,7 @@ then fi elif pgrep spotify &>/dev/null then - echo Spotify: "▐▐" $($HOME/.dotfiles/scripts/media_print_spotify_info.sh) + echo Spotify: "▐▐" $($DOTFILES_LOCATION/scripts/media_print_spotify_info.sh) elif pgrep mpd &>/dev/null then if type mpc &>/dev/null diff --git a/setup.py b/setup.py index 76d541d..1f5fe83 100755 --- a/setup.py +++ b/setup.py @@ -4,9 +4,11 @@ import argparse import os +import pwd import sys import subprocess +user = pwd.getpwuid(os.getuid())[0] home_dir = os.getenv("HOME") cwd = os.getcwd() @@ -38,6 +40,46 @@ def fish_config(quiet): subprocess.run(["fish", dir_path+"fisher.fish"]) +def dotfile_loc_helper(quiet): + """Create a symlink of get_dotfiles_location.sh into the path""" + + try: + os.symlink(cwd + "/get_dotfiles_location.sh", + home_dir + "/.local/bin/get_dotfiles_location") + except Exception as e: + if isinstance(e, FileExistsError): + pass + else: + return e + +def offlineimap_passwd(quiet): + """Write the environment file for the systemd unit""" + res = dotfile_loc_helper(quiet): + if res: + return res + env_file_path = "/etc/systemd/system/offlineimap@fischerling.env" + if not os.path.exists(env_file_path): + try: + subprocess.run(["get_dotfiles_location", ">", + env_file_path]) + except Exception as e: + if isinstance(e, PermissionError): + subprocess.run(["get_dotfiles_location", "|", "sudo", "tee", "-a", + env_file_path, ">", "/dev/null"]) + else: + return e + +def offlineimap_warn(quiet): + """Print a warning about my offlineimap setup""" + + if not quiet: + print("! WARNING !") + print("My offlineimap setup uses a patched version !") + print("The patch can be found at offlineimap/expandvars.patch.") + print("Only proceed if you know what you are doing") + if input("Want to continue ? (y/N) ") not in ["Y","y"]: + exit("Aborting.") + # targets are a list of tuples and/or functions targets = { @@ -48,7 +90,8 @@ targets = { "ssh-config": [("ssh/config", home_dir + "/.ssh/config")], "xinitrc": - [("xinitrc", home_dir + "/.xinitrc")], + [("xinitrc", home_dir + "/.xinitrc"), + dotfile_loc_helper], "Xresources": [("Xresources", home_dir + "/.Xresources")], "mutt": @@ -58,21 +101,25 @@ targets = { "zshrc": [("zshrc", home_dir + "/zshrc")], "i3-config": - [("i3", home_dir + "/.i3")], + [("i3", home_dir + "/.i3"), + dotfile_loc_helper], "dir_colors": [("dir_colors", home_dir + "/.dir_colors")], "fish-config": [("config/fish/config.fish", home_dir + "/.config/fish/config.fish"), ("config/fish/fishfile", home_dir + "/.config/fish/fishfile"), - fish_config], + fish_config, + dotfile_loc_helper], "terminator-config": [("config/terminator/config", home_dir + "/.config/terminator/config")], "offlineimap": - [("offlineimap/offlineimaprc", home_dir + "/.offlineimaprc"), - ("offlineimap/FAU.IMAP.PASS.gpg", ""), + [offlineimap_warn, + ("offlineimap/offlineimaprc", home_dir + "/.offlineimaprc"), + ("offlineimap/FAU.IMAP.PASS.gpg", home_dir +"/.fau_imap_pass"), ("offlineimap/offlineimap@.service", - "/etc/systemd/system/offlineimap@.service")], + "/etc/systemd/system/offlineimap@" + user + ".service"), + offlineimap_passwd], "FAU": [("FAU/wl-FAU-STUD.gpg", "/etc/netctl/wl-FAU-STUD"), ("FAU/fau_stud.conf.gpg", "/etc/wpa_supplicant/fau_stud.conf"), @@ -90,8 +137,9 @@ def install_target(target, quiet): for instruction in targets[target]: if isinstance(instruction, tuple): if not os.path.exists(instruction[0]): - print("Can't find", instruction[0] + - ". Please make sure you are in the right directory.", file=sys.stderr) + print("Can't find", instruction[0], + ". Please make sure you are in the right directory.", + file=sys.stderr) else: # check if file is encrypted if instruction[0][-4:] == ".gpg": @@ -110,7 +158,8 @@ def install_target(target, quiet): # set privacy friendly file permissions if not subprocess.run(["chmod", "660", instruction[0]]): print("Skipping because changing permissions of", - instruction[1], "failed. This could be a privacy risk!") + instruction[1], "failed. This could be a", + "privacy risk!", file=sys.stderr) continue else: print("Decrypting failed", file=sys.stderr) @@ -129,7 +178,7 @@ def install_target(target, quiet): subprocess.run(["sudo", "ln", "-s", cwd + '/' + instruction[0], instruction[1]]) elif isinstance(e, FileExistsError): - print("File already exists") + print("File already exists", file=sys.stderr) else: print(e, file=sys.stderr) @@ -138,14 +187,14 @@ def install_target(target, quiet): print("Running function", instruction) res = instruction(quiet) if res: - if not quiet: - print("The instruction", instruction, "of", target, "failed with", str(res) + ".") - print("This can leaf your installation in a broken state") - print("ABORTING to prevent failures.") - exit(res) + print("The instruction", instruction, "of", target, + "failed with", str(res) + ".", file=sys.stderr) + print("This can leaf your installation in a broken state", + file=sys.stderr) else: print("I don't understand", instruction, - "\nThe instruction musst be a tuple or a function.\nSKIPPING IT") + "\nThe instruction musst be a tuple or a function.", + "\nSKIPPING IT", file=sys.stderr) if target in git_submodules_for: choice = input(target + " uses git submodules want to pull them ? (Y/n) ") diff --git a/xinitrc b/xinitrc index 8352544..c3365ba 100644 --- a/xinitrc +++ b/xinitrc @@ -44,6 +44,12 @@ export LANG [ -n "$LC_MEASUREMENT" ] && export LC_MEASUREMENT [ -n "$LC_IDENTIFICATION" ] && export LC_IDENTIFICATION +# Export DOTFILES_LOCATION (should be exported allready + +if [ -z "$DOTFILES_LOCATION" ]; then + export DOTFILES_LOCATION=$(get_dotfiles_location) +fi + eval $(ssh-agent -s -a ~/.ssh/agent.sock) [[ -f $HOME/.Xresources ]] && xrdb -merge $HOME/.Xresources diff --git a/zshrc b/zshrc index 2a4ddfc..3fad5e6 100644 --- a/zshrc +++ b/zshrc @@ -59,6 +59,9 @@ HIST_IGNORE_ALL_DUPS="true" # You may need to manually set your language environment # export LANG=en_US.UTF-8 +# Export the path of our dotfiles +export DOTFILES_LOCATION=$(get_dotfiles_location) + # Preferred editor export EDITOR='vim' -- cgit v1.2.3