V0.1.4
This commit is contained in:
126
part1.sh
126
part1.sh
@@ -20,6 +20,69 @@ command_exists() {
|
|||||||
command -v "$1" >/dev/null 2>&1
|
command -v "$1" >/dev/null 2>&1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
find_ssh_key_in_dir() {
|
||||||
|
local ssh_dir="$1"
|
||||||
|
local key_file=""
|
||||||
|
|
||||||
|
[[ -d "$ssh_dir" ]] || return 1
|
||||||
|
|
||||||
|
while IFS= read -r key_file; do
|
||||||
|
case "$(basename "$key_file")" in
|
||||||
|
*.pub|authorized_keys|known_hosts|config)
|
||||||
|
continue
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [[ -f "$key_file.pub" ]]; then
|
||||||
|
printf '%s' "$key_file"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done < <(find "$ssh_dir" -maxdepth 1 -type f | sort)
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
wait_for_ssh_key() {
|
||||||
|
local preferred_path="$1"
|
||||||
|
local ssh_dir="$HOME_DIR/.ssh"
|
||||||
|
local detected_key=""
|
||||||
|
|
||||||
|
mkdir -p "$ssh_dir"
|
||||||
|
chmod 700 "$ssh_dir"
|
||||||
|
|
||||||
|
if [[ -f "$preferred_path" && -f "$preferred_path.pub" ]]; then
|
||||||
|
printf '%s' "$preferred_path"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if detected_key="$(find_ssh_key_in_dir "$ssh_dir")"; then
|
||||||
|
printf '%s' "$detected_key"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
info "Waiting for an SSH key to appear in $ssh_dir"
|
||||||
|
printf 'Create the key in another terminal; this script will keep watching.\n'
|
||||||
|
printf 'Expected path: %s (with matching .pub file)\n' "$preferred_path"
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
if [[ -f "$preferred_path" && -f "$preferred_path.pub" ]]; then
|
||||||
|
printf '%s' "$preferred_path"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if detected_key="$(find_ssh_key_in_dir "$ssh_dir")"; then
|
||||||
|
printf '%s' "$detected_key"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if command_exists inotifywait; then
|
||||||
|
inotifywait -q -e create -e close_write -e moved_to "$ssh_dir" >/dev/null 2>&1 || sleep 2
|
||||||
|
else
|
||||||
|
sleep 2
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
prompt_yes_no() {
|
prompt_yes_no() {
|
||||||
local prompt="$1"
|
local prompt="$1"
|
||||||
local default="${2:-Y}"
|
local default="${2:-Y}"
|
||||||
@@ -178,6 +241,17 @@ Categories=Network;InstantMessaging;Chat;IRCClient
|
|||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
write_keyd_remap_conf() {
|
||||||
|
sudo mkdir -p /etc/keyd
|
||||||
|
sudo tee /etc/keyd/remap.conf >/dev/null <<'EOF'
|
||||||
|
[ids]
|
||||||
|
0001:0001:09b4e68d
|
||||||
|
[main]
|
||||||
|
leftalt = leftmeta
|
||||||
|
leftmeta = leftalt
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
HOME_DIR="$HOME"
|
HOME_DIR="$HOME"
|
||||||
BASHRC="$HOME_DIR/.bashrc"
|
BASHRC="$HOME_DIR/.bashrc"
|
||||||
TMP_DIR="$(mktemp -d)"
|
TMP_DIR="$(mktemp -d)"
|
||||||
@@ -216,6 +290,7 @@ declare -a PACMAN_PACKAGES=(
|
|||||||
grim
|
grim
|
||||||
chromium
|
chromium
|
||||||
uv
|
uv
|
||||||
|
npm
|
||||||
rofi
|
rofi
|
||||||
slurp
|
slurp
|
||||||
brightnessctl
|
brightnessctl
|
||||||
@@ -275,23 +350,10 @@ if prompt_yes_no "Configure global git identity?" "Y"; then
|
|||||||
git config --global user.email "$git_email"
|
git config --global user.email "$git_email"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if prompt_yes_no "Create or reuse an SSH key for git access?" "Y"; then
|
if prompt_yes_no "Wait for an existing SSH key for git access?" "Y"; then
|
||||||
info "Preparing SSH key"
|
info "Waiting for SSH key"
|
||||||
ssh_key_path="$(prompt_required_value "SSH key path:" "$HOME_DIR/.ssh/id_ed25519")"
|
ssh_key_path="$(prompt_required_value "SSH key path:" "$HOME_DIR/.ssh/id_ed25519")"
|
||||||
ssh_key_comment="$(prompt_required_value "SSH key comment/email:")"
|
ssh_key_path="$(wait_for_ssh_key "$ssh_key_path")"
|
||||||
mkdir -p "$HOME_DIR/.ssh"
|
|
||||||
chmod 700 "$HOME_DIR/.ssh"
|
|
||||||
|
|
||||||
if [[ ! -f "$ssh_key_path" ]]; then
|
|
||||||
ssh_key_passphrase=""
|
|
||||||
if prompt_yes_no "Protect the SSH key with a passphrase?" "Y"; then
|
|
||||||
ssh_key_passphrase="$(prompt_passphrase)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
ssh-keygen -t ed25519 -C "$ssh_key_comment" -f "$ssh_key_path" -N "$ssh_key_passphrase"
|
|
||||||
else
|
|
||||||
info "SSH key already exists at $ssh_key_path, reusing it"
|
|
||||||
fi
|
|
||||||
|
|
||||||
chmod 600 "$ssh_key_path"
|
chmod 600 "$ssh_key_path"
|
||||||
chmod 644 "$ssh_key_path.pub"
|
chmod 644 "$ssh_key_path.pub"
|
||||||
@@ -314,6 +376,38 @@ if prompt_yes_no "Create or reuse an SSH key for git access?" "Y"; then
|
|||||||
printf '\nPublic key: %s.pub\n' "$ssh_key_path"
|
printf '\nPublic key: %s.pub\n' "$ssh_key_path"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if prompt_yes_no "Enable the keyd system service?" "Y"; then
|
||||||
|
if command_exists keyd; then
|
||||||
|
info "Enabling keyd"
|
||||||
|
sudo systemctl enable --now keyd.service
|
||||||
|
else
|
||||||
|
warn "keyd is not installed; skipping service enablement"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if prompt_yes_no "Remap ThinkPad Alt to Super with keyd?" "Y"; then
|
||||||
|
if command_exists keyd; then
|
||||||
|
info "Writing /etc/keyd/remap.conf"
|
||||||
|
write_keyd_remap_conf
|
||||||
|
sudo systemctl enable --now keyd.service
|
||||||
|
sudo systemctl restart keyd.service
|
||||||
|
else
|
||||||
|
warn "keyd is not installed; skipping remap configuration"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if prompt_yes_no "Set up uv with Python 3.14 and global tools?" "Y"; then
|
||||||
|
if command_exists uv; then
|
||||||
|
info "Configuring uv"
|
||||||
|
uv python install 3.14
|
||||||
|
uv python pin --global 3.14
|
||||||
|
uv tool install ruff
|
||||||
|
uv tool install python-lsp-server
|
||||||
|
else
|
||||||
|
warn "uv is not installed; skipping Python and tool setup"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
if prompt_yes_no "Clone a dotfiles repository into ~/.config?" "Y"; then
|
if prompt_yes_no "Clone a dotfiles repository into ~/.config?" "Y"; then
|
||||||
info "Cloning dotfiles"
|
info "Cloning dotfiles"
|
||||||
dotfiles_repo="$(prompt_required_value "Dotfiles repository URL:")"
|
dotfiles_repo="$(prompt_required_value "Dotfiles repository URL:")"
|
||||||
|
|||||||
Reference in New Issue
Block a user