diff --git a/.gitignore b/.gitignore index d869ee2..df30d7e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ config/git/config/* !config/git/config/.gitkeep !config/git/config/README.md +managed/* +!managed/.gitkeep diff --git a/config/config.json b/config/config.json new file mode 100644 index 0000000..b3a1dc2 --- /dev/null +++ b/config/config.json @@ -0,0 +1,27 @@ +{ + "directories": [ + ".local/bin", + ".local/cache", + ".local/config", + ".local/data", + ".local/state", + ".local/state/bash", + ".local/state/less", + "Applications", + "Certificates", + "Docker", + "Documents", + "Downloads", + "Games", + "Git", + "Laboratory", + "Laboratory/Training", + "Laboratory/Lab", + "Music", + "Notes", + "Pictures", + "Projects", + "Templates", + "Videos" + ] +} diff --git a/config/X11/xinitrc b/files/X11/xinitrc similarity index 100% rename from config/X11/xinitrc rename to files/X11/xinitrc diff --git a/config/alacritty/alacritty.toml b/files/alacritty/alacritty.toml similarity index 100% rename from config/alacritty/alacritty.toml rename to files/alacritty/alacritty.toml diff --git a/config/amfora/config.toml b/files/amfora/config.toml similarity index 100% rename from config/amfora/config.toml rename to files/amfora/config.toml diff --git a/config/ansible/ansible.cfg b/files/ansible/ansible.cfg similarity index 100% rename from config/ansible/ansible.cfg rename to files/ansible/ansible.cfg diff --git a/config/ansible/hosts.yml b/files/ansible/hosts.yml similarity index 100% rename from config/ansible/hosts.yml rename to files/ansible/hosts.yml diff --git a/config/bash/bash_profile b/files/bash/bash_profile similarity index 100% rename from config/bash/bash_profile rename to files/bash/bash_profile diff --git a/config/bash/bashrc b/files/bash/bashrc similarity index 100% rename from config/bash/bashrc rename to files/bash/bashrc diff --git a/config/bash/bashrc.d/X11 b/files/bash/bashrc.d/X11 similarity index 100% rename from config/bash/bashrc.d/X11 rename to files/bash/bashrc.d/X11 diff --git a/config/bash/bashrc.d/aliases b/files/bash/bashrc.d/aliases similarity index 100% rename from config/bash/bashrc.d/aliases rename to files/bash/bashrc.d/aliases diff --git a/config/bash/bashrc.d/ansible b/files/bash/bashrc.d/ansible similarity index 100% rename from config/bash/bashrc.d/ansible rename to files/bash/bashrc.d/ansible diff --git a/config/bash/bashrc.d/docker b/files/bash/bashrc.d/docker similarity index 100% rename from config/bash/bashrc.d/docker rename to files/bash/bashrc.d/docker diff --git a/config/bash/bashrc.d/exercism b/files/bash/bashrc.d/exercism similarity index 100% rename from config/bash/bashrc.d/exercism rename to files/bash/bashrc.d/exercism diff --git a/config/bash/bashrc.d/functions b/files/bash/bashrc.d/functions similarity index 100% rename from config/bash/bashrc.d/functions rename to files/bash/bashrc.d/functions diff --git a/config/bash/bashrc.d/git b/files/bash/bashrc.d/git similarity index 100% rename from config/bash/bashrc.d/git rename to files/bash/bashrc.d/git diff --git a/config/bash/bashrc.d/gnupg b/files/bash/bashrc.d/gnupg similarity index 100% rename from config/bash/bashrc.d/gnupg rename to files/bash/bashrc.d/gnupg diff --git a/config/bash/bashrc.d/go b/files/bash/bashrc.d/go similarity index 100% rename from config/bash/bashrc.d/go rename to files/bash/bashrc.d/go diff --git a/config/bash/bashrc.d/history b/files/bash/bashrc.d/history similarity index 100% rename from config/bash/bashrc.d/history rename to files/bash/bashrc.d/history diff --git a/config/bash/bashrc.d/kubectl b/files/bash/bashrc.d/kubectl similarity index 100% rename from config/bash/bashrc.d/kubectl rename to files/bash/bashrc.d/kubectl diff --git a/config/bash/bashrc.d/less b/files/bash/bashrc.d/less similarity index 100% rename from config/bash/bashrc.d/less rename to files/bash/bashrc.d/less diff --git a/config/bash/bashrc.d/lf b/files/bash/bashrc.d/lf similarity index 100% rename from config/bash/bashrc.d/lf rename to files/bash/bashrc.d/lf diff --git a/config/bash/bashrc.d/local_software b/files/bash/bashrc.d/local_software similarity index 100% rename from config/bash/bashrc.d/local_software rename to files/bash/bashrc.d/local_software diff --git a/config/bash/bashrc.d/minikube b/files/bash/bashrc.d/minikube similarity index 100% rename from config/bash/bashrc.d/minikube rename to files/bash/bashrc.d/minikube diff --git a/config/bash/bashrc.d/misc b/files/bash/bashrc.d/misc similarity index 100% rename from config/bash/bashrc.d/misc rename to files/bash/bashrc.d/misc diff --git a/config/bash/bashrc.d/pass b/files/bash/bashrc.d/pass similarity index 100% rename from config/bash/bashrc.d/pass rename to files/bash/bashrc.d/pass diff --git a/config/bash/bashrc.d/prompt b/files/bash/bashrc.d/prompt similarity index 100% rename from config/bash/bashrc.d/prompt rename to files/bash/bashrc.d/prompt diff --git a/config/bash/bashrc.d/pulumi b/files/bash/bashrc.d/pulumi similarity index 100% rename from config/bash/bashrc.d/pulumi rename to files/bash/bashrc.d/pulumi diff --git a/config/bash/bashrc.d/terminfo b/files/bash/bashrc.d/terminfo similarity index 100% rename from config/bash/bashrc.d/terminfo rename to files/bash/bashrc.d/terminfo diff --git a/config/bash/bashrc.d/vagrant b/files/bash/bashrc.d/vagrant similarity index 100% rename from config/bash/bashrc.d/vagrant rename to files/bash/bashrc.d/vagrant diff --git a/config/bash/bashrc.d/vault b/files/bash/bashrc.d/vault similarity index 100% rename from config/bash/bashrc.d/vault rename to files/bash/bashrc.d/vault diff --git a/files/bash/environment b/files/bash/environment new file mode 100644 index 0000000..87faaa4 --- /dev/null +++ b/files/bash/environment @@ -0,0 +1,24 @@ +## vim: ft=sh : + +# == Add personal bin directory to PATH +if ! [[ "${PATH}" =~ "${HOME}/.local/bin" ]]; then + export PATH=${HOME}/.local/bin:${PATH} +fi + +# == Add custom scripts directory to PATH +if ! [[ "${PATH}" =~ "${HOME}/.local/scripts" ]]; then + export PATH=${HOME}/.local/scripts:${PATH} +fi + +# == Add AppImage directory to PATH +if ! [[ "${PATH}" =~ "${HOME}/Applications" ]]; then + export PATH=${HOME}/Applications:${PATH} +fi + +# == The XDG Directories +export XDG_CONFIG_HOME=${HOME}/.local/config +export XDG_DATA_HOME=${HOME}/.local/share +export XDG_CACHE_HOME=${HOME}/.local/cache +export XDG_STATE_HOME=${HOME}/.local/state + +export LOG_HOME="${XDG_STATE_HOME}/logs" diff --git a/config/dunst/dunstrc b/files/dunst/dunstrc similarity index 100% rename from config/dunst/dunstrc rename to files/dunst/dunstrc diff --git a/files/git/config/gitconfig-parameters b/files/git/config/gitconfig-parameters new file mode 100644 index 0000000..dd8530e --- /dev/null +++ b/files/git/config/gitconfig-parameters @@ -0,0 +1,3 @@ +GIT_USER_NAME="Dan Anglin" +GIT_USER_EMAIL="daangling@gmail.com" +GIT_USER_SIGNINGKEY="0C1D44CFBEE68638" diff --git a/config/git/gitconfig b/files/git/gitconfig similarity index 100% rename from config/git/gitconfig rename to files/git/gitconfig diff --git a/config/git/gitignore b/files/git/gitignore similarity index 100% rename from config/git/gitignore rename to files/git/gitignore diff --git a/config/git/gitmessage b/files/git/gitmessage similarity index 100% rename from config/git/gitmessage rename to files/git/gitmessage diff --git a/config/lf/lfrc b/files/lf/lfrc similarity index 100% rename from config/lf/lfrc rename to files/lf/lfrc diff --git a/config/logrotate/logrotate.conf b/files/logrotate/logrotate.conf similarity index 100% rename from config/logrotate/logrotate.conf rename to files/logrotate/logrotate.conf diff --git a/config/river/init b/files/river/init similarity index 100% rename from config/river/init rename to files/river/init diff --git a/config/tmux/tmux.conf b/files/tmux/tmux.conf similarity index 100% rename from config/tmux/tmux.conf rename to files/tmux/tmux.conf diff --git a/config/xdg/user-dirs.dirs b/files/xdg/user-dirs.dirs similarity index 100% rename from config/xdg/user-dirs.dirs rename to files/xdg/user-dirs.dirs diff --git a/config/xdg/user-dirs.locale b/files/xdg/user-dirs.locale similarity index 100% rename from config/xdg/user-dirs.locale rename to files/xdg/user-dirs.locale diff --git a/files/zk/config.toml b/files/zk/config.toml new file mode 100644 index 0000000..2f24dc0 --- /dev/null +++ b/files/zk/config.toml @@ -0,0 +1,11 @@ +[note] +default-title = "Note" +extension = "md" +filename = "{{date now '%Y%m%d%H%M%S'}}-{{slug title}}" +language = "en" + +[extra] +author = "dananglin" + +[tool] +editor = "nvim" diff --git a/magefiles/config.go b/magefiles/config.go new file mode 100644 index 0000000..dd444fb --- /dev/null +++ b/magefiles/config.go @@ -0,0 +1,37 @@ +//go:build mage + +package main + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" +) + +const ( + configDir string = "./config/" + configFileName string = "config.json" +) + +type config struct { + Directories []string `json:"directories"` +} + +func newConfig() (config, error) { + var cfg config + + path := filepath.Join(configDir, configFileName) + + file, err := os.Open(path) + if err != nil { + return cfg, fmt.Errorf("unable to open the file: %w", err) + } + defer file.Close() + + if err = json.NewDecoder(file).Decode(&cfg); err != nil { + return cfg, fmt.Errorf("unable to decode the JSON file: %w", err) + } + + return cfg, nil +} diff --git a/magefiles/directories.go b/magefiles/directories.go new file mode 100644 index 0000000..1eacc74 --- /dev/null +++ b/magefiles/directories.go @@ -0,0 +1,77 @@ +//go:build mage + +package main + +import ( + "errors" + "fmt" + "io/fs" + "os" + "path/filepath" + "slices" +) + +const ( + dirModePerm fs.FileMode = 0700 +) + +// Directories ensure that the directories specified in the configuration is present within the home directory. +func Directories() error { + config, err := newConfig() + if err != nil { + return fmt.Errorf("unable to load the configuration: %w", err) + } + + userHome, err := os.UserHomeDir() + if err != nil { + return fmt.Errorf("unable to get the user's home directory: %w", err) + } + + for _, dir := range slices.All(config.Directories) { + path := filepath.Join(userHome, dir) + if err := ensureDirectory(path); err != nil { + return fmt.Errorf("unable to ensure that %s is present: %w", path, err) + } + + fmt.Printf("Successfully ensured %s is present.\n", path) + } + + + /* + for each dir: + + - get full path + - get dirinfo + - if no path, create directory and set mode to 0700 and exit (create a separate function for this) + - ensure existing directory mode is set to 0700 + */ + + return nil +} + +func ensureDirectory(path string) error { + info, err := os.Stat(path); + if err != nil { + if errors.Is(err, os.ErrNotExist) { + if err := os.Mkdir(path, dirModePerm); err != nil { + return fmt.Errorf("unable to create the directory: %w", err) + } + + return nil + } + + return fmt.Errorf("received an unexpected error after attempting to get the directory information: %w", err) + } + + if !info.IsDir() { + return errors.New("the path exists but it is not a directory") + } + + if info.Mode().Perm() != dirModePerm { + if err := os.Chmod(path, dirModePerm); err != nil { + return fmt.Errorf("unable to update the directory's mode to %d: %w", dirModePerm, err) + } + } + + return nil +} diff --git a/magefiles/go.mod b/magefiles/go.mod new file mode 100644 index 0000000..5a692b5 --- /dev/null +++ b/magefiles/go.mod @@ -0,0 +1,3 @@ +module codeflow.dananglin.me.uk/linux-home/manager/magefiles + +go 1.23.1 diff --git a/magefiles/main.go b/magefiles/main.go new file mode 100644 index 0000000..8883df9 --- /dev/null +++ b/magefiles/main.go @@ -0,0 +1,13 @@ +//go:build ignore + +package main + +import ( + "os" + + "github.com/magefile/mage/mage" +) + +func main() { + os.Exit(mage.Main()) +} diff --git a/managed/.gitkeep b/managed/.gitkeep new file mode 100644 index 0000000..e69de29