17 changed files with 505 additions and 1259 deletions
+132 -103
View File
@@ -1,140 +1,169 @@
# AGENTS.md AGENTS
Guidelines for agentic coding assistants working in this repository. I created this `AGENTS.md` to help agentic coding assistants work in this repository. It contains
1) Build / lint / test commands (including how to run a single test) and
2) Code style guidelines and conventions to follow when editing code here.
## Repository Overview Repository state
- This repository contains shell scripts for Linux Mint XFCE post-installation setup.
- Main scripts are located in `post_installation_script/` directory.
- Testing infrastructure is in `post_installation_script_test/` (Docker/Podman test containers).
- No build system, package.json, Makefile, or language-specific project files were detected.
- There are no Cursor rules or Copilot instruction files in the repo (checked paths below).
- `.cursor/rules/` : not found
- `.cursorrules` : not found
- `.github/copilot-instructions.md` : not found
- **Type**: Shell script project for Linux Mint XFCE post-installation setup If you add new code (Go, Python, Node, Rust, Java, etc.), follow the per-ecosystem quick commands below.
- **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
## 1) Build / Lint / Test Commands - General notes
- Run commands from the repository root unless a submodule or service has its own README.
- Prefer local, repo-scoped toolchains (venv, node_modules/.bin, go modules, cargo) to avoid global state.
### Shell Scripts - Shell scripts
- Quick check: `shellcheck scripts/*.sh` (install `shellcheck` first).
- Run an individual script: `bash path/to/script.sh` or `./script.sh` (ensure executable bit set).
- Syntax check: `bash -n path/to/script.sh`
- Trace execution: `bash -x path/to/script.sh` (shows each command as it runs)
```bash - Testing shell scripts
# Syntax check only (no execution) - See `post_installation_script_test/README.md` for detailed container-based testing instructions.
bash -n path/to/script.sh - Quick start:
- Build image: `./post_installation_script_test/01_create_image.sh`
- Start container: `./post_installation_script_test/02_start_container_with_image.sh`
# Trace execution (shows each command as it runs) - Python (if added)
bash -x path/to/script.sh - Install: `python -m venv .venv && source .venv/bin/activate && pip install -r requirements.txt`
- Lint: `ruff .` or `flake8 .`
- Format: `black .`
- Test all: `pytest -q`
- Run a single test: `pytest path/to/test_file.py::TestClass::test_method -q`
# Lint with shellcheck (install with: apt install shellcheck) - Node / JavaScript / TypeScript (if added)
shellcheck post_installation_script/*.sh - Install: `npm ci` or `pnpm install` / `yarn install`
- Lint: `npm run lint` (or `npx eslint .`)
- Format: `npx prettier --write .`
- Test all: `npm test` (or `npx vitest` / `npx jest`)
- Run a single test:
- Jest: `npx jest path/to/file.test.js -t "test name regex"`
- Vitest: `npx vitest run path/to/file.spec.ts -t "test name"`
# Run individual script - Go (if added)
bash path/to/script.sh - Build: `go build ./...`
./script.sh # requires executable bit: chmod +x script.sh - Lint: `golangci-lint run` (if configured)
``` - Test all: `go test ./...`
- Run a single test: `go test ./pkg/name -run TestFunctionName`
### Container-Based Testing - Rust (if added)
- Build: `cargo build`
- Lint: `cargo clippy`
- Test all: `cargo test`
- Run a single test: `cargo test test_name -- --exact`
```bash - Java / Maven (if added)
# Build test image (Ubuntu 22.04 with useful utilities) - Build: `mvn -DskipTests package`
cd post_installation_script_test - Lint/format: use `spotless`/`checkstyle` if configured
bash 01_create_image.sh - Test all: `mvn test`
- Run a single test: `mvn -Dtest=ClassName#methodName test`
# Start interactive container (auto-removed on exit) - .NET (if added)
bash 02_start_container_with_image.sh - Build: `dotnet build`
- Test all: `dotnet test`
- Run a single test: `dotnet test --filter FullyQualifiedName~Namespace.ClassName.MethodName`
# Inside container - source scripts mounted at /workspace: - CI / Automation
bash /workspace/<scriptName>.sh - If you add GitHub Actions, keep workflows idempotent and cache dependencies carefully.
``` - Avoid secrets in workflows; read sensitive values from repository/organization secrets.
### Single Test Commands (for future languages) 2) Code style guidelines
```bash The guidance below is intentionally general and focuses on consistency, readability and safety so
# Python: pytest path/to/test.py::TestClass::test_method -q agentic tools can make changes predictably across multiple languages.
# 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
```
--- - Formatting
- Use an automated formatter for the language (Black for Python, Prettier for JS/TS, gofmt/gofmt -s for Go,
rustfmt for Rust). Commit formatted code only.
- Use an editorconfig file for basic whitespace/indentation rules when possible.
## 2) Code Style Guidelines - Imports / dependencies
- Keep imports explicit and minimal: import only what you use.
- Group imports in a logical order (language default + third-party + local project). Leave a blank line between groups.
- Dont commit unused dependencies; remove them from lock files / manifests and run the linter.
### Shell Scripts (Primary Language) - Types / typing
- Prefer explicit types where the language supports them (TypeScript types, Python type hints, Go static types).
- Add types for public interfaces and complex logic; internal simple helper functions may rely on inference.
- **Shebang**: Use `#!/bin/bash` (not `/bin/sh`) for bash-specific features - Naming conventions
- **Safety**: Use `set -euo pipefail` at script start - Use clear, descriptive names. Prefer `calculate_total`, `prepare_connection`, `user_id` style for snake_case languages.
- **Quotes**: Always use double quotes for variable expansion: `"$VAR"`, never bare `$VAR` - For camelCase languages (JS/TS): `calculateTotal`, `prepareConnection`.
- **Conditionals**: Use `[[ ]]` for tests, not `[ ]` - Types and classes: use PascalCase/UpperCamelCase: `UserService`, `HttpClient`.
- **Variables**: Use `readonly` for constants, `local` for function-scoped variables - Constants: use UPPER_SNAKE_CASE or language-specific constant conventions.
- **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 - Functions and modules
- Keep functions small (ideally < 40 lines) and single-responsibility.
- Prefer pure functions where possible; keep side effects explicit and isolated.
- Organize modules by feature/domain, not solely by type (avoid monolithic god-modules).
- **Formatting**: Use automated formatters (Black/Prettier/gofmt/rustfmt) - commit formatted code - Error handling
- **Types**: Prefer explicit typing (TypeScript types, Python type hints, Go static types) - Fail fast and return/raise errors with context (message + cause) rather than swallowing them.
- **Naming**: - Avoid logging raw errors in library code; return errors to callers and let the application layer decide logging.
- snake_case: variables, functions (`user_id`, `calculate_total`) - Use typed error types when the language supports it (Go error types, custom exceptions in Python/JS).
- PascalCase: types/classes (`UserService`, `HttpClient`) - Clean up resources with `finally`/`defer` equivalents to avoid leaks.
- 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
--- - Tests
- Prefer small, deterministic unit tests. Mock external IO and network where reasonable.
- Use explicit fixtures and avoid implicit global state between tests.
- Name tests with the behavior they assert: `test_calculate_total_with_discounts` or `shouldReturn400WhenMissingField`.
## 3) Security - Logging and observability
- Use structured logging where available (JSON structured logs for services).
- Avoid printing raw stack traces to stdout in production code; include them at debug level.
- Never commit secrets, API keys, credentials, or tokens - Security and secrets
- Use environment variables for sensitive values - Never commit secrets, API keys, or credentials. Use environment variables and vaults.
- Validate and sanitize all external input - Validate and sanitize external input at the boundaries of the system.
- Run linting (`shellcheck`) before committing shell scripts
--- - Performance
- Measure before optimizing. Prefer clarity over micro-optimizations unless a hotspot is identified.
## 4) Commit Guidelines 3) Code review / commit guidance for agents
- Make small, focused commits with descriptive messages - Make small, focused commits and include a one-line summary plus a short description of the why.
- Include formatter command in commit message if auto-formatting - When changing behavior, add or update tests that verify the new/changed behavior.
- When changing behavior, add or update tests - If you reformat files automatically, include the formatter command in the commit message to make CI reproduction easy.
- Run full test suite before opening PRs
--- 4) Repo housekeeping checks (recommended for agents)
## 5) Cursor / Copilot Rules - When adding a new language or framework, add an entry to this file with the exact commands required to build/test.
- Add CI workflows to run lint + tests on PRs and enable branch protection rules if this becomes a shared repo.
- **Session storage**: Store session logs and working notes in `.agents/sessions/` folder for future reference. Use descriptive filenames (e.g., `session-<date>-<topic>.md`).
- `.cursor/rules/`: Not present 5) Cursor / Copilot rules
- `.cursorrules`: Not present
- `.github/copilot-instructions.md`: Not present
--- - Cursor rules: none present at `.cursor/rules/` or `.cursorrules` in this repository.
- GitHub Copilot instructions: none present at `.github/copilot-instructions.md`.
## 6) Repo Housekeeping If you add any of these files, update this document and include the exact file path and relevant sections for agents to follow.
- Store session logs in `.agents/sessions/` for reference Quick checklist for an agent making changes
- When adding new languages, update this file with exact build/test commands - Run local linter/formatter configured for the language before opening a PR.
- Run the test suite and the single-test command for any tests you added/changed.
- Do not add secrets to the tree; use placeholders and document required environment variables.
--- Next steps (recommended)
1) Add a minimal `Makefile` or `package.json` scripts for common tasks so agents can run `make test` / `npm test`.
2) If the project will contain multiple services, add per-service README files and CI workflows.
3) Add EditorConfig + language-specific formatter configs (pyproject.toml, .prettierrc, rustfmt.toml) to lock formatting rules.
## Files Referenced Files referenced
- Root `README.md`
- `post_installation_script/README.md` - main script usage
- `post_installation_script_test/README.md` - testing instructions
- `.cursor/rules/` (not present)
- `.cursorrules` (not present)
- `.github/copilot-instructions.md` (not present)
- `README.md` - Project overview If anything in this file needs to be stricter or you want another style (for example a fully opinionated TS style), say which language or style and I will update `AGENTS.md` accordingly.
- `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
-124
View File
@@ -1,124 +0,0 @@
#!/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.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."
else
echo ""
echo "Release prepared locally. Push manually with:"
echo " git push -u origin $RELEASE_BRANCH"
fi
echo ""
echo "Next steps:"
echo "1. Create a PR from $RELEASE_BRANCH to main in Gitea via web UI"
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. Execute script '02_finalise_release.sh' to create a tag in repo"
echo ""
echo "3. Create a release from the new tag in Gitea via web UI"
-61
View File
@@ -1,61 +0,0 @@
#!/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"
RELEASE_BRANCH="release/$CURRENT_VERSION"
_local_exists=false
if git rev-parse "$RELEASE_BRANCH" >/dev/null 2>&1; then
_local_exists=true
fi
_remote_exists=false
if git ls-remote --heads origin "$RELEASE_BRANCH" 2>/dev/null | grep -q .; then
_remote_exists=true
fi
if [ "$_local_exists" = "true" ] || [ "$_remote_exists" = "true" ]; then
if question_answered_with_yes "Delete release branch $RELEASE_BRANCH (local and remote)?"; then
[ "$_local_exists" = "true" ] && git branch -D "$RELEASE_BRANCH"
[ "$_remote_exists" = "true" ] && git push origin --delete "$RELEASE_BRANCH"
fi
fi
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
-21
View File
@@ -1,21 +0,0 @@
MIT License
Copyright (c) 2026 Linux-Café Esslingen
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+15 -28
View File
@@ -18,45 +18,32 @@ You can also make use of snapshot feature of the virtualization software to easi
e.g. state directly after Linux Mint installation, before running the post-installation script. 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. This way you can test the script multiple times without needing to reinstall Linux Mint each time.
## License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
## Release Process ## Release Process
This project uses a two-step release process. This project uses a simple release process based on git tags.
### Versioning ### Versioning
- Version is stored in `VERSION` file (format: v0, v1, v2, ...) - Version is stored in `VERSION` file (format: v0, v1, v2, ...)
- Major version increments only - Major version increments only (major-bugfix scheme)
- Script version stored in `SCRIPT_VERSION` variable - Script version is also stored in `SCRIPT_VERSION` variable within the main script to display version during script execution
### Step 1: Prepare Release ### Creating a Release
- Make sure you are on main branch with no local changes. Script will abort otherwise Run the release script from the repository root:
Run from repository root:
```bash ```bash
./01_prepare_release.sh ./release.sh
``` ```
The script will: The script will:
- Update VERSION file and SCRIPT_VERSION in the script 1. Check for uncommitted local changes (exits if any exist)
- Create a release branch (e.g., `release/v1`) 2. Show current version and propose next version
- Push the release branch 3. Prompt for confirmation
4. Update VERSION file and SCRIPT_VERSION in the script
5. Create a git commit
6. Create an annotated tag
7. Prompt to push to origin (including tags)
### After step 1 (manual) ### Gitea Integration
- Create and merge PR from release branch to main When a tag is pushed to the remote, Gitea automatically creates a release from it.
### 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 ### Requirements
- Clean working tree (no uncommitted changes) - Clean working tree (no uncommitted changes)
+1 -1
View File
@@ -1 +1 @@
v11 v9
@@ -1,277 +0,0 @@
#!/bin/bash
SCRIPT_VERSION="v11"
echo "
#####################################
#### Nachinstallationsarbeiten
#### Version: $SCRIPT_VERSION
#####################################
#### Was tut dieses Skript? ####
# Vorausgesetzt wird eine Installation von Linux Mint (XFCE oder Cinnamon).
# Das Skript bietet -teilweise interaktiv- die Installation von zusätzlichen Programmen an, die Linux Mint nicht standardmässig mitbringt.
# Zu Beginn werden die folgenden zusätzlichen Programme in einem Schritt installiert:
#
# 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
echo "#### 64 bit Mint - Es werden notwendige Programme für das Ausführen des Skripts installiert ####"
sudo apt -y install unzip
echo "#### 64 bit Mint - Es werden weitere hilfreiche Programme installiert ####"
sudo apt -y install clementine vlc htop hardinfo font-manager asunder gtkhash
sSuffixDate=$(date '+%Y-%m-%d_%H:%M:%S')
detect_desktop() {
if [ -n "$XDG_CURRENT_DESKTOP" ]; then
case "$XDG_CURRENT_DESKTOP" in
XFCE | Xfce | xfce) echo "xfce" ;;
X-Cinnamon | Cinnamon | cinnamon) echo "cinnamon" ;;
esac
elif [ -n "$DESKTOP_SESSION" ]; then
case "$DESKTOP_SESSION" in
*xfce* | *XFCE*) echo "xfce" ;;
*cinnamon* | *Cinnamon*) echo "cinnamon" ;;
esac
fi
}
echo
echo
echo "### Desktop-Umgebung erkennen ###"
DETECTED_DESKTOP=$(detect_desktop)
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
if [ -z "$DETECTED_DESKTOP" ]; then
echo
echo
echo "Desktop-Umgebung konnte nicht erkannt werden."
echo "Bitte manuell auswählen:"
echo "1) XFCE"
echo "2) Cinnamon"
echo -n "Auswahl: "
read -r desktop_choice
case "$desktop_choice" in
1) DESKTOP="xfce" ;;
2) DESKTOP="cinnamon" ;;
*)
echo "Ungültige Auswahl. Skript wird beendet."
exit 1
;;
esac
else
echo
echo
echo "Erkannte Desktop-Umgebung: $DETECTED_DESKTOP"
if question_answered_with_yes "Verwende erkannte Desktop-Umgebung?"; then
DESKTOP="$DETECTED_DESKTOP"
else
echo
echo
echo "Bitte manuell auswählen:"
echo "1) XFCE"
echo "2) Cinnamon"
echo -n "Auswahl: "
read -r desktop_choice
case "$desktop_choice" in
1) DESKTOP="xfce" ;;
2) DESKTOP="cinnamon" ;;
*)
echo "Ungültige Auswahl. Skript wird beendet."
exit 1
;;
esac
fi
fi
case "$DESKTOP" in
xfce)
source "$SCRIPT_DIR/xfce/xfce.sh"
;;
cinnamon)
source "$SCRIPT_DIR/cinnamon/cinnamon.sh"
;;
esac
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
if [ "$DESKTOP" = "xfce" ]; then
echo "## im Anschluss \"psensor\" konfigurieren im XFCE-Applet in der Taskleiste"
fi
fi
echo
echo
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
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 >/tmp/signal-desktop-keyring.gpg
cat /tmp/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
# execute bundles
# example: $SCRIPT_DIR/bundles/template.sh
echo
echo "###############################"
echo "######### Skript ENDE #########"
echo "###############################"
echo
echo
echo
echo "Verbleibende manuelle Schritte:"
if [ "$DESKTOP" = "xfce" ]; then
echo "### Taskleiste ###: XFCE-Applets für 2x Netzwerkmonitor (LAN + WLAN) konfigurieren"
echo "Wenn ### Sensoren ### installiert wurden: psensor konfigurieren im XFCE-Applet in der Taskleiste, falls gewünscht."
fi
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
@@ -0,0 +1,266 @@
#!/bin/bash
SCRIPT_VERSION="v9"
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
## - Microsoft Aptos Fonts.zip
## - google-fonts.tar.gz
## - xfce4-panel.xml
#
# 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="Microsoft Aptos Fonts.zip"
if [ ! -f "$_aptos_zip" ]; then
echo ""
echo "$_aptos_zip nicht gefunden."
echo "Bitte laden Sie die Datei von Microsoft herunter und legen Sie sie im selben Verzeichnis wie dieses Skript ab."
else
echo
echo "Entpacke das Archiv..."
unzip -o "$_aptos_zip"
echo "Erstelle /usr/share/fonts/truetype/aptos/"
sudo mkdir -p /usr/share/fonts/truetype/aptos
echo "Installiere alle .ttf Schriften..."
find . -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."
fi
fi
echo
echo
echo " ## freie Google-Schriften als Ersatz für aktuelle MS-Standardschriften installieren:"
if question_answered_with_yes " ### Installiere Google Schriften? ###"; then
echo
echo "### Google Schriften ###"
_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 heruntergeladen werden? Es ist ca. 1,4GB gross! "
if question_answered_with_yes " ### Download Google Schriften ###"; 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 "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."
echo "Temporärer Fontordner wird gelöscht"
rm -r fonts-main
echo "Google-Schriften sind installiert. Die Anpassung der Standardschriften und/oder das Erstellen der Ersetzungstabelle in Libre Office muss manuell erfolgen, falls gewünscht."
else
echo "Schriften Fehlen immer noch. Manuell herunterladen und installieren"
fi
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
+6 -23
View File
@@ -1,27 +1,12 @@
# Post-Installation Script # Post-Installation Script
This directory contains files belonging to the Linux Mint post-installation scripts. This directory contains files belonging to the Linux Mint XFCE post-installation script.
## Structure
```
post_installation_script/
├── Nachinstallationsarbeiten_LC_Esslingen.sh # Main script (asks for desktop)
├── xfce/
│ ├── xfce.sh # XFCE-specific configurations
│ └── xfce4-panel-profiles.tar.bz2 # XFCE panel backup
├── cinnamon/
│ └── cinnamon.sh # Cinnamon (reserved for future)
├── 01_prepare_release.sh
└── 02_finalise_release.sh
```
## Prerequisites to run the script ## Prerequisites to run the script
- Linux Mint (XFCE or Cinnamon) installed and running - Linux Mint XFCE installed and running
- Internet connection for downloading packages and fonts - Internet connection for downloading packages and updates
- Required tools: `curl`, `unzip`, `wget`, `fc-cache` (most are pre-installed) - Script file: `Nachinstallationsarbeiten_LC_Esslingen_XFCE.sh` copied to Desktop
- External files are referenced by the script, please check header comments in the script
No external files need to be pre-downloaded.
## Usage ## Usage
@@ -29,11 +14,9 @@ Run the main script:
```bash ```bash
cd post_installation_script cd post_installation_script
bash Nachinstallationsarbeiten_LC_Esslingen.sh bash Nachinstallationsarbeiten_LC_Esslingen_XFCE.sh
``` ```
The script will ask you to select your desktop environment (XFCE or Cinnamon), then proceed with the installation.
The script is interactive and will prompt for confirmation before each installation step. The script is interactive and will prompt for confirmation before each installation step.
## Testing ## Testing
@@ -1,20 +0,0 @@
#!/bin/bash
# <short description here>
# A shellscript meant to be used as subscript of `/post_installation_script/Nachinstallationsarbeiten_LC_Esslingen.sh`.
SCRIPT_DIR="$(cd "$(dirname "$0")"/.. && pwd)"
source "$SCRIPT_DIR/common.sh"
# please seperate stuff that doesn't belong together and maybe put short descriptions before those blocks (as comments) like in the following example:
# # Steam and Steam-related packages
# echo '### Steam ###'
# if question_answered_with_yes " ### Installiere Steam? ###"; then
# echo "### Steam ###"
# sudo apt install steam-installer
# # sudo flatpak install com.valvesoftware.Steam
# if question_answered_with_yes " ### Installiere Steam-Geräte-Unterstützungspaket (z. B. für Steam-Controller)? ###"; then
# echo "### Steam-Devices ###"
# sudo apt install steam-devices
# fi
# fi
# echo '### Ende Steam ###'
@@ -1,49 +0,0 @@
#!/bin/bash
# Cinnamon-specific script - called by main script
# This file contains Cinnamon-specific configurations
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
CINNAMONDIR="$SCRIPT_DIR/cinnamon"
echo
echo
echo "### System Monitor Applet ###"
if question_answered_with_yes " ### System Monitor Applet in der Taskleiste installieren? ###"; then
echo "### System Monitor Applet wird installiert ###"
sudo apt-get install gir1.2-gtop-2.0 -y
wget -O /tmp/sysmonitor@orcus.zip "https://cinnamon-spices.linuxmint.com/files/applets/sysmonitor@orcus.zip"
unzip -o /tmp/sysmonitor@orcus.zip -d ~/.local/share/cinnamon/applets/
rm /tmp/sysmonitor@orcus.zip
CURRENT_APPLETS=$(gsettings get org.cinnamon enabled-applets)
echo "DEBUG: current enabled-applets = $CURRENT_APPLETS"
INSTANCE_ID=$(gsettings get org.cinnamon next-applet-id)
echo "DEBUG: ID for the new applet = $INSTANCE_ID"
echo "DEBUG: Adding sysmonitor to applets list..."
NEW_APPLET="panel1:right:13:sysmonitor@orcus:$INSTANCE_ID"
NEW_APPLETS=$(echo "$CURRENT_APPLETS" | sed "s/\\]$/, '$NEW_APPLET']/")
gsettings set org.cinnamon enabled-applets "$NEW_APPLETS"
echo "DEBUG: Checking updated current enabled-applets = $(gsettings get org.cinnamon enabled-applets)"
NEXT_ID=$((INSTANCE_ID + 1))
echo "DEBUG: Setting next-applet-id to $NEXT_ID..."
gsettings set org.cinnamon next-applet-id "$NEXT_ID"
echo "DEBUG: Checking updated next-applet-id = $(gsettings get org.cinnamon next-applet-id)"
echo "copy system monitor config file..."
mkdir -p ~/.config/cinnamon/spices/sysmonitor@orcus/
cp "$CINNAMONDIR/sysmonitor_settings.json" ~/.config/cinnamon/spices/sysmonitor@orcus/$INSTANCE_ID.json
if question_answered_with_yes " ### Falls System Monitor Applet in der Taskleiste nicht angezeigt wird: Cinnamon Desktop neu laden? ###"; then
echo "Dialog 'Sie befinden sich im Rückfallmodus' mit JA beantworten um Desktop neuzustarten"
pkill -HUP -f "cinnamon --replace"
else
echo "Falls die Taskleiste nicht aktualisiert wurde: Abmelden und wieder anmelden oder neu starten"
fi
echo ""
echo "Fertig! System Monitor Applet wurde installiert."
fi
@@ -1,46 +0,0 @@
[/]
enabled-applets=['panel1:left:0:menu@cinnamon.org:0', 'panel1:left:1:separator@cinnamon.org:1', 'panel1:left:2:grouped-window-list@cinnamon.org:2', 'panel1:right:1:systray@cinnamon.org:3', 'panel1:right:2:xapp-status@cinnamon.org:4', 'panel1:right:3:notifications@cinnamon.org:5', 'panel1:right:4:printers@cinnamon.org:6', 'panel1:right:5:removable-drives@cinnamon.org:7', 'panel1:right:6:keyboard@cinnamon.org:8', 'panel1:right:7:favorites@cinnamon.org:9', 'panel1:right:8:network@cinnamon.org:10', 'panel1:right:9:sound@cinnamon.org:11', 'panel1:right:10:power@cinnamon.org:12', 'panel1:right:11:calendar@cinnamon.org:13', 'panel1:right:12:cornerbar@cinnamon.org:14', 'panel1:right:13:sysmonitor@orcus:15']
next-applet-id=16
panel-edit-mode=false
panel-zone-symbolic-icon-sizes='[{"panelId": 1, "left": 28, "center": 28, "right": 16}]'
panels-height=['1:40']
[desktop/a11y/applications]
screen-reader-enabled=false
[desktop/a11y/mouse]
dwell-click-enabled=false
dwell-threshold=10
dwell-time=1.2
secondary-click-enabled=false
secondary-click-time=1.2
[desktop/input-sources]
sources=[('xkb', 'de')]
[desktop/interface]
toolkit-accessibility=false
[desktop/screensaver]
layout-group=0
[desktop/sound]
event-sounds=false
[gestures]
swipe-down-2='PUSH_TILE_DOWN::end'
swipe-down-3='TOGGLE_OVERVIEW::end'
swipe-down-4='VOLUME_DOWN::end'
swipe-left-2='PUSH_TILE_LEFT::end'
swipe-left-3='WORKSPACE_NEXT::end'
swipe-left-4='WINDOW_WORKSPACE_PREVIOUS::end'
swipe-right-2='PUSH_TILE_RIGHT::end'
swipe-right-3='WORKSPACE_PREVIOUS::end'
swipe-right-4='WINDOW_WORKSPACE_NEXT::end'
swipe-up-2='PUSH_TILE_UP::end'
swipe-up-3='TOGGLE_EXPO::end'
swipe-up-4='VOLUME_UP::end'
tap-3='MEDIA_PLAY_PAUSE::end'
[settings-daemon/plugins/color]
night-light-last-coordinates=(52.5, 13.366667)
@@ -1,458 +0,0 @@
{
"layout": {
"type": "layout",
"pages": [
"common",
"cpu",
"mem",
"swap",
"net",
"load"
],
"common": {
"type": "page",
"title": "Common",
"sections": [
"common_g",
"common_c"
]
},
"common_g": {
"type": "section",
"title": "General",
"keys": [
"onclick_program",
"smooth",
"draw_border",
"graph_width",
"graph_spacing",
"refresh_rate",
"use_padding",
"padding_lr",
"padding_tb"
]
},
"common_c": {
"type": "section",
"title": "Colors",
"keys": [
"bg_color",
"border_color"
]
},
"cpu": {
"type": "page",
"title": "CPU",
"sections": [
"cpu_g",
"cpu_c"
]
},
"cpu_g": {
"type": "section",
"title": "General",
"keys": [
"cpu_enabled",
"cpu_override_graph_width",
"cpu_graph_width",
"cpu_tooltip_decimals"
]
},
"cpu_c": {
"type": "section",
"title": "Colors",
"keys": [
"cpu_color_0",
"cpu_color_1",
"cpu_color_2",
"cpu_color_3"
]
},
"mem": {
"type": "page",
"title": "Memory",
"sections": [
"mem_g",
"mem_c"
]
},
"mem_g": {
"type": "section",
"title": "General",
"keys": [
"mem_enabled",
"mem_override_graph_width",
"mem_graph_width"
]
},
"mem_c": {
"type": "section",
"title": "Colors",
"keys": [
"mem_color_0",
"mem_color_1"
]
},
"swap": {
"type": "page",
"title": "Swap",
"sections": [
"swap_g",
"swap_c"
]
},
"swap_g": {
"type": "section",
"title": "General",
"keys": [
"swap_enabled",
"swap_override_graph_width",
"swap_graph_width"
]
},
"swap_c": {
"type": "section",
"title": "Colors",
"keys": [
"swap_color_0"
]
},
"net": {
"type": "page",
"title": "Network",
"sections": [
"net_g",
"net_c"
]
},
"net_g": {
"type": "section",
"title": "General",
"keys": [
"net_enabled",
"net_override_graph_width",
"net_graph_width",
"net_minimum_graph_scale"
]
},
"net_c": {
"type": "section",
"title": "Colors",
"keys": [
"net_color_0",
"net_color_1"
]
},
"load": {
"type": "page",
"title": "Load",
"sections": [
"load_g",
"load_c"
]
},
"load_g": {
"type": "section",
"title": "General",
"keys": [
"load_enabled",
"load_override_graph_width",
"load_graph_width"
]
},
"load_c": {
"type": "section",
"title": "Colors",
"keys": [
"load_color_0"
]
}
},
"onclick_program": {
"type": "entry",
"default": "gnome-system-monitor",
"description": "Program to launch on click",
"value": "gnome-system-monitor"
},
"smooth": {
"type": "switch",
"default": true,
"description": "Smooth graphs",
"value": true
},
"draw_border": {
"type": "switch",
"default": false,
"description": "Draw border",
"value": true
},
"graph_width": {
"type": "spinbutton",
"default": 40,
"min": 10,
"max": 1000,
"step": 1,
"description": "Common graph width",
"units": "pixels",
"tooltip": "If the applet is in a vertical panel, this sets the graph height. The graph width is then the panel width minus padding",
"value": 10.0
},
"graph_spacing": {
"type": "spinbutton",
"default": 3,
"min": -1,
"max": 100,
"step": 1,
"description": "Graph spacing",
"units": "pixels",
"tooltip": "The number of pixels between each graph. Can be set to -1 to allow single line borders between graphs if borders are enabled",
"value": 3
},
"refresh_rate": {
"type": "spinbutton",
"default": 1000,
"min": 100,
"max": 60000,
"step": 50,
"description": "Refresh rate",
"units": "ms",
"value": 1000
},
"use_padding": {
"type": "switch",
"default": false,
"description": "Use custom applet padding",
"value": false
},
"padding_lr": {
"type": "spinbutton",
"default": 1,
"min": 0,
"max": 100,
"step": 1,
"description": "Left/right padding",
"units": "pixels",
"dependency": "use_padding",
"value": 1
},
"padding_tb": {
"type": "spinbutton",
"default": 1,
"min": 0,
"max": 100,
"step": 1,
"description": "Top/bottom padding",
"units": "pixels",
"dependency": "use_padding",
"value": 1
},
"bg_color": {
"type": "colorchooser",
"default": "rgba(0,0,0,0)",
"description": "Background color",
"value": "rgba(0,0,0,0)"
},
"border_color": {
"type": "colorchooser",
"default": "rgb(128,128,128)",
"description": "Border color",
"value": "rgb(128,128,128)"
},
"cpu_enabled": {
"type": "switch",
"default": true,
"description": "Enable",
"value": true
},
"cpu_override_graph_width": {
"type": "switch",
"default": false,
"description": "Override graph width",
"value": false
},
"cpu_graph_width": {
"type": "spinbutton",
"default": 40,
"min": 10,
"max": 1000,
"step": 1,
"description": "Graph width",
"units": "pixels",
"dependency": "cpu_override_graph_width",
"value": 40
},
"cpu_tooltip_decimals": {
"type": "spinbutton",
"default": 0,
"min": 0,
"max": 10,
"step": 1,
"description": "Show this many decimals in the tooltip",
"units": "decimals",
"value": 0
},
"cpu_color_0": {
"type": "colorchooser",
"default": "rgb(252,233,79)",
"description": "User color",
"value": "rgb(252,233,79)"
},
"cpu_color_1": {
"type": "colorchooser",
"default": "rgb(252,175,62)",
"description": "Nice color",
"value": "rgb(252,175,62)"
},
"cpu_color_2": {
"type": "colorchooser",
"default": "rgb(239,41,41)",
"description": "Kernel color",
"value": "rgb(239,41,41)"
},
"cpu_color_3": {
"type": "colorchooser",
"default": "rgb(94,0,0)",
"description": "IOWait color",
"value": "rgb(94,0,0)"
},
"mem_enabled": {
"type": "switch",
"default": true,
"description": "Enable",
"value": true
},
"mem_override_graph_width": {
"type": "switch",
"default": false,
"description": "Override graph width",
"value": false
},
"mem_graph_width": {
"type": "spinbutton",
"default": 40,
"min": 10,
"max": 1000,
"step": 1,
"description": "Graph width",
"units": "pixels",
"dependency": "mem_override_graph_width",
"value": 40
},
"mem_color_0": {
"type": "colorchooser",
"default": "rgb(118,210,255)",
"description": "Used color",
"value": "rgb(118,210,255)"
},
"mem_color_1": {
"type": "colorchooser",
"default": "rgb(52,101,164)",
"description": "Cached color",
"value": "rgb(52,101,164)"
},
"swap_enabled": {
"type": "switch",
"default": true,
"description": "Enable",
"value": true
},
"swap_override_graph_width": {
"type": "switch",
"default": false,
"description": "Override graph width",
"value": false
},
"swap_graph_width": {
"type": "spinbutton",
"default": 40,
"min": 10,
"max": 1000,
"step": 1,
"description": "Graph width",
"units": "pixels",
"dependency": "swap_override_graph_width",
"value": 40
},
"swap_color_0": {
"type": "colorchooser",
"default": "rgb(114,159,207)",
"description": "Used color",
"value": "rgb(114,159,207)"
},
"net_enabled": {
"type": "switch",
"default": true,
"description": "Enable",
"value": true
},
"net_override_graph_width": {
"type": "switch",
"default": false,
"description": "Override graph width",
"value": false
},
"net_graph_width": {
"type": "spinbutton",
"default": 40,
"min": 10,
"max": 1000,
"step": 1,
"description": "Graph width",
"units": "pixels",
"dependency": "net_override_graph_width",
"value": 40
},
"net_minimum_graph_scale": {
"type": "spinbutton",
"default": 0,
"min": 0,
"max": 1000000,
"step": 10,
"description": "Minimum graph scale",
"units": "Mb/s",
"tooltip": "The minimum scale for the graph in Megabits per second.\nThe graph will not scale below this minimum, but it will automatically scale if the network speed exceeds this value.\n\nTo always automatically scale, set the value to 0.",
"value": 0
},
"net_color_0": {
"type": "colorchooser",
"default": "rgb(138,226,52)",
"description": "Download color",
"value": "rgb(138,226,52)"
},
"net_color_1": {
"type": "colorchooser",
"default": "rgb(239,41,41)",
"description": "Upload color",
"value": "rgb(239,41,41)"
},
"load_enabled": {
"type": "switch",
"default": true,
"description": "Enable",
"value": true
},
"load_override_graph_width": {
"type": "switch",
"default": false,
"description": "Override graph width",
"value": false
},
"load_graph_width": {
"type": "spinbutton",
"default": 40,
"min": 10,
"max": 1000,
"step": 1,
"description": "Graph width",
"units": "pixels",
"dependency": "load_override_graph_width",
"value": 40
},
"load_color_0": {
"type": "colorchooser",
"default": "rgb(204,0,0)",
"description": "Color",
"value": "rgb(204,0,0)"
},
"__md5__": "9911223138f00e8c746a460d9c0f715a"
}
-16
View File
@@ -1,16 +0,0 @@
# functions and variables for use in multiple files ("common" functions and variables)
question_answered_with_yes() {
local prompt="$1"
local ans
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
}
-32
View File
@@ -1,32 +0,0 @@
#!/bin/bash
# XFCE-specific script - called by main script
# This file contains XFCE-specific package installations and panel configuration
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
XFCEDIR="$SCRIPT_DIR/xfce"
echo "### XFCE-specific packages ###"
sudo apt -y install xfce4-goodies
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 "$XFCEDIR/xfce4-panel-profiles.tar.bz2"
if question_answered_with_yes " ### Falls System Monitor Applet in der Taskleiste nicht angezeigt wird: Desktop neu laden? ###"; then
xfce4-panel --restart
else
echo "Falls die Taskleiste nicht aktualisiert wurde: Abmelden und wieder anmelden oder neu starten"
fi
fi
Executable
+85
View File
@@ -0,0 +1,85 @@
#!/usr/bin/env bash
set -e
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
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"
if git rev-parse "refs/tags/$NEXT_VERSION_STR" >/dev/null 2>&1; then
echo "Error: Tag $NEXT_VERSION_STR already exists locally."
exit 1
fi
if git remote get-url origin >/dev/null 2>&1; then
if git ls-remote --tags origin "$NEXT_VERSION_STR" 2>/dev/null | grep -q "$NEXT_VERSION_STR"; then
echo "Error: Tag $NEXT_VERSION_STR already exists on remote."
exit 1
fi
else
echo "Warning: No remote configured. You can still create the release locally."
fi
echo "Current version: $CURRENT_VERSION"
echo "Proposed version: $NEXT_VERSION_STR"
echo ""
read -p "Confirm release version $NEXT_VERSION_STR? [y/N]: " confirm
if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
echo "Release aborted."
exit 0
fi
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"
git tag -a "$NEXT_VERSION_STR" -m "Release $NEXT_VERSION_STR"
echo ""
echo "Tag $NEXT_VERSION_STR created locally."
read -p "Push to origin (includes tags)? [y/N]: " push_confirm
if [[ "$push_confirm" == "y" || "$push_confirm" == "Y" ]]; then
git push origin --tags
echo "Done! Gitea will create release from tag $NEXT_VERSION_STR"
else
echo "Release prepared locally. Push manually with: git push origin --tags"
fi