]> us-delaporte.pagekite.me Git - dotfiles.git/blob - bin/dot
Fix for ability to create corrupt .yaml
[dotfiles.git] / bin / dot
1 #!/bin/bash
2 ENVS="$HOME/envs"
3 ANSIBLE="$ENVS/ansible/bin/ansible-playbook"
4 read -d '' HELP << EOF
5 dot - a (mostly) one script dotfiles manager
6
7 1. Install this file on your path
8 2. Clone your (or my) 'dotfiles' repository to ~/dotfiles
9 3. Run 'dot help' to get started.
10
11 Copyright 2026 Edward Delaporte V
12 Licensed under AGPLv3 and later.
13
14 dot setup
15 install ansible CLI to $ANSIBLE
16
17 dot link FILE
18 updates ~/dot.HOSTNAME.yaml
19 to include a symlink from ~/dotfiles/files/FILE to ~/.FILE
20
21 dot install SCRIPT
22 updates ~/dot.HOSTNAME.yaml
23 to run ~/dotfiles/SCRIPT.sh if it has not yet been run
24 creates ~/dot/SCRIPT.installed after SCRIPT has been run
25
26 dot check
27 check setup against ~/dot.HOSTNAME.yaml
28
29 dot apply
30 apply config in ~/dot.HOSTNAME.yaml
31 EOF
32
33 if [ ! -n "$1" ] || [ "$1" == "help" ]; then
34 echo "$HELP"
35 fi
36 # set -v
37
38 TASKFILE="$HOME/backup/dot.$HOSTNAME.yaml"
39 LINKFILES="$HOME/dotfiles/files"
40 INSTALLS="$HOME/dotfiles/install"
41 DOT="$HOME/dot"
42
43 read -d '' EMPTY_TASKFILE << EOF
44 ---
45 - name: Set up dotfiles on $HOSTNAME
46 gather_facts: no
47 hosts: localhost
48 connection: local
49
50 tasks:
51 - name: Check on $TASKFILE
52 ansible.builtin.stat:
53 path: $TASKFILE
54 EOF
55
56 if [[ ! -f "$TASKFILE" ]]; then
57 echo "Creating empty $TASKFILE"
58 mkdir -p "$HOME/backup"
59 echo "$EMPTY_TASKFILE" >> $TASKFILE
60 fi
61
62 if [ "$1" == "setup" ]; then
63 if [[ ! -f "$ANSIBLE" ]]; then
64 mkdir -p "$ENVS"
65 echo "Setting up Ansible in ~/envs/ansible"
66 cd $HOME/envs; python3 -m venv ansible
67 $HOME/envs/ansible/bin/pip install ansible jinja2
68 fi
69 if [[ -f "$ANSIBLE" ]]; then
70 echo "[ ok ]: Ansible setup at $ANSIBLE"
71 fi
72 if [[ -f "$TASKFILE" ]]; then
73 echo "[ ok ]: dot config at $TASKFILE"
74 fi
75 fi
76
77 if [ "$1" == "reset" ]; then
78 read -n1 -p "Reset $TASKFILE? [y,N]" input
79 if [[ ! $input == "Y" && ! $input == "y" ]]; then
80 echo "Aborted by user"
81 exit 1
82 fi
83 echo "$EMPTY_TASKFILE" > $TASKFILE
84 echo ""
85 fi
86
87
88 if [ "$1" == "check" ]; then
89 $ANSIBLE $TASKFILE --check --diff
90 fi
91
92 if [ "$1" == "link" ]; then
93 if [ ! -n "$2" ]; then
94 echo "Can symlink: (from $LINKFILES)"
95 cd $LINKFILES
96 ls -p | grep -v /
97 exit 1
98 fi
99
100 read -d '' LINK_THIS_FILE << EOF
101
102 - name: symlink $2
103 ansible.builtin.file:
104 src: "$LINKFILES/$2"
105 dest: "$HOME/.$2"
106 state: "link"
107 EOF
108
109 echo " $LINK_THIS_FILE" >> $TASKFILE
110 echo "$2 added to symlinks in $TASKFILE"
111 echo "Run 'dot apply' to create all configured symlinks"
112 fi
113
114
115 if [ "$1" == "apply" ]; then
116 if [[ ! -f "$TASKFILE" ]]; then
117 echo "$TASKFILE is missing. Run 'dot setup'"
118 exit 1
119 fi
120 $ANSIBLE $TASKFILE
121 fi
122
123 if [ "$1" == "install" ]; then
124 if [ ! -n "$2" ]; then
125 echo "Can install: (.sh scripts in $INSTALLS)"
126 cd $INSTALLS
127 ls -p | grep -v / | grep .sh
128 exit 1
129 fi
130 if [[ ! -f "$INSTALLS/$2.sh" ]]; then
131 echo "No such install script $INSTALLS/$2.sh"
132 echo "Run dot install with no params to list scripts."
133 exit 1
134 fi
135
136 mkdir -p $DOT
137 read -d '' RUN_INSTALL << EOF
138 - name: check $2
139 stat:
140 path: "$DOT/$2.installed"
141 register: $2_installed
142 - name: install $2
143 ansible.builtin.shell: |
144 "$INSTALLS/$2.sh"
145 touch "$DOT/$2.installed"
146 when: not $2_installed.stat.exists
147 - name: verify $2 is installed
148 ansible.builtin.debug:
149 msg: "$2 is installed."
150 when: $2_installed.stat.exists
151 EOF
152 echo " $RUN_INSTALL" >> $TASKFILE
153 echo "Run 'dot apply' to run the install"
154 fi