checkpoint: manage home directories
- ensure configured home directories are present and their mode set to 0700 - move dotfiles to files - added JSON config
This commit is contained in:
parent
ba0a415b03
commit
903e5d8b66
49 changed files with 197 additions and 0 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -1,3 +1,5 @@
|
||||||
config/git/config/*
|
config/git/config/*
|
||||||
!config/git/config/.gitkeep
|
!config/git/config/.gitkeep
|
||||||
!config/git/config/README.md
|
!config/git/config/README.md
|
||||||
|
managed/*
|
||||||
|
!managed/.gitkeep
|
||||||
|
|
27
config/config.json
Normal file
27
config/config.json
Normal file
|
@ -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"
|
||||||
|
]
|
||||||
|
}
|
24
files/bash/environment
Normal file
24
files/bash/environment
Normal file
|
@ -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"
|
3
files/git/config/gitconfig-parameters
Normal file
3
files/git/config/gitconfig-parameters
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
GIT_USER_NAME="Dan Anglin"
|
||||||
|
GIT_USER_EMAIL="daangling@gmail.com"
|
||||||
|
GIT_USER_SIGNINGKEY="0C1D44CFBEE68638"
|
11
files/zk/config.toml
Normal file
11
files/zk/config.toml
Normal file
|
@ -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"
|
37
magefiles/config.go
Normal file
37
magefiles/config.go
Normal file
|
@ -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
|
||||||
|
}
|
77
magefiles/directories.go
Normal file
77
magefiles/directories.go
Normal file
|
@ -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
|
||||||
|
}
|
3
magefiles/go.mod
Normal file
3
magefiles/go.mod
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
module codeflow.dananglin.me.uk/linux-home/manager/magefiles
|
||||||
|
|
||||||
|
go 1.23.1
|
13
magefiles/main.go
Normal file
13
magefiles/main.go
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
//go:build ignore
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/magefile/mage/mage"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
os.Exit(mage.Main())
|
||||||
|
}
|
0
managed/.gitkeep
Normal file
0
managed/.gitkeep
Normal file
Loading…
Reference in a new issue