16 Commits

Author SHA1 Message Date
markus.block b1f7c675c6 Release v10 (#11)
Reviewed-on: lxcafe/lxcafe#11
2026-03-15 12:07:42 +01:00
markus.block 63e26040fa release-process-improvements (#10)
Reviewed-on: lxcafe/lxcafe#10
2026-03-15 12:05:52 +01:00
markus.block fb40815e6c download-selected-google-fonts (#9)
Reviewed-on: lxcafe/lxcafe#9
2026-03-15 10:57:44 +01:00
markus.block b9693a455a do not expect Aptos font file but download it when needed (#8)
Reviewed-on: lxcafe/lxcafe#8
2026-03-14 17:02:38 +01:00
markus.block 5bffe8f68f release-process (#7)
Reviewed-on: lxcafe/lxcafe#7
2026-02-22 19:24:28 +01:00
markus.block c3828b8112 release-process (#6)
Reviewed-on: lxcafe/lxcafe#6
2026-02-22 19:09:49 +01:00
markus.block 3c014a480c release-process (#5)
Reviewed-on: lxcafe/lxcafe#5
2026-02-22 18:59:34 +01:00
markus.block 556ead922f fix-panel-config (#4)
Reviewed-on: lxcafe/lxcafe#4
2026-02-22 17:50:16 +01:00
markus.block fb04ecd1ed install-aptos-fonts (#3)
Reviewed-on: lxcafe/lxcafe#3
2026-02-22 17:27:33 +01:00
lxcafe 375ad53a4d Merge pull request 'fix-script-portability' (#2) from markus.block/lxcafe:fix-script-portability into main
Reviewed-on: lxcafe/lxcafe#2
2026-02-19 09:05:39 +01:00
markus.block 1c10ae2610 fixed line breaks and script exit 2026-02-15 19:02:36 +01:00
markus.block 1b262b55d7 added section for agents regarding session storage 2026-02-15 18:20:28 +01:00
markus.block 34d6707ba3 removed apt simulation doing now real apt updates/install 2026-02-15 18:18:30 +01:00
markus.block bc1e17ec04 added test infrastructure based on docker/podman
* documentation added
* scripts to setup image and start container added
2026-02-15 17:56:39 +01:00
markus.block 3c6856d68b fixed problem with unexpected operator after pressing 'j' 2026-02-14 18:52:13 +01:00
markus.block fc1554cee9 added latest Nachinstallationsarbeiten script provided by Martin 2026-02-14 17:17:34 +01:00
15 changed files with 770 additions and 601 deletions
+140
View File
@@ -0,0 +1,140 @@
# AGENTS.md
Guidelines for agentic coding assistants working in this repository.
## Repository Overview
- **Type**: Shell script project for Linux Mint XFCE post-installation setup
- **Main scripts**: `post_installation_script/` - Linux Mint XFCE post-installation automation
- **Testing**: `post_installation_script_test/` - Docker/Podman container-based testing
- **No build system**: Pure shell scripts, no package.json/Makefile/Cargo.toml
---
## 1) Build / Lint / Test Commands
### Shell Scripts
```bash
# Syntax check only (no execution)
bash -n path/to/script.sh
# Trace execution (shows each command as it runs)
bash -x path/to/script.sh
# Lint with shellcheck (install with: apt install shellcheck)
shellcheck post_installation_script/*.sh
# Run individual script
bash path/to/script.sh
./script.sh # requires executable bit: chmod +x script.sh
```
### Container-Based Testing
```bash
# Build test image (Ubuntu 22.04 with useful utilities)
cd post_installation_script_test
bash 01_create_image.sh
# Start interactive container (auto-removed on exit)
bash 02_start_container_with_image.sh
# Inside container - source scripts mounted at /workspace:
bash /workspace/<scriptName>.sh
```
### Single Test Commands (for future languages)
```bash
# Python: pytest path/to/test.py::TestClass::test_method -q
# Node/Jest: npx jest path/to/file.test.js -t "test name regex"
# Node/Vitest: npx vitest run path/to/file.spec.ts -t "test name"
# Go: go test ./pkg/name -run TestFunctionName
# Rust: cargo test test_name -- --exact
# Java/Maven: mvn -Dtest=ClassName#methodName test
# .NET: dotnet test --filter FullyQualifiedName~Namespace.ClassName.MethodName
```
---
## 2) Code Style Guidelines
### Shell Scripts (Primary Language)
- **Shebang**: Use `#!/bin/bash` (not `/bin/sh`) for bash-specific features
- **Safety**: Use `set -euo pipefail` at script start
- **Quotes**: Always use double quotes for variable expansion: `"$VAR"`, never bare `$VAR`
- **Conditionals**: Use `[[ ]]` for tests, not `[ ]`
- **Variables**: Use `readonly` for constants, `local` for function-scoped variables
- **Performance**: Prefer functions over subshells when possible
- **Naming**: Use descriptive function names: `install_fonts()`, `configure_panel()`, `prompt_user()`
- **Errors**: Write to stderr: `echo "Error: $msg" >&2`
- **Exit codes**: 0=success, 1=general error, 2=invalid usage
- **Comments**: Avoid unless explaining non-obvious behavior
- **Constants**: Define at top of script, UPPER_SNAKE_CASE
### General Conventions
- **Formatting**: Use automated formatters (Black/Prettier/gofmt/rustfmt) - commit formatted code
- **Types**: Prefer explicit typing (TypeScript types, Python type hints, Go static types)
- **Naming**:
- snake_case: variables, functions (`user_id`, `calculate_total`)
- PascalCase: types/classes (`UserService`, `HttpClient`)
- UPPER_SNAKE_CASE: constants (`MAX_RETRIES`, `API_BASE_URL`)
- **Imports**: Keep minimal, group logically (stdlib → third-party → local), blank line between groups
- **Functions**: Keep small (<40 lines), single responsibility, pure where possible
- **Error handling**: Fail fast with context, avoid silent failures, use typed errors where supported
- **Tests**: Deterministic, mock external I/O, explicit names like `test_should_return_400_when_missing_field`
- **Resources**: Always clean up with `finally`/`defer` equivalents
---
## 3) Security
- Never commit secrets, API keys, credentials, or tokens
- Use environment variables for sensitive values
- Validate and sanitize all external input
- Run linting (`shellcheck`) before committing shell scripts
---
## 4) Commit Guidelines
- Make small, focused commits with descriptive messages
- Include formatter command in commit message if auto-formatting
- When changing behavior, add or update tests
- Run full test suite before opening PRs
---
## 5) Cursor / Copilot Rules
- `.cursor/rules/`: Not present
- `.cursorrules`: Not present
- `.github/copilot-instructions.md`: Not present
---
## 6) Repo Housekeeping
- Store session logs in `.agents/sessions/` for reference
- When adding new languages, update this file with exact build/test commands
---
## Files Referenced
- `README.md` - Project overview
- `post_installation_script/README.md` - Script usage and details
- `post_installation_script_test/README.md` - Container testing instructions
---
## Quick Checklist for Changes
- [ ] Run `shellcheck` on shell scripts before committing
- [ ] Verify `bash -n` syntax check passes
- [ ] Test script changes in container first
- [ ] No secrets in code - use environment variables
- [ ] Run tests if added for new functionality
+24
View File
@@ -0,0 +1,24 @@
# OS
.DS_Store
Thumbs.db
*~
# IDE
.idea/
*.swp
*.swo
*~
.vscode/
# Test containers
*.tar.gz
fonts-main/
*.log
# Temporary files
tmp/
temp/
*.tmp
# agent specific sessions
.agents/sessions/*
+128
View File
@@ -0,0 +1,128 @@
#!/usr/bin/env bash
set -e
question_answered_with_yes() {
local prompt="$1"
local ans
printf '%b\n Enter y or n and press Enter,\n abort with any other key ... [y/N]: ' "$prompt"
read -r ans
case "$ans" in
y|Y) return 0 ;;
n|N|"") return 1 ;;
*) echo "Aborted."; exit 1 ;;
esac
}
if [ -n "$(git status --porcelain)" ]; then
echo "Error: You have uncommitted local changes."
echo "Please commit or stash them before releasing."
echo ""
echo "Uncommitted files:"
git status --short
exit 1
fi
echo "Fetching latest changes..."
git fetch origin
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
if [ "$CURRENT_BRANCH" = "main" ]; then
echo "Pulling latest from main..."
git pull origin main || true
else
echo "Error: You must be on the main branch to create a release."
echo "Current branch: $CURRENT_BRANCH"
exit 1
fi
VERSION_FILE="VERSION"
SCRIPT_FILE="post_installation_script/Nachinstallationsarbeiten_LC_Esslingen_XFCE.sh"
if [ ! -f "$VERSION_FILE" ]; then
echo "Error: $VERSION_FILE not found"
exit 1
fi
CURRENT_VERSION=$(cat "$VERSION_FILE" | tr -d '\n')
if [ ! -f "$SCRIPT_FILE" ]; then
echo "Error: $SCRIPT_FILE not found"
exit 1
fi
CURRENT_MAJOR=${CURRENT_VERSION#v}
if ! [[ "$CURRENT_VERSION" =~ ^v[0-9]+$ ]]; then
echo "Error: Invalid version format in $VERSION_FILE. Expected v0, v1, v2, etc."
exit 1
fi
NEXT_VERSION=$((CURRENT_MAJOR + 1))
NEXT_VERSION_STR="v$NEXT_VERSION"
RELEASE_BRANCH="release/$NEXT_VERSION_STR"
if git ls-remote --heads origin "$RELEASE_BRANCH" 2>/dev/null | grep -q .; then
echo "Error: Branch $RELEASE_BRANCH already exists on remote."
exit 1
fi
if git rev-parse "$RELEASE_BRANCH" >/dev/null 2>&1; then
echo "Branch $RELEASE_BRANCH exists locally."
if question_answered_with_yes "Delete local branch and continue?"; then
git branch -D "$RELEASE_BRANCH"
else
echo "Release aborted."
exit 0
fi
fi
echo "Current version: $CURRENT_VERSION"
echo "Proposed version: $NEXT_VERSION_STR"
echo "Release branch: $RELEASE_BRANCH"
echo ""
if ! question_answered_with_yes "Confirm release version $NEXT_VERSION_STR?"; then
echo "Release aborted."
exit 0
fi
echo "Creating release branch $RELEASE_BRANCH..."
git checkout -b "$RELEASE_BRANCH"
echo "$NEXT_VERSION_STR" > "$VERSION_FILE"
sed -i.bak "s/^SCRIPT_VERSION=.*/SCRIPT_VERSION=\"$NEXT_VERSION_STR\"/" "$SCRIPT_FILE"
if [ -f "${SCRIPT_FILE}.bak" ]; then
rm "${SCRIPT_FILE}.bak"
fi
git add "$VERSION_FILE" "$SCRIPT_FILE"
git commit -m "Release $NEXT_VERSION_STR"
echo ""
echo "Release $NEXT_VERSION_STR prepared on branch $RELEASE_BRANCH."
if question_answered_with_yes "Push release branch to origin?"; then
git push -u origin "$RELEASE_BRANCH"
echo ""
echo "Branch pushed to origin."
echo ""
echo "Next steps:"
echo "1. Create a PR from $RELEASE_BRANCH to main"
echo " - Via web: Go to your git hosting and create a PR"
echo " - Or: gh pr create --base main --head $RELEASE_BRANCH"
echo ""
echo "2. After PR is merged, create a tag:"
echo " git checkout main && git pull"
echo " git tag -a $NEXT_VERSION_STR -m \"Release $NEXT_VERSION_STR\""
echo " git push origin $NEXT_VERSION_STR"
echo ""
echo "3. Gitea will create a release from the tag"
else
echo ""
echo "Release prepared locally. Push manually with:"
echo " git push -u origin $RELEASE_BRANCH"
echo ""
echo "Then create a PR to main via your git hosting."
fi
+42
View File
@@ -0,0 +1,42 @@
#!/usr/bin/env bash
set -e
question_answered_with_yes() {
local prompt="$1"
local ans
printf '%b\n Enter y or n and press Enter,\n abort with any other key ... [y/N]: ' "$prompt"
read -r ans
case "$ans" in
y|Y) return 0 ;;
n|N|"") return 1 ;;
*) echo "Aborted."; exit 1 ;;
esac
}
echo "Fetching latest from origin..."
git fetch origin
git checkout main
git pull origin main
VERSION_FILE="VERSION"
CURRENT_VERSION=$(cat "$VERSION_FILE" | tr -d '\n')
echo "Finalising release of version: $CURRENT_VERSION"
if ! question_answered_with_yes "Create tag $CURRENT_VERSION on main?"; then
echo "Tag creation aborted."
exit 0
fi
git tag -a "$CURRENT_VERSION" -m "Release $CURRENT_VERSION"
if question_answered_with_yes "Push tag to origin?"; then
git push origin "$CURRENT_VERSION"
echo ""
echo "Tag $CURRENT_VERSION pushed to origin."
echo "Gitea will create a release from the tag."
else
echo "Tag created locally. Push manually with:"
echo " git push origin $CURRENT_VERSION"
fi
@@ -1,380 +0,0 @@
#!/bin/bash
cMode="KeineSimulation"
cMode="simulation"
bIsVlcInstalled=false
echo "
###################################
#### Nachinstallationsarbeiten ####
###################################
"
#
#
#
if [ "$cMode" != "KeineSimulation" ]; then
echo " simulation sudo apt-get update"
else
sudo apt-get update
fi
sSuffixDate=$(date '+%Y-%m-%d_%H:%M:%S')
echo
echo
echo "A) #### 64 bit Mint XFCE ####"
echo "B) #### 32 bit Debian XFCE ####"
echo "q) Quit. Abbruch"
echo "sonst <enter> zum überspringen."
read -p "
Geben Sie a oder b ein und die Eingabetaste,
Abbruch mit jeder anderen Taste ... " option;
case "$option" in
[aAmM])
echo "A) #### 64 bit Mint XFCE ####"
if [ "$cMode" != "KeineSimulation" ]; then
echo "simulation
sudo apt -y install xfce4-goodies clementine vlc htop hardinfo font-manager asunder gtkhash pcmanfm
";
bIsVlcInstalled=true
else
sudo apt -y install xfce4-goodies clementine vlc htop hardinfo font-manager asunder gtkhash pcmanfm
bIsVlcInstalled=true
fi
;;
[bBdD])
echo "#### 32 bit Debian XFCE ####"
echo "## sources list"
if [ "$cMode" != "KeineSimulation" ]; then
echo "### Paketquellen eintragen:"
echo " cp /etc/apt/sources.list /etc/apt/sources.list_" $sSuffixDate
echo "simulation deb http://deb.debian.org/debian bookworm main contrib non-free > /etc/apt/sources.list"
echo "simulation deb-src http://deb.debian.org/debian bookworm main contrib non-free >> /etc/apt/sources.list"
echo "simulation deb http://deb.debian.org/debian-security/ bookworm-security main contrib non-free >> /etc/apt/sources.list"
echo "simulation deb-src http://deb.debian.org/debian-security/ bookworm-security main contrib non-free >> /etc/apt/sources.list"
echo "simulation deb http://deb.debian.org/debian bookworm-updates main contrib non-free >> /etc/apt/sources.list"
echo "simulation deb-src http://deb.debian.org/debian bookworm-updates main contrib non-free >> /etc/apt/sources.list"
echo "### zusätzliche Standardprogramme installieren:"
echo "simulation sudo apt install xfce4-goodies clementine vlc htop hardinfo font-manager asunder gtkhash pcmanfm timeshift gnome-system-tools gnome-disk-utility inxi "
bIsVlcInstalled=true
echo " FIN #### 64 bit Mint XFCE ####"
else
echo "### Paketquellen eintragen:"
cp /etc/apt/sources.list /etc/apt/sources.list_$sSuffixDate
deb http://deb.debian.org/debian bookworm main contrib non-free > /etc/apt/sources.list
deb-src http://deb.debian.org/debian bookworm main contrib non-free >> /etc/apt/sources.list
deb http://deb.debian.org/debian-security/ bookworm-security main contrib non-free >> /etc/apt/sources.list
deb-src http://deb.debian.org/debian-security/ bookworm-security main contrib non-free >> /etc/apt/sources.list
deb http://deb.debian.org/debian bookworm-updates main contrib non-free >> /etc/apt/sources.list
deb-src http://deb.debian.org/debian bookworm-updates main contrib non-free >> /etc/apt/sources.list
echo "### zusätzliche Standardprogramme installieren:"
sudo apt install xfce4-goodies clementine vlc htop hardinfo font-manager asunder gtkhash pcmanfm timeshift gnome-system-tools gnome-disk-utility inxi
bIsVlcInstalled=true
echo " FIN #### 32 bit Debian XFCE ####"
fi
;;
q) echo "Quit. Abbruch"
exit
;;
*) echo "Unknown parameter"
esac
echo ""
echo ""
echo "#### alle Systeme ####"
#
echo "### Taskleiste mit XFCE-Applets für Systemauslastung und 2x Netzwerkmonitor (LAN + WLAN) ergänzen und konfigurieren"
echo " leider fehlt die automatisierung noch "
echo " Manuelle Arbeit notwendig "
#
#
#
#
echo
echo
echo "#### nur auf Wunsch / bei Bedarf ####"
#
echo
echo
echo
### Sensoren ###
# alle Abfragen können mit "ja" beantwortet werden!
read -p " ### Sensoren ###
Geben Sie j oder n ein und die Eingabetaste,
Abbruch mit jeder anderen Taste ... " kommando;
if [ $kommando == 'j' -o $kommando == 'J' -o $kommando == 'ja' -o $kommando == 'y' -o $kommando == 'Y' ]; then
echo "### Sensoren ###"
if [ "$cMode" != "KeineSimulation" ]; then
echo " simulation "
echo " apt -y Automatic yes to prompts; assume "yes" as answer to all prompts and run non-interactively."
echo "simulation sudo apt -y install lm-sensors psensor"
echo "simulation sudo sensors-detect"
echo "# alle Abfragen können mit "ja" beantwortet werden!"
echo "simulation sudo service kmod start"
else
sudo apt install lm-sensors psensor
sudo sensors-detect
echo "# alle Abfragen können mit "ja" beantwortet werden!"
sudo service kmod start
echo "## dann psensor konfigurieren im Applet in der Taskleiste"
fi
fi
echo
echo
if $bIsVlcInstalled; then
echo "### Kauf-DVDs abspielen ###"
read -p " ### Film DVDs ###
Geben Sie j oder n ein und die Eingabetaste,
Abbruch mit jeder anderen Taste ... " kommando;
if [ $kommando == 'j' -o $kommando == 'J' -o $kommando == 'ja' -o $kommando == 'y' -o $kommando == 'Y' ]; then
echo "### Sensoren ###"
if [ "$cMode" != "KeineSimulation" ]; then
echo " simulation "
echo "simulation sudo service kmod start"
echo " simulation sudo apt install libdvd-pkg"
echo " simulationsudo dpkg-reconfigure libdvd-pkg"
else
sudo apt install libdvd-pkg
sudo dpkg-reconfigure libdvd-pkg
fi
fi
else
echo "Player Fehlt
## vlc muss installiert sein! Zum Kauf-DVDs abspielen"
fi
echo
echo
echo "### Schriften, falls Microsoft-Office-Dokumente weiterverwendet werden sollen oder Dokumentenaustausch mit Microsoft-Nutzern gewünscht ist ###
## frei verfügbare, alte Microsoft-Standardschriften installieren:"
read -p " ### M$ Schriften ###
Geben Sie j oder n ein und die Eingabetaste,
Abbruch mit jeder anderen Taste ... " kommando;
if [ $kommando == 'j' -o $kommando == 'J' -o $kommando == 'ja' -o $kommando == 'y' -o $kommando == 'Y' ]; then
echo "### M$ Schriften ###"
if [ "$cMode" != "KeineSimulation" ]; then
echo "simulation
sudo apt install ttf-mscorefonts-installer"
else
sudo apt install ttf-mscorefonts-installer
fi
fi
echo
echo
echo " ## freie Google-Schriften mit gleicher Laufweite wie aktuelle MS-Standardschriften installieren:"
read -p " ### Google Schriften ###
Geben Sie j oder n ein und die Eingabetaste,
Abbruch mit jeder anderen Taste ... " kommando;
if [ $kommando == 'j' -o $kommando == 'J' -o $kommando == 'ja' -o $kommando == 'y' -o $kommando == 'Y' ]; then
echo
echo "### Google Schriften ###"
if [ "$cMode" != "KeineSimulation" ]; then
_gf="google-fonts"
fGoogleSchriften=./$_gf".tar.gz"
if [ ! -f "$fGoogleSchriften" ]; then
echo
echo "$fGoogleSchriften nicht gefunden."
echo " soll das Archiv "google-fonts.tar.gz" von Github runter geladen werden ca. 1GB gross! "
read -p " ### Download Google Schriften ### j/n: " runterLaden;
if [ $runterLaden == 'j' -o $runterLaden == 'J' -o $runterLaden == 'ja' -o $runterLaden == 'y' -o $runterLaden == 'Y' ]; then
echo " Download Google Schriften ###"
echo "simulation
_wgeturl=https://github.com/google/fonts/archive/main.tar.gz
_gf=google-fonts
o Connecting to Github server to download fonts...
wget $_wgeturl -O $_gf.tar.gz"
fi
fi
if [ -f "$fGoogleSchriften" ]; then
echo
echo "Extracting the downloaded archive..."
echo " simulationtar -zxvf $_gf.tar.gz"
echo "Creating the /usr/share/fonts/truetype/$_gf folder"
echo " simulationsudo mkdir -p /usr/share/fonts/truetype/$_gf"
echo "Installing all .ttf fonts in /usr/share/fonts/truetype/$_gf"
echo " simulationfind $PWD/fonts-main/ -name "*.ttf" -exec sudo install -m644 {} /usr/share/fonts/truetype/google-fonts/ \; "
echo "Updating the font cache"
echo " simulationfc-cache -f"
else
echo "Schriften Fehlen immer noch. Manuell runterladen und installieren"
fi
# "Simulation"
else
# "KeineSimulation"
_gf="google-fonts"
fGoogleSchriften=./$_gf".tar.gz"
if [ ! -f "$fGoogleSchriften" ]; then
echo ""
echo "$fGoogleSchriften nicht gefunden."
echo " soll das Archiv "google-fonts.tar.gz" von Github runter geladen werden ca. 1GB gross! "
read -p " ### Download Google Schriften ### " runterLaden;
if [ $runterLaden == 'j' -o $runterLaden == 'J' -o $runterLaden == 'ja' -o $runterLaden == 'y' -o $runterLaden == 'Y' ]; then
_wgeturl="https://github.com/google/fonts/archive/main.tar.gz"
echo "Connecting to Github server to download fonts..."
wget $_wgeturl -O $_gf.tar.gz
fi
fi
if [ -f "$fGoogleSchriften" ]; then
echo
echo "$fGoogleSchriften nicht gefunden."
echo "Extracting the downloaded archive..."
tar -zxvf $_gf.tar.gz
echo "Creating the /usr/share/fonts/truetype/$_gf folder"
sudo mkdir -p /usr/share/fonts/truetype/$_gf
echo "Installing all .ttf fonts in /usr/share/fonts/truetype/$_gf"
find $PWD/fonts-main/ -name "*.ttf" -exec sudo install -m644 {} /usr/share/fonts/truetype/google-fonts/ \; || echo "An error occured, please run this script again."
echo "Updating the font cache"
fc-cache -f
echo "Done. Now you can delete the tarball file $_gf.tar.gz if you wish."
else
echo "Schriften Fehlen immer noch. Manuell runterladen und installieren"
fi
# "KeineSimulation"
fi
fi
#
echo
echo
echo "#### Chromium Browser installieren:"
read -p " ### Chromium ###
Geben Sie j oder n ein und die Eingabetaste,
Abbruch mit jeder anderen Taste ... " kommando;
if [ $kommando == 'j' -o $kommando == 'J' -o $kommando == 'ja' -o $kommando == 'y' -o $kommando == 'Y' ]; then
echo "### Chromium ###"
if [ "$cMode" != "KeineSimulation" ]; then
echo "simulation
sudo apt install chromium
sudo apt install chromium-browser
"
echo " tbd DateiName!?
## Gnome-Schlüsselbund-Fehlermeldung bei jedem Start von Chrome/Chromium beheben: Starter bzw. .desktop-Datei mit folgendem Parameter ergänzen:
## --password-store=basic "
else
sudo apt install chromium-browser
fi88=
fi
fi
echo
echo
echo "### Vivaldi Browser installieren:#### "
read -p " ### Vivaldi ###
Geben Sie j oder n ein und die Eingabetaste,
Abbruch mit jeder anderen Taste ... " kommando;
if [ $kommando == 'j' -o $kommando == 'J' -o $kommando == 'ja' -o $kommando == 'y' -o $kommando == 'Y' ]; then
echo "### ###"
if [ "$cMode" != "KeineSimulation" ]; then
echo "simulation
## nötige Zusatzpakete installieren
sudo apt install dirmngr ca-certificates software-properties-common apt-transport-https curl -y
## key importieren
curl -fsSL https://repo.vivaldi.com/archive/linux_signing_key.pub | gpg --dearmor | sudo tee /usr/share/keyrings/vivaldi.gpg > /dev/null
## Repository hinzufügen
echo deb [arch=amd64,armhf signed-by=/usr/share/keyrings/vivaldi.gpg] https://repo.vivaldi.com/stable/deb/ stable main | sudo tee /etc/apt/sources.list.d/vivaldi.list
sudo apt update && sudo apt install vivaldi-stable"
echo " tbd DateiName!?
## Gnome-Schlüsselbund-Fehlermeldung bei jedem Start von Chrome/Chromium beheben: Starter bzw. .desktop-Datei mit folgendem Parameter ergänzen:
## --password-store=basic "
else
echo "## nötige Zusatzpakete installieren"
sudo apt install dirmngr ca-certificates software-properties-common apt-transport-https curl -y
#
echo "## ## key importieren"
curl -fsSL https://repo.vivaldi.com/archive/linux_signing_key.pub | gpg --dearmor | sudo tee /usr/share/keyrings/vivaldi.gpg > /dev/null
#
echo "## ## Repository hinzufügen"
echo deb [arch=amd64,armhf signed-by=/usr/share/keyrings/vivaldi.gpg] https://repo.vivaldi.com/stable/deb/ stable main | sudo tee /etc/apt/sources.list.d/vivaldi.list
#
sudo apt update && sudo apt install vivaldi-stable
#
echo "## ## Gnome-Schlüsselbund-Fehlermeldung bei jedem Start von Chrome/Chromium beheben: Starter bzw. .desktop-Datei mit folgendem Parameter ergänzen: "
echo "## ## --password-store=basic"
#
fi
fi
echo
echo
echo "####Signal für Desktop (setzt Signalinstallation auf einem Android- Oder Apple-Gerät voraus!)#### "
read -p " ### Signal ###
Geben Sie j oder n ein und die Eingabetaste,
Abbruch mit jeder anderen Taste ... " kommando;
if [ $kommando == 'j' -o $kommando == 'J' -o $kommando == 'ja' -o $kommando == 'y' -o $kommando == 'Y' ]; then
echo "### ###"
if [ "$cMode" != "KeineSimulation" ]; then
echo "simulation
## zusätzliches Repository nötig!
#
## NOTE: These instructions only work for 64-bit Debian-based
## Linux distributions such as Ubuntu, Mint etc.
#
## key importieren
wget -O- https://updates.signal.org/desktop/apt/keys.asc | gpg --dearmor > signal-desktop-keyring.gpg
cat signal-desktop-keyring.gpg | sudo tee /usr/share/keyrings/signal-desktop-keyring.gpg > /dev/null
## Repository hinzufügen:
echo 'deb [arch=amd64 signed-by=/usr/share/keyrings/signal-desktop-keyring.gpg] https://updates.signal.org/desktop/apt xenial main' | sudo tee /etc/apt/sources.list.d/signal-xenial.list
sudo apt update && sudo apt install signal-desktop
"
else
echo "## zusätzliches Repository nötig!
## NOTE: These instructions only work for 64-bit Debian-based
## Linux distributions such as Ubuntu, Mint etc.
## key importieren
"
wget -O- https://updates.signal.org/desktop/apt/keys.asc | gpg --dearmor > signal-desktop-keyring.gpg
cat signal-desktop-keyring.gpg | sudo tee /usr/share/keyrings/signal-desktop-keyring.gpg > /dev/null
#
echo "## Repository hinzufügen:"
echo 'deb [arch=amd64 signed-by=/usr/share/keyrings/signal-desktop-keyring.gpg] https://updates.signal.org/desktop/apt xenial main' | sudo tee /etc/apt/sources.list.d/signal-xenial.list
sudo apt update && sudo apt install signal-desktop
#
fi
fi
echo
echo
echo "Skript ENDE"
echo
echo
echo
echo "Manuelle Schritte"
echo
echo "### Taskleiste mit XFCE-Applets für Systemauslastung und 2x Netzwerkmonitor (LAN + WLAN) ergänzen und konfigurieren"
echo
echo
echo "Wenn
### Sensoren ###
installiert wurden
## dann psensor konfigurieren im Applet in der Taskleiste "
echo
echo
+56 -1
View File
@@ -1,4 +1,59 @@
# lxcafe Repository # lxcafe Repository
Linux Mint post-installation scripts.
Ablage für Code Schnipsel ## Structure
- **post_installation_script/** - Main post-installation scripts for Linux Mint XFCE
- **post_installation_script_test/** - Docker based testing environment for script development
- **.agents/** - Agent instructions for AI-assisted development
See individual README files in each directory for detailed information on usage and development.
## Test post installation script
To test the full functionality of post-installation script in a safe, isolated environment, use VirtualBox or similar virtualization
software to create a virtual machine with Linux Mint XFCE. Then, copy the script to the virtual machine and run it there.
This allows you to test the script without affecting your main system.
You can also make use of snapshot feature of the virtualization software to easily revert to a clean state after testing,
e.g. state directly after Linux Mint installation, before running the post-installation script.
This way you can test the script multiple times without needing to reinstall Linux Mint each time.
## Release Process
This project uses a two-step release process.
### Versioning
- Version is stored in `VERSION` file (format: v0, v1, v2, ...)
- Major version increments only
- Script version stored in `SCRIPT_VERSION` variable
### Step 1: Prepare Release
- Make sure you are on main branch with no local changes. Script will abort otherwise
Run from repository root:
```bash
./01_prepare_release.sh
```
The script will:
- Update VERSION file and SCRIPT_VERSION in the script
- Create a release branch (e.g., `release/v1`)
- Push the release branch
### After step 1 (manual)
- Create and merge PR from release branch to main
### Step 2: Finalize Release (After PR Merged)
Run from repository root:
```bash
./02_finalise_release.sh
```
The script will:
- Create and push tag for release version to main
### After step 2 (manual)
- Create a release in gitea
### Requirements
- Clean working tree (no uncommitted changes)
- Git remote configured (origin)
+1
View File
@@ -0,0 +1 @@
v10
@@ -0,0 +1,259 @@
#!/bin/bash
SCRIPT_VERSION="v10"
bIsVlcInstalled=false
# Prompt helper: ask a question and return 0 (yes) for j/J/ja/y/Y, non-zero otherwise
question_answered_with_yes() {
local prompt="$1"
local ans
# Use %b to interpret backslash escape sequences (\n, \t, etc.)
printf '%b\n Geben Sie j oder n ein und die Eingabetaste,\n Abbruch mit jeder anderen Taste ... [j/N]: ' "$prompt"
read -r ans
case "$ans" in
j|J|ja|y|Y) return 0 ;;
n|N|"") return 1 ;;
*) echo "Abbruch."; exit 1 ;;
esac
}
echo "
#####################################
#### Nachinstallationsarbeiten
#### Version: $SCRIPT_VERSION
#####################################
#### Was tut dieses Skript? ####
# Vorausgesetzt wird eine Installation von Linux Mint XFCE.
# Das Skript bietet -teilweise interaktiv- die Installation von zusätzlichen Programmen an, die Linux Mint XFCE nicht standardmässig mitbringt.
#
# Folgende Dateien werden aus dem Skript referenziert und werden im selben Verzeichnis wie dieses Skript erwartet
## - xfce4-panel-profiles.tar.bz2
#
# Zu Beginn werden die folgenden zusätzlichen Programme in einem Schritt installiert:
#
# xfce4-goodies (zusätzliche Elemente für die Taskleiste)
# xfce4-panel-profiles (Tool für die Taskleistenbearbeitung)
# clementine (Audioplayer und Musikbibliothekverwaltung)
# vlc (weltbester Mediaplayer ;-))
# htop (Systemmonitortool)
# hardinfo (Übersicht der Systemeigenschaften)
# font-manager (Schriftarten verwalten)
# asunder (Audio-CDs in z.B. mp3-Dateien verwandeln (rippen))
# gtkhash (Prüfsummen von Dateien erstellen und überprüfen)
# Danach geht es interaktiv weiter.
"
#
#
#
sudo apt-get update
# needed by script to unzip Aptos font
sudo apt install unzip -y
sSuffixDate=$(date '+%Y-%m-%d_%H:%M:%S')
echo
if question_answered_with_yes "#### Installiere Zusatzprogramme für 64 bit Mint XFCE? ####"; then
echo "#### 64 bit Mint XFCE ####"
sudo apt -y install xfce4-goodies clementine vlc htop hardinfo font-manager asunder gtkhash
bIsVlcInstalled=true
fi
echo ""
echo ""
echo
echo
echo "#### nur auf Wunsch / bei Bedarf ####"
echo
### Sensoren ###
if question_answered_with_yes " ### Installiere Sensoren? ###"; then
echo "### Sensoren ###"
sudo apt install lm-sensors psensor
sudo sensors-detect
sudo service kmod start
echo "## im Anschluss \"psensor\" konfigurieren im XFCE-Applet in der Taskleiste"
fi
echo
echo
if [ "$bIsVlcInstalled" = true ]; then
echo "### Kauf-DVDs abspielen ###"
if question_answered_with_yes " ### Installiere Paket um Film DVDs abspielen zu können? ###"; then
echo "### Kauf-DVDs abspielen ###"
sudo apt install libdvd-pkg
sudo dpkg-reconfigure libdvd-pkg
fi
else
echo "Player Fehlt
## VLC muss installiert sein um Kauf-DVDs abspielen zu können"
fi
echo
echo
echo "### Schriften, falls Microsoft-Office-Dokumente weiterverwendet werden sollen oder Dokumentenaustausch mit Microsoft-Nutzern gewünscht ist ###
## frei verfügbare, alte Microsoft-Standardschriften installieren:"
if question_answered_with_yes " ### Installiere M$ Schriften? ###"; then
echo "### M$ Schriften ###"
sudo apt install ttf-mscorefonts-installer
fi
echo
echo
echo " ## Microsoft Aptos Schriftarten installieren:"
if question_answered_with_yes " ### Installiere Aptos Schriften? ###"; then
echo
echo "### Aptos Schriften ###"
_aptos_zip="/tmp/Microsoft Aptos Fonts.zip"
_aptos_url="https://download.microsoft.com/download/8/6/0/860a94fa-7feb-44ef-ac79-c072d9113d69/Microsoft%20Aptos%20Fonts.zip"
echo "Lade Aptos Schriften herunter..."
wget "$_aptos_url" -O "$_aptos_zip"
echo "Entpacke das Archiv..."
unzip -o "$_aptos_zip" -d /tmp/aptos_fonts
echo "Erstelle /usr/share/fonts/truetype/aptos/"
sudo mkdir -p /usr/share/fonts/truetype/aptos
echo "Installiere alle .ttf Schriften..."
find /tmp/aptos_fonts -name "*.ttf" -exec sudo install -m644 {} /usr/share/fonts/truetype/aptos/ \; 2>/dev/null || true
echo "Aktualisiere den Font-Cache"
fc-cache -f
echo "Fertig! Aptos Schriftarten sind installiert."
echo "Entferne temporäre Dateien..."
rm -rf "$_aptos_zip" /tmp/aptos_fonts
fi
echo
echo
echo " ## freie Google-Schriften"
if question_answered_with_yes " ### Installiere Google Schriften? ###"; then
echo
echo "### Google Schriften ###"
_google_fonts_dir="/usr/share/fonts/truetype/google-fonts"
_google_fonts_url_base="https://gwfh.mranftl.com/api/fonts"
_google_fonts="arimo carlito caladea inconsolata cousine libre-franklin neuton cabin oswald crimson-text lustria tinos league-spartan pt-sans"
sudo mkdir -p "$_google_fonts_dir"
for _font in $_google_fonts; do
echo "Lade $_font herunter..."
curl -s -o /tmp/"$_font".zip "${_google_fonts_url_base}/$_font?download=zip&subsets=latin,latin-ext&variants=regular,700"
if [ -s /tmp/"$_font".zip ] && head -c 2 /tmp/"$_font".zip | grep -q "PK"; then
unzip -o /tmp/"$_font".zip -d /tmp/"$_font"_fonts
sudo cp /tmp/"$_font"_fonts/fonts/"$_font"/* "$_google_fonts_dir/" 2>/dev/null || \
sudo cp /tmp/"$_font"_fonts/* "$_google_fonts_dir/" 2>/dev/null || true
rm -rf /tmp/"$_font".zip /tmp/"$_font"_fonts
else
echo "Fehler: Download von $_font fehlgeschlagen, überspringe..."
rm -f /tmp/"$_font".zip
fi
done
echo "Aktualisiere den Font-Cache"
fc-cache -f
echo "Fertig! Google Schriftarten sind installiert."
echo "Die Anpassung der Standardschriften und/oder das Erstellen der Ersetzungstabelle in Libre Office muss manuell erfolgen, falls gewünscht."
fi
#
echo
echo
echo "#### Chromium Browser installieren:"
if question_answered_with_yes " ### Installiere Chromium? ###"; then
echo "### Chromium ###"
sudo apt install chromium-browser
sudo apt install chromium
fi
echo
echo
echo "#### Vivaldi Browser installieren:"
if question_answered_with_yes " ### Installiere Vivaldi? ###"; then
echo "### ###"
echo "## nötige Zusatzpakete installieren"
sudo apt install dirmngr ca-certificates software-properties-common apt-transport-https curl -y
#
echo "## ## key importieren"
curl -fsSL https://repo.vivaldi.com/archive/linux_signing_key.pub | gpg --dearmor | sudo tee /usr/share/keyrings/vivaldi.gpg > /dev/null
#
echo "## ## Repository hinzufügen"
echo deb [arch=amd64,armhf signed-by=/usr/share/keyrings/vivaldi.gpg] https://repo.vivaldi.com/stable/deb/ stable main | sudo tee /etc/apt/sources.list.d/vivaldi.list
#
sudo apt update && sudo apt install vivaldi-stable
#
echo "## ## Gnome-Schlüsselbund-Fehlermeldung bei jedem Start von Chrome/Chromium beheben: Starter bzw. .desktop-Datei mit folgendem Parameter ergänzen: "
echo "## ## --password-store=basic"
#
fi
echo
echo
echo "####Signal für Desktop (die Nutzung setzt eine Signal-Installation auf einem Android- Oder Apple-Gerät voraus!)#### "
if question_answered_with_yes " ### Installiere Signal? ###"; then
echo "### ###"
echo "## zusätzliches Repository nötig!
## NOTE: These instructions only work for 64-bit Debian-based
## Linux distributions such as Ubuntu, Mint etc.
## key importieren
"
wget -O- https://updates.signal.org/desktop/apt/keys.asc | gpg --dearmor > signal-desktop-keyring.gpg
cat signal-desktop-keyring.gpg | sudo tee /usr/share/keyrings/signal-desktop-keyring.gpg > /dev/null
#
echo "## Repository hinzufügen:"
echo 'deb [arch=amd64 signed-by=/usr/share/keyrings/signal-desktop-keyring.gpg] https://updates.signal.org/desktop/apt xenial main' | sudo tee /etc/apt/sources.list.d/signal-xenial.list
sudo apt update && sudo apt install signal-desktop
#
fi
echo
echo
echo "### Anpassung der Panel-Konfiguration / Taskleiste #### "
echo "### SystemMonitor, ArbeitsflächenAnzeige #### "
echo
echo "Achtung! Es kann vorkommen, dass die Taskleiste nach diesem Schritt verschwunden ist."
echo "Ein Abmelden und Wiederanmelden des Benutzers oder ein Reboot behebt das Problem."
echo
if question_answered_with_yes " ### Änderungen am Panel durchführen? ###"; then
echo "### ###"
sudo apt install xfce4-panel-profiles -y
echo "## Austausch der Panel-Konfigurationsdatei:"
xfce4-panel-profiles load xfce4-panel-profiles.tar.bz2
fi
echo
echo "###############################"
echo "######### Skript ENDE #########"
echo "###############################"
echo
echo
echo
echo "Verbleibende manuelle Schritte:"
echo
echo "### Taskleiste ###: XFCE-Applets für 2x Netzwerkmonitor (LAN + WLAN) konfigurieren"
echo
echo "Wenn ### Sensoren ### installiert wurden: psensor konfigurieren im XFCE-Applet in der Taskleiste, falls gewünscht."
echo
echo "Wenn ### Google-Schriften ### installiert wurden: Anpassung der Standardschriften und/oder das Erstellen der Ersetzungstabelle in Libre Office, falls gewünscht."
echo
echo
read -p ' ### Um dieses Fenster zu schliessen, Enter drücken ### '
exit 0
+25
View File
@@ -0,0 +1,25 @@
# Post-Installation Script
This directory contains files belonging to the Linux Mint XFCE post-installation script.
## Prerequisites to run the script
- Linux Mint XFCE installed and running
- Internet connection for downloading packages and updates
- Script file: `Nachinstallationsarbeiten_LC_Esslingen_XFCE.sh` copied to Desktop
No external files need to be pre-downloaded.
## Usage
Run the main script:
```bash
cd post_installation_script
bash Nachinstallationsarbeiten_LC_Esslingen_XFCE.sh
```
The script is interactive and will prompt for confirmation before each installation step.
## Testing
See `../post_installation_script_test/README.md` for container-based testing instructions.
+4
View File
@@ -0,0 +1,4 @@
#!/bin/bash
# Create test image from Dockerfile
docker build -t mint-script-test -f Dockerfile .
@@ -0,0 +1,8 @@
#!/bin/bash
docker run -it --rm \
--tmpfs /tmp:rw \
--entrypoint bash \
-v "$(pwd)/../post_installation_script/":/workspace-source:ro \
mint-script-test \
-c 'cp -r /workspace-source/* /workspace/ && cd /workspace && exec bash'
+12
View File
@@ -0,0 +1,12 @@
FROM ubuntu:22.04
# Install required utilities including sudo
RUN apt-get update && apt-get install -y --no-install-recommends \
bash wget tar curl gnupg ca-certificates apt-utils apt coreutils file procps sudo && \
apt-get clean && rm -rf /var/lib/apt/lists/*
# Configure passwordless sudo for all users (needed for script)
RUN echo 'ALL ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
WORKDIR /workspace
ENTRYPOINT ["/bin/bash"]
+71
View File
@@ -0,0 +1,71 @@
# Post-Installation Script Testing
This directory contains a quick (but not complete) test for post-installation script in a safe, isolated container environment.
The container has no UI installed and therefore can't test the UI related parts of the script (Taskbar adaptions), but
it allows to test the logic, prompts, and error handling of the script.
## Prerequisites
- Docker or Podman installed on the host system. If Podman is used, an alias for `docker` command should be set up (e.g. `alias docker=podman`)
- in order to use the provided scripts without modification.
## Contents
- `Dockerfile` - Container image definition for testing
- `01_create_image.sh` - script for creating container image locally
- `02_start_container_with_image.sh` - script for starting container from created image
## Purpose
Provides a reproducible testing environment that allows:
- Running the post-installation script without affecting the host system
- Real `apt` installations (isolated in container)
- Testing script logic, prompts, and error handling
- Validating syntax and tracing execution
## Features
The Dockerfile includes:
- Ubuntu 22.04 base image
- Passwordless sudo for real apt installations
- Useful utilities: `bash`, `wget`, `tar`, `curl`, `gnupg`, `ca-certificates`, `file`, `procps`, `sudo`
## Usage
### Build the test image
Run the prepared shell script to build the image
```bash
cd post_installation_script_test
bash 01_create_image.sh
```
### Start a container for testing
Run the prepared shell script start a new container for testing based in the
image and remove container after it is stopped. After container is started an interactive session is started into the container.
```bash
cd post_installation_script_test
bash 02_start_container_with_image.sh
```
### Test the script file in the running container
After container is started an interactive session was started in the container and the script can be started for testing.
The source script folder is mounted read-only to `/workspace-source` and contents are copied to `/workspace` at container startup.
To test changes made on the host, restart the container - it will copy the updated files.
```bash
ls -al
bash <scriptName>.sh
```
## Security Notes
- The source script folder is mounted read-only to `/workspace-source`
- Contents are automatically copied to `/workspace` (writable) at container startup
- This keeps the host script folder untouched while allowing the script to write files (e.g., font extraction)
- All apt installations are real but isolated in the container
- Use `--tmpfs /tmp:rw` for any temporary writes inside the container
- Container is automatically removed after exit (`--rm` flag)
-220
View File
@@ -1,220 +0,0 @@
<?xml version="1.1" encoding="UTF-8"?>
<channel name="xfce4-panel" version="1.0">
<property name="configver" type="int" value="2"/>
<property name="panels" type="array">
<value type="int" value="1"/>
<value type="int" value="2"/>
<property name="panel-1" type="empty">
<property name="position" type="string" value="p=6;x=0;y=0"/>
<property name="length" type="uint" value="100"/>
<property name="position-locked" type="bool" value="true"/>
<property name="icon-size" type="uint" value="16"/>
<property name="size" type="uint" value="29"/>
<property name="plugin-ids" type="array">
<value type="int" value="1"/>
<value type="int" value="2"/>
<value type="int" value="3"/>
<value type="int" value="5"/>
<value type="int" value="6"/>
<value type="int" value="8"/>
<value type="int" value="9"/>
<value type="int" value="10"/>
<value type="int" value="11"/>
<value type="int" value="12"/>
<value type="int" value="13"/>
<value type="int" value="14"/>
<value type="int" value="7"/>
<value type="int" value="26"/>
<value type="int" value="28"/>
</property>
<property name="nrows" type="uint" value="2"/>
<property name="border-width" type="uint" value="1"/>
</property>
<property name="panel-2" type="empty">
<property name="autohide-behavior" type="uint" value="1"/>
<property name="position" type="string" value="p=10;x=0;y=0"/>
<property name="position-locked" type="bool" value="true"/>
<property name="size" type="uint" value="48"/>
<property name="plugin-ids" type="array">
<value type="int" value="15"/>
<value type="int" value="16"/>
<value type="int" value="17"/>
<value type="int" value="18"/>
<value type="int" value="19"/>
<value type="int" value="20"/>
<value type="int" value="21"/>
<value type="int" value="22"/>
</property>
</property>
</property>
<property name="plugins" type="empty">
<property name="plugin-2" type="string" value="tasklist">
<property name="grouping" type="uint" value="1"/>
</property>
<property name="plugin-3" type="string" value="separator">
<property name="expand" type="bool" value="true"/>
<property name="style" type="uint" value="0"/>
</property>
<property name="plugin-5" type="string" value="separator">
<property name="style" type="uint" value="0"/>
</property>
<property name="plugin-6" type="string" value="systray">
<property name="show-frame" type="bool" value="false"/>
<property name="square-icons" type="bool" value="true"/>
<property name="names-ordered" type="array">
<value type="string" value="pamac-tray"/>
<value type="string" value="connman-gtk"/>
</property>
<property name="known-legacy-items" type="array">
<value type="string" value="ethernet-netzverbindung »wired connection 1« ist aktiv"/>
<value type="string" value="netzwerk-manager-applet"/>
</property>
<property name="known-items" type="array">
<value type="string" value="Nextcloud"/>
</property>
</property>
<property name="plugin-8" type="string" value="pulseaudio">
<property name="enable-keyboard-shortcuts" type="bool" value="true"/>
<property name="show-notifications" type="bool" value="true"/>
</property>
<property name="plugin-9" type="string" value="power-manager-plugin"/>
<property name="plugin-10" type="string" value="notification-plugin"/>
<property name="plugin-11" type="string" value="separator">
<property name="style" type="uint" value="0"/>
</property>
<property name="plugin-12" type="string" value="clock"/>
<property name="plugin-13" type="string" value="separator">
<property name="style" type="uint" value="0"/>
</property>
<property name="plugin-14" type="string" value="actions"/>
<property name="plugin-15" type="string" value="showdesktop"/>
<property name="plugin-16" type="string" value="separator"/>
<property name="plugin-17" type="string" value="launcher">
<property name="items" type="array">
<value type="string" value="15869715091.desktop"/>
</property>
</property>
<property name="plugin-18" type="string" value="launcher">
<property name="items" type="array">
<value type="string" value="15869715092.desktop"/>
</property>
</property>
<property name="plugin-19" type="string" value="launcher">
<property name="items" type="array">
<value type="string" value="15869715093.desktop"/>
</property>
</property>
<property name="plugin-20" type="string" value="launcher">
<property name="items" type="array">
<value type="string" value="15869715094.desktop"/>
</property>
</property>
<property name="plugin-21" type="string" value="separator"/>
<property name="plugin-22" type="string" value="directorymenu">
<property name="base-directory" type="string" value="/home/artix"/>
</property>
<property name="plugin-1" type="string" value="whiskermenu">
<property name="button-icon" type="string" value="artixlinux-logo"/>
<property name="show-button-title" type="bool" value="true"/>
<property name="launcher-icon-size" type="int" value="3"/>
<property name="hover-switch-category" type="bool" value="true"/>
<property name="favorites-in-recent" type="bool" value="true"/>
<property name="position-search-alternate" type="bool" value="true"/>
<property name="position-categories-alternate" type="bool" value="true"/>
<property name="command-switchuser" type="string" value="gdmflexiserver"/>
<property name="favorites" type="array">
<value type="string" value="xfce4-web-browser.desktop"/>
<value type="string" value="xfce4-mail-reader.desktop"/>
<value type="string" value="xfce4-file-manager.desktop"/>
<value type="string" value="xfce4-terminal-emulator.desktop"/>
</property>
<property name="recent" type="array">
<value type="string" value="xfce4-file-manager.desktop"/>
<value type="string" value="xfce4-terminal-emulator.desktop"/>
</property>
</property>
<property name="plugin-7" type="string" value="genmon">
<property name="command" type="string" value=""/>
<property name="use-label" type="bool" value="true"/>
<property name="text" type="string" value="(genmon)"/>
<property name="update-period" type="int" value="30000"/>
<property name="enable-single-row" type="bool" value="true"/>
<property name="font" type="string" value="Roboto 11"/>
</property>
<property name="plugin-26" type="string" value="whiskermenu"/>
<property name="plugin-28" type="string" value="cpugraph">
<property name="update-interval" type="int" value="2"/>
<property name="time-scale" type="int" value="0"/>
<property name="size" type="int" value="16"/>
<property name="mode" type="int" value="1"/>
<property name="color-mode" type="int" value="0"/>
<property name="frame" type="int" value="0"/>
<property name="border" type="int" value="1"/>
<property name="bars" type="int" value="1"/>
<property name="per-core" type="int" value="0"/>
<property name="tracked-core" type="int" value="0"/>
<property name="in-terminal" type="int" value="1"/>
<property name="startup-notification" type="int" value="0"/>
<property name="load-threshold" type="int" value="0"/>
<property name="smt-stats" type="int" value="0"/>
<property name="smt-issues" type="int" value="0"/>
<property name="per-core-spacing" type="int" value="1"/>
<property name="command" type="string" value=""/>
<property name="background" type="array">
<value type="double" value="1"/>
<value type="double" value="1"/>
<value type="double" value="1"/>
<value type="double" value="0"/>
</property>
<property name="foreground-1" type="array">
<value type="double" value="0"/>
<value type="double" value="1"/>
<value type="double" value="0"/>
<value type="double" value="1"/>
</property>
<property name="foreground-2" type="array">
<value type="double" value="1"/>
<value type="double" value="0"/>
<value type="double" value="0"/>
<value type="double" value="1"/>
</property>
<property name="foreground-3" type="array">
<value type="double" value="0"/>
<value type="double" value="0"/>
<value type="double" value="1"/>
<value type="double" value="1"/>
</property>
<property name="smt-issues-color" type="array">
<value type="double" value="0.90000000000000002"/>
<value type="double" value="0"/>
<value type="double" value="0"/>
<value type="double" value="1"/>
</property>
<property name="foreground-system" type="array">
<value type="double" value="0.90000000000000002"/>
<value type="double" value="0.10000000000000001"/>
<value type="double" value="0.10000000000000001"/>
<value type="double" value="1"/>
</property>
<property name="foreground-user" type="array">
<value type="double" value="0.10000000000000001"/>
<value type="double" value="0.40000000000000002"/>
<value type="double" value="0.90000000000000002"/>
<value type="double" value="1"/>
</property>
<property name="foreground-nice" type="array">
<value type="double" value="0.90000000000000002"/>
<value type="double" value="0.80000000000000004"/>
<value type="double" value="0.20000000000000001"/>
<value type="double" value="1"/>
</property>
<property name="foreground-iowait" type="array">
<value type="double" value="0.20000000000000001"/>
<value type="double" value="0.90000000000000002"/>
<value type="double" value="0.40000000000000002"/>
<value type="double" value="1"/>
</property>
</property>
</property>
</channel>