rebrand(installer): convert dankinstall to duxinstall

(cherry picked from commit 6d65f304e5)
This commit is contained in:
purian23 committed 2026-10-25 04:20:03 -04:00
1 parent d2e191d642
commit defab4fbc8
25 files changed
+97 -94

No files matched your search

+1 -1
View File
@@ -47,7 +47,7 @@ body:
attributes:
label: Select your Installation Method
options:
- DankInstaller
- Dux Installer
- Distro Packaging
- Source
validations:
+1 -1
View File
@@ -54,7 +54,7 @@ body:
attributes:
label: Select your Installation Method
options:
- DankInstaller
- Dux Installer
- Distro Packaging
- Source
validations:
+2 -2
View File
@@ -63,8 +63,8 @@ jobs:
- name: Build dms (distropkg)
run: go build -v -tags 'distro_binary withshell' ./cmd/dms
- name: Build dankinstall
run: go build -v ./cmd/dankinstall
- name: Build duxinstall
run: go build -v ./cmd/duxinstall
build-freebsd:
runs-on: ubuntu-latest
+13 -13
View File
@@ -88,7 +88,7 @@ jobs:
if: matrix.goos == 'linux'
run: go test -v ./...
- name: Build dankinstall (${{ env.ASSET }})
- name: Build duxinstall (${{ env.ASSET }})
if: matrix.goos == 'linux'
env:
GOOS: ${{ matrix.goos }}
@@ -96,12 +96,12 @@ jobs:
GOARCH: ${{ matrix.arch }}
run: |
set -eux
cd cmd/dankinstall
cd cmd/duxinstall
go build -trimpath -ldflags "-s -w -X main.Version=${TAG}" \
-o ../../dankinstall-${{ env.ASSET }}
-o ../../duxinstall-${{ env.ASSET }}
cd ../..
gzip -9 -k dankinstall-${{ env.ASSET }}
sha256sum dankinstall-${{ env.ASSET }}.gz > dankinstall-${{ env.ASSET }}.gz.sha256
gzip -9 -k duxinstall-${{ env.ASSET }}
sha256sum duxinstall-${{ env.ASSET }}.gz > duxinstall-${{ env.ASSET }}.gz.sha256
- name: Sync embedded shell
run: make sync-shell
@@ -149,8 +149,8 @@ jobs:
with:
name: core-assets-${{ env.ASSET }}
path: |
core/dankinstall-${{ env.ASSET }}.gz
core/dankinstall-${{ env.ASSET }}.gz.sha256
core/duxinstall-${{ env.ASSET }}.gz
core/duxinstall-${{ env.ASSET }}.gz.sha256
core/dms-${{ env.ASSET }}.gz
core/dms-${{ env.ASSET }}.gz.sha256
core/dms-distropkg-${{ env.ASSET }}.gz
@@ -175,8 +175,8 @@ jobs:
with:
name: core-assets-${{ env.ASSET }}
path: |
core/dankinstall-${{ env.ASSET }}.gz
core/dankinstall-${{ env.ASSET }}.gz.sha256
core/duxinstall-${{ env.ASSET }}.gz
core/duxinstall-${{ env.ASSET }}.gz.sha256
core/dms-${{ env.ASSET }}.gz
core/dms-${{ env.ASSET }}.gz.sha256
core/dms-distropkg-${{ env.ASSET }}.gz
@@ -302,8 +302,8 @@ jobs:
- **`dms-distropkg-arm64.gz`** - DMS CLI binary built with distro_package tag for ARM64 systems
- **`dms-distropkg-freebsd-amd64.gz`** - DMS CLI binary built with distro_package tag for FreeBSD x86_64 systems
- **`dms-distropkg-freebsd-arm64.gz`** - DMS CLI binary built with distro_package tag for FreeBSD ARM64 systems
- **`dankinstall-amd64.gz`** - Installer binary for x86_64 systems
- **`dankinstall-arm64.gz`** - Installer binary for ARM64 systems
- **`duxinstall-amd64.gz`** - Installer binary for x86_64 systems
- **`duxinstall-arm64.gz`** - Installer binary for ARM64 systems
- **`dms-cli-<version>.tar.gz`** - Go source code with vendored modules (for distro packaging)
- **`dms-qml.tar.gz`** - QML source code only
- **`dms-source.tar.gz`** - Full repository source with bundled DCommon (for distro packaging)
@@ -348,8 +348,8 @@ jobs:
fi
done
# Copy dankinstall binaries
cp _core_assets/dankinstall-*.gz* _release_assets/
# Copy duxinstall binaries
cp _core_assets/duxinstall-*.gz* _release_assets/
# Copy completions
cp _core_assets/completion.* _release_assets/ 2>/dev/null || true
+1 -1
View File
@@ -130,6 +130,6 @@ distro/void/masterdir*/
# Often gets built
core/dms
core/dankinstall
core/duxinstall
core/internal/shellembed/dist
+1 -1
View File
@@ -4,7 +4,7 @@ DMS is an open-source desktop shell for Wayland compositors on linux, built to w
## Repo Structure
- core/ - Go. `cmd/dms` runs quickshell, CLI utilities, and the unix socket server the UI depends on. `cmd/dankinstall` is a separate installer TUI.
- core/ - Go. `cmd/dms` runs quickshell, CLI utilities, and the unix socket server the UI depends on. `cmd/duxinstall` is a separate installer TUI.
- quickshell/ - the entire UI: Common/ (singletons, Theme, settings), Services/ (system and core access), Modules/ (bar, dock, lock, ...), Modals/, Widgets/ (shell-specific widgets and deprecated Dank* shims), PLUGINS/, translations/
- dux-qml-common/ - submodule of shared QML widgets
- docs/, distro/ - IPC and theme docs, packaging
+3 -3
View File
@@ -33,7 +33,7 @@ dux-shell/
│ ├── Widgets/ # Reusable UI controls
│ └── Common/ # Shared resources and themes
├── core/ # Go backend and CLI
│ ├── cmd/ # dms CLI and dankinstall binaries
│ ├── cmd/ # dms CLI and duxinstall binaries
│ ├── internal/ # System integration, IPC, distro support
│ └── pkg/ # Shared packages
├── distro/ # Distribution packaging
@@ -159,12 +159,12 @@ See component-specific documentation:
### Building from Source
**Core + Dankinstall:**
**Core + Duxinstall:**
```bash
cd core
make # Build dms CLI
make dankinstall # Build installer
make duxinstall # Build installer
```
**Shell:**
+11 -11
View File
@@ -1,7 +1,7 @@
BINARY_NAME=dms
BINARY_NAME_INSTALL=dankinstall
BINARY_NAME_INSTALL=duxinstall
SOURCE_DIR=cmd/dms
SOURCE_DIR_INSTALL=cmd/dankinstall
SOURCE_DIR_INSTALL=cmd/duxinstall
BUILD_DIR=bin
SHELL_SRC=../quickshell
EMBED_DIR=internal/shellembed/dist
@@ -32,7 +32,7 @@ else
DIST_ARCHS = $(ARCH)
endif
.PHONY: all build sync-shell dankinstall dist clean install install-all install-dankinstall uninstall uninstall-all uninstall-dankinstall install-config uninstall-config test fmt vet deps print-version help
.PHONY: all build sync-shell duxinstall dist clean install install-all install-duxinstall uninstall uninstall-all uninstall-duxinstall install-config uninstall-config test fmt vet deps print-version help
# Default target
all: build
@@ -58,7 +58,7 @@ build: sync-shell
CGO_ENABLED=0 $(GO) build -tags withshell $(BUILD_LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME) ./$(SOURCE_DIR)
@echo "Build complete: $(BUILD_DIR)/$(BINARY_NAME)"
dankinstall:
duxinstall:
@echo "Building $(BINARY_NAME_INSTALL)..."
@mkdir -p $(BUILD_DIR)
CGO_ENABLED=0 $(GO) build $(BUILD_LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME_INSTALL) ./$(SOURCE_DIR_INSTALL)
@@ -77,7 +77,7 @@ dist: sync-shell
done
@echo "Distribution builds complete"
build-all: build dankinstall
build-all: build duxinstall
install:
@echo "Installing $(BINARY_NAME) to $(INSTALL_DIR)..."
@@ -91,7 +91,7 @@ install-all:
@install -D -m 755 $(BUILD_DIR)/$(BINARY_NAME_INSTALL) $(INSTALL_DIR)/$(BINARY_NAME_INSTALL)
@echo "Installation complete"
install-dankinstall:
install-duxinstall:
@echo "Installing $(BINARY_NAME_INSTALL) to $(INSTALL_DIR)..."
@install -D -m 755 $(BUILD_DIR)/$(BINARY_NAME_INSTALL) $(INSTALL_DIR)/$(BINARY_NAME_INSTALL)
@echo "Installation complete"
@@ -108,7 +108,7 @@ uninstall-all:
@rm -f $(INSTALL_DIR)/$(BINARY_NAME_INSTALL)
@echo "Uninstall complete"
uninstall-dankinstall:
uninstall-duxinstall:
@echo "Uninstalling $(BINARY_NAME_INSTALL) from $(INSTALL_DIR)..."
@rm -f $(INSTALL_DIR)/$(BINARY_NAME_INSTALL)
@echo "Uninstall complete"
@@ -160,16 +160,16 @@ help:
@echo " all - Build the main binary (dms) (default)"
@echo " build - Build the main binary (dms) with the embedded UI"
@echo " sync-shell - Copy quickshell/ into the embed dir (runs before tagged builds)"
@echo " dankinstall - Build dankinstall binary"
@echo " duxinstall - Build duxinstall binary"
@echo " dist - Build dms for linux/freebsd amd64/arm64 (no update/greeter)"
@echo " Use ARCH=amd64 or ARCH=arm64 and/or DIST_OSES=linux to narrow"
@echo " build-all - Build both binaries"
@echo " install - Install dms to $(INSTALL_DIR)"
@echo " install-all - Install both dms and dankinstall to $(INSTALL_DIR)"
@echo " install-dankinstall - Install only dankinstall to $(INSTALL_DIR)"
@echo " install-all - Install both dms and duxinstall to $(INSTALL_DIR)"
@echo " install-duxinstall - Install only duxinstall to $(INSTALL_DIR)"
@echo " uninstall - Remove dms from $(INSTALL_DIR)"
@echo " uninstall-all - Remove both binaries from $(INSTALL_DIR)"
@echo " uninstall-dankinstall - Remove only dankinstall from $(INSTALL_DIR)"
@echo " uninstall-duxinstall - Remove only duxinstall from $(INSTALL_DIR)"
@echo " clean - Clean build artifacts"
@echo " test - Run tests"
@echo " fmt - Format Go code"
+7 -7
View File
@@ -9,7 +9,7 @@ Go-based backend for Dux Shell providing system integration, IPC, and installati
**dms CLI**
Command-line interface and daemon for shell management and system control.
**dankinstall**
**duxinstall**
Distribution-aware installer for deploying DMS and compositor configurations on Arch, Fedora, Debian, Ubuntu, openSUSE, Gentoo, and Void. Supports both an interactive TUI and a headless (unattended) mode via CLI flags.
## System Integration
@@ -102,7 +102,7 @@ Requires Go 1.25+
```bash
make # Build dms CLI
make dankinstall # Build installer
make duxinstall # Build installer
make test # Run tests
```
@@ -142,12 +142,12 @@ go run github.com/duxlabs-dev/dux-go/cmd/go-wayland-scanner@latest \
**Module Structure:**
- `cmd/` - Binary entrypoints (dms, dankinstall)
- `cmd/` - Binary entrypoints (dms, duxinstall)
- `internal/distros/` - Distribution-specific installation logic
- `internal/proto/` - Wayland protocol bindings
- `pkg/` - Shared packages
## Installation via dankinstall
## Installation via duxinstall
**Interactive (TUI):**
@@ -186,7 +186,7 @@ Headless mode requires `--yes` to proceed; without it, the installer exits with
Configuration files are not replaced by default unless `--replace-configs` or `--replace-configs-all` is specified.
Optional packages (`dms-greeter`, `danksearch`, `dankcalendar`) are disabled by default; enable them with their dedicated flags, `--include-deps`, or `--all-features`.
When no flags are provided, `dankinstall` launches the interactive TUI.
When no flags are provided, `duxinstall` launches the interactive TUI.
### Headless mode validation rules
@@ -198,8 +198,8 @@ Headless mode activates when `--compositor` or `--term` is provided.
### Log file location
`dankinstall` writes logs to `/tmp` by default.
Set the `DANKINSTALL_LOG_DIR` environment variable to override the log directory.
`duxinstall` writes logs to `/tmp` by default.
Set the `DUXINSTALL_LOG_DIR` environment variable to override the log directory.
## Supported Distributions
@@ -10,7 +10,7 @@ NC='\033[0m' # No Color
# Get latest version tag
VERSION=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0")
echo -e "${GREEN}Building dankinstall ${VERSION}${NC}"
echo -e "${GREEN}Building duxinstall ${VERSION}${NC}"
# Create bin directory if it doesn't exist
mkdir -p bin
@@ -19,20 +19,20 @@ mkdir -p bin
for ARCH in amd64 arm64; do
echo -e "${BLUE}Building for ${ARCH}...${NC}"
cd cmd/dankinstall
cd cmd/duxinstall
GOOS=linux CGO_ENABLED=0 GOARCH=${ARCH} \
go build -trimpath -ldflags "-s -w -X main.Version=${VERSION}" \
-o ../../bin/dankinstall-${ARCH}
-o ../../bin/duxinstall-${ARCH}
cd ../..
# Compress
gzip -9 -k -f bin/dankinstall-${ARCH}
gzip -9 -k -f bin/duxinstall-${ARCH}
# Generate checksum
(cd bin && sha256sum dankinstall-${ARCH}.gz > dankinstall-${ARCH}.gz.sha256)
(cd bin && sha256sum duxinstall-${ARCH}.gz > duxinstall-${ARCH}.gz.sha256)
echo -e "${GREEN}✓ Built bin/dankinstall-${ARCH}.gz${NC}"
echo -e "${GREEN}✓ Built bin/duxinstall-${ARCH}.gz${NC}"
done
echo -e "${GREEN}Done! Files ready in bin/:${NC}"
ls -lh bin/dankinstall-*
ls -lh bin/duxinstall-*
+1 -1
View File
@@ -288,7 +288,7 @@ func checkSystemInfo() []checkResult {
details := fmt.Sprintf("ID: %s, Version: %s, Arch: %s", osInfo.ID, osInfo.VersionID, osInfo.Architecture)
switch {
case osInfo.Immutable:
details += "; image-based (" + osInfo.ImmutableReason + "), dankinstall deploys configuration only"
details += "; image-based (" + osInfo.ImmutableReason + "), duxinstall deploys configuration only"
case distros.IsUnsupportedDistro(osInfo.Distribution.ID, osInfo.VersionID):
status = statusWarn
message += " (version may not be fully supported)"
@@ -32,9 +32,9 @@ var (
)
var rootCmd = &cobra.Command{
Use: "dankinstall",
Use: "duxinstall",
Short: "Install Dux Shell and its dependencies",
Long: `dankinstall sets up Dux Shell with your chosen compositor and terminal.
Long: `duxinstall sets up Dux Shell with your chosen compositor and terminal.
Without flags, it launches an interactive TUI. Providing either --compositor
or --term activates headless (unattended) mode, which requires both flags.
@@ -42,7 +42,7 @@ or --term activates headless (unattended) mode, which requires both flags.
Headless mode requires cached credentials or a passwordless rule for your
privilege escalation tool (sudo, doas, or run0).`,
Args: cobra.NoArgs,
RunE: runDankinstall,
RunE: runDuxinstall,
SilenceErrors: true,
SilenceUsage: true,
}
@@ -66,7 +66,7 @@ func init() {
func main() {
if os.Getuid() == 0 {
fmt.Fprintln(os.Stderr, "Error: dankinstall must not be run as root")
fmt.Fprintln(os.Stderr, "Error: duxinstall must not be run as root")
os.Exit(1)
}
@@ -76,7 +76,7 @@ func main() {
}
}
func runDankinstall(cmd *cobra.Command, args []string) error {
func runDuxinstall(cmd *cobra.Command, args []string) error {
headlessMode := compositor != "" || term != ""
if !headlessMode {
+3 -3
View File
@@ -43,7 +43,7 @@ if [ -z "$LATEST_VERSION" ]; then
exit 1
fi
printf "%bInstalling Dankinstall %s for %s...%b\n" "$GREEN" "$LATEST_VERSION" "$ARCH" "$NC"
printf "%bInstalling Duxinstall %s for %s...%b\n" "$GREEN" "$LATEST_VERSION" "$ARCH" "$NC"
# Download and install
TEMP_DIR=$(mktemp -d)
@@ -52,8 +52,8 @@ cd "$TEMP_DIR" || exit 1
# Download the gzipped binary and its checksum
printf "%bDownloading installer...%b\n" "$GREEN" "$NC"
curl -L "https://github.com/duxlabs-dev/dux-shell/releases/download/$LATEST_VERSION/dankinstall-$ARCH.gz" -o "installer.gz"
curl -L "https://github.com/duxlabs-dev/dux-shell/releases/download/$LATEST_VERSION/dankinstall-$ARCH.gz.sha256" -o "expected.sha256"
curl -L "https://github.com/duxlabs-dev/dux-shell/releases/download/$LATEST_VERSION/duxinstall-$ARCH.gz" -o "installer.gz"
curl -L "https://github.com/duxlabs-dev/dux-shell/releases/download/$LATEST_VERSION/duxinstall-$ARCH.gz.sha256" -o "expected.sha256"
# Get the expected checksum
EXPECTED_CHECKSUM=$(awk '{print $1}' expected.sha256)
+13 -13
View File
@@ -182,7 +182,7 @@ layout {
}
func TestConfigDeploymentFlow(t *testing.T) {
tempDir, err := os.MkdirTemp("", "dankinstall-test")
tempDir, err := os.MkdirTemp("", "duxinstall-test")
require.NoError(t, err)
defer os.RemoveAll(tempDir)
@@ -312,7 +312,7 @@ func TestHyprlangMonitorLineToLuaPreservesOptions(t *testing.T) {
}
func TestHyprlandConfigDeployment(t *testing.T) {
tempDir, err := os.MkdirTemp("", "dankinstall-hyprland-test")
tempDir, err := os.MkdirTemp("", "duxinstall-hyprland-test")
require.NoError(t, err)
defer os.RemoveAll(tempDir)
@@ -324,7 +324,7 @@ func TestHyprlandConfigDeployment(t *testing.T) {
cd := NewConfigDeployer(logChan)
t.Run("deploy hyprland config to empty directory", func(t *testing.T) {
td, err := os.MkdirTemp("", "dankinstall-hyprland-empty")
td, err := os.MkdirTemp("", "duxinstall-hyprland-empty")
require.NoError(t, err)
defer os.RemoveAll(td)
os.Setenv("HOME", td)
@@ -344,7 +344,7 @@ func TestHyprlandConfigDeployment(t *testing.T) {
})
t.Run("deploy hyprland config with existing monitors", func(t *testing.T) {
td, err := os.MkdirTemp("", "dankinstall-hyprland-merge")
td, err := os.MkdirTemp("", "duxinstall-hyprland-merge")
require.NoError(t, err)
defer os.RemoveAll(td)
os.Setenv("HOME", td)
@@ -408,7 +408,7 @@ general {
})
t.Run("deploy hyprland config removes root legacy symlink when lua exists", func(t *testing.T) {
td, err := os.MkdirTemp("", "dankinstall-hyprland-lua-conf-symlink")
td, err := os.MkdirTemp("", "duxinstall-hyprland-lua-conf-symlink")
require.NoError(t, err)
defer os.RemoveAll(td)
os.Setenv("HOME", td)
@@ -431,7 +431,7 @@ general {
})
t.Run("deploy hyprland config refreshes managed binds but preserves user binds", func(t *testing.T) {
td, err := os.MkdirTemp("", "dankinstall-hyprland-refresh-binds")
td, err := os.MkdirTemp("", "duxinstall-hyprland-refresh-binds")
require.NoError(t, err)
defer os.RemoveAll(td)
os.Setenv("HOME", td)
@@ -457,7 +457,7 @@ general {
}
func TestKittyConfigDeployment(t *testing.T) {
tempDir, err := os.MkdirTemp("", "dankinstall-kitty-test")
tempDir, err := os.MkdirTemp("", "duxinstall-kitty-test")
require.NoError(t, err)
defer os.RemoveAll(tempDir)
@@ -495,7 +495,7 @@ func TestKittyConfigDeployment(t *testing.T) {
}
func TestAlacrittyConfigDeployment(t *testing.T) {
tempDir, err := os.MkdirTemp("", "dankinstall-alacritty-test")
tempDir, err := os.MkdirTemp("", "duxinstall-alacritty-test")
require.NoError(t, err)
defer os.RemoveAll(tempDir)
@@ -570,7 +570,7 @@ func TestShouldReplaceConfigDeployIfMissing(t *testing.T) {
}
t.Run("replaceConfigs nil deploys config", func(t *testing.T) {
tempDir, err := os.MkdirTemp("", "dankinstall-replace-nil-test")
tempDir, err := os.MkdirTemp("", "duxinstall-replace-nil-test")
require.NoError(t, err)
defer os.RemoveAll(tempDir)
@@ -603,7 +603,7 @@ func TestShouldReplaceConfigDeployIfMissing(t *testing.T) {
})
t.Run("replaceConfigs all false and config missing deploys config", func(t *testing.T) {
tempDir, err := os.MkdirTemp("", "dankinstall-replace-missing-test")
tempDir, err := os.MkdirTemp("", "duxinstall-replace-missing-test")
require.NoError(t, err)
defer os.RemoveAll(tempDir)
@@ -636,7 +636,7 @@ func TestShouldReplaceConfigDeployIfMissing(t *testing.T) {
})
t.Run("replaceConfigs false and config exists skips config", func(t *testing.T) {
tempDir, err := os.MkdirTemp("", "dankinstall-replace-exists-test")
tempDir, err := os.MkdirTemp("", "duxinstall-replace-exists-test")
require.NoError(t, err)
defer os.RemoveAll(tempDir)
@@ -678,7 +678,7 @@ func TestShouldReplaceConfigDeployIfMissing(t *testing.T) {
})
t.Run("replaceConfigs true and config exists deploys config", func(t *testing.T) {
tempDir, err := os.MkdirTemp("", "dankinstall-replace-true-test")
tempDir, err := os.MkdirTemp("", "duxinstall-replace-true-test")
require.NoError(t, err)
defer os.RemoveAll(tempDir)
@@ -725,7 +725,7 @@ func TestShouldReplaceConfigDeployIfMissing(t *testing.T) {
})
t.Run("hyprland legacy config exists skips when replace false", func(t *testing.T) {
tempDir, err := os.MkdirTemp("", "dankinstall-hyprland-legacy-skip-test")
tempDir, err := os.MkdirTemp("", "duxinstall-hyprland-legacy-skip-test")
require.NoError(t, err)
defer os.RemoveAll(tempDir)
+1 -1
View File
@@ -735,7 +735,7 @@ func (a *ArchDistribution) installSingleAURPackageInternal(ctx context.Context,
return fmt.Errorf("failed to get user home directory: %w", err)
}
buildDir := filepath.Join(homeDir, ".cache", "dankinstall", "aur-builds", pkg)
buildDir := filepath.Join(homeDir, ".cache", "duxinstall", "aur-builds", pkg)
// Clean up any existing cache first
if err := os.RemoveAll(buildDir); err != nil {
+1 -1
View File
@@ -659,7 +659,7 @@ func (b *BaseDistribution) installDMSBinary(ctx context.Context, sudoPassword st
if err != nil {
return fmt.Errorf("failed to get user home directory: %w", err)
}
tmpDir := filepath.Join(homeDir, ".cache", "dankinstall", "manual-builds")
tmpDir := filepath.Join(homeDir, ".cache", "duxinstall", "manual-builds")
if err := os.MkdirAll(tmpDir, 0o755); err != nil {
return fmt.Errorf("failed to create temp directory: %w", err)
}
+1 -1
View File
@@ -81,7 +81,7 @@ func detectImmutable(fs afero.Fs, osRelease map[string]string) (bool, string) {
func ImmutableGuidance(info *OSInfo) string {
var b strings.Builder
fmt.Fprintf(&b, "%s is an image-based system: %s.\n\n", info.PrettyName, info.ImmutableReason)
b.WriteString("dankinstall has no package mapping for this image, so it cannot tell what is installed or deploy configuration for it. Nothing was changed on this system.\n\n")
b.WriteString("duxinstall has no package mapping for this image, so it cannot tell what is installed or deploy configuration for it. Nothing was changed on this system.\n\n")
b.WriteString("See " + site.Docs + "/getting-started for other options.")
return b.String()
}
+5 -5
View File
@@ -95,8 +95,8 @@ func (m *ManualPackageInstaller) installNiri(ctx context.Context, sudoPassword s
m.log("Installing niri from source...")
homeDir, _ := os.UserHomeDir()
buildDir := filepath.Join(homeDir, ".cache", "dankinstall", "niri-build")
tmpDir := filepath.Join(homeDir, ".cache", "dankinstall", "tmp")
buildDir := filepath.Join(homeDir, ".cache", "duxinstall", "niri-build")
tmpDir := filepath.Join(homeDir, ".cache", "duxinstall", "tmp")
if err := os.MkdirAll(buildDir, 0o755); err != nil {
return fmt.Errorf("failed to create build directory: %w", err)
}
@@ -173,7 +173,7 @@ func (m *ManualPackageInstaller) installQuickshell(ctx context.Context, variant
return fmt.Errorf("HOME environment variable not set")
}
cacheDir := filepath.Join(homeDir, ".cache", "dankinstall")
cacheDir := filepath.Join(homeDir, ".cache", "duxinstall")
if err := os.MkdirAll(cacheDir, 0o755); err != nil {
return fmt.Errorf("failed to create cache directory: %w", err)
}
@@ -279,7 +279,7 @@ func (m *ManualPackageInstaller) installHyprland(ctx context.Context, sudoPasswo
return fmt.Errorf("HOME environment variable not set")
}
cacheDir := filepath.Join(homeDir, ".cache", "dankinstall")
cacheDir := filepath.Join(homeDir, ".cache", "duxinstall")
if err := os.MkdirAll(cacheDir, 0o755); err != nil {
return fmt.Errorf("failed to create cache directory: %w", err)
}
@@ -342,7 +342,7 @@ func (m *ManualPackageInstaller) installGhostty(ctx context.Context, sudoPasswor
return fmt.Errorf("HOME environment variable not set")
}
cacheDir := filepath.Join(homeDir, ".cache", "dankinstall")
cacheDir := filepath.Join(homeDir, ".cache", "duxinstall")
if err := os.MkdirAll(cacheDir, 0o755); err != nil {
return fmt.Errorf("failed to create cache directory: %w", err)
}
+1 -1
View File
@@ -703,7 +703,7 @@ func (o *OpenSUSEDistribution) installQuickshell(ctx context.Context, variant de
return fmt.Errorf("HOME environment variable not set")
}
cacheDir := filepath.Join(homeDir, ".cache", "dankinstall")
cacheDir := filepath.Join(homeDir, ".cache", "duxinstall")
if err := os.MkdirAll(cacheDir, 0o755); err != nil {
return fmt.Errorf("failed to create cache directory: %w", err)
}
+4 -4
View File
@@ -518,14 +518,14 @@ func (r *Runner) resolveSudoPassword() (string, error) {
return "", fmt.Errorf(
"sudo authentication required but no cached credentials found\n" +
"Options:\n" +
" 1. Run 'sudo -v' before dankinstall to cache credentials\n" +
" 1. Run 'sudo -v' before duxinstall to cache credentials\n" +
" 2. Configure passwordless sudo for your user",
)
case privesc.ToolDoas:
return "", fmt.Errorf(
"doas authentication required but no cached credentials found\n" +
"Options:\n" +
" 1. Run 'doas true' before dankinstall to cache credentials (requires 'persist' in /etc/doas.conf)\n" +
" 1. Run 'doas true' before duxinstall to cache credentials (requires 'persist' in /etc/doas.conf)\n" +
" 2. Configure a 'nopass' rule in /etc/doas.conf for your user",
)
case privesc.ToolRun0:
@@ -565,9 +565,9 @@ func (r *Runner) requireLayeredPackages(distro distros.Distribution, dependencie
layerer, ok := distro.(distros.PackageLayerer)
if !ok {
return fmt.Errorf("this image has no known way to add packages; install them with the image's own tooling, reboot, and run dankinstall again")
return fmt.Errorf("this image has no known way to add packages; install them with the image's own tooling, reboot, and run duxinstall again")
}
fmt.Fprintln(os.Stdout, "Packages must be added to the image first. Run these, reboot, then run dankinstall again:")
fmt.Fprintln(os.Stdout, "Packages must be added to the image first. Run these, reboot, then run duxinstall again:")
fmt.Fprintln(os.Stdout)
for _, cmd := range layerer.LayerCommands(dependencies, wm, reinstallItems, disabledItems) {
fmt.Fprintf(os.Stdout, " %s\n", cmd)
+8 -5
View File
@@ -23,15 +23,18 @@ type FileLogger struct {
func NewFileLogger() (*FileLogger, error) {
timestamp := time.Now().Unix()
// Use DANKINSTALL_LOG_DIR if set, otherwise fall back to /tmp.
logDir := os.Getenv("DANKINSTALL_LOG_DIR")
logDir := os.Getenv("DUXINSTALL_LOG_DIR")
if logDir == "" {
// Pre-rename name, still set in existing scripts.
logDir = os.Getenv("DANKINSTALL_LOG_DIR")
}
if logDir == "" {
logDir = "/tmp"
}
if err := os.MkdirAll(logDir, 0o755); err != nil {
return nil, fmt.Errorf("failed to create log directory: %w", err)
}
logPath := filepath.Join(logDir, fmt.Sprintf("dankinstall-%d.log", timestamp))
logPath := filepath.Join(logDir, fmt.Sprintf("duxinstall-%d.log", timestamp))
file, err := os.Create(logPath)
if err != nil {
@@ -49,7 +52,7 @@ func NewFileLogger() (*FileLogger, error) {
passwordRe: passwordRe,
}
header := fmt.Sprintf("=== DankInstall Log ===\nStarted: %s\n\n", time.Now().Format(time.RFC3339))
header := fmt.Sprintf("=== DuxInstall Log ===\nStarted: %s\n\n", time.Now().Format(time.RFC3339))
logger.writeToFile(header)
return logger, nil
@@ -102,7 +105,7 @@ func (l *FileLogger) Close() error {
l.mu.Lock()
defer l.mu.Unlock()
footer := fmt.Sprintf("\n=== DankInstall Log End ===\nCompleted: %s\n", time.Now().Format(time.RFC3339))
footer := fmt.Sprintf("\n=== DuxInstall Log End ===\nCompleted: %s\n", time.Now().Format(time.RFC3339))
l.writer.WriteString(footer) //nolint:errcheck
l.writer.Flush()
+1 -1
View File
@@ -19,7 +19,7 @@ func resumePath() string {
if dir == "" {
dir = filepath.Join(os.Getenv("HOME"), ".local", "state")
}
return filepath.Join(dir, "dankinstall", "resume.json")
return filepath.Join(dir, "duxinstall", "resume.json")
}
func saveLayerResume(r layerResume) error {
+2 -2
View File
@@ -78,10 +78,10 @@ func (m Model) viewLayerPackages() string {
commands := m.layerCommands()
if len(commands) == 0 {
b.WriteString(m.styles.Normal.Render(wrapText("This image has no known way to add these packages. Install them from the image's own tooling, reboot, and run dankinstall again.", 70)))
b.WriteString(m.styles.Normal.Render(wrapText("This image has no known way to add these packages. Install them from the image's own tooling, reboot, and run duxinstall again.", 70)))
b.WriteString("\n\n")
} else {
b.WriteString(m.styles.Normal.Render("Run these, reboot, then run dankinstall again. It picks up from here and deploys configuration:"))
b.WriteString(m.styles.Normal.Render("Run these, reboot, then run duxinstall again. It picks up from here and deploys configuration:"))
b.WriteString("\n\n")
for _, cmd := range commands {
b.WriteString(" " + m.styles.Accent.Render(cmd))
+3 -3
View File
@@ -18,7 +18,7 @@ func (m Model) viewWelcome() string {
b.WriteString(m.styles.Accent.Render(strings.Repeat("━", 58)))
b.WriteByte('\n')
b.WriteString(m.styles.TitleBox.Render(
m.styles.Highlight.Render("dankinstall") + m.styles.AccentItalic.Render(" // Dux Labs Installer")))
m.styles.Highlight.Render("duxinstall") + m.styles.AccentItalic.Render(" // Dux Labs Installer")))
b.WriteByte('\n')
b.WriteString(m.styles.SubtleItalic.Render("Quickstart for a Dux Desktop"))
b.WriteString("\n\n")
@@ -67,14 +67,14 @@ func (m Model) writeImmutableSystem(b *strings.Builder) {
func (m Model) writeImmutableNotice(b *strings.Builder) {
title := m.styles.Warning.Bold(true).Render("Image-based system: " + m.osInfo.ImmutableReason)
msg := wrapText("dankinstall will not install packages or ask for a password here. It checks what is installed, lists anything missing with the command to layer it, and deploys configuration into your home directory.", 70)
msg := wrapText("duxinstall will not install packages or ask for a password here. It checks what is installed, lists anything missing with the command to layer it, and deploys configuration into your home directory.", 70)
b.WriteString(m.styles.InfoBox.Render(title + "\n" + m.styles.Normal.Render(msg)))
b.WriteString("\n\n")
}
func (m Model) writeResumeNotice(b *strings.Builder) {
title := m.styles.Success.Bold(true).Render(fmt.Sprintf("▶ Resuming setup: %s with %s", m.resume.WindowManager, m.resume.Terminal))
msg := wrapText("Press Enter to finish. dankinstall checks that the layered packages are installed and deploys configuration into your home directory. No packages are installed and no password is needed.", 70)
msg := wrapText("Press Enter to finish. duxinstall checks that the layered packages are installed and deploys configuration into your home directory. No packages are installed and no password is needed.", 70)
b.WriteString(m.styles.InfoBox.Render(title + "\n" + m.styles.Normal.Render(msg)))
b.WriteString("\n\n")
}
+1 -1
View File
@@ -126,4 +126,4 @@ sudo ln -sf /etc/sv/dbus /var/service/dbus
sudo ln -sf /etc/sv/elogind /var/service/elogind
```
The `dankinstall` Void path enables both services after installing packages.
The `duxinstall` Void path enables both services after installing packages.