mirror of
https://github.com/ChrisTitusTech/linutil.git
synced 2024-11-22 05:12:27 +00:00
Merge branch 'main' into testing-9
This commit is contained in:
commit
0eafa7b54c
128
.github/CODE_OF_CONDUCT.md
vendored
Normal file
128
.github/CODE_OF_CONDUCT.md
vendored
Normal file
|
@ -0,0 +1,128 @@
|
||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
We as members, contributors, and leaders pledge to make participation in our
|
||||||
|
community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||||
|
identity and expression, level of experience, education, socio-economic status,
|
||||||
|
nationality, personal appearance, race, religion, or sexual identity
|
||||||
|
and orientation.
|
||||||
|
|
||||||
|
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||||
|
diverse, inclusive, and healthy community.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to a positive environment for our
|
||||||
|
community include:
|
||||||
|
|
||||||
|
* Demonstrating empathy and kindness toward other people
|
||||||
|
* Being respectful of differing opinions, viewpoints, and experiences
|
||||||
|
* Giving and gracefully accepting constructive feedback
|
||||||
|
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||||
|
and learning from the experience
|
||||||
|
* Focusing on what is best not just for us as individuals, but for the
|
||||||
|
overall community
|
||||||
|
|
||||||
|
Examples of unacceptable behavior include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery, and sexual attention or
|
||||||
|
advances of any kind
|
||||||
|
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or email
|
||||||
|
address, without their explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Enforcement Responsibilities
|
||||||
|
|
||||||
|
Community leaders are responsible for clarifying and enforcing our standards of
|
||||||
|
acceptable behavior and will take appropriate and fair corrective action in
|
||||||
|
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||||
|
or harmful.
|
||||||
|
|
||||||
|
Community leaders have the right and responsibility to remove, edit, or reject
|
||||||
|
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||||
|
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||||
|
decisions when appropriate.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies within all community spaces, and also applies when
|
||||||
|
an individual is officially representing the community in public spaces.
|
||||||
|
Examples of representing our community include using an official e-mail address,
|
||||||
|
posting via an official social media account, or acting as an appointed
|
||||||
|
representative at an online or offline event.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported to the community leaders responsible for enforcement at
|
||||||
|
contact@christitus.com.
|
||||||
|
All complaints will be reviewed and investigated promptly and fairly.
|
||||||
|
|
||||||
|
All community leaders are obligated to respect the privacy and security of the
|
||||||
|
reporter of any incident.
|
||||||
|
|
||||||
|
## Enforcement Guidelines
|
||||||
|
|
||||||
|
Community leaders will follow these Community Impact Guidelines in determining
|
||||||
|
the consequences for any action they deem in violation of this Code of Conduct:
|
||||||
|
|
||||||
|
### 1. Correction
|
||||||
|
|
||||||
|
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||||
|
unprofessional or unwelcome in the community.
|
||||||
|
|
||||||
|
**Consequence**: A private, written warning from community leaders, providing
|
||||||
|
clarity around the nature of the violation and an explanation of why the
|
||||||
|
behavior was inappropriate. A public apology may be requested.
|
||||||
|
|
||||||
|
### 2. Warning
|
||||||
|
|
||||||
|
**Community Impact**: A violation through a single incident or series
|
||||||
|
of actions.
|
||||||
|
|
||||||
|
**Consequence**: A warning with consequences for continued behavior. No
|
||||||
|
interaction with the people involved, including unsolicited interaction with
|
||||||
|
those enforcing the Code of Conduct, for a specified period of time. This
|
||||||
|
includes avoiding interactions in community spaces as well as external channels
|
||||||
|
like social media. Violating these terms may lead to a temporary or
|
||||||
|
permanent ban.
|
||||||
|
|
||||||
|
### 3. Temporary Ban
|
||||||
|
|
||||||
|
**Community Impact**: A serious violation of community standards, including
|
||||||
|
sustained inappropriate behavior.
|
||||||
|
|
||||||
|
**Consequence**: A temporary ban from any sort of interaction or public
|
||||||
|
communication with the community for a specified period of time. No public or
|
||||||
|
private interaction with the people involved, including unsolicited interaction
|
||||||
|
with those enforcing the Code of Conduct, is allowed during this period.
|
||||||
|
Violating these terms may lead to a permanent ban.
|
||||||
|
|
||||||
|
### 4. Permanent Ban
|
||||||
|
|
||||||
|
**Community Impact**: Demonstrating a pattern of violation of community
|
||||||
|
standards, including sustained inappropriate behavior, harassment of an
|
||||||
|
individual, or aggression toward or disparagement of classes of individuals.
|
||||||
|
|
||||||
|
**Consequence**: A permanent ban from any sort of public interaction within
|
||||||
|
the community.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||||
|
version 2.0, available at
|
||||||
|
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
|
||||||
|
|
||||||
|
Community Impact Guidelines were inspired by [Mozilla's code of conduct
|
||||||
|
enforcement ladder](https://github.com/mozilla/diversity).
|
||||||
|
|
||||||
|
[homepage]: https://www.contributor-covenant.org
|
||||||
|
|
||||||
|
For answers to common questions about this code of conduct, see the FAQ at
|
||||||
|
https://www.contributor-covenant.org/faq. Translations are available at
|
||||||
|
https://www.contributor-covenant.org/translations.
|
5
.github/PULL_REQUEST_TEMPLATE.md
vendored
5
.github/PULL_REQUEST_TEMPLATE.md
vendored
|
@ -1,8 +1,3 @@
|
||||||
# Pull Request
|
|
||||||
|
|
||||||
## Title
|
|
||||||
<!--[Provide a succinct and descriptive title for the pull request.]-->
|
|
||||||
|
|
||||||
## Type of Change
|
## Type of Change
|
||||||
- [ ] New feature
|
- [ ] New feature
|
||||||
- [ ] Bug fix
|
- [ ] Bug fix
|
||||||
|
|
2
.github/mkdocs.yml
vendored
2
.github/mkdocs.yml
vendored
|
@ -5,7 +5,9 @@ docs_dir: '../docs'
|
||||||
nav:
|
nav:
|
||||||
- Introduction: 'index.md'
|
- Introduction: 'index.md'
|
||||||
- User Guide: 'userguide.md'
|
- User Guide: 'userguide.md'
|
||||||
|
- Contributing:
|
||||||
- Contributing Guide: 'contribute.md'
|
- Contributing Guide: 'contribute.md'
|
||||||
|
- Roadmap: 'roadmap.md'
|
||||||
- Documentation:
|
- Documentation:
|
||||||
- Known Issues: 'KnownIssues.md'
|
- Known Issues: 'KnownIssues.md'
|
||||||
- FAQ: 'faq.md'
|
- FAQ: 'faq.md'
|
||||||
|
|
8
.github/release-drafter.yml
vendored
8
.github/release-drafter.yml
vendored
|
@ -1,5 +1,3 @@
|
||||||
name-template: '$RESOLVED_VERSION'
|
|
||||||
tag-template: '$RESOLVED_VERSION'
|
|
||||||
tag-prefix: ""
|
tag-prefix: ""
|
||||||
categories:
|
categories:
|
||||||
- title: '🚀 Features'
|
- title: '🚀 Features'
|
||||||
|
@ -21,10 +19,6 @@ template: |
|
||||||
|
|
||||||
$CHANGES
|
$CHANGES
|
||||||
|
|
||||||
## Contributors
|
|
||||||
|
|
||||||
$CONTRIBUTORS
|
|
||||||
|
|
||||||
change-title-escapes: '\<*_&"'''
|
change-title-escapes: '\<*_&"'''
|
||||||
autolabeler:
|
autolabeler:
|
||||||
- label: 'documentation'
|
- label: 'documentation'
|
||||||
|
@ -58,3 +52,5 @@ replacers:
|
||||||
replace: ''
|
replace: ''
|
||||||
exclude-labels:
|
exclude-labels:
|
||||||
- 'skip-changelog'
|
- 'skip-changelog'
|
||||||
|
|
||||||
|
filter-by-commitish: true
|
25
.github/workflows/cargo-lock.yml
vendored
25
.github/workflows/cargo-lock.yml
vendored
|
@ -1,25 +0,0 @@
|
||||||
name: Remove Cargo.lock changes
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
types: [opened, synchronize]
|
|
||||||
paths:
|
|
||||||
- 'Cargo.lock'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
remove-cargo-lock:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Remove Cargo.lock changes
|
|
||||||
run: |
|
|
||||||
git config user.name github-actions
|
|
||||||
git config user.email github-actions@github.com
|
|
||||||
git checkout ${{ github.head_ref }}
|
|
||||||
git reset origin/${{ github.base_ref }} -- Cargo.lock
|
|
||||||
git commit -m "Remove changes to Cargo.lock" || echo "No changes to commit"
|
|
||||||
git push origin ${{ github.head_ref }} --force
|
|
7
.github/workflows/github-pages.yml
vendored
7
.github/workflows/github-pages.yml
vendored
|
@ -3,10 +3,11 @@ name: GitHub Pages Deploy
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
paths:
|
paths:
|
||||||
- 'mkdocs.yml'
|
- '.github/mkdocs.yml'
|
||||||
|
- '.github/requirements.txt'
|
||||||
- 'docs/**'
|
- 'docs/**'
|
||||||
- 'overrides/**'
|
- 'overrides/**'
|
||||||
- 'CONTRIBUTING.md'
|
- '.github/CONTRIBUTING.md'
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
@ -29,4 +30,6 @@ jobs:
|
||||||
run: pip install -r .github/requirements.txt
|
run: pip install -r .github/requirements.txt
|
||||||
|
|
||||||
- name: Build & Deploy using mkdocs
|
- name: Build & Deploy using mkdocs
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
run: mkdocs gh-deploy --force -f .github/mkdocs.yml
|
run: mkdocs gh-deploy --force -f .github/mkdocs.yml
|
||||||
|
|
37
.github/workflows/linutil.yml
vendored
37
.github/workflows/linutil.yml
vendored
|
@ -3,6 +3,7 @@ name: LinUtil Release
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: ["main"]
|
branches: ["main"]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
|
@ -59,3 +60,39 @@ jobs:
|
||||||
file_pattern: "build/linutil"
|
file_pattern: "build/linutil"
|
||||||
add_options: '--force'
|
add_options: '--force'
|
||||||
if: success()
|
if: success()
|
||||||
|
|
||||||
|
- name: Extract Version
|
||||||
|
id: extract_version
|
||||||
|
run: |
|
||||||
|
version=$(date +"%Y.%m.%d")
|
||||||
|
echo "version=$version" >> $GITHUB_ENV
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Generate Release Notes
|
||||||
|
id: generate_notes
|
||||||
|
uses: release-drafter/release-drafter@v6
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
with:
|
||||||
|
config-name: release-drafter.yml
|
||||||
|
version: ${{ env.version }}
|
||||||
|
|
||||||
|
- name: Create and Upload Release
|
||||||
|
id: create_release
|
||||||
|
uses: softprops/action-gh-release@v2
|
||||||
|
with:
|
||||||
|
tag_name: ${{ env.version }}
|
||||||
|
name: Pre-Release ${{ env.version }}
|
||||||
|
body: |
|
||||||
|
${{ steps.generate_notes.outputs.body }}
|
||||||
|
|
||||||
|
![GitHub Downloads (specific asset, specific tag)](https://img.shields.io/github/downloads/ChrisTitusTech/linutil/${{ env.version }}/linutil)
|
||||||
|
append_body: false
|
||||||
|
files: |
|
||||||
|
./build/linutil
|
||||||
|
./start.sh
|
||||||
|
./startdev.sh
|
||||||
|
prerelease: true
|
||||||
|
env:
|
||||||
|
version: ${{ env.version }}
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
56
.github/workflows/pr-labels.yaml
vendored
Normal file
56
.github/workflows/pr-labels.yaml
vendored
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
name: Manage labels based on PR body
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request_target:
|
||||||
|
types: [opened, edited, reopened, synchronize]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
manage-labels:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Analyze PR Body and manage labels
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
body=$(jq -r '.pull_request.body' "$GITHUB_EVENT_PATH")
|
||||||
|
labels_to_add=()
|
||||||
|
labels_to_remove=()
|
||||||
|
declare -A label_checks=(
|
||||||
|
["New feature"]="enhancement"
|
||||||
|
["Bug fix|Hotfix|Security patch"]="bug"
|
||||||
|
["Documentation update"]="documentation"
|
||||||
|
["Refactoring"]="refactor"
|
||||||
|
["UI/UX improvement"]="UI/UX"
|
||||||
|
)
|
||||||
|
for pattern in "${!label_checks[@]}"; do
|
||||||
|
label="${label_checks[$pattern]}"
|
||||||
|
if echo "$body" | grep -Eq "\- \[x\] ($pattern)"; then
|
||||||
|
labels_to_add+=("$label")
|
||||||
|
else
|
||||||
|
labels_to_remove+=("$label")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "LABELS_TO_ADD=$(IFS=,; echo "${labels_to_add[*]}")" >> $GITHUB_ENV
|
||||||
|
echo "LABELS_TO_REMOVE=$(IFS=,; echo "${labels_to_remove[*]}")" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Add labels if necessary
|
||||||
|
if: env.LABELS_TO_ADD != ''
|
||||||
|
run: |
|
||||||
|
IFS=',' read -ra labels <<< "${LABELS_TO_ADD}"
|
||||||
|
for label in "${labels[@]}"; do
|
||||||
|
curl -s -X POST \
|
||||||
|
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
|
||||||
|
-H "Accept: application/vnd.github.v3+json" \
|
||||||
|
-d "{\"labels\": [\"$label\"]}" \
|
||||||
|
https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/labels
|
||||||
|
done
|
||||||
|
- name: Remove labels if necessary
|
||||||
|
if: env.LABELS_TO_REMOVE != ''
|
||||||
|
run: |
|
||||||
|
IFS=',' read -ra labels <<< "${LABELS_TO_REMOVE}"
|
||||||
|
for label in "${labels[@]}"; do
|
||||||
|
curl -s -X DELETE \
|
||||||
|
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
|
||||||
|
-H "Accept: application/vnd.github.v3+json" \
|
||||||
|
https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/labels/$label
|
||||||
|
done
|
55
.github/workflows/pre-release.yaml
vendored
55
.github/workflows/pre-release.yaml
vendored
|
@ -1,55 +0,0 @@
|
||||||
name: Pre-Release LinUtil
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write # Grant write permissions to contents
|
|
||||||
packages: write # Grant write permissions to packages
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch: # Manual trigger added
|
|
||||||
workflow_run:
|
|
||||||
workflows: ["LinUtil Release"]
|
|
||||||
types:
|
|
||||||
- completed
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-runspace:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout Repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Extract Version
|
|
||||||
id: extract_version
|
|
||||||
run: |
|
|
||||||
version=$(date +"%Y.%m.%d")
|
|
||||||
echo "version=$version" >> $GITHUB_ENV
|
|
||||||
shell: bash
|
|
||||||
|
|
||||||
- name: Generate Release Notes
|
|
||||||
id: generate_notes
|
|
||||||
uses: release-drafter/release-drafter@v6
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
with:
|
|
||||||
config-name: release-drafter.yml
|
|
||||||
version: ${{ env.version }}
|
|
||||||
|
|
||||||
- name: Create and Upload Release
|
|
||||||
id: create_release
|
|
||||||
uses: softprops/action-gh-release@v2
|
|
||||||
with:
|
|
||||||
tag_name: ${{ env.version }}
|
|
||||||
name: Pre-Release ${{ env.version }}
|
|
||||||
body: |
|
|
||||||
${{ steps.generate_notes.outputs.body }}
|
|
||||||
|
|
||||||
![GitHub Downloads (specific asset, specific tag)](https://img.shields.io/github/downloads/ChrisTitusTech/linutil/${{ env.version }}/linutil)
|
|
||||||
append_body: false
|
|
||||||
files: |
|
|
||||||
./build/linutil
|
|
||||||
./start.sh
|
|
||||||
./startdev.sh
|
|
||||||
prerelease: true
|
|
||||||
env:
|
|
||||||
version: ${{ env.version }}
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -2,3 +2,4 @@
|
||||||
/build
|
/build
|
||||||
rust/target
|
rust/target
|
||||||
rust/build
|
rust/build
|
||||||
|
/build/linutil
|
||||||
|
|
|
@ -31,7 +31,9 @@ For comprehensive information on how to use Linutil, visit the [Linutil Official
|
||||||
|
|
||||||
## 🛠 Contributing
|
## 🛠 Contributing
|
||||||
|
|
||||||
We welcome contributions from the community! Before you start, please review our [Contributing Guidelines](CONTRIBUTING.md) to understand how to make the most effective and efficient contributions.
|
We welcome contributions from the community! Before you start, please review our [Contributing Guidelines](.github/CONTRIBUTING.md) to understand how to make the most effective and efficient contributions.
|
||||||
|
|
||||||
|
[Official LinUtil Roadmap](https://christitustech.github.io/linutil/roadmap)
|
||||||
|
|
||||||
## 🏅 Thanks to All Contributors
|
## 🏅 Thanks to All Contributors
|
||||||
|
|
||||||
|
|
BIN
build/linutil
BIN
build/linutil
Binary file not shown.
|
@ -16,15 +16,19 @@ setupAlacritty() {
|
||||||
else
|
else
|
||||||
echo "alacritty is already installed."
|
echo "alacritty is already installed."
|
||||||
fi
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
setupAlacrittyConfig() {
|
||||||
echo "Copy alacritty config files"
|
echo "Copy alacritty config files"
|
||||||
if [ -d "${HOME}/.config/alacritty" ]; then
|
if [ -d "${HOME}/.config/alacritty" ] && [ ! -d "${HOME}/.config/alacritty-bak" ]; then
|
||||||
cp -r "${HOME}/.config/alacritty" "${HOME}/.config/alacritty-bak"
|
cp -r "${HOME}/.config/alacritty" "${HOME}/.config/alacritty-bak"
|
||||||
fi
|
fi
|
||||||
mkdir -p "${HOME}/.config/alacritty/"
|
mkdir -p "${HOME}/.config/alacritty/"
|
||||||
wget -O "${HOME}/.config/alacritty/alacritty.toml" "https://github.com/ChrisTitusTech/dwm-titus/raw/main/config/alacritty/alacritty.toml"
|
curl -sSLo "${HOME}/.config/alacritty/alacritty.toml" "https://github.com/ChrisTitusTech/dwm-titus/raw/main/config/alacritty/alacritty.toml"
|
||||||
wget -O "${HOME}/.config/alacritty/nordic.toml" "https://github.com/ChrisTitusTech/dwm-titus/raw/main/config/alacritty/nordic.toml"
|
curl -sSLo "${HOME}/.config/alacritty/nordic.toml" "https://github.com/ChrisTitusTech/dwm-titus/raw/main/config/alacritty/nordic.toml"
|
||||||
}
|
}
|
||||||
|
|
||||||
checkEnv
|
checkEnv
|
||||||
checkEscalationTool
|
checkEscalationTool
|
||||||
setupAlacritty
|
setupAlacritty
|
||||||
|
setupAlacrittyConfig
|
128
tabs/applications-setup/dwmtitus-setup.sh
Normal file → Executable file
128
tabs/applications-setup/dwmtitus-setup.sh
Normal file → Executable file
|
@ -1,4 +1,5 @@
|
||||||
#!/bin/sh -e
|
#!/bin/sh -e
|
||||||
|
|
||||||
. ../common-script.sh
|
. ../common-script.sh
|
||||||
|
|
||||||
makeDWM() {
|
makeDWM() {
|
||||||
|
@ -14,8 +15,8 @@ setupDWM() {
|
||||||
pacman)
|
pacman)
|
||||||
$ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm base-devel libx11 libxinerama libxft imlib2 libxcb
|
$ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm base-devel libx11 libxinerama libxft imlib2 libxcb
|
||||||
;;
|
;;
|
||||||
apt)
|
apt-get|nala)
|
||||||
$ESCALATION_TOOL "$PACKAGER" install -y build-essential libx11-dev libxinerama-dev libxft-dev libimlib2-dev libxcb1-dev libx11-xcb1
|
$ESCALATION_TOOL "$PACKAGER" install -y build-essential libx11-dev libxinerama-dev libxft-dev libimlib2-dev libx11-xcb-dev libfontconfig1 libx11-6 libxft2 libxinerama1 libxcb-res0-dev
|
||||||
;;
|
;;
|
||||||
dnf)
|
dnf)
|
||||||
$ESCALATION_TOOL "$PACKAGER" groupinstall -y "Development Tools"
|
$ESCALATION_TOOL "$PACKAGER" groupinstall -y "Development Tools"
|
||||||
|
@ -55,7 +56,7 @@ install_nerd_font() {
|
||||||
# Check if the font zip file already exists
|
# Check if the font zip file already exists
|
||||||
if [ ! -f "$FONT_ZIP" ]; then
|
if [ ! -f "$FONT_ZIP" ]; then
|
||||||
# Download the font zip file
|
# Download the font zip file
|
||||||
wget -P "$FONT_DIR" "$FONT_URL" || {
|
curl -sSLo "$FONT_ZIP" "$FONT_URL" || {
|
||||||
echo "Failed to download Meslo Nerd-fonts from $FONT_URL"
|
echo "Failed to download Meslo Nerd-fonts from $FONT_URL"
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
@ -114,7 +115,7 @@ picom_animations() {
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Install the built binary
|
# Install the built binary
|
||||||
if ! sudo ninja -C build install; then
|
if ! $ESCALATION_TOOL ninja -C build install; then
|
||||||
echo "Failed to install the built binary"
|
echo "Failed to install the built binary"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
@ -142,27 +143,30 @@ clone_config_folders() {
|
||||||
}
|
}
|
||||||
|
|
||||||
configure_backgrounds() {
|
configure_backgrounds() {
|
||||||
|
# Set the variable PIC_DIR which stores the path for images
|
||||||
|
PIC_DIR="$HOME/Pictures"
|
||||||
|
|
||||||
# Set the variable BG_DIR to the path where backgrounds will be stored
|
# Set the variable BG_DIR to the path where backgrounds will be stored
|
||||||
BG_DIR="$HOME/Pictures/backgrounds"
|
BG_DIR="$PIC_DIR/backgrounds"
|
||||||
|
|
||||||
# Check if the ~/Pictures directory exists
|
# Check if the ~/Pictures directory exists
|
||||||
if [ ! -d "~/Pictures" ]; then
|
if [ ! -d "$PIC_DIR" ]; then
|
||||||
# If it doesn't exist, print an error message and return with a status of 1 (indicating failure)
|
# If it doesn't exist, print an error message and return with a status of 1 (indicating failure)
|
||||||
echo "Pictures directory does not exist"
|
echo "Pictures directory does not exist"
|
||||||
mkdir ~/Pictures
|
mkdir "$PIC_DIR"
|
||||||
echo "Directory was created in Home folder"
|
echo "Directory was created in Home folder"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Check if the backgrounds directory (BG_DIR) exists
|
# Check if the backgrounds directory (BG_DIR) exists
|
||||||
if [ ! -d "$BG_DIR" ]; then
|
if [ ! -d "$BG_DIR" ]; then
|
||||||
# If the backgrounds directory doesn't exist, attempt to clone a repository containing backgrounds
|
# If the backgrounds directory doesn't exist, attempt to clone a repository containing backgrounds
|
||||||
if ! git clone https://github.com/ChrisTitusTech/nord-background.git ~/Pictures; then
|
if ! git clone https://github.com/ChrisTitusTech/nord-background.git "$PIC_DIR/nord-background"; then
|
||||||
# If the git clone command fails, print an error message and return with a status of 1
|
# If the git clone command fails, print an error message and return with a status of 1
|
||||||
echo "Failed to clone the repository"
|
echo "Failed to clone the repository"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
# Rename the cloned directory to 'backgrounds'
|
# Rename the cloned directory to 'backgrounds'
|
||||||
mv ~/Pictures/nord-background ~/Pictures/backgrounds
|
mv "$PIC_DIR/nord-background" "$PIC_DIR/backgrounds"
|
||||||
# Print a success message indicating that the backgrounds have been downloaded
|
# Print a success message indicating that the backgrounds have been downloaded
|
||||||
echo "Downloaded desktop backgrounds to $BG_DIR"
|
echo "Downloaded desktop backgrounds to $BG_DIR"
|
||||||
else
|
else
|
||||||
|
@ -177,7 +181,7 @@ setupDisplayManager() {
|
||||||
pacman)
|
pacman)
|
||||||
$ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm xorg-xinit xorg-server
|
$ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm xorg-xinit xorg-server
|
||||||
;;
|
;;
|
||||||
apt)
|
apt-get|nala)
|
||||||
$ESCALATION_TOOL "$PACKAGER" install -y xorg xinit
|
$ESCALATION_TOOL "$PACKAGER" install -y xorg xinit
|
||||||
;;
|
;;
|
||||||
dnf)
|
dnf)
|
||||||
|
@ -192,8 +196,8 @@ setupDisplayManager() {
|
||||||
echo "Setting up Display Manager"
|
echo "Setting up Display Manager"
|
||||||
currentdm="none"
|
currentdm="none"
|
||||||
for dm in gdm sddm lightdm; do
|
for dm in gdm sddm lightdm; do
|
||||||
if systemctl is-active --quiet $dm.service; then
|
if systemctl is-active --quiet "$dm.service"; then
|
||||||
currentdm=$dm
|
currentdm="$dm"
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
@ -203,13 +207,13 @@ setupDisplayManager() {
|
||||||
echo "No display manager found, installing $DM"
|
echo "No display manager found, installing $DM"
|
||||||
case "$PACKAGER" in
|
case "$PACKAGER" in
|
||||||
pacman)
|
pacman)
|
||||||
$ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm $DM
|
$ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm "$DM"
|
||||||
;;
|
;;
|
||||||
apt)
|
apt-get|nala)
|
||||||
$ESCALATION_TOOL "$PACKAGER" install -y $DM
|
$ESCALATION_TOOL "$PACKAGER" install -y "$DM"
|
||||||
;;
|
;;
|
||||||
dnf)
|
dnf)
|
||||||
$ESCALATION_TOOL "$PACKAGER" install -y $DM
|
$ESCALATION_TOOL "$PACKAGER" install -y "$DM"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo "Unsupported package manager: $PACKAGER"
|
echo "Unsupported package manager: $PACKAGER"
|
||||||
|
@ -217,82 +221,67 @@ setupDisplayManager() {
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
echo "$DM installed successfully"
|
echo "$DM installed successfully"
|
||||||
systemctl enable $DM
|
systemctl enable "$DM"
|
||||||
|
|
||||||
# Clear the screen
|
|
||||||
clear
|
|
||||||
|
|
||||||
# Prompt user for auto-login
|
# Prompt user for auto-login
|
||||||
echo "Do you want to enable auto-login?"
|
# Using printf instead of echo -n as It's more posix-compliant.
|
||||||
echo "Use arrow keys or j/k to navigate, Enter to select"
|
printf "Do you want to enable auto-login? (Y/n) "
|
||||||
options=("Yes" "No")
|
read -r answer
|
||||||
selected=0
|
case "$answer" in
|
||||||
|
[Yy]*)
|
||||||
# Function to print menu
|
|
||||||
print_menu() {
|
|
||||||
for i in "${!options[@]}"; do
|
|
||||||
if [ $i -eq $selected ]; then
|
|
||||||
echo "> ${options[$i]}"
|
|
||||||
else
|
|
||||||
echo " ${options[$i]}"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
# Handle user input
|
|
||||||
while true; do
|
|
||||||
print_menu
|
|
||||||
read -rsn1 key
|
|
||||||
case "$key" in
|
|
||||||
$'\x1B') # ESC sequence for arrow keys
|
|
||||||
read -rsn2 key
|
|
||||||
case "$key" in
|
|
||||||
'[A' | 'k') ((selected > 0)) && ((selected--));; # Up arrow or k
|
|
||||||
'[B' | 'j') ((selected < ${#options[@]}-1)) && ((selected++));; # Down arrow or j
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
'') break;; # Enter key
|
|
||||||
esac
|
|
||||||
clear
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ "${options[$selected]}" = "Yes" ]; then
|
|
||||||
echo "Configuring SDDM for autologin"
|
echo "Configuring SDDM for autologin"
|
||||||
SDDM_CONF="/etc/sddm.conf"
|
SDDM_CONF="/etc/sddm.conf"
|
||||||
if [ ! -f "$SDDM_CONF" ]; then
|
if [ ! -f "$SDDM_CONF" ]; then
|
||||||
echo "[Autologin]" | sudo tee -a "$SDDM_CONF"
|
echo "[Autologin]" | $ESCALATION_TOOL tee -a "$SDDM_CONF"
|
||||||
echo "User=$USER" | sudo tee -a "$SDDM_CONF"
|
echo "User=$USER" | $ESCALATION_TOOL tee -a "$SDDM_CONF"
|
||||||
echo "Session=dwm" | sudo tee -a "$SDDM_CONF"
|
echo "Session=dwm" | $ESCALATION_TOOL tee -a "$SDDM_CONF"
|
||||||
else
|
else
|
||||||
sudo sed -i '/^\[Autologin\]/d' "$SDDM_CONF"
|
$ESCALATION_TOOL sed -i '/^\[Autologin\]/d' "$SDDM_CONF"
|
||||||
sudo sed -i '/^User=/d' "$SDDM_CONF"
|
$ESCALATION_TOOL sed -i '/^User=/d' "$SDDM_CONF"
|
||||||
sudo sed -i '/^Session=/d' "$SDDM_CONF"
|
$ESCALATION_TOOL sed -i '/^Session=/d' "$SDDM_CONF"
|
||||||
echo "[Autologin]" | sudo tee -a "$SDDM_CONF"
|
echo "[Autologin]" | $ESCALATION_TOOL tee -a "$SDDM_CONF"
|
||||||
echo "User=$USER" | sudo tee -a "$SDDM_CONF"
|
echo "User=$USER" | $ESCALATION_TOOL tee -a "$SDDM_CONF"
|
||||||
echo "Session=dwm" | sudo tee -a "$SDDM_CONF"
|
echo "Session=dwm" | $ESCALATION_TOOL tee -a "$SDDM_CONF"
|
||||||
fi
|
fi
|
||||||
echo "Checking if autologin group exists"
|
echo "Checking if autologin group exists"
|
||||||
if ! getent group autologin > /dev/null; then
|
if ! getent group autologin > /dev/null; then
|
||||||
echo "Creating autologin group"
|
echo "Creating autologin group"
|
||||||
sudo groupadd autologin
|
$ESCALATION_TOOL groupadd autologin
|
||||||
else
|
else
|
||||||
echo "Autologin group already exists"
|
echo "Autologin group already exists"
|
||||||
fi
|
fi
|
||||||
echo "Adding user with UID 1000 to autologin group"
|
echo "Adding user with UID 1000 to autologin group"
|
||||||
USER_UID_1000=$(getent passwd 1000 | cut -d: -f1)
|
USER_UID_1000=$(getent passwd 1000 | cut -d: -f1)
|
||||||
if [ -n "$USER_UID_1000" ]; then
|
if [ -n "$USER_UID_1000" ]; then
|
||||||
sudo usermod -aG autologin "$USER_UID_1000"
|
$ESCALATION_TOOL usermod -aG autologin "$USER_UID_1000"
|
||||||
echo "User $USER_UID_1000 added to autologin group"
|
echo "User $USER_UID_1000 added to autologin group"
|
||||||
else
|
else
|
||||||
echo "No user with UID 1000 found - Auto login not possible"
|
echo "No user with UID 1000 found - Auto login not possible"
|
||||||
fi
|
fi
|
||||||
else
|
;;
|
||||||
|
*)
|
||||||
echo "Auto-login configuration skipped"
|
echo "Auto-login configuration skipped"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
fi
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
install_slstatus() {
|
||||||
|
printf "Do you want to install slstatus? (y/N): " # using printf instead of 'echo' to avoid newline, -n flag for 'echo' is not supported in POSIX
|
||||||
|
read -r response # -r flag to prevent backslashes from being interpreted
|
||||||
|
if [ "$response" = "y" ] || [ "$response" = "Y" ]; then
|
||||||
|
echo "Installing slstatus"
|
||||||
|
cd "$HOME/dwm-titus/slstatus" || { echo "Failed to change directory to slstatus"; return 1; }
|
||||||
|
if $ESCALATION_TOOL make clean install; then
|
||||||
|
echo "slstatus installed successfully"
|
||||||
|
else
|
||||||
|
echo "Failed to install slstatus"
|
||||||
|
return 1
|
||||||
fi
|
fi
|
||||||
|
else
|
||||||
|
echo "Skipping slstatus installation"
|
||||||
|
fi
|
||||||
|
cd "$HOME"
|
||||||
}
|
}
|
||||||
|
|
||||||
checkEnv
|
checkEnv
|
||||||
|
@ -300,6 +289,7 @@ checkEscalationTool
|
||||||
setupDisplayManager
|
setupDisplayManager
|
||||||
setupDWM
|
setupDWM
|
||||||
makeDWM
|
makeDWM
|
||||||
|
install_slstatus
|
||||||
install_nerd_font
|
install_nerd_font
|
||||||
clone_config_folders
|
clone_config_folders
|
||||||
configure_backgrounds
|
configure_backgrounds
|
||||||
|
|
33
tabs/applications-setup/fastfetch-setup.sh
Normal file
33
tabs/applications-setup/fastfetch-setup.sh
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
. ../common-script.sh
|
||||||
|
|
||||||
|
setupFastfetch() {
|
||||||
|
echo "Installing Fastfetch if not already installed..."
|
||||||
|
if ! command_exists fastfetch; then
|
||||||
|
case ${PACKAGER} in
|
||||||
|
pacman)
|
||||||
|
$ESCALATION_TOOL "${PACKAGER}" -S --needed --noconfirm fastfetch
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
$ESCALATION_TOOL "${PACKAGER}" install -y fastfetch
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
echo "Fastfetch is already installed."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
setupFastfetchConfig() {
|
||||||
|
echo "Copying Fastfetch config files..."
|
||||||
|
if [ -d "${HOME}/.config/fastfetch" ] && [ ! -d "${HOME}/.config/fastfetch-bak" ]; then
|
||||||
|
cp -r "${HOME}/.config/fastfetch" "${HOME}/.config/fastfetch-bak"
|
||||||
|
fi
|
||||||
|
mkdir -p "${HOME}/.config/fastfetch/"
|
||||||
|
curl -sSLo "${HOME}/.config/fastfetch/config.jsonc" https://raw.githubusercontent.com/ChrisTitusTech/mybash/main/config.jsonc
|
||||||
|
}
|
||||||
|
|
||||||
|
checkEnv
|
||||||
|
checkEscalationTool
|
||||||
|
setupFastfetch
|
||||||
|
setupFastfetchConfig
|
|
@ -16,15 +16,19 @@ setupKitty() {
|
||||||
else
|
else
|
||||||
echo "Kitty is already installed."
|
echo "Kitty is already installed."
|
||||||
fi
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
setupKittyConfig() {
|
||||||
echo "Copy Kitty config files"
|
echo "Copy Kitty config files"
|
||||||
if [ -d "${HOME}/.config/kitty" ]; then
|
if [ -d "${HOME}/.config/kitty" ] && [ ! -d "${HOME}/.config/kitty-bak" ]; then
|
||||||
cp -r "${HOME}/.config/kitty" "${HOME}/.config/kitty-bak"
|
cp -r "${HOME}/.config/kitty" "${HOME}/.config/kitty-bak"
|
||||||
fi
|
fi
|
||||||
mkdir -p "${HOME}/.config/kitty/"
|
mkdir -p "${HOME}/.config/kitty/"
|
||||||
wget -O "${HOME}/.config/kitty/kitty.conf" https://github.com/ChrisTitusTech/dwm-titus/raw/main/config/kitty/kitty.conf
|
curl -sSLo "${HOME}/.config/kitty/kitty.conf" https://github.com/ChrisTitusTech/dwm-titus/raw/main/config/kitty/kitty.conf
|
||||||
wget -O "${HOME}/.config/kitty/nord.conf" https://github.com/ChrisTitusTech/dwm-titus/raw/main/config/kitty/nord.conf
|
curl -sSLo "${HOME}/.config/kitty/nord.conf" https://github.com/ChrisTitusTech/dwm-titus/raw/main/config/kitty/nord.conf
|
||||||
}
|
}
|
||||||
|
|
||||||
checkEnv
|
checkEnv
|
||||||
checkEscalationTool
|
checkEscalationTool
|
||||||
setupKitty
|
setupKitty
|
||||||
|
setupKittyConfig
|
118
tabs/applications-setup/mybash-setup.sh
Normal file
118
tabs/applications-setup/mybash-setup.sh
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
. ../common-script.sh
|
||||||
|
|
||||||
|
gitpath="$HOME/.local/share/mybash"
|
||||||
|
|
||||||
|
cloneMyBash() {
|
||||||
|
# Check if the dir exists before attempting to clone into it.
|
||||||
|
if [ -d "$gitpath" ]; then
|
||||||
|
rm -rf "$gitpath"
|
||||||
|
fi
|
||||||
|
mkdir -p "$HOME/.local/share" # Only create the dir if it doesn't exist.
|
||||||
|
cd "$HOME" && git clone https://github.com/ChrisTitusTech/mybash.git "$gitpath"
|
||||||
|
}
|
||||||
|
|
||||||
|
installDepend() {
|
||||||
|
echo "Install mybash if not already installed"
|
||||||
|
case "$PACKAGER" in
|
||||||
|
pacman)
|
||||||
|
$ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm bash bash-completion tar bat tree unzip fontconfig
|
||||||
|
;;
|
||||||
|
apt)
|
||||||
|
$ESCALATION_TOOL "$PACKAGER" install -y bash bash-completion tar bat tree unzip fontconfig
|
||||||
|
;;
|
||||||
|
dnf)
|
||||||
|
$ESCALATION_TOOL "$PACKAGER" install -y bash bash-completion tar bat tree unzip fontconfig
|
||||||
|
;;
|
||||||
|
zypper)
|
||||||
|
$ESCALATION_TOOL "$PACKAGER" install -y bash bash-completion tar bat tree unzip fontconfig
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
printf "%b\n" "${RED}Unsupported package manager: $PACKAGER${RC}" # The packages above were grabbed out of the original mybash-setup-script.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
installFont() {
|
||||||
|
# Check to see if the MesloLGS Nerd Font is installed (Change this to whatever font you would like)
|
||||||
|
FONT_NAME="MesloLGS Nerd Font Mono"
|
||||||
|
if fc-list :family | grep -iq "$FONT_NAME"; then
|
||||||
|
echo "Font '$FONT_NAME' is installed."
|
||||||
|
else
|
||||||
|
echo "Installing font '$FONT_NAME'"
|
||||||
|
# Change this URL to correspond with the correct font
|
||||||
|
FONT_URL="https://github.com/ryanoasis/nerd-fonts/releases/latest/download/Meslo.zip"
|
||||||
|
FONT_DIR="$HOME/.local/share/fonts"
|
||||||
|
TEMP_DIR=$(mktemp -d)
|
||||||
|
curl -sSLo "$TEMP_DIR"/"${FONT_NAME}".zip "$FONT_URL"
|
||||||
|
unzip "$TEMP_DIR"/"${FONT_NAME}".zip -d "$TEMP_DIR"
|
||||||
|
mkdir -p "$FONT_DIR"/"$FONT_NAME"
|
||||||
|
mv "${TEMP_DIR}"/*.ttf "$FONT_DIR"/"$FONT_NAME"
|
||||||
|
fc-cache -fv
|
||||||
|
rm -rf "${TEMP_DIR}"
|
||||||
|
echo "'$FONT_NAME' installed successfully."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
installStarshipAndFzf() {
|
||||||
|
if command_exists starship; then
|
||||||
|
echo "Starship already installed"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! curl -sSL https://starship.rs/install.sh | sh; then
|
||||||
|
printf "%b\n" "${RED}Something went wrong during starship install!${RC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if command_exists fzf; then
|
||||||
|
echo "Fzf already installed"
|
||||||
|
else
|
||||||
|
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
|
||||||
|
$ESCALATION_TOOL ~/.fzf/install
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
installZoxide() {
|
||||||
|
if command_exists zoxide; then
|
||||||
|
echo "Zoxide already installed"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! curl -sSL https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | sh; then
|
||||||
|
printf "%b\n" "${RED}Something went wrong during zoxide install!${RC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
linkConfig() {
|
||||||
|
OLD_BASHRC="$HOME/.bashrc"
|
||||||
|
if [ -e "$OLD_BASHRC" ] && [ ! -e "$HOME/.bashrc.bak" ]; then
|
||||||
|
printf "%b\n" "${YELLOW}Moving old bash config file to $HOME/.bashrc.bak${RC}"
|
||||||
|
if ! mv "$OLD_BASHRC" "$HOME/.bashrc.bak"; then
|
||||||
|
printf "%b\n" "${RED}Can't move the old bash config file!${RC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf "%b\n" "${YELLOW}Linking new bash config file...${RC}"
|
||||||
|
ln -svf "$gitpath/.bashrc" "$HOME/.bashrc" || {
|
||||||
|
printf "%b\n" "${RED}Failed to create symbolic link for .bashrc${RC}"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
ln -svf "$gitpath/starship.toml" "$HOME/.config/starship.toml" || {
|
||||||
|
printf "%b\n" "${RED}Failed to create symbolic link for starship.toml${RC}"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
printf "%b\n" "${GREEN}Done! restart your shell to see the changes.${RC}"
|
||||||
|
}
|
||||||
|
|
||||||
|
checkEnv
|
||||||
|
checkEscalationTool
|
||||||
|
cloneMyBash
|
||||||
|
installDepend
|
||||||
|
installFont
|
||||||
|
installStarshipAndFzf
|
||||||
|
installZoxide
|
||||||
|
linkConfig
|
55
tabs/applications-setup/neovim-setup.sh
Executable file
55
tabs/applications-setup/neovim-setup.sh
Executable file
|
@ -0,0 +1,55 @@
|
||||||
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
. ../common-script.sh
|
||||||
|
|
||||||
|
gitpath="$HOME/.local/share/neovim"
|
||||||
|
|
||||||
|
cloneNeovim() {
|
||||||
|
# Check if the dir exists before attempting to clone into it.
|
||||||
|
if [ -d "$gitpath" ]; then
|
||||||
|
rm -rf "$gitpath"
|
||||||
|
fi
|
||||||
|
mkdir -p "$HOME/.local/share" # Only create the dir if it doesn't exist.
|
||||||
|
cd "$HOME" && git clone https://github.com/ChrisTitusTech/neovim.git "$HOME/.local/share/neovim"
|
||||||
|
}
|
||||||
|
|
||||||
|
setupNeovim() {
|
||||||
|
echo "Install Neovim if not already installed"
|
||||||
|
case "$PACKAGER" in
|
||||||
|
pacman)
|
||||||
|
$ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm neovim ripgrep fzf python-virtualenv luarocks go shellcheck
|
||||||
|
;;
|
||||||
|
apt)
|
||||||
|
$ESCALATION_TOOL "$PACKAGER" install -y neovim ripgrep fd-find python3-venv luarocks golang-go shellcheck
|
||||||
|
;;
|
||||||
|
dnf)
|
||||||
|
$ESCALATION_TOOL "$PACKAGER" install -y neovim ripgrep fzf python3-virtualenv luarocks golang ShellCheck
|
||||||
|
;;
|
||||||
|
zypper)
|
||||||
|
$ESCALATION_TOOL "$PACKAGER" install -y neovim ripgrep fzf python3-virtualenv luarocks golang ShellCheck
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
printf "%b\n" "${RED}Unsupported package manager: $PACKAGER${RC}" # The packages above were grabbed out of the original nvim-setup-script.
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
backupNeovimConfig() {
|
||||||
|
if [ -d "$HOME/.config/nvim" ] && [ ! -d "$HOME/.config/nvim-backup" ]; then
|
||||||
|
cp -r "$HOME/.config/nvim" "$HOME/.config/nvim-backup"
|
||||||
|
fi
|
||||||
|
rm -rf "$HOME/.config/nvim"
|
||||||
|
}
|
||||||
|
|
||||||
|
linkNeovimConfig() {
|
||||||
|
mkdir -p "$HOME/.config/nvim"
|
||||||
|
ln -s "$gitpath/titus-kickstart/"* "$HOME/.config/nvim/" # Wild card is used here to link all contents of titus-kickstart.
|
||||||
|
}
|
||||||
|
|
||||||
|
checkEnv
|
||||||
|
checkEscalationTool
|
||||||
|
cloneNeovim
|
||||||
|
setupNeovim
|
||||||
|
backupNeovimConfig
|
||||||
|
linkNeovimConfig
|
|
@ -16,20 +16,24 @@ setupRofi() {
|
||||||
else
|
else
|
||||||
echo "Rofi is already installed."
|
echo "Rofi is already installed."
|
||||||
fi
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
setupRofiConfig() {
|
||||||
echo "Copy Rofi config files"
|
echo "Copy Rofi config files"
|
||||||
if [ -d "$HOME/.config/rofi" ]; then
|
if [ -d "$HOME/.config/rofi" ] && [ ! -d "$HOME/.config/rofi-bak" ]; then
|
||||||
cp -r "$HOME/.config/rofi" "$HOME/.config/rofi.bak"
|
cp -r "$HOME/.config/rofi" "$HOME/.config/rofi-bak"
|
||||||
fi
|
fi
|
||||||
mkdir -p "$HOME/.config/rofi"
|
mkdir -p "$HOME/.config/rofi"
|
||||||
wget -O "$HOME/.config/rofi/powermenu.sh" https://github.com/ChrisTitusTech/dwm-titus/raw/main/config/rofi/powermenu.sh
|
curl -sSLo "$HOME/.config/rofi/powermenu.sh" https://github.com/ChrisTitusTech/dwm-titus/raw/main/config/rofi/powermenu.sh
|
||||||
chmod +x "$HOME/.config/rofi/powermenu.sh"
|
chmod +x "$HOME/.config/rofi/powermenu.sh"
|
||||||
wget -O "$HOME/.config/rofi/config.rasi" https://github.com/ChrisTitusTech/dwm-titus/raw/main/config/rofi/config.rasi
|
curl -sSLo "$HOME/.config/rofi/config.rasi" https://github.com/ChrisTitusTech/dwm-titus/raw/main/config/rofi/config.rasi
|
||||||
mkdir -p "$HOME/.config/rofi/themes"
|
mkdir -p "$HOME/.config/rofi/themes"
|
||||||
wget -O "$HOME/.config/rofi/themes/nord.rasi" https://github.com/ChrisTitusTech/dwm-titus/raw/main/config/rofi/themes/nord.rasi
|
curl -sSLo "$HOME/.config/rofi/themes/nord.rasi" https://github.com/ChrisTitusTech/dwm-titus/raw/main/config/rofi/themes/nord.rasi
|
||||||
wget -O "$HOME/.config/rofi/themes/sidetab-nord.rasi" https://github.com/ChrisTitusTech/dwm-titus/raw/main/config/rofi/themes/sidetab-nord.rasi
|
curl -sSLo "$HOME/.config/rofi/themes/sidetab-nord.rasi" https://github.com/ChrisTitusTech/dwm-titus/raw/main/config/rofi/themes/sidetab-nord.rasi
|
||||||
wget -O "$HOME/.config/rofi/themes/powermenu.rasi" https://github.com/ChrisTitusTech/dwm-titus/raw/main/config/rofi/themes/powermenu.rasi
|
curl -sSLo "$HOME/.config/rofi/themes/powermenu.rasi" https://github.com/ChrisTitusTech/dwm-titus/raw/main/config/rofi/themes/powermenu.rasi
|
||||||
}
|
}
|
||||||
|
|
||||||
checkEnv
|
checkEnv
|
||||||
checkEscalationTool
|
checkEscalationTool
|
||||||
setupRofi
|
setupRofi
|
||||||
|
setupRofiConfig
|
||||||
|
|
|
@ -6,7 +6,7 @@ script = "alacritty-setup.sh"
|
||||||
|
|
||||||
[[data]]
|
[[data]]
|
||||||
name = "Bash Prompt"
|
name = "Bash Prompt"
|
||||||
command = "bash -c \"$(curl -s https://raw.githubusercontent.com/ChrisTitusTech/mybash/main/setup.sh)\""
|
script = "mybash-setup.sh"
|
||||||
|
|
||||||
[[data]]
|
[[data]]
|
||||||
name = "DWM-Titus"
|
name = "DWM-Titus"
|
||||||
|
@ -18,7 +18,7 @@ script = "kitty-setup.sh"
|
||||||
|
|
||||||
[[data]]
|
[[data]]
|
||||||
name = "Neovim"
|
name = "Neovim"
|
||||||
command = "bash -c \"$(curl -s https://raw.githubusercontent.com/ChrisTitusTech/neovim/main/setup.sh)\""
|
script = "neovim-setup.sh"
|
||||||
|
|
||||||
[[data]]
|
[[data]]
|
||||||
name = "Rofi"
|
name = "Rofi"
|
||||||
|
@ -27,3 +27,7 @@ script = "rofi-setup.sh"
|
||||||
[[data]]
|
[[data]]
|
||||||
name = "ZSH Prompt"
|
name = "ZSH Prompt"
|
||||||
script = "zsh-setup.sh"
|
script = "zsh-setup.sh"
|
||||||
|
|
||||||
|
[[data]]
|
||||||
|
name = "Fastfetch"
|
||||||
|
script = "fastfetch-setup.sh"
|
|
@ -5,6 +5,7 @@
|
||||||
RC='\033[0m'
|
RC='\033[0m'
|
||||||
RED='\033[31m'
|
RED='\033[31m'
|
||||||
YELLOW='\033[33m'
|
YELLOW='\033[33m'
|
||||||
|
CYAN='\033[36m'
|
||||||
GREEN='\033[32m'
|
GREEN='\033[32m'
|
||||||
|
|
||||||
command_exists() {
|
command_exists() {
|
||||||
|
@ -54,7 +55,7 @@ checkEscalationTool() {
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
echo -e "${RED}Can't find a supported escalation tool${RC}"
|
printf "%b\n" "${RED}Can't find a supported escalation tool${RC}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
@ -82,7 +83,7 @@ checkPackageManager() {
|
||||||
done
|
done
|
||||||
|
|
||||||
if [ -z "${PACKAGER}" ]; then
|
if [ -z "${PACKAGER}" ]; then
|
||||||
echo -e "${RED}Can't find a supported package manager${RC}"
|
printf "%b\n" "${RED}Can't find a supported package manager${RC}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,7 +85,7 @@ mkdir -p "$mods_path"
|
||||||
|
|
||||||
# Download the latest release
|
# Download the latest release
|
||||||
echo "Downloading the latest loot filter..."
|
echo "Downloading the latest loot filter..."
|
||||||
wget -q --show-progress https://github.com/ChrisTitusTech/d2r-loot-filter/releases/latest/download/lootfilter.zip -O /tmp/lootfilter.zip
|
curl -sSLo /tmp/lootfilter.zip https://github.com/ChrisTitusTech/d2r-loot-filter/releases/latest/download/lootfilter.zip
|
||||||
|
|
||||||
# Extract the contents to the mods folder
|
# Extract the contents to the mods folder
|
||||||
echo "Extracting loot filter to $mods_path..."
|
echo "Extracting loot filter to $mods_path..."
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
name = "Gaming"
|
name = "Gaming"
|
||||||
|
|
||||||
[[data]]
|
[[data]]
|
||||||
name = "Diablo II Ressurected"
|
name = "Diablo II Resurrected"
|
||||||
|
|
||||||
[[data.entries]]
|
[[data.entries]]
|
||||||
name = "Loot Filter Install"
|
name = "Loot Filter Install"
|
||||||
|
|
|
@ -19,7 +19,7 @@ installPkg() {
|
||||||
}
|
}
|
||||||
|
|
||||||
configureUFW() {
|
configureUFW() {
|
||||||
echo -e "${GREEN}Using Chris Titus Recommended Firewall Rules${RC}"
|
printf "%b\n" "${GREEN}Using Chris Titus Recommended Firewall Rules${RC}"
|
||||||
|
|
||||||
echo "Disabling UFW"
|
echo "Disabling UFW"
|
||||||
$ESCALATION_TOOL ufw disable
|
$ESCALATION_TOOL ufw disable
|
||||||
|
@ -40,7 +40,7 @@ configureUFW() {
|
||||||
$ESCALATION_TOOL ufw default allow outgoing
|
$ESCALATION_TOOL ufw default allow outgoing
|
||||||
|
|
||||||
$ESCALATION_TOOL ufw enable
|
$ESCALATION_TOOL ufw enable
|
||||||
echo -e "${GREEN}Enabled Firewall with Baselines!${RC}"
|
printf "%b\n" "${GREEN}Enabled Firewall with Baselines!${RC}"
|
||||||
}
|
}
|
||||||
|
|
||||||
checkEnv
|
checkEnv
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
installDepend() {
|
installDepend() {
|
||||||
## Check for dependencies.
|
## Check for dependencies.
|
||||||
DEPENDENCIES='tar tree multitail tldr trash-cli unzip cmake make jq'
|
DEPENDENCIES='tar tree multitail tldr trash-cli unzip cmake make jq'
|
||||||
echo -e "${YELLOW}Installing dependencies...${RC}"
|
printf "%b\n" "${YELLOW}Installing dependencies...${RC}"
|
||||||
case $PACKAGER in
|
case $PACKAGER in
|
||||||
pacman)
|
pacman)
|
||||||
if ! grep -q "^\s*\[multilib\]" /etc/pacman.conf; then
|
if ! grep -q "^\s*\[multilib\]" /etc/pacman.conf; then
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
installDepend() {
|
installDepend() {
|
||||||
## Check for dependencies.
|
## Check for dependencies.
|
||||||
echo -e "${YELLOW}Installing dependencies...${RC}"
|
printf "%b\n" "${YELLOW}Installing dependencies...${RC}"
|
||||||
if [ "$PACKAGER" = "pacman" ]; then
|
if [ "$PACKAGER" = "pacman" ]; then
|
||||||
if ! grep -q "^\s*\[multilib\]" /etc/pacman.conf; then
|
if ! grep -q "^\s*\[multilib\]" /etc/pacman.conf; then
|
||||||
echo "[multilib]" | $ESCALATION_TOOL tee -a /etc/pacman.conf
|
echo "[multilib]" | $ESCALATION_TOOL tee -a /etc/pacman.conf
|
||||||
|
@ -38,8 +38,7 @@ install_additional_dependencies() {
|
||||||
cut -d '/' --fields=3)
|
cut -d '/' --fields=3)
|
||||||
|
|
||||||
version_no_v=$(echo "$version" | tr -d v)
|
version_no_v=$(echo "$version" | tr -d v)
|
||||||
wget "https://github.com/lutris/lutris/releases/download/${version}/lutris_${version_no_v}_all.deb"
|
curl -sSLo "lutris_${version_no_v}_all.deb" "https://github.com/lutris/lutris/releases/download/${version}/lutris_${version_no_v}_all.deb"
|
||||||
|
|
||||||
# Install the downloaded .deb package using apt-get
|
# Install the downloaded .deb package using apt-get
|
||||||
echo "Installing lutris_${version_no_v}_all.deb"
|
echo "Installing lutris_${version_no_v}_all.deb"
|
||||||
$ESCALATION_TOOL apt-get update
|
$ESCALATION_TOOL apt-get update
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
. ../common-script.sh
|
. ../common-script.sh
|
||||||
|
|
||||||
install_theme_tools() {
|
install_theme_tools() {
|
||||||
printf "${YELLOW}Installing theme tools (qt6ct and kvantum)...${RC}\n"
|
printf "%b\n" "${YELLOW}Installing theme tools (qt6ct and kvantum)...${RC}\n"
|
||||||
case $PACKAGER in
|
case $PACKAGER in
|
||||||
apt-get)
|
apt-get)
|
||||||
$ESCALATION_TOOL apt-get update
|
$ESCALATION_TOOL apt-get update
|
||||||
|
@ -21,14 +21,14 @@ install_theme_tools() {
|
||||||
$ESCALATION_TOOL pacman -S --needed --noconfirm qt6ct kvantum
|
$ESCALATION_TOOL pacman -S --needed --noconfirm qt6ct kvantum
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
printf "${RED}Unsupported package manager. Please install qt6ct and kvantum manually.${RC}\n"
|
printf "%b\n" "${RED}Unsupported package manager. Please install qt6ct and kvantum manually.${RC}\n"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
configure_qt6ct() {
|
configure_qt6ct() {
|
||||||
printf "${YELLOW}Configuring qt6ct...${RC}\n"
|
printf "%b\n" "${YELLOW}Configuring qt6ct...${RC}\n"
|
||||||
mkdir -p "$HOME/.config/qt6ct"
|
mkdir -p "$HOME/.config/qt6ct"
|
||||||
cat <<EOF > "$HOME/.config/qt6ct/qt6ct.conf"
|
cat <<EOF > "$HOME/.config/qt6ct/qt6ct.conf"
|
||||||
[Appearance]
|
[Appearance]
|
||||||
|
@ -36,26 +36,26 @@ style=kvantum
|
||||||
color_scheme=default
|
color_scheme=default
|
||||||
icon_theme=breeze
|
icon_theme=breeze
|
||||||
EOF
|
EOF
|
||||||
printf "${GREEN}qt6ct configured successfully.${RC}\n"
|
printf "%b\n" "${GREEN}qt6ct configured successfully.${RC}\n"
|
||||||
|
|
||||||
# Add QT_QPA_PLATFORMTHEME to /etc/environment
|
# Add QT_QPA_PLATFORMTHEME to /etc/environment
|
||||||
if ! grep -q "QT_QPA_PLATFORMTHEME=qt6ct" /etc/environment; then
|
if ! grep -q "QT_QPA_PLATFORMTHEME=qt6ct" /etc/environment; then
|
||||||
printf "${YELLOW}Adding QT_QPA_PLATFORMTHEME to /etc/environment...${RC}\n"
|
printf "%b\n" "${YELLOW}Adding QT_QPA_PLATFORMTHEME to /etc/environment...${RC}\n"
|
||||||
echo "QT_QPA_PLATFORMTHEME=qt6ct" | $ESCALATION_TOOL tee -a /etc/environment > /dev/null
|
echo "QT_QPA_PLATFORMTHEME=qt6ct" | $ESCALATION_TOOL tee -a /etc/environment > /dev/null
|
||||||
printf "${GREEN}QT_QPA_PLATFORMTHEME added to /etc/environment.${RC}\n"
|
printf "%b\n" "${GREEN}QT_QPA_PLATFORMTHEME added to /etc/environment.${RC}\n"
|
||||||
else
|
else
|
||||||
printf "${GREEN}QT_QPA_PLATFORMTHEME already set in /etc/environment.${RC}\n"
|
printf "%b\n" "${GREEN}QT_QPA_PLATFORMTHEME already set in /etc/environment.${RC}\n"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
configure_kvantum() {
|
configure_kvantum() {
|
||||||
printf "${YELLOW}Configuring Kvantum...${RC}\n"
|
printf "%b\n" "${YELLOW}Configuring Kvantum...${RC}\n"
|
||||||
mkdir -p "$HOME/.config/Kvantum"
|
mkdir -p "$HOME/.config/Kvantum"
|
||||||
cat <<EOF > "$HOME/.config/Kvantum/kvantum.kvconfig"
|
cat <<EOF > "$HOME/.config/Kvantum/kvantum.kvconfig"
|
||||||
[General]
|
[General]
|
||||||
theme=Breeze
|
theme=Breeze
|
||||||
EOF
|
EOF
|
||||||
printf "${GREEN}Kvantum configured successfully.${RC}\n"
|
printf "%b\n" "${GREEN}Kvantum configured successfully.${RC}\n"
|
||||||
}
|
}
|
||||||
|
|
||||||
checkEnv
|
checkEnv
|
||||||
|
|
205
tabs/system-setup/5-samba-ssh-setup.sh
Executable file
205
tabs/system-setup/5-samba-ssh-setup.sh
Executable file
|
@ -0,0 +1,205 @@
|
||||||
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
# Load common script functions
|
||||||
|
. ../common-script.sh
|
||||||
|
|
||||||
|
# Function to install packages based on the package manager
|
||||||
|
install_package() {
|
||||||
|
PACKAGE=$1
|
||||||
|
if ! command_exists "$PACKAGE"; then
|
||||||
|
case "$PACKAGER" in
|
||||||
|
pacman)
|
||||||
|
$ESCALATION_TOOL "$PACKAGER" -S --noconfirm "$PACKAGE"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
$ESCALATION_TOOL "$PACKAGER" install -y "$PACKAGE"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
echo "$PACKAGE is already installed."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to setup and configure SSH
|
||||||
|
setup_ssh() {
|
||||||
|
printf "%b\n" "${YELLOW}Setting up SSH...${RC}"
|
||||||
|
|
||||||
|
# Detect package manager and install appropriate SSH package
|
||||||
|
case "$PACKAGER" in
|
||||||
|
"apt-get")
|
||||||
|
install_package openssh-server
|
||||||
|
SSH_SERVICE="ssh"
|
||||||
|
;;
|
||||||
|
"pacman")
|
||||||
|
install_package openssh
|
||||||
|
SSH_SERVICE="sshd"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
install_package openssh-server
|
||||||
|
SSH_SERVICE="sshd"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Enable and start the appropriate SSH service
|
||||||
|
$ESCALATION_TOOL systemctl enable "$SSH_SERVICE"
|
||||||
|
$ESCALATION_TOOL systemctl start "$SSH_SERVICE"
|
||||||
|
|
||||||
|
# Get the local IP address
|
||||||
|
LOCAL_IP=$(ip -4 addr show | awk '/inet / {print $2}' | tail -n 1)
|
||||||
|
|
||||||
|
printf "%b\n" "${GREEN}Your local IP address is: $LOCAL_IP${RC}"
|
||||||
|
|
||||||
|
# Check if SSH is running
|
||||||
|
if systemctl is-active --quiet "$SSH_SERVICE"; then
|
||||||
|
printf "%b\n" "${GREEN}SSH is up and running.${RC}"
|
||||||
|
else
|
||||||
|
printf "%b\n" "${RED}Failed to start SSH.${RC}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to setup and configure Samba
|
||||||
|
setup_samba() {
|
||||||
|
printf "%b\n" "${YELLOW}Setting up Samba...${RC}"
|
||||||
|
|
||||||
|
# Install Samba if not installed
|
||||||
|
install_package samba
|
||||||
|
|
||||||
|
SAMBA_CONFIG="/etc/samba/smb.conf"
|
||||||
|
|
||||||
|
if [ -f "$SAMBA_CONFIG" ]; then
|
||||||
|
printf "%b\n" "${YELLOW}Samba configuration file already exists in $SAMBA_CONFIG.${RC}"
|
||||||
|
printf "Do you want to modify the existing Samba configuration? (yes/no): "
|
||||||
|
read -r MODIFY_SAMBA
|
||||||
|
if [ "$MODIFY_SAMBA" = "yes" ]; then
|
||||||
|
"$ESCALATION_TOOL" "$EDITOR" "$SAMBA_CONFIG"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printf "%b\n" "${YELLOW}No existing Samba configuration found. Setting up a new one...${RC}"
|
||||||
|
|
||||||
|
# Prompt user for shared directory path
|
||||||
|
printf "Enter the path for the Samba share (default: /srv/samba/share): "
|
||||||
|
read -r SHARED_DIR
|
||||||
|
SHARED_DIR=${SHARED_DIR:-/srv/samba/share}
|
||||||
|
|
||||||
|
# Create the shared directory if it doesn't exist
|
||||||
|
$ESCALATION_TOOL mkdir -p "$SHARED_DIR"
|
||||||
|
$ESCALATION_TOOL chmod -R 0777 "$SHARED_DIR"
|
||||||
|
|
||||||
|
# Add a new Samba user
|
||||||
|
echo "Enter Samba username: "
|
||||||
|
read -r SAMBA_USER
|
||||||
|
|
||||||
|
# Loop until the passwords match
|
||||||
|
while true; do
|
||||||
|
echo "Enter Samba password: "
|
||||||
|
stty -echo
|
||||||
|
read -r SAMBA_PASSWORD
|
||||||
|
stty echo
|
||||||
|
echo "Confirm Samba password: "
|
||||||
|
stty -echo
|
||||||
|
read SAMBA_PASSWORD_CONFIRM
|
||||||
|
stty echo
|
||||||
|
echo ""
|
||||||
|
if [ "$SAMBA_PASSWORD" = "$SAMBA_PASSWORD_CONFIRM" ]; then
|
||||||
|
printf "%b\n" "${GREEN}Passwords match.${RC}"
|
||||||
|
break
|
||||||
|
else
|
||||||
|
printf "%b\n" "${RED}Passwords do not match. Please try again.${RC}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Add the user and set the password
|
||||||
|
$ESCALATION_TOOL smbpasswd -a "$SAMBA_USER"
|
||||||
|
|
||||||
|
# Configure Samba settings
|
||||||
|
$ESCALATION_TOOL sh -c "cat > $SAMBA_CONFIG" <<EOL
|
||||||
|
[global]
|
||||||
|
workgroup = WORKGROUP
|
||||||
|
server string = Samba Server
|
||||||
|
security = user
|
||||||
|
map to guest = bad user
|
||||||
|
dns proxy = no
|
||||||
|
|
||||||
|
[Share]
|
||||||
|
path = $SHARED_DIR
|
||||||
|
browsable = yes
|
||||||
|
writable = yes
|
||||||
|
guest ok = no
|
||||||
|
read only = no
|
||||||
|
EOL
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Enable and start Samba services
|
||||||
|
$ESCALATION_TOOL systemctl enable smb nmb
|
||||||
|
$ESCALATION_TOOL systemctl start smb nmb
|
||||||
|
|
||||||
|
# Check if Samba is running
|
||||||
|
if systemctl is-active --quiet smb && systemctl is-active --quiet nmb; then
|
||||||
|
printf "%b\n" "${GREEN}Samba is up and running.${RC}"
|
||||||
|
printf "%b\n" "${YELLOW}Samba share available at: $SHARED_DIR${RC}"
|
||||||
|
else
|
||||||
|
printf "%b\n" "${RED}Failed to start Samba.${RC}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to configure firewall (optional)
|
||||||
|
configure_firewall() {
|
||||||
|
printf "%b\n" "${BLUE}Configuring firewall...${RC}"
|
||||||
|
|
||||||
|
if command_exists ufw; then
|
||||||
|
$ESCALATION_TOOL ufw allow OpenSSH
|
||||||
|
$ESCALATION_TOOL ufw allow Samba
|
||||||
|
$ESCALATION_TOOL ufw enable
|
||||||
|
printf "%b\n" "${GREEN}Firewall configured for SSH and Samba.${RC}"
|
||||||
|
else
|
||||||
|
printf "%b\n" "${YELLOW}UFW is not installed. Skipping firewall configuration.${RC}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_ssh_samba(){
|
||||||
|
printf "Samba and SSH Setup Script\n"
|
||||||
|
printf "----------------------------\n"
|
||||||
|
clear
|
||||||
|
|
||||||
|
# Display menu
|
||||||
|
printf "Select an option:\n"
|
||||||
|
printf "1. Setup SSH\n"
|
||||||
|
printf "2. Setup Samba\n"
|
||||||
|
printf "3. Configure Firewall\n"
|
||||||
|
printf "4. Setup All\n"
|
||||||
|
printf "5. Exit\n"
|
||||||
|
|
||||||
|
printf "Enter your choice [1-5]: "
|
||||||
|
read CHOICE
|
||||||
|
|
||||||
|
case "$CHOICE" in
|
||||||
|
1)
|
||||||
|
setup_ssh
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
setup_samba
|
||||||
|
;;
|
||||||
|
3)
|
||||||
|
configure_firewall
|
||||||
|
;;
|
||||||
|
4)
|
||||||
|
setup_ssh
|
||||||
|
setup_samba
|
||||||
|
configure_firewall
|
||||||
|
;;
|
||||||
|
5)
|
||||||
|
printf "%b\n" "${GREEN}Exiting.${RC}"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
printf "%b\n" "${RED}Invalid choice. Please enter a number between 1 and 5.${RC}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
printf "%b\n" "${GREEN}Setup completed.${RC}"
|
||||||
|
}
|
||||||
|
|
||||||
|
checkEnv
|
||||||
|
checkEscalationTool
|
||||||
|
setup_ssh_samba
|
87
tabs/system-setup/6-docker-setup.sh
Executable file
87
tabs/system-setup/6-docker-setup.sh
Executable file
|
@ -0,0 +1,87 @@
|
||||||
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
. ../common-script.sh
|
||||||
|
|
||||||
|
# Function to prompt the user for installation choice
|
||||||
|
choose_installation() {
|
||||||
|
clear
|
||||||
|
printf "%b\n" "${YELLOW}Choose what to install:${RC}"
|
||||||
|
printf "%b\n" "1. ${YELLOW}Docker${RC}"
|
||||||
|
printf "%b\n" "2. ${YELLOW}Docker Compose${RC}"
|
||||||
|
printf "%b\n" "3. ${YELLOW}Both${RC}"
|
||||||
|
read -p "Enter your choice [1-3]: " CHOICE
|
||||||
|
|
||||||
|
case "$CHOICE" in
|
||||||
|
1) INSTALL_DOCKER=1; INSTALL_COMPOSE=0 ;;
|
||||||
|
2) INSTALL_DOCKER=0; INSTALL_COMPOSE=1 ;;
|
||||||
|
3) INSTALL_DOCKER=1; INSTALL_COMPOSE=1 ;;
|
||||||
|
*) echo "Invalid choice. Exiting."; exit 1 ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
install_docker() {
|
||||||
|
printf "%b\n" "${YELLOW}Installing Docker...${RC}"
|
||||||
|
case $PACKAGER in
|
||||||
|
apt-get | yum)
|
||||||
|
curl -fsSL https://get.docker.com | sh
|
||||||
|
;;
|
||||||
|
zypper)
|
||||||
|
$ESCALATION_TOOL ${PACKAGER} --non-interactive install docker
|
||||||
|
$ESCALATION_TOOL systemctl enable docker
|
||||||
|
$ESCALATION_TOOL systemctl start docker
|
||||||
|
;;
|
||||||
|
pacman)
|
||||||
|
$ESCALATION_TOOL ${PACKAGER} -S --noconfirm docker
|
||||||
|
$ESCALATION_TOOL systemctl enable docker
|
||||||
|
$ESCALATION_TOOL systemctl start docker
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
printf "${RED}Unsupported package manager. Please install Docker manually.${RC}\n"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
install_docker_compose() {
|
||||||
|
printf "%b\n" "${YELLOW}Installing Docker Compose...${RC}"
|
||||||
|
case $PACKAGER in
|
||||||
|
apt-get | yum)
|
||||||
|
$ESCALATION_TOOL ${PACKAGER} update
|
||||||
|
$ESCALATION_TOOL ${PACKAGER} install -y docker-compose-plugin
|
||||||
|
;;
|
||||||
|
zypper)
|
||||||
|
$ESCALATION_TOOL ${PACKAGER} --non-interactive install docker-compose
|
||||||
|
;;
|
||||||
|
pacman)
|
||||||
|
$ESCALATION_TOOL ${PACKAGER} -S --noconfirm docker-compose
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
printf "${RED}Unsupported package manager. Please install Docker Compose manually.${RC}\n"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
install_components() {
|
||||||
|
choose_installation
|
||||||
|
|
||||||
|
if [ "$INSTALL_DOCKER" -eq 1 ]; then
|
||||||
|
if ! command_exists docker; then
|
||||||
|
install_docker
|
||||||
|
else
|
||||||
|
printf "%b\n" "${GREEN}Docker is already installed.${RC}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$INSTALL_COMPOSE" -eq 1 ]; then
|
||||||
|
if ! command_exists docker-compose || ! command_exists docker compose version; then
|
||||||
|
install_docker_compose
|
||||||
|
else
|
||||||
|
printf "%b\n" "${GREEN}Docker Compose is already installed.${RC}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
checkEnv
|
||||||
|
checkEscalationTool
|
||||||
|
install_components
|
|
@ -1,6 +1,6 @@
|
||||||
#!/bin/sh -e
|
#!/bin/sh -e
|
||||||
|
|
||||||
. "$(dirname "$0")/../../common-script.sh"
|
. ../../common-script.sh
|
||||||
|
|
||||||
installDepend() {
|
installDepend() {
|
||||||
case $PACKAGER in
|
case $PACKAGER in
|
||||||
|
|
|
@ -336,7 +336,7 @@ sgdisk -a 2048 -o ${DISK} # new gpt disk 2048 alignment
|
||||||
|
|
||||||
# create partitions
|
# create partitions
|
||||||
sgdisk -n 1::+1M --typecode=1:ef02 --change-name=1:'BIOSBOOT' ${DISK} # partition 1 (BIOS Boot Partition)
|
sgdisk -n 1::+1M --typecode=1:ef02 --change-name=1:'BIOSBOOT' ${DISK} # partition 1 (BIOS Boot Partition)
|
||||||
sgdisk -n 2::+300M --typecode=2:ef00 --change-name=2:'EFIBOOT' ${DISK} # partition 2 (UEFI Boot Partition)
|
sgdisk -n 2::+1GiB --typecode=2:ef00 --change-name=2:'EFIBOOT' ${DISK} # partition 2 (UEFI Boot Partition)
|
||||||
sgdisk -n 3::-0 --typecode=3:8300 --change-name=3:'ROOT' ${DISK} # partition 3 (Root), default start, remaining
|
sgdisk -n 3::-0 --typecode=3:8300 --change-name=3:'ROOT' ${DISK} # partition 3 (Root), default start, remaining
|
||||||
if [[ ! -d "/sys/firmware/efi" ]]; then # Checking for bios system
|
if [[ ! -d "/sys/firmware/efi" ]]; then # Checking for bios system
|
||||||
sgdisk -A 1:set:2 ${DISK}
|
sgdisk -A 1:set:2 ${DISK}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#!/bin/sh -e
|
#!/bin/sh -e
|
||||||
|
|
||||||
. "$(dirname "$0")/../../common-script.sh"
|
. ../../common-script.sh
|
||||||
|
|
||||||
installDepend() {
|
installDepend() {
|
||||||
case $PACKAGER in
|
case $PACKAGER in
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
#!/bin/sh -e
|
#!/bin/sh -e
|
||||||
|
|
||||||
. "$(dirname "$0")/../../common-script.sh"
|
. ../../common-script.sh
|
||||||
|
|
||||||
# https://rpmfusion.org/Configuration
|
# https://rpmfusion.org/Configuration
|
||||||
|
|
||||||
installRPMFusion() {
|
installRPMFusion() {
|
||||||
case $PACKAGER in
|
case $PACKAGER in
|
||||||
dnf)
|
dnf)
|
||||||
if [[ ! -e /etc/yum.repos.d/rpmfusion-free.repo || ! -e /etc/yum.repos.d/rpmfusion-nonfree.repo ]]; then
|
if [ ! -e /etc/yum.repos.d/rpmfusion-free.repo ] || [ ! -e /etc/yum.repos.d/rpmfusion-nonfree.repo ]; then
|
||||||
echo "Installing RPM Fusion..."
|
echo "Installing RPM Fusion..."
|
||||||
$ESCALATION_TOOL "$PACKAGER" install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
|
$ESCALATION_TOOL "$PACKAGER" install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
|
||||||
$ESCALATION_TOOL "$PACKAGER" config-manager --enable fedora-cisco-openh264
|
$ESCALATION_TOOL "$PACKAGER" config-manager --enable fedora-cisco-openh264
|
||||||
|
|
|
@ -20,7 +20,7 @@ fastUpdate() {
|
||||||
|
|
||||||
$ESCALATION_TOOL rate-mirrors --top-mirrors-number-to-retest=5 --disable-comments --save /etc/pacman.d/mirrorlist --allow-root ${dtype_local}
|
$ESCALATION_TOOL rate-mirrors --top-mirrors-number-to-retest=5 --disable-comments --save /etc/pacman.d/mirrorlist --allow-root ${dtype_local}
|
||||||
if [ $? -ne 0 ] || [ ! -s /etc/pacman.d/mirrorlist ]; then
|
if [ $? -ne 0 ] || [ ! -s /etc/pacman.d/mirrorlist ]; then
|
||||||
echo -e "${RED}Rate-mirrors failed, restoring backup.${RC}"
|
printf "%b\n" "${RED}Rate-mirrors failed, restoring backup.${RC}"
|
||||||
$ESCALATION_TOOL cp /etc/pacman.d/mirrorlist.bak /etc/pacman.d/mirrorlist
|
$ESCALATION_TOOL cp /etc/pacman.d/mirrorlist.bak /etc/pacman.d/mirrorlist
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
@ -28,7 +28,7 @@ fastUpdate() {
|
||||||
apt-get|nala)
|
apt-get|nala)
|
||||||
$ESCALATION_TOOL apt-get update
|
$ESCALATION_TOOL apt-get update
|
||||||
if ! command_exists nala; then
|
if ! command_exists nala; then
|
||||||
$ESCALATION_TOOL apt-get install -y nala || { echo -e "${YELLOW}Falling back to apt-get${RC}"; PACKAGER="apt-get"; }
|
$ESCALATION_TOOL apt-get install -y nala || { printf "%b\n" "${YELLOW}Falling back to apt-get${RC}"; PACKAGER="apt-get"; }
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "${PACKAGER}" = "nala" ]; then
|
if [ "${PACKAGER}" = "nala" ]; then
|
||||||
|
@ -54,14 +54,14 @@ fastUpdate() {
|
||||||
$ESCALATION_TOOL ${PACKAGER} -Syu
|
$ESCALATION_TOOL ${PACKAGER} -Syu
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo -e "${RED}Unsupported package manager: $PACKAGER${RC}"
|
printf "%b\n" "${RED}Unsupported package manager: $PACKAGER${RC}"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
updateSystem() {
|
updateSystem() {
|
||||||
echo -e "${GREEN}Updating system${RC}"
|
printf "%b\n" "${GREEN}Updating system${RC}"
|
||||||
case ${PACKAGER} in
|
case ${PACKAGER} in
|
||||||
nala|apt-get)
|
nala|apt-get)
|
||||||
$ESCALATION_TOOL "${PACKAGER}" update -y
|
$ESCALATION_TOOL "${PACKAGER}" update -y
|
||||||
|
@ -83,7 +83,7 @@ updateSystem() {
|
||||||
$ESCALATION_TOOL ${PACKAGER} -Syu
|
$ESCALATION_TOOL ${PACKAGER} -Syu
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo -e "${RED}Unsupported package manager: ${PACKAGER}${RC}"
|
printf "%b\n" "${RED}Unsupported package manager: ${PACKAGER}${RC}"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
|
@ -51,3 +51,11 @@ script = "3-global-theme.sh"
|
||||||
[[data]]
|
[[data]]
|
||||||
name = "Remove Snaps"
|
name = "Remove Snaps"
|
||||||
script = "4-remove-snaps.sh"
|
script = "4-remove-snaps.sh"
|
||||||
|
|
||||||
|
[[data]]
|
||||||
|
name = "SSH-Samba Setup"
|
||||||
|
script = "5-samba-ssh-setup.sh"
|
||||||
|
|
||||||
|
[[data]]
|
||||||
|
name = "Docker Setup"
|
||||||
|
script = "6-docker-setup.sh"
|
|
@ -1,5 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
say_hello () {
|
|
||||||
echo Hi
|
|
||||||
}
|
|
|
@ -1,6 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# The current working directory will always be inside "commands"
|
|
||||||
. test/lib.sh
|
|
||||||
|
|
||||||
say_hello
|
|
179
tabs/utils/auto-login.sh
Normal file
179
tabs/utils/auto-login.sh
Normal file
|
@ -0,0 +1,179 @@
|
||||||
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
. ../common-script.sh
|
||||||
|
|
||||||
|
# Function to list common session options
|
||||||
|
list_sessions() {
|
||||||
|
echo "Select the session:"
|
||||||
|
echo "1) GNOME (gnome.desktop)"
|
||||||
|
echo "2) KDE Plasma (plasma.desktop)"
|
||||||
|
echo "3) XFCE (xfce.desktop)"
|
||||||
|
echo "4) LXDE (LXDE.desktop)"
|
||||||
|
echo "5) LXQt (lxqt.desktop)"
|
||||||
|
echo "6) Cinnamon (cinnamon.desktop)"
|
||||||
|
echo "7) MATE (mate.desktop)"
|
||||||
|
echo "8) Openbox (openbox.desktop)"
|
||||||
|
echo "9) i3 (i3.desktop)"
|
||||||
|
echo "10) Custom session"
|
||||||
|
echo "Enter your choice [1-10]: "
|
||||||
|
read session_choice
|
||||||
|
|
||||||
|
case "$session_choice" in
|
||||||
|
1) session="gnome.desktop" ;;
|
||||||
|
2) session="plasma.desktop" ;;
|
||||||
|
3) session="xfce.desktop" ;;
|
||||||
|
4) session="LXDE.desktop" ;;
|
||||||
|
5) session="lxqt.desktop" ;;
|
||||||
|
6) session="cinnamon.desktop" ;;
|
||||||
|
7) session="mate.desktop" ;;
|
||||||
|
8) session="openbox.desktop" ;;
|
||||||
|
9) session="i3.desktop" ;;
|
||||||
|
10)
|
||||||
|
echo "Enter custom session name (e.g., mysession.desktop): "
|
||||||
|
read -r session ;;
|
||||||
|
*)
|
||||||
|
echo "Invalid option selected."
|
||||||
|
exit 1 ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to configure LightDM
|
||||||
|
configure_lightdm() {
|
||||||
|
echo "Configuring LightDM for autologin..."
|
||||||
|
|
||||||
|
echo "Enter username for LightDM autologin: "
|
||||||
|
read -r user
|
||||||
|
|
||||||
|
$ESCALATION_TOOL "echo '[Seat:*]' > /etc/lightdm/lightdm.conf.d/50-autologin.conf"
|
||||||
|
$ESCALATION_TOOL "echo 'autologin-user=$user' >> /etc/lightdm/lightdm.conf.d/50-autologin.conf"
|
||||||
|
$ESCALATION_TOOL "echo 'autologin-user-timeout=0' >> /etc/lightdm/lightdm.conf.d/50-autologin.conf"
|
||||||
|
|
||||||
|
echo "LightDM has been configured for autologin."
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to remove LightDM autologin
|
||||||
|
remove_lightdm_autologin() {
|
||||||
|
echo "Removing LightDM autologin configuration..."
|
||||||
|
$ESCALATION_TOOL rm -f /etc/lightdm/lightdm.conf.d/50-autologin.conf
|
||||||
|
echo "LightDM autologin configuration has been removed."
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to configure GDM
|
||||||
|
configure_gdm() {
|
||||||
|
echo "Configuring GDM for autologin..."
|
||||||
|
|
||||||
|
echo "Enter username for GDM autologin: "
|
||||||
|
read -r user
|
||||||
|
|
||||||
|
$ESCALATION_TOOL "echo '[daemon]' > /etc/gdm/custom.conf"
|
||||||
|
$ESCALATION_TOOL "echo 'AutomaticLoginEnable = true' >> /etc/gdm/custom.conf"
|
||||||
|
$ESCALATION_TOOL "echo 'AutomaticLogin = $user' >> /etc/gdm/custom.conf"
|
||||||
|
|
||||||
|
echo "GDM has been configured for autologin."
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to remove GDM autologin
|
||||||
|
remove_gdm_autologin() {
|
||||||
|
echo "Removing GDM autologin configuration..."
|
||||||
|
$ESCALATION_TOOL sed -i '/AutomaticLoginEnable/d' /etc/gdm/custom.conf
|
||||||
|
$ESCALATION_TOOL sed -i '/AutomaticLogin/d' /etc/gdm/custom.conf
|
||||||
|
echo "GDM autologin configuration has been removed."
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to configure SDDM
|
||||||
|
configure_sddm() {
|
||||||
|
echo "Configuring SDDM for autologin..."
|
||||||
|
|
||||||
|
echo "Enter username for SDDM autologin: "
|
||||||
|
read -r user
|
||||||
|
list_sessions # Show session options
|
||||||
|
|
||||||
|
$ESCALATION_TOOL "echo '[Autologin]' > /etc/sddm.conf"
|
||||||
|
$ESCALATION_TOOL "echo 'User=$user' >> /etc/sddm.conf"
|
||||||
|
$ESCALATION_TOOL "echo 'Session=$session' >> /etc/sddm.conf"
|
||||||
|
|
||||||
|
echo "SDDM has been configured for autologin."
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to remove SDDM autologin
|
||||||
|
remove_sddm_autologin() {
|
||||||
|
echo "Removing SDDM autologin configuration..."
|
||||||
|
$ESCALATION_TOOL sed -i '/\[Autologin\]/,+2d' /etc/sddm.conf
|
||||||
|
echo "SDDM autologin configuration has been removed."
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to configure LXDM
|
||||||
|
configure_lxdm() {
|
||||||
|
echo "Configuring LXDM for autologin..."
|
||||||
|
|
||||||
|
echo "Enter username for LXDM autologin: "
|
||||||
|
read -r user
|
||||||
|
list_sessions # Show session options
|
||||||
|
|
||||||
|
$ESCALATION_TOOL sed -i "s/^#.*autologin=.*$/autologin=${user}/" /etc/lxdm/lxdm.conf
|
||||||
|
$ESCALATION_TOOL sed -i "s|^#.*session=.*$|session=/usr/bin/${session}|; s|^session=.*$|session=/usr/bin/${session}|" /etc/lxdm/lxdm.conf
|
||||||
|
|
||||||
|
echo "LXDM has been configured for autologin."
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to remove LXDM autologin
|
||||||
|
remove_lxdm_autologin() {
|
||||||
|
echo "Removing LXDM autologin configuration..."
|
||||||
|
$ESCALATION_TOOL sed -i "s/^autologin=.*$/#autologin=/" /etc/lxdm/lxdm.conf
|
||||||
|
$ESCALATION_TOOL sed -i "s/^session=.*$/#session=/" /etc/lxdm/lxdm.conf
|
||||||
|
echo "LXDM autologin configuration has been removed."
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to configure or remove autologin based on user choice
|
||||||
|
configure_or_remove_autologin() {
|
||||||
|
echo "Do you want to add or remove autologin?"
|
||||||
|
echo "1) Add autologin"
|
||||||
|
echo "2) Remove autologin"
|
||||||
|
echo "Enter your choice [1-2]: "
|
||||||
|
read action_choice
|
||||||
|
|
||||||
|
if [ "$action_choice" = "1" ]; then
|
||||||
|
echo "Choose the display manager to configure:"
|
||||||
|
echo "1) LightDM"
|
||||||
|
echo "2) GDM"
|
||||||
|
echo "3) SDDM"
|
||||||
|
echo "4) LXDM"
|
||||||
|
echo "Enter your choice [1-4]: "
|
||||||
|
read choice
|
||||||
|
|
||||||
|
case "$choice" in
|
||||||
|
1) configure_lightdm ;;
|
||||||
|
2) configure_gdm ;;
|
||||||
|
3) configure_sddm ;;
|
||||||
|
4) configure_lxdm ;;
|
||||||
|
*) echo "Invalid option selected." ;;
|
||||||
|
esac
|
||||||
|
elif [ "$action_choice" = "2" ]; then
|
||||||
|
echo "Choose the display manager to remove autologin:"
|
||||||
|
echo "1) LightDM"
|
||||||
|
echo "2) GDM"
|
||||||
|
echo "3) SDDM"
|
||||||
|
echo "4) LXDM"
|
||||||
|
echo "Enter your choice [1-4]: "
|
||||||
|
read choice
|
||||||
|
|
||||||
|
case "$choice" in
|
||||||
|
1) remove_lightdm_autologin ;;
|
||||||
|
2) remove_gdm_autologin ;;
|
||||||
|
3) remove_sddm_autologin ;;
|
||||||
|
4) remove_lxdm_autologin ;;
|
||||||
|
*) echo "Invalid option selected." ;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
echo "Invalid choice. Exiting..."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Action completed. Exiting..."
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
checkEnv
|
||||||
|
checkEscalationTool
|
||||||
|
configure_or_remove_autologin
|
|
@ -2,9 +2,9 @@
|
||||||
|
|
||||||
. ../common-script.sh
|
. ../common-script.sh
|
||||||
|
|
||||||
# Function to check bluetoothctl is installed
|
# Function to check Bluez is installed
|
||||||
setupBluetooth() {
|
setupBluetooth() {
|
||||||
echo "Install bluetoothctl if not already installed..."
|
printf "%b\n" "${YELLOW}Installing Bluez...${RC}"
|
||||||
if ! command_exists bluetoothctl; then
|
if ! command_exists bluetoothctl; then
|
||||||
case ${PACKAGER} in
|
case ${PACKAGER} in
|
||||||
pacman)
|
pacman)
|
||||||
|
@ -15,39 +15,26 @@ setupBluetooth() {
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
else
|
else
|
||||||
echo "Bluetoothctl is already installed."
|
printf "%b\n" "${GREEN}Bluez is already installed.${RC}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Check if bluetooth service is running
|
# Check if bluetooth service is running
|
||||||
if ! systemctl is-active --quiet bluetooth; then
|
if ! systemctl is-active --quiet bluetooth; then
|
||||||
echo "Bluetooth service is not running. Starting it now..."
|
printf "%b\n" "${YELLOW}Bluetooth service is not running. Starting it now...${RC}"
|
||||||
$ESCALATION_TOOL systemctl start bluetooth
|
$ESCALATION_TOOL systemctl start bluetooth
|
||||||
|
|
||||||
if systemctl is-active --quiet bluetooth; then
|
if systemctl is-active --quiet bluetooth; then
|
||||||
echo "bluetooth service started successfully."
|
printf "%b\n" "${GREEN}Bluetooth service started successfully.${RC}"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Function to display colored text
|
|
||||||
colored_echo() {
|
|
||||||
local color=$1
|
|
||||||
local text=$2
|
|
||||||
case $color in
|
|
||||||
red) echo -e "\033[31m$text\033[0m" ;;
|
|
||||||
green) echo -e "\033[32m$text\033[0m" ;;
|
|
||||||
yellow) echo -e "\033[33m$text\033[0m" ;;
|
|
||||||
blue) echo -e "\033[34m$text\033[0m" ;;
|
|
||||||
*) echo "$text" ;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function to display the main menu
|
# Function to display the main menu
|
||||||
main_menu() {
|
main_menu() {
|
||||||
while true; do
|
while true; do
|
||||||
clear
|
clear
|
||||||
colored_echo blue "Bluetooth Manager"
|
printf "%b\n" "${YELLOW}Bluetooth Manager${RC}"
|
||||||
colored_echo blue "================="
|
printf "%b\n" "${YELLOW}=================${RC}"
|
||||||
echo "1. Scan for devices"
|
echo "1. Scan for devices"
|
||||||
echo "2. Pair with a device"
|
echo "2. Pair with a device"
|
||||||
echo "3. Connect to a device"
|
echo "3. Connect to a device"
|
||||||
|
@ -55,7 +42,7 @@ main_menu() {
|
||||||
echo "5. Remove a device"
|
echo "5. Remove a device"
|
||||||
echo "0. Exit"
|
echo "0. Exit"
|
||||||
echo -n "Choose an option: "
|
echo -n "Choose an option: "
|
||||||
read -e choice
|
read choice
|
||||||
|
|
||||||
case $choice in
|
case $choice in
|
||||||
1) scan_devices ;;
|
1) scan_devices ;;
|
||||||
|
@ -64,7 +51,7 @@ main_menu() {
|
||||||
4) disconnect_device ;;
|
4) disconnect_device ;;
|
||||||
5) remove_device ;;
|
5) remove_device ;;
|
||||||
0) exit 0 ;;
|
0) exit 0 ;;
|
||||||
*) colored_echo red "Invalid option. Please try again." ;;
|
*) printf "%b\n" "${RED}Invalid option. Please try again.${RC}" ;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
@ -72,13 +59,13 @@ main_menu() {
|
||||||
# Function to scan for devices
|
# Function to scan for devices
|
||||||
scan_devices() {
|
scan_devices() {
|
||||||
clear
|
clear
|
||||||
colored_echo yellow "Scanning for devices..."
|
printf "%b\n" "${YELLOW}Scanning for devices...${RC}"
|
||||||
bluetoothctl --timeout 10 scan on
|
bluetoothctl --timeout 10 scan on
|
||||||
devices=$(bluetoothctl devices)
|
devices=$(bluetoothctl devices)
|
||||||
if [ -z "$devices" ]; then
|
if [ -z "$devices" ]; then
|
||||||
colored_echo red "No devices found."
|
printf "%b\n" "${RED}No devices found.${RC}"
|
||||||
else
|
else
|
||||||
colored_echo green "Devices found:"
|
printf "%b\n" "${GREEN}Devices found:${RC}"
|
||||||
echo "$devices"
|
echo "$devices"
|
||||||
fi
|
fi
|
||||||
echo "Press any key to return to the main menu..."
|
echo "Press any key to return to the main menu..."
|
||||||
|
@ -87,49 +74,51 @@ scan_devices() {
|
||||||
|
|
||||||
# Function to prompt for MAC address using numbers
|
# Function to prompt for MAC address using numbers
|
||||||
prompt_for_mac() {
|
prompt_for_mac() {
|
||||||
local action=$1
|
action=$1
|
||||||
local command=$2
|
command=$2
|
||||||
local prompt_msg=$3
|
prompt_msg=$3
|
||||||
local success_msg=$4
|
success_msg=$4
|
||||||
local failure_msg=$5
|
failure_msg=$5
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
clear
|
clear
|
||||||
devices=$(bluetoothctl devices)
|
devices=$(bluetoothctl devices)
|
||||||
if [ -z "$devices" ]; then
|
if [ -z "$devices" ]; then
|
||||||
colored_echo red "No devices available. Please scan for devices first."
|
printf "%b\n" "${RED}No devices available. Please scan for devices first.${RC}"
|
||||||
echo "Press any key to return to the main menu..."
|
echo "Press any key to return to the main menu..."
|
||||||
read -n 1
|
read -n 1
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Display devices with numbers
|
# Display devices with numbers
|
||||||
IFS=$'\n' read -r -a device_list <<<"$devices"
|
device_list=$(echo "$devices" | tr '\n' '\n')
|
||||||
for i in "${!device_list[@]}"; do
|
i=1
|
||||||
echo "$((i+1)). ${device_list[$i]}"
|
echo "$device_list" | while IFS= read -r device; do
|
||||||
|
echo "$i. $device"
|
||||||
|
i=$((i + 1))
|
||||||
done
|
done
|
||||||
echo "0. Exit to main menu"
|
echo "0. Exit to main menu"
|
||||||
echo -n "$prompt_msg"
|
echo -n "$prompt_msg"
|
||||||
read -e choice
|
read choice
|
||||||
|
|
||||||
# Validate the choice
|
# Validate the choice
|
||||||
if [[ $choice =~ ^[0-9]+$ ]] && [ "$choice" -le "${#device_list[@]}" ] && [ "$choice" -gt 0 ]; then
|
if echo "$choice" | grep -qE '^[0-9]+$' && [ "$choice" -le "$((i - 1))" ] && [ "$choice" -gt 0 ]; then
|
||||||
device=${device_list[$((choice-1))]}
|
device=$(echo "$device_list" | sed -n "${choice}p")
|
||||||
mac=$(echo "$device" | awk '{print $2}')
|
mac=$(echo "$device" | awk '{print $2}')
|
||||||
if bluetoothctl info "$mac" > /dev/null 2>&1; then
|
if bluetoothctl info "$mac" > /dev/null 2>&1; then
|
||||||
bluetoothctl $command "$mac" && {
|
bluetoothctl $command "$mac" && {
|
||||||
colored_echo green "$success_msg"
|
printf "%b\n" "${GREEN}$success_msg${RC}"
|
||||||
break
|
break
|
||||||
} || {
|
} || {
|
||||||
colored_echo red "$failure_msg"
|
printf "%b\n" "${RED}$failure_msg${RC}"
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
colored_echo red "Invalid MAC address. Please try again."
|
printf "%b\n" "${RED}Invalid MAC address. Please try again.${RC}"
|
||||||
fi
|
fi
|
||||||
elif [ "$choice" -eq 0 ]; then
|
elif [ "$choice" -eq 0 ]; then
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
colored_echo red "Invalid choice. Please try again."
|
printf "%b\n" "${RED}Invalid choice. Please try again.${RC}"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
echo "Press any key to return to the main menu..."
|
echo "Press any key to return to the main menu..."
|
||||||
|
|
193
tabs/utils/create-bootable-usb.sh
Normal file
193
tabs/utils/create-bootable-usb.sh
Normal file
|
@ -0,0 +1,193 @@
|
||||||
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
. ../common-script.sh
|
||||||
|
|
||||||
|
# Function to display usage instructions
|
||||||
|
usage() {
|
||||||
|
printf "%b\n" "${RED} Usage: $0 ${RC}"
|
||||||
|
echo "No arguments needed. The script will prompt for ISO path and USB device."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to display all available block devices
|
||||||
|
list_devices() {
|
||||||
|
printf "%b\n" "${YELLOW} Available devices and partitions: ${RC}"
|
||||||
|
echo ""
|
||||||
|
$ESCALATION_TOOL lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to fetch the latest Arch Linux ISO
|
||||||
|
fetch_arch_latest_iso() {
|
||||||
|
ARCH_BASE_URL="https://archive.archlinux.org/iso/"
|
||||||
|
ARCH_LATEST=$(curl -s "$ARCH_BASE_URL" | grep -oP '(?<=href=")[0-9]{4}\.[0-9]{2}\.[0-9]{2}(?=/)' | sort -V | tail -1)
|
||||||
|
ARCH_URL="${ARCH_BASE_URL}${ARCH_LATEST}/archlinux-${ARCH_LATEST}-x86_64.iso"
|
||||||
|
printf "%b\n" "${GREEN} Selected Arch Linux (latest) ISO URL: ${RC} $ARCH_URL"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to fetch older Arch Linux ISOs and display in a table format
|
||||||
|
fetch_arch_older_isos() {
|
||||||
|
ARCH_BASE_URL="https://archive.archlinux.org/iso/"
|
||||||
|
ARCH_VERSIONS=$(curl -s "$ARCH_BASE_URL" | grep -oP '(?<=href=")[0-9]{4}\.[0-9]{2}\.[0-9]{2}(?=/)' | sort -V)
|
||||||
|
|
||||||
|
# Filter versions to include only those from 2017-04-01 and later
|
||||||
|
MIN_DATE="2017.04.01"
|
||||||
|
ARCH_VERSIONS=$(echo "$ARCH_VERSIONS" | awk -v min_date="$MIN_DATE" '$0 >= min_date')
|
||||||
|
|
||||||
|
if [ -z "$ARCH_VERSIONS" ]; then
|
||||||
|
printf "%b\n" "${RED}No Arch Linux versions found from ${MIN_DATE} onwards.${RC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf "%b\n" "${YELLOW}Available Arch Linux versions from ${MIN_DATE} onwards:${RC}"
|
||||||
|
|
||||||
|
COUNTER=1
|
||||||
|
ROW_ITEMS=6 # Number of versions to show per row
|
||||||
|
for VERSION in $ARCH_VERSIONS; do
|
||||||
|
printf "%-5s${YELLOW}%-15s ${RC}" "$COUNTER)" "$VERSION"
|
||||||
|
|
||||||
|
if [ $(( COUNTER % ROW_ITEMS )) -eq 0 ]; then
|
||||||
|
echo "" # New line after every 6 versions
|
||||||
|
fi
|
||||||
|
|
||||||
|
COUNTER=$((COUNTER + 1))
|
||||||
|
done
|
||||||
|
printf "\n" # New line after the last row
|
||||||
|
printf "Select an Arch Linux version (1-%d): " "$((COUNTER - 1))"
|
||||||
|
read -r ARCH_OPTION
|
||||||
|
ARCH_DIR=$(echo "$ARCH_VERSIONS" | sed -n "${ARCH_OPTION}p")
|
||||||
|
ARCH_URL="${ARCH_BASE_URL}${ARCH_DIR}/archlinux-${ARCH_DIR}-x86_64.iso"
|
||||||
|
printf "%b\n" "${GREEN}Selected Arch Linux (older) ISO URL: $ARCH_URL${RC}"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Function to fetch the latest Debian Linux ISO
|
||||||
|
fetch_debian_latest_iso() {
|
||||||
|
DEBIAN_URL=$(curl -s https://www.debian.org/distrib/netinst | grep -oP '(?<=href=")[^"]+debian-[0-9.]+-amd64-netinst.iso(?=")' | head -1)
|
||||||
|
printf "%b\n" "${GREEN} Selected Debian Linux (latest) ISO URL: ${RC} $DEBIAN_URL"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to ask whether to use local or online ISO
|
||||||
|
choose_iso_source() {
|
||||||
|
printf "%b\n" "${YELLOW} Do you want to use a local ISO or download online? ${RC}"
|
||||||
|
printf "1) Download online\n"
|
||||||
|
printf "2) Use local ISO\n"
|
||||||
|
printf "\n"
|
||||||
|
printf "Select option (1-2): "
|
||||||
|
read -r ISO_SOURCE_OPTION
|
||||||
|
|
||||||
|
case $ISO_SOURCE_OPTION in
|
||||||
|
1)
|
||||||
|
fetch_iso_urls # Call the function to fetch online ISO URLs
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
printf "Enter the path to the already downloaded ISO file: "
|
||||||
|
read -r ISO_PATH
|
||||||
|
if [ ! -f "$ISO_PATH" ]; then
|
||||||
|
printf "%b\n" "${RED} ISO file not found: $ISO_PATH ${RC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
printf "%b\n" "${RED}Invalid option selected. ${RC}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to fetch ISO URLs
|
||||||
|
fetch_iso_urls() {
|
||||||
|
clear
|
||||||
|
printf "%b\n" "${YELLOW}Available ISOs for download:${RC}"
|
||||||
|
echo "1) Arch Linux (latest)"
|
||||||
|
echo "2) Arch Linux (older versions)"
|
||||||
|
echo "3) Debian Linux (latest)"
|
||||||
|
echo ""
|
||||||
|
read -p "Select the ISO you want to download (1-3): " ISO_OPTION
|
||||||
|
|
||||||
|
case $ISO_OPTION in
|
||||||
|
1)
|
||||||
|
fetch_arch_latest_iso
|
||||||
|
ISO_URL=$ARCH_URL
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
fetch_arch_older_isos
|
||||||
|
ISO_URL=$ARCH_URL
|
||||||
|
;;
|
||||||
|
3)
|
||||||
|
fetch_debian_latest_iso
|
||||||
|
ISO_URL=$DEBIAN_URL
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
printf "%b\n" "${RED}Invalid option selected.${RC}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
ISO_PATH=$(basename "$ISO_URL")
|
||||||
|
printf "%b\n" "${YELLOW}Downloading ISO...${RC}"
|
||||||
|
curl -L -o "$ISO_PATH" "$ISO_URL"
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
printf "%b\n" "${RED}Failed to download the ISO file.${RC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
write_iso(){
|
||||||
|
clear
|
||||||
|
|
||||||
|
# Ask whether to use a local or online ISO
|
||||||
|
choose_iso_source
|
||||||
|
|
||||||
|
clear
|
||||||
|
# Display all available devices
|
||||||
|
list_devices
|
||||||
|
|
||||||
|
# Prompt user for USB device
|
||||||
|
read -p "Enter the USB device (e.g., /dev/sdX): " USB_DEVICE
|
||||||
|
|
||||||
|
# Verify that the USB device exists
|
||||||
|
if [ ! -b "$USB_DEVICE" ]; then
|
||||||
|
printf "%b\n" "${RED}USB device not found: $USB_DEVICE${RC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Confirm the device selection with the user
|
||||||
|
printf "%b\n" "${RED}WARNING: This will erase all data on ${USB_DEVICE}. Are you sure you want to continue? (yes/no)${RC}"
|
||||||
|
read -r CONFIRMATION
|
||||||
|
|
||||||
|
if [ "$CONFIRMATION" != "yes" ]; then
|
||||||
|
printf "%b\n" "${YELLOW}Operation cancelled.${RC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Display progress and create the bootable USB drive
|
||||||
|
printf "%b\n" "${YELLOW}Creating bootable USB drive...${RC}"
|
||||||
|
if ! $ESCALATION_TOOL dd if="$ISO_PATH" of="$USB_DEVICE" bs=4M status=progress oflag=sync; then
|
||||||
|
printf "%b\n" "${RED}Failed to create bootable USB drive${RC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Sync to ensure all data is written
|
||||||
|
if ! $ESCALATION_TOOL sync; then
|
||||||
|
printf "%b\n" "${RED}Failed to sync data${RC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf "%b\n" "${GREEN}Bootable USB drive created successfully!${RC}"
|
||||||
|
|
||||||
|
# Eject the USB device
|
||||||
|
printf "%b\n" "${YELLOW}Ejecting ${USB_DEVICE}...${RC}"
|
||||||
|
if ! $ESCALATION_TOOL umount "${USB_DEVICE}"* 2>/dev/null; then
|
||||||
|
printf "%b\n" "${RED}Failed to unmount ${USB_DEVICE}${RC}"
|
||||||
|
fi
|
||||||
|
if ! $ESCALATION_TOOL eject "$USB_DEVICE"; then
|
||||||
|
printf "%b\n" "${RED}Failed to eject ${USB_DEVICE}${RC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf "%b\n" "${GREEN}You can safely remove your USB drive. Reinsert the drive to be detected.${RC}"
|
||||||
|
}
|
||||||
|
|
||||||
|
checkEnv
|
||||||
|
checkEscalationTool
|
||||||
|
write_iso
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
. ./utility_functions.sh
|
. ./utility_functions.sh
|
||||||
|
|
||||||
|
. ../../common-script.sh
|
||||||
|
|
||||||
# Function to auto-detect displays and set common resolution
|
# Function to auto-detect displays and set common resolution
|
||||||
auto_detect_displays() {
|
auto_detect_displays() {
|
||||||
if confirm_action "Auto-detect displays and set common resolution?"; then
|
if confirm_action "Auto-detect displays and set common resolution?"; then
|
||||||
|
@ -13,11 +15,19 @@ auto_detect_displays() {
|
||||||
|
|
||||||
for monitor in $monitors; do
|
for monitor in $monitors; do
|
||||||
resolutions=$(get_unique_resolutions "$monitor")
|
resolutions=$(get_unique_resolutions "$monitor")
|
||||||
common_resolutions=$(comm -12 <(echo "$common_resolutions") <(echo "$resolutions"))
|
temp_common_resolutions=$(mktemp)
|
||||||
|
temp_resolutions=$(mktemp)
|
||||||
|
|
||||||
|
echo "$common_resolutions" > "$temp_common_resolutions"
|
||||||
|
echo "$resolutions" > "$temp_resolutions"
|
||||||
|
|
||||||
|
common_resolutions=$(comm -12 "$temp_common_resolutions" "$temp_resolutions")
|
||||||
|
|
||||||
|
rm -f "$temp_common_resolutions" "$temp_resolutions"
|
||||||
done
|
done
|
||||||
|
|
||||||
if [ -z "$common_resolutions" ]; then
|
if [ -z "$common_resolutions" ]; then
|
||||||
dialog --msgbox "No common resolution found among connected monitors." 10 60
|
echo "No common resolution found among connected monitors."
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -2,38 +2,42 @@
|
||||||
|
|
||||||
. ./utility_functions.sh
|
. ./utility_functions.sh
|
||||||
|
|
||||||
|
. ../../common-script.sh
|
||||||
|
|
||||||
# Function to change monitor orientation
|
# Function to change monitor orientation
|
||||||
change_orientation() {
|
change_orientation() {
|
||||||
monitor_list=$(detect_connected_monitors)
|
monitor_list=$(detect_connected_monitors)
|
||||||
IFS=$'\n' read -r -a monitor_array <<<"$monitor_list"
|
monitor_array=$(echo "$monitor_list" | tr '\n' ' ')
|
||||||
|
|
||||||
clear
|
clear
|
||||||
echo -e "${BLUE}=========================================${RESET}"
|
printf "%b\n" "${YELLOW}=========================================${RC}"
|
||||||
echo -e "${BLUE} Change Monitor Orientation${RESET}"
|
printf "%b\n" "${YELLOW} Change Monitor Orientation${RC}"
|
||||||
echo -e "${BLUE}=========================================${RESET}"
|
printf "%b\n" "${YELLOW}=========================================${RC}"
|
||||||
echo -e "${YELLOW}Choose a monitor to configure:${RESET}"
|
printf "%b\n" "${YELLOW}Choose a monitor to configure:${RC}"
|
||||||
for i in "${!monitor_array[@]}"; do
|
i=1
|
||||||
echo -e "$((i + 1)). ${CYAN}${monitor_array[i]}${RESET}"
|
for monitor in $monitor_array; do
|
||||||
|
printf "%b\n" "$i. ${GREEN}$monitor${RC}"
|
||||||
|
i=$((i + 1))
|
||||||
done
|
done
|
||||||
|
|
||||||
read -p "Enter the number of the monitor: " monitor_choice
|
read -p "Enter the number of the monitor: " monitor_choice
|
||||||
|
|
||||||
if ! [[ "$monitor_choice" =~ ^[0-9]+$ ]] || (( monitor_choice < 1 )) || (( monitor_choice > ${#monitor_array[@]} )); then
|
if ! echo "$monitor_choice" | grep -qE '^[0-9]+$' || [ "$monitor_choice" -lt 1 ] || [ "$monitor_choice" -gt "$((i - 1))" ]; then
|
||||||
echo -e "${RED}Invalid selection.${RESET}"
|
printf "%b\n" "${RED}Invalid selection.${RC}"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
monitor_name="${monitor_array[monitor_choice - 1]}"
|
monitor_name=$(echo "$monitor_array" | cut -d' ' -f"$monitor_choice")
|
||||||
|
|
||||||
clear
|
clear
|
||||||
echo -e "${BLUE}=========================================${RESET}"
|
printf "%b\n" "${YELLOW}=========================================${RC}"
|
||||||
echo -e "${BLUE} Set Orientation for $monitor_name${RESET}"
|
printf "%b\n" "${YELLOW} Set Orientation for $monitor_name${RC}"
|
||||||
echo -e "${BLUE}=========================================${RESET}"
|
printf "%b\n" "${YELLOW}=========================================${RC}"
|
||||||
echo -e "${YELLOW}Choose orientation:${RESET}"
|
printf "%b\n" "${YELLOW}Choose orientation:${RC}"
|
||||||
echo -e "1. ${CYAN}Normal${RESET}"
|
printf "%b\n" "1. ${GREEN}Normal${RC}"
|
||||||
echo -e "2. ${CYAN}Left${RESET}"
|
printf "%b\n" "2. ${GREEN}Left${RC}"
|
||||||
echo -e "3. ${CYAN}Right${RESET}"
|
printf "%b\n" "3. ${GREEN}Right${RC}"
|
||||||
echo -e "4. ${CYAN}Inverted${RESET}"
|
printf "%b\n" "4. ${GREEN}Inverted${RC}"
|
||||||
|
|
||||||
read -p "Enter the number of the orientation: " orientation_choice
|
read -p "Enter the number of the orientation: " orientation_choice
|
||||||
|
|
||||||
|
@ -42,15 +46,15 @@ change_orientation() {
|
||||||
2) orientation="left" ;;
|
2) orientation="left" ;;
|
||||||
3) orientation="right" ;;
|
3) orientation="right" ;;
|
||||||
4) orientation="inverted" ;;
|
4) orientation="inverted" ;;
|
||||||
*) echo -e "${RED}Invalid selection.${RESET}"; return ;;
|
*) printf "%b\n" "${RED}Invalid selection.${RC}"; return ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if confirm_action "Change orientation of ${CYAN}$monitor_name${RESET} to ${CYAN}$orientation${RESET}?"; then
|
if confirm_action "Change orientation of $monitor_name to $orientation?"; then
|
||||||
echo -e "${GREEN}Changing orientation of $monitor_name to $orientation${RESET}"
|
printf "%b\n" "${GREEN}Changing orientation of $monitor_name to $orientation${RC}"
|
||||||
execute_command "xrandr --output $monitor_name --rotate $orientation"
|
execute_command "xrandr --output $monitor_name --rotate $orientation"
|
||||||
echo -e "${GREEN}Orientation changed successfully.${RESET}"
|
printf "%b\n" "${GREEN}Orientation changed successfully.${RC}"
|
||||||
else
|
else
|
||||||
echo -e "${RED}Action canceled.${RESET}"
|
printf "%b\n" "${RED}Action canceled.${RC}"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,54 +2,50 @@
|
||||||
|
|
||||||
. ./utility_functions.sh
|
. ./utility_functions.sh
|
||||||
|
|
||||||
RESET='\033[0m'
|
. ../../common-script.sh
|
||||||
BOLD='\033[1m'
|
|
||||||
RED='\033[31m'
|
|
||||||
GREEN='\033[32m'
|
|
||||||
YELLOW='\033[33m'
|
|
||||||
BLUE='\033[34m'
|
|
||||||
CYAN='\033[36m'
|
|
||||||
|
|
||||||
# Function to disable a monitor
|
# Function to disable a monitor
|
||||||
disable_monitor() {
|
disable_monitor() {
|
||||||
monitor_list=$(detect_connected_monitors)
|
monitor_list=$(detect_connected_monitors)
|
||||||
IFS=$'\n' read -r -a monitor_array <<<"$monitor_list"
|
monitor_array=$(echo "$monitor_list" | tr '\n' ' ')
|
||||||
|
|
||||||
clear
|
clear
|
||||||
echo -e "${BLUE}=========================================${RESET}"
|
printf "%b\n" "${YELLOW}=========================================${RC}"
|
||||||
echo -e "${BLUE} Disable Monitor${RESET}"
|
printf "%b\n" "${YELLOW} Disable Monitor${RC}"
|
||||||
echo -e "${BLUE}=========================================${RESET}"
|
printf "%b\n" "${YELLOW}=========================================${RC}"
|
||||||
echo -e "${YELLOW}Choose a monitor to disable:${RESET}"
|
printf "%b\n" "Choose a monitor to disable:"
|
||||||
for i in "${!monitor_array[@]}"; do
|
i=1
|
||||||
echo -e "$((i + 1)). ${CYAN}${monitor_array[i]}${RESET}"
|
for monitor in $monitor_array; do
|
||||||
|
printf "%b\n" "$i. ${GREEN}$monitor${RC}"
|
||||||
|
i=$((i + 1))
|
||||||
done
|
done
|
||||||
|
|
||||||
read -p "Enter the number of the monitor: " monitor_choice
|
read -p "Enter the number of the monitor: " monitor_choice
|
||||||
|
|
||||||
if ! [[ "$monitor_choice" =~ ^[0-9]+$ ]] || (( monitor_choice < 1 )) || (( monitor_choice > ${#monitor_array[@]} )); then
|
if ! echo "$monitor_choice" | grep -qE '^[0-9]+$' || [ "$monitor_choice" -lt 1 ] || [ "$monitor_choice" -gt "$((i - 1))" ]; then
|
||||||
echo -e "${RED}Invalid selection.${RESET}"
|
printf "%b\n" "${RED}Invalid selection.${RC}"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
monitor_name="${monitor_array[monitor_choice - 1]}"
|
monitor_name=$(echo "$monitor_array" | cut -d' ' -f"$monitor_choice")
|
||||||
|
|
||||||
echo -e "${RED}Warning: Disabling the monitor will turn it off and may affect your display setup.${RESET}"
|
printf "%b\n" "${RED}Warning: Disabling the monitor will turn it off and may affect your display setup.${RC}"
|
||||||
|
|
||||||
if confirm_action "Do you really want to disable ${CYAN}$monitor_name${RESET}?"; then
|
if confirm_action "Do you really want to disable ${GREEN}$monitor_name${RC}?"; then
|
||||||
echo -e "${GREEN}Disabling $monitor_name${RESET}"
|
printf "%b\n" "${GREEN}Disabling $monitor_name${RC}"
|
||||||
execute_command "xrandr --output $monitor_name --off"
|
execute_command "xrandr --output $monitor_name --off"
|
||||||
echo -e "${GREEN}Monitor $monitor_name disabled successfully.${RESET}"
|
printf "%b\n" "${GREEN}Monitor $monitor_name disabled successfully.${RC}"
|
||||||
else
|
else
|
||||||
echo -e "${RED}Action canceled.${RESET}"
|
printf "%b\n" "${RED}Action canceled.${RC}"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Function to prompt for confirmation
|
# Function to prompt for confirmation
|
||||||
confirm_action() {
|
confirm_action() {
|
||||||
local action="$1"
|
action="$1"
|
||||||
echo -e "${BOLD}${YELLOW}$action${RESET}"
|
printf "%b\n" "${YELLOW}$action${RC}"
|
||||||
read -p "Are you sure? (y/n): " confirm
|
read -p "Are you sure? (y/n): " confirm
|
||||||
if [[ "$confirm" =~ ^[Yy]$ ]]; then
|
if echo "$confirm" | grep -qE '^[Yy]$'; then
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
return 1
|
return 1
|
||||||
|
|
|
@ -2,12 +2,14 @@
|
||||||
|
|
||||||
. ./utility_functions.sh
|
. ./utility_functions.sh
|
||||||
|
|
||||||
|
. ../../common-script.sh
|
||||||
|
|
||||||
# Function to duplicate displays
|
# Function to duplicate displays
|
||||||
duplicate_displays() {
|
duplicate_displays() {
|
||||||
primary=$(detect_connected_monitors | head -n 1)
|
primary=$(detect_connected_monitors | head -n 1)
|
||||||
for monitor in $(detect_connected_monitors | tail -n +2); do
|
for monitor in $(detect_connected_monitors | tail -n +2); do
|
||||||
if confirm_action "Duplicate $monitor to $primary?"; then
|
if confirm_action "Duplicate $monitor to $primary?"; then
|
||||||
echo "Duplicating $monitor to $primary"
|
printf "%b\n" "${GREEN}Duplicating $monitor to $primary${RC}"
|
||||||
execute_command "xrandr --output $monitor --same-as $primary"
|
execute_command "xrandr --output $monitor --same-as $primary"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
|
@ -2,55 +2,40 @@
|
||||||
|
|
||||||
. ./utility_functions.sh
|
. ./utility_functions.sh
|
||||||
|
|
||||||
RESET='\033[0m'
|
. ../../common-script.sh
|
||||||
BOLD='\033[1m'
|
|
||||||
RED='\033[31m'
|
|
||||||
GREEN='\033[32m'
|
|
||||||
YELLOW='\033[33m'
|
|
||||||
BLUE='\033[34m'
|
|
||||||
CYAN='\033[36m'
|
|
||||||
|
|
||||||
# Function to enable a monitor
|
# Function to enable a monitor
|
||||||
enable_monitor() {
|
enable_monitor() {
|
||||||
monitor_list=$(detect_connected_monitors)
|
monitor_list=$(detect_connected_monitors)
|
||||||
IFS=$'\n' read -r -a monitor_array <<<"$monitor_list"
|
monitor_array=$(echo "$monitor_list" | tr '\n' ' ')
|
||||||
|
|
||||||
clear
|
clear
|
||||||
echo -e "${BLUE}=========================================${RESET}"
|
printf "%b\n" "${YELLOW}=========================================${RC}"
|
||||||
echo -e "${BLUE} Enable Monitor${RESET}"
|
printf "%b\n" "${YELLOW} Enable Monitor${RC}"
|
||||||
echo -e "${BLUE}=========================================${RESET}"
|
printf "%b\n" "${YELLOW}=========================================${RC}"
|
||||||
echo -e "${YELLOW}Choose a monitor to enable:${RESET}"
|
printf "%b\n" "${YELLOW}Choose a monitor to enable:${RC}"
|
||||||
for i in "${!monitor_array[@]}"; do
|
|
||||||
echo -e "$((i + 1)). ${CYAN}${monitor_array[i]}${RESET}"
|
i=1
|
||||||
|
for monitor in $monitor_array; do
|
||||||
|
printf "%b\n" "$i. ${GREEN}$monitor${RC}"
|
||||||
|
i=$((i + 1))
|
||||||
done
|
done
|
||||||
|
|
||||||
read -p "Enter the number of the monitor: " monitor_choice
|
read -p "Enter the number of the monitor: " monitor_choice
|
||||||
|
|
||||||
if ! [[ "$monitor_choice" =~ ^[0-9]+$ ]] || (( monitor_choice < 1 )) || (( monitor_choice > ${#monitor_array[@]} )); then
|
if ! echo "$monitor_choice" | grep -qE '^[0-9]+$' || [ "$monitor_choice" -lt 1 ] || [ "$monitor_choice" -gt "$((i - 1))" ]; then
|
||||||
echo -e "${RED}Invalid selection.${RESET}"
|
printf "%b\n" "${RED}Invalid selection.${RC}"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
monitor_name="${monitor_array[monitor_choice - 1]}"
|
monitor_name=$(echo "$monitor_array" | cut -d' ' -f"$monitor_choice")
|
||||||
|
|
||||||
if confirm_action "Enable ${CYAN}$monitor_name${RESET}?"; then
|
if confirm_action "Enable $monitor_name?"; then
|
||||||
echo -e "${GREEN}Enabling $monitor_name${RESET}"
|
printf "%b\n" "${GREEN}Enabling $monitor_name${RC}"
|
||||||
execute_command "xrandr --output $monitor_name --auto"
|
execute_command "xrandr --output $monitor_name --auto"
|
||||||
echo -e "${GREEN}Monitor $monitor_name enabled successfully.${RESET}"
|
printf "%b\n" "${GREEN}Monitor $monitor_name enabled successfully.${RC}"
|
||||||
else
|
else
|
||||||
echo -e "${RED}Action canceled.${RESET}"
|
printf "%b\n" "${RED}Action canceled.${RC}"
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function to prompt for confirmation
|
|
||||||
confirm_action() {
|
|
||||||
local action="$1"
|
|
||||||
echo -e "${BOLD}${YELLOW}$action${RESET}"
|
|
||||||
read -p "Are you sure? (y/n): " confirm
|
|
||||||
if [[ "$confirm" =~ ^[Yy]$ ]]; then
|
|
||||||
return 0
|
|
||||||
else
|
|
||||||
return 1
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,14 +2,22 @@
|
||||||
|
|
||||||
. ./utility_functions.sh
|
. ./utility_functions.sh
|
||||||
|
|
||||||
|
. ../../common-script.sh
|
||||||
|
|
||||||
# Function to extend displays
|
# Function to extend displays
|
||||||
extend_displays() {
|
extend_displays() {
|
||||||
monitors=($(detect_connected_monitors))
|
monitors=$(detect_connected_monitors)
|
||||||
for ((i=1; i<${#monitors[@]}; i++)); do
|
monitor_array=$(echo "$monitors" | tr '\n' ' ')
|
||||||
if confirm_action "Extend ${monitors[$i]} to the right of ${monitors[$((i-1))]}?"; then
|
i=1
|
||||||
echo "Extending ${monitors[$i]} to the right of ${monitors[$((i-1))]}"
|
for monitor in $monitor_array; do
|
||||||
execute_command "xrandr --output ${monitors[$i]} --right-of ${monitors[$((i-1))]}"
|
if [ "$i" -gt 1 ]; then
|
||||||
|
prev_monitor=$(echo "$monitor_array" | cut -d' ' -f$((i-1)))
|
||||||
|
if confirm_action "Extend $monitor to the right of $prev_monitor?"; then
|
||||||
|
printf "%b\n" "${GREEN}Extending $monitor to the right of $prev_monitor${RC}"
|
||||||
|
execute_command "xrandr --output $monitor --right-of $prev_monitor"
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
|
i=$((i + 1))
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,35 +2,39 @@
|
||||||
|
|
||||||
. ./utility_functions.sh
|
. ./utility_functions.sh
|
||||||
|
|
||||||
|
. ../../common-script.sh
|
||||||
|
|
||||||
# Function to manage monitor arrangement
|
# Function to manage monitor arrangement
|
||||||
manage_arrangement() {
|
manage_arrangement() {
|
||||||
monitor_list=$(detect_connected_monitors)
|
monitor_list=$(detect_connected_monitors)
|
||||||
IFS=$'\n' read -r -a monitor_array <<<"$monitor_list"
|
monitor_array=$(echo "$monitor_list" | tr '\n' ' ')
|
||||||
|
|
||||||
clear
|
clear
|
||||||
echo -e "${BLUE}=========================================${RESET}"
|
printf "%b\n" "${YELLOW}=========================================${RC}"
|
||||||
echo -e "${BLUE} Manage Monitor Arrangement${RESET}"
|
printf "%b\n" "${YELLOW} Manage Monitor Arrangement${RC}"
|
||||||
echo -e "${BLUE}=========================================${RESET}"
|
printf "%b\n" "${YELLOW}=========================================${RC}"
|
||||||
echo -e "${YELLOW}Choose the monitor to arrange:${RESET}"
|
printf "%b\n" "${YELLOW}Choose the monitor to arrange:${RC}"
|
||||||
for i in "${!monitor_array[@]}"; do
|
i=1
|
||||||
echo -e "$((i + 1)). ${CYAN}${monitor_array[i]}${RESET}"
|
for monitor in $monitor_array; do
|
||||||
|
printf "%b\n" "$i. ${YELLOW}$monitor${RC}"
|
||||||
|
i=$((i + 1))
|
||||||
done
|
done
|
||||||
|
|
||||||
read -p "Enter the number of the monitor to arrange: " monitor_choice
|
read -p "Enter the number of the monitor to arrange: " monitor_choice
|
||||||
|
|
||||||
if ! [[ "$monitor_choice" =~ ^[0-9]+$ ]] || (( monitor_choice < 1 )) || (( monitor_choice > ${#monitor_array[@]} )); then
|
if ! echo "$monitor_choice" | grep -qE '^[0-9]+$' || [ "$monitor_choice" -lt 1 ] || [ "$monitor_choice" -gt "$((i - 1))" ]; then
|
||||||
echo -e "${RED}Invalid selection.${RESET}"
|
printf "%b\n" "${RED}Invalid selection.${RC}"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
monitor_name="${monitor_array[monitor_choice - 1]}"
|
monitor_name=$(echo "$monitor_array" | cut -d' ' -f"$monitor_choice")
|
||||||
|
|
||||||
clear
|
clear
|
||||||
echo -e "${YELLOW}Choose position relative to other monitors:${RESET}"
|
printf "%b\n" "${YELLOW}Choose position relative to other monitors:${RC}"
|
||||||
echo -e "1. ${CYAN}Left of${RESET}"
|
printf "%b\n" "1. ${YELLOW}Left of${RC}"
|
||||||
echo -e "2. ${CYAN}Right of${RESET}"
|
printf "%b\n" "2. ${YELLOW}Right of${RC}"
|
||||||
echo -e "3. ${CYAN}Above${RESET}"
|
printf "%b\n" "3. ${YELLOW}Above${RC}"
|
||||||
echo -e "4. ${CYAN}Below${RESET}"
|
printf "%b\n" "4. ${YELLOW}Below${RC}"
|
||||||
|
|
||||||
read -p "Enter the number of the position: " position_choice
|
read -p "Enter the number of the position: " position_choice
|
||||||
|
|
||||||
|
@ -39,31 +43,31 @@ manage_arrangement() {
|
||||||
2) position="--right-of" ;;
|
2) position="--right-of" ;;
|
||||||
3) position="--above" ;;
|
3) position="--above" ;;
|
||||||
4) position="--below" ;;
|
4) position="--below" ;;
|
||||||
*) echo -e "${RED}Invalid selection.${RESET}"; return ;;
|
*) printf "%b\n" "${RED}Invalid selection.${RC}"; return ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
echo -e "${YELLOW}Choose the reference monitor:${RESET}"
|
printf "%b\n" "${YELLOW}Choose the reference monitor:${RC}"
|
||||||
for i in "${!monitor_array[@]}"; do
|
for i in $monitor_array; do
|
||||||
if [[ "${monitor_array[i]}" != "$monitor_name" ]]; then
|
if [ "$i" != "$monitor_name" ]; then
|
||||||
echo -e "$((i + 1)). ${CYAN}${monitor_array[i]}${RESET}"
|
printf "%b\n" "$((i + 1)). ${YELLOW}$i${RC}"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
read -p "Enter the number of the reference monitor: " ref_choice
|
read -p "Enter the number of the reference monitor: " ref_choice
|
||||||
|
|
||||||
if ! [[ "$ref_choice" =~ ^[0-9]+$ ]] || (( ref_choice < 1 )) || (( ref_choice > ${#monitor_array[@]} )) || (( ref_choice == monitor_choice )); then
|
if ! echo "$ref_choice" | grep -qE '^[0-9]+$' || [ "$ref_choice" -lt 1 ] || [ "$ref_choice" -gt "$((i - 1))" ] || [ "$ref_choice" -eq "$monitor_choice" ]; then
|
||||||
echo -e "${RED}Invalid selection.${RESET}"
|
printf "%b\n" "${RED}Invalid selection.${RC}"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
ref_monitor="${monitor_array[ref_choice - 1]}"
|
ref_monitor=$(echo "$monitor_array" | cut -d' ' -f"$ref_choice")
|
||||||
|
|
||||||
if confirm_action "Arrange ${CYAN}$monitor_name${RESET} ${position} ${CYAN}$ref_monitor${RESET}?"; then
|
if confirm_action "Arrange ${YELLOW}$monitor_name${RC} ${position} ${YELLOW}$ref_monitor${RC}?"; then
|
||||||
echo -e "${GREEN}Arranging $monitor_name ${position} $ref_monitor${RESET}"
|
printf "%b\n" "${GREEN}Arranging $monitor_name ${position} $ref_monitor${RC}"
|
||||||
execute_command "xrandr --output $monitor_name $position $ref_monitor"
|
execute_command "xrandr --output $monitor_name $position $ref_monitor"
|
||||||
echo -e "${GREEN}Arrangement updated successfully.${RESET}"
|
printf "%b\n" "${GREEN}Arrangement updated successfully.${RC}"
|
||||||
else
|
else
|
||||||
echo -e "${RED}Action canceled.${RESET}"
|
printf "%b\n" "${RED}Action canceled.${RC}"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,22 +2,24 @@
|
||||||
|
|
||||||
. ./utility_functions.sh
|
. ./utility_functions.sh
|
||||||
|
|
||||||
# Function to reset scaling back to 1 (native resolution) for all monitors
|
. ../../common-script.sh
|
||||||
reset_scaling() {
|
|
||||||
echo -e "${BLUE}=========================================${RESET}"
|
# Function to Reset scaling back to 1 (native resolution) for all monitors
|
||||||
echo -e "${BLUE} Reset Monitor Scaling to Native Resolution${RESET}"
|
Reset_scaling() {
|
||||||
echo -e "${BLUE}=========================================${RESET}"
|
printf "%b\n" "${YELLOW}=========================================${RC}"
|
||||||
|
printf "%b\n" "${YELLOW} Reset Monitor Scaling to Native Resolution${RC}"
|
||||||
|
printf "%b\n" "${YELLOW}=========================================${RC}"
|
||||||
|
|
||||||
monitor_list=$(detect_connected_monitors)
|
monitor_list=$(detect_connected_monitors)
|
||||||
IFS=$'\n' read -r -a monitor_array <<<"$monitor_list"
|
monitor_array=$(echo "$monitor_list" | tr '\n' ' ')
|
||||||
|
|
||||||
for monitor in "${monitor_array[@]}"; do
|
for monitor in $monitor_array; do
|
||||||
echo -e "${CYAN}Resetting scaling for $monitor to 1x1 (native resolution)${RESET}"
|
printf "%b\n" "${CYAN}Resetting scaling for $monitor to 1x1 (native resolution)${RC}"
|
||||||
execute_command "xrandr --output $monitor --scale 1x1"
|
execute_command "xrandr --output $monitor --scale 1x1"
|
||||||
done
|
done
|
||||||
|
|
||||||
echo -e "${GREEN}All monitor scalings have been reset to 1x1.${RESET}"
|
printf "%b\n" "${GREEN}All monitor scalings have been Reset to 1x1.${RC}"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Call the reset_scaling function
|
# Call the Reset_scaling function
|
||||||
reset_scaling
|
Reset_scaling
|
||||||
|
|
|
@ -2,42 +2,42 @@
|
||||||
|
|
||||||
. ./utility_functions.sh
|
. ./utility_functions.sh
|
||||||
|
|
||||||
|
. ../../common-script.sh
|
||||||
|
|
||||||
# Function to scale smaller monitors to the highest resolution of a bigger monitor
|
# Function to scale smaller monitors to the highest resolution of a bigger monitor
|
||||||
scale_monitors() {
|
scale_monitors() {
|
||||||
echo -e "${BLUE}=========================================${RESET}"
|
printf "%b\n" "${YELLOW}=========================================${RC}"
|
||||||
echo -e "${BLUE} Scale Monitors to Highest Resolution${RESET}"
|
printf "%b\n" "${YELLOW} Scale Monitors to Highest Resolution${RC}"
|
||||||
echo -e "${BLUE}=========================================${RESET}"
|
printf "%b\n" "${YELLOW}=========================================${RC}"
|
||||||
|
|
||||||
monitor_list=$(detect_connected_monitors)
|
monitor_list=$(detect_connected_monitors)
|
||||||
IFS=$'\n' read -r -a monitor_array <<<"$monitor_list"
|
monitor_array=$(echo "$monitor_list" | tr '\n' ' ')
|
||||||
|
|
||||||
# Get the highest resolution among all monitors
|
|
||||||
max_width=0
|
max_width=0
|
||||||
max_height=0
|
max_height=0
|
||||||
|
|
||||||
for monitor in "${monitor_array[@]}"; do
|
for monitor in $monitor_array; do
|
||||||
res=$(xrandr | grep -A1 "^$monitor connected" | tail -1 | awk '{print $1}')
|
res=$(xrandr | grep -A1 "^$monitor connected" | tail -1 | awk '{print $1}')
|
||||||
width=$(echo $res | awk -Fx '{print $1}')
|
width=$(echo "$res" | awk -Fx '{print $1}')
|
||||||
height=$(echo $res | awk -Fx '{print $2}')
|
height=$(echo "$res" | awk -Fx '{print $2}')
|
||||||
|
|
||||||
if (( width > max_width )); then
|
if [ "$width" -gt "$max_width" ]; then
|
||||||
max_width=$width
|
max_width=$width
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if (( height > max_height )); then
|
if [ "$height" -gt "$max_height" ]; then
|
||||||
max_height=$height
|
max_height=$height
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
echo -e "${CYAN}Highest resolution found: ${max_width}x${max_height}${RESET}"
|
printf "%b\n" "${YELLOW}Highest resolution found: ${max_width}x${max_height}${RC}"
|
||||||
|
|
||||||
# Scale all monitors to the maximum resolution
|
for monitor in $monitor_array; do
|
||||||
for monitor in "${monitor_array[@]}"; do
|
printf "%b\n" "${YELLOW}Scaling $monitor to ${max_width}x${max_height}${RC}"
|
||||||
echo -e "${CYAN}Scaling $monitor to ${max_width}x${max_height}${RESET}"
|
|
||||||
execute_command "xrandr --output $monitor --scale-from ${max_width}x${max_height}"
|
execute_command "xrandr --output $monitor --scale-from ${max_width}x${max_height}"
|
||||||
done
|
done
|
||||||
|
|
||||||
echo -e "${GREEN}Scaling complete. All monitors are now scaled to ${max_width}x${max_height}.${RESET}"
|
printf "%b\n" "${GREEN}Scaling complete. All monitors are now scaled to ${max_width}x${max_height}.${RC}"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Call the scale_monitors function
|
# Call the scale_monitors function
|
||||||
|
|
85
tabs/utils/monitor-control/set_brightness.sh
Normal file
85
tabs/utils/monitor-control/set_brightness.sh
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
. ./utility_functions.sh
|
||||||
|
|
||||||
|
# Function to adjust brightness for a selected monitor
|
||||||
|
adjust_monitor_brightness() {
|
||||||
|
while true; do
|
||||||
|
monitor_list=$(detect_connected_monitors)
|
||||||
|
monitor_array=$(echo "$monitor_list" | tr '\n' ' ')
|
||||||
|
set -- $monitor_array
|
||||||
|
count=1
|
||||||
|
|
||||||
|
clear
|
||||||
|
printf "%b\n" "${YELLOW}=========================================${RC}"
|
||||||
|
printf "%b\n" "${YELLOW} Adjust Monitor Brightness${RC}"
|
||||||
|
printf "%b\n" "${YELLOW}=========================================${RC}"
|
||||||
|
printf "%b\n" "${YELLOW}Choose a monitor to adjust brightness:${RC}"
|
||||||
|
for monitor in "$@"; do
|
||||||
|
echo "$count. $monitor"
|
||||||
|
count=$((count + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Enter the number of the monitor (or 'q' to quit): "
|
||||||
|
read monitor_choice
|
||||||
|
|
||||||
|
if [ "$monitor_choice" = "q" ]; then
|
||||||
|
printf "%b\n" "${RED}Exiting...${RC}"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! echo "$monitor_choice" | grep -qE '^[0-9]+$'; then
|
||||||
|
echo "Invalid selection. Please try again."
|
||||||
|
echo "Press [Enter] to continue..."
|
||||||
|
read dummy
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$monitor_choice" -lt 1 ] || [ "$monitor_choice" -gt "$#" ]; then
|
||||||
|
printf "%b\n" "${RED}Invalid selection. Please try again.${RC}"
|
||||||
|
echo "Press [Enter] to continue..."
|
||||||
|
read dummy
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
monitor_name=$(eval echo "\${$monitor_choice}")
|
||||||
|
current_brightness=$(get_current_brightness "$monitor_name")
|
||||||
|
|
||||||
|
# Correctly calculate the brightness percentage
|
||||||
|
current_brightness_percentage=$(awk "BEGIN {printf \"%.0f\", $current_brightness * 100}")
|
||||||
|
printf "%b\n" "${YELLOW}Current brightness for $monitor_name${RC}: ${GREEN}$current_brightness_percentage%${RC}"
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
echo "Enter the new brightness value as a percentage (10 to 100, or 'q' to quit): "
|
||||||
|
read new_brightness_percentage
|
||||||
|
|
||||||
|
if [ "$new_brightness_percentage" = "q" ]; then
|
||||||
|
printf "%b\n" "${RED}Exiting...${RC}"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Validate brightness input: accept only values above 10
|
||||||
|
if ! echo "$new_brightness_percentage" | grep -qE '^[0-9]+$' || [ "$new_brightness_percentage" -lt 10 ] || [ "$new_brightness_percentage" -gt 100 ]; then
|
||||||
|
printf "%b\n" "${RED}Invalid brightness value. Please enter a value between 10 and 100.${RC}"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Convert percentage to xrandr brightness value (10% to 0.10)
|
||||||
|
new_brightness=$(awk "BEGIN {printf \"%.2f\", $new_brightness_percentage / 100}")
|
||||||
|
|
||||||
|
echo "Set brightness for $monitor_name to $new_brightness_percentage%? (y/n): "
|
||||||
|
read confirm
|
||||||
|
if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then
|
||||||
|
printf "%b\n" "${GREEN}Setting brightness for $monitor_name to $new_brightness_percentage%${RC}"
|
||||||
|
execute_command "xrandr --output $monitor_name --brightness $new_brightness"
|
||||||
|
printf "%b\n" "${GREEN}Brightness for $monitor_name set to $new_brightness_percentage% successfully.${RC}"
|
||||||
|
break
|
||||||
|
else
|
||||||
|
printf "%b\n" "${RED}Action canceled. Please choose a different brightness value.${RC}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Call the adjust_monitor_brightness function
|
||||||
|
adjust_monitor_brightness
|
|
@ -2,35 +2,39 @@
|
||||||
|
|
||||||
. ./utility_functions.sh
|
. ./utility_functions.sh
|
||||||
|
|
||||||
|
. ../../common-script.sh
|
||||||
|
|
||||||
# Function to set a monitor as primary
|
# Function to set a monitor as primary
|
||||||
set_primary_monitor() {
|
set_primary_monitor() {
|
||||||
monitor_list=$(detect_connected_monitors)
|
monitor_list=$(detect_connected_monitors)
|
||||||
IFS=$'\n' read -r -a monitor_array <<<"$monitor_list"
|
monitor_array=$(echo "$monitor_list" | tr '\n' ' ')
|
||||||
|
|
||||||
clear
|
clear
|
||||||
echo -e "${BLUE}=========================================${RESET}"
|
printf "%b\n" "${YELLOW}=========================================${RC}"
|
||||||
echo -e "${BLUE} Set Primary Monitor${RESET}"
|
printf "%b\n" "${YELLOW} Set Primary Monitor${RC}"
|
||||||
echo -e "${BLUE}=========================================${RESET}"
|
printf "%b\n" "${YELLOW}=========================================${RC}"
|
||||||
echo -e "${YELLOW}Choose a monitor to set as primary:${RESET}"
|
printf "%b\n" "${YELLOW}Choose a monitor to set as primary:${RC}"
|
||||||
for i in "${!monitor_array[@]}"; do
|
i=1
|
||||||
echo -e "$((i + 1)). ${CYAN}${monitor_array[i]}${RESET}"
|
for monitor in $monitor_array; do
|
||||||
|
printf "%b\n" "$i. ${YELLOW}$monitor${RC}"
|
||||||
|
i=$((i + 1))
|
||||||
done
|
done
|
||||||
|
|
||||||
read -p "Enter the number of the monitor: " monitor_choice
|
read -p "Enter the number of the monitor: " monitor_choice
|
||||||
|
|
||||||
if ! [[ "$monitor_choice" =~ ^[0-9]+$ ]] || (( monitor_choice < 1 )) || (( monitor_choice > ${#monitor_array[@]} )); then
|
if ! echo "$monitor_choice" | grep -qE '^[0-9]+$' || [ "$monitor_choice" -lt 1 ] || [ "$monitor_choice" -gt "$((i - 1))" ]; then
|
||||||
echo -e "${RED}Invalid selection.${RESET}"
|
printf "%b\n" "${RED}Invalid selection.${RC}"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
monitor_name="${monitor_array[monitor_choice - 1]}"
|
monitor_name=$(echo "$monitor_array" | cut -d' ' -f"$monitor_choice")
|
||||||
|
|
||||||
if confirm_action "Set ${CYAN}$monitor_name${RESET} as the primary monitor?"; then
|
if confirm_action "Set $monitor_name as the primary monitor?"; then
|
||||||
echo -e "${GREEN}Setting $monitor_name as primary monitor${RESET}"
|
printf "%b\n" "${GREEN}Setting $monitor_name as primary monitor${RC}"
|
||||||
execute_command "xrandr --output $monitor_name --primary"
|
execute_command "xrandr --output $monitor_name --primary"
|
||||||
echo -e "${GREEN}Monitor $monitor_name set as primary successfully.${RESET}"
|
printf "%b\n" "${GREEN}Monitor $monitor_name set as primary successfully.${RC}"
|
||||||
else
|
else
|
||||||
echo -e "${RED}Action canceled.${RESET}"
|
printf "%b\n" "${RED}Action canceled.${RC}"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,73 +2,68 @@
|
||||||
|
|
||||||
. ./utility_functions.sh
|
. ./utility_functions.sh
|
||||||
|
|
||||||
RESET='\033[0m'
|
. ../../common-script.sh
|
||||||
BOLD='\033[1m'
|
|
||||||
RED='\033[31m'
|
|
||||||
GREEN='\033[32m'
|
|
||||||
YELLOW='\033[33m'
|
|
||||||
BLUE='\033[34m'
|
|
||||||
CYAN='\033[36m'
|
|
||||||
|
|
||||||
# Function to set resolutions
|
# Function to set resolutions
|
||||||
set_resolutions() {
|
set_resolutions() {
|
||||||
monitor_list=$(detect_connected_monitors)
|
monitor_list=$(detect_connected_monitors)
|
||||||
IFS=$'\n' read -r -a monitor_array <<<"$monitor_list"
|
monitor_array=$(echo "$monitor_list" | tr '\n' ' ')
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
clear
|
clear
|
||||||
echo -e "${BLUE}=========================================${RESET}"
|
printf "%b\n" "${YELLOW}=========================================${RC}"
|
||||||
echo -e "${BLUE} Monitor Configuration${RESET}"
|
printf "%b\n" "${YELLOW} Monitor Configuration${RC}"
|
||||||
echo -e "${BLUE}=========================================${RESET}"
|
printf "%b\n" "${YELLOW}=========================================${RC}"
|
||||||
echo -e "${YELLOW}Choose a monitor to configure:${RESET}"
|
|
||||||
for i in "${!monitor_array[@]}"; do
|
printf "%b\n" "${YELLOW}Choose a monitor to configure:${RC}"
|
||||||
echo -e "$((i + 1)). ${CYAN}${monitor_array[i]}${RESET}"
|
i=1
|
||||||
|
for monitor in $monitor_array; do
|
||||||
|
printf "%b\n" "$i. ${YELLOW}$monitor${RC}"
|
||||||
|
i=$((i + 1))
|
||||||
done
|
done
|
||||||
|
|
||||||
read -p "Enter the choice (or 'q' to quit): " monitor_choice
|
read -p "Enter the choice (or 'q' to quit): " monitor_choice
|
||||||
|
|
||||||
if [[ "$monitor_choice" == "q" ]]; then
|
if [ "$monitor_choice" = "q" ]; then
|
||||||
echo -e "${RED}Exiting...${RESET}"
|
printf "%b\n" "${RED}Exiting...${RC}"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! [[ "$monitor_choice" =~ ^[0-9]+$ ]] || (( monitor_choice < 1 )) || (( monitor_choice > ${#monitor_array[@]} )); then
|
if ! echo "$monitor_choice" | grep -qE '^[0-9]+$' || [ "$monitor_choice" -lt 1 ] || [ "$monitor_choice" -gt "$((i - 1))" ]; then
|
||||||
echo -e "${RED}Invalid selection. Please try again.${RESET}"
|
printf "%b\n" "${RED}Invalid selection. Please try again.${RC}"
|
||||||
read -p "Press [Enter] to continue..."
|
read -p "Press [Enter] to continue..."
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
|
|
||||||
monitor_name="${monitor_array[monitor_choice - 1]}"
|
monitor_name=$(echo "$monitor_array" | cut -d' ' -f"$monitor_choice")
|
||||||
resolutions=$(get_unique_resolutions "$monitor_name" | sort -rn -t'x' -k1,1 -k2,2)
|
resolutions=$(get_unique_resolutions "$monitor_name" | sort -rn -t'x' -k1,1 -k2,2)
|
||||||
|
|
||||||
# Create a temporary file with resolutions and indices
|
|
||||||
temp_res_file=$(mktemp)
|
temp_res_file=$(mktemp)
|
||||||
echo "$resolutions" | awk '{print NR " " $0}' > "$temp_res_file"
|
echo "$resolutions" | awk '{print NR " " $0}' > "$temp_res_file"
|
||||||
|
|
||||||
# Read the resolutions into an associative array
|
i=1
|
||||||
declare -A resolution_map
|
while read -r resolution; do
|
||||||
while read -r index resolution; do
|
resolution_map[$i]="$resolution"
|
||||||
resolution_map[$index]="$resolution"
|
i=$((i + 1))
|
||||||
done < "$temp_res_file"
|
done < "$temp_res_file"
|
||||||
|
|
||||||
clear
|
clear
|
||||||
echo -e "${BLUE}=========================================${RESET}"
|
printf "%b\n" "${YELLOW}=========================================${RC}"
|
||||||
echo -e "${BLUE} Resolution Configuration for ${CYAN}$monitor_name${RESET}"
|
printf "%b\n" "${YELLOW} Resolution Configuration for ${YELLOW}$monitor_name${RC}"
|
||||||
echo -e "${BLUE}=========================================${RESET}"
|
printf "%b\n" "${YELLOW}=========================================${RC}"
|
||||||
echo -e "${YELLOW}Choose resolution for $monitor_name:${RESET}"
|
|
||||||
awk '{print $1 ". " $2}' "$temp_res_file"
|
awk '{print $1 ". " $2}' "$temp_res_file"
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
read -p "Enter the choice (or 'q' to quit): " resolution_choice
|
read -p "Enter the choice (or 'q' to quit): " resolution_choice
|
||||||
|
|
||||||
if [[ "$resolution_choice" == "q" ]]; then
|
if [ "$resolution_choice" = "q" ]; then
|
||||||
echo -e "${RED}Exiting...${RESET}"
|
printf "%b\n" "${RED}Exiting...${RC}"
|
||||||
rm "$temp_res_file"
|
rm "$temp_res_file"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! [[ "$resolution_choice" =~ ^[0-9]+$ ]] || (( resolution_choice < 1 )) || (( resolution_choice > ${#resolution_map[@]} )); then
|
if ! echo "$resolution_choice" | grep -qE '^[0-9]+$' || [ "$resolution_choice" -lt 1 ] || [ "$resolution_choice" -gt "$((i - 1))" ]; then
|
||||||
echo -e "${RED}Invalid selection. Please try again.${RESET}"
|
printf "%b\n" "${RED}Invalid selection. Please try again.${RC}"
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -76,16 +71,15 @@ set_resolutions() {
|
||||||
selected_resolution=${resolution_map[$resolution_choice]}
|
selected_resolution=${resolution_map[$resolution_choice]}
|
||||||
|
|
||||||
read -p "Set resolution for $monitor_name to $selected_resolution? (y/n): " confirm
|
read -p "Set resolution for $monitor_name to $selected_resolution? (y/n): " confirm
|
||||||
if [[ "$confirm" =~ ^[Yy]$ ]]; then
|
if echo "$confirm" | grep -qE '^[Yy]$'; then
|
||||||
echo -e "${GREEN}Setting resolution for $monitor_name to $selected_resolution${RESET}"
|
printf "%b\n" "${GREEN}Setting resolution for $monitor_name to $selected_resolution${RC}"
|
||||||
execute_command "xrandr --output $monitor_name --mode $selected_resolution"
|
execute_command "xrandr --output $monitor_name --mode $selected_resolution"
|
||||||
break
|
break
|
||||||
else
|
else
|
||||||
echo -e "${RED}Action canceled. Please choose a different resolution.${RESET}"
|
printf "%b\n" "${RED}Action canceled. Please choose a different resolution.${RC}"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# Clean up the temporary file
|
|
||||||
rm "$temp_res_file"
|
rm "$temp_res_file"
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
. ../../common-script.sh
|
. ../../common-script.sh
|
||||||
|
|
||||||
# Function to check bluetoothctl is installed
|
# Function to check xrandr is installed
|
||||||
setup_xrandr() {
|
setup_xrandr() {
|
||||||
echo "Install xrandr if not already installed..."
|
echo "Install xrandr if not already installed..."
|
||||||
if ! command_exists xrandr; then
|
if ! command_exists xrandr; then
|
||||||
|
@ -22,22 +22,9 @@ setup_xrandr() {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Function to display colored text
|
|
||||||
colored_echo() {
|
|
||||||
local color=$1
|
|
||||||
local text=$2
|
|
||||||
case $color in
|
|
||||||
red) echo -e "\033[31m$text\033[0m" ;;
|
|
||||||
green) echo -e "\033[32m$text\033[0m" ;;
|
|
||||||
yellow) echo -e "\033[33m$text\033[0m" ;;
|
|
||||||
blue) echo -e "\033[34m$text\033[0m" ;;
|
|
||||||
*) echo "$text" ;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function to execute xrandr commands and handle errors
|
# Function to execute xrandr commands and handle errors
|
||||||
execute_command() {
|
execute_command() {
|
||||||
local command="$1"
|
command="$1"
|
||||||
echo "Executing: $command"
|
echo "Executing: $command"
|
||||||
eval "$command" 2>&1 | tee /tmp/xrandr.log | tail -n 20
|
eval "$command" 2>&1 | tee /tmp/xrandr.log | tail -n 20
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
|
@ -51,9 +38,15 @@ detect_connected_monitors() {
|
||||||
echo "$xrandr_output" | grep " connected" | awk '{print $1}'
|
echo "$xrandr_output" | grep " connected" | awk '{print $1}'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Function to get the current brightness for a monitor
|
||||||
|
get_current_brightness() {
|
||||||
|
monitor="$1"
|
||||||
|
xrandr --verbose | grep -A 10 "^$monitor connected" | grep "Brightness:" | awk '{print $2}'
|
||||||
|
}
|
||||||
|
|
||||||
# Function to get resolutions for a monitor
|
# Function to get resolutions for a monitor
|
||||||
get_unique_resolutions() {
|
get_unique_resolutions() {
|
||||||
local monitor="$1"
|
monitor="$1"
|
||||||
xrandr_output=$(xrandr)
|
xrandr_output=$(xrandr)
|
||||||
# Get available resolutions from xrandr without line limit
|
# Get available resolutions from xrandr without line limit
|
||||||
available_resolutions=$(echo "$xrandr_output" | sed -n "/$monitor connected/,/^[^ ]/p" | grep -oP '\d+x\d+' | sort -u)
|
available_resolutions=$(echo "$xrandr_output" | sed -n "/$monitor connected/,/^[^ ]/p" | grep -oP '\d+x\d+' | sort -u)
|
||||||
|
@ -61,22 +54,35 @@ get_unique_resolutions() {
|
||||||
# Define standard resolutions
|
# Define standard resolutions
|
||||||
standard_resolutions="1920x1080 1280x720 1600x900 2560x1440 3840x2160"
|
standard_resolutions="1920x1080 1280x720 1600x900 2560x1440 3840x2160"
|
||||||
|
|
||||||
|
temp_file=$(mktemp)
|
||||||
|
echo "$available_resolutions" > "$temp_file"
|
||||||
|
|
||||||
# Filter standard resolutions to include only those available for the monitor
|
# Filter standard resolutions to include only those available for the monitor
|
||||||
filtered_standard_resolutions=$(echo "$standard_resolutions" | tr ' ' '\n' | grep -xF -f <(echo "$available_resolutions"))
|
filtered_standard_resolutions=$(echo "$standard_resolutions" | tr ' ' '\n' | grep -xF -f "$temp_file")
|
||||||
|
|
||||||
|
rm "$temp_file"
|
||||||
|
|
||||||
|
available_res_file=$(mktemp)
|
||||||
|
filtered_standard_res_file=$(mktemp)
|
||||||
|
echo "$available_resolutions" | sort > "$available_res_file"
|
||||||
|
echo "$filtered_standard_resolutions" | sort > "$filtered_standard_res_file"
|
||||||
|
|
||||||
# Get remaining available resolutions (excluding standard ones)
|
# Get remaining available resolutions (excluding standard ones)
|
||||||
remaining_resolutions=$(comm -23 <(echo "$available_resolutions" | sort) <(echo "$filtered_standard_resolutions" | sort))
|
remaining_resolutions=$(comm -23 "$available_res_file" "$filtered_standard_res_file")
|
||||||
|
|
||||||
|
rm "$available_res_file" "$filtered_standard_res_file"
|
||||||
|
|
||||||
# Combine filtered standard resolutions and remaining resolutions, and limit to 10 results
|
# Combine filtered standard resolutions and remaining resolutions, and limit to 10 results
|
||||||
echo -e "$filtered_standard_resolutions\n$remaining_resolutions" | head -n 10
|
printf "%b\n" "$filtered_standard_resolutions\n$remaining_resolutions" | head -n 10
|
||||||
}
|
}
|
||||||
|
|
||||||
# Function to prompt for confirmation
|
# Function to prompt for confirmation
|
||||||
confirm_action() {
|
confirm_action() {
|
||||||
local action="$1"
|
action="$1"
|
||||||
echo "$action"
|
printf "%b\n" "${CYAN}$action${RC}"
|
||||||
read -p "Are you sure? (y/n): " confirm
|
printf "%b" "${CYAN}Are you sure? (y/n): ${RC}"
|
||||||
if [[ "$confirm" =~ ^[Yy]$ ]]; then
|
read -r confirm
|
||||||
|
if echo "$confirm" | grep -qE '^[Yy]$'; then
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
return 1
|
return 1
|
||||||
|
|
209
tabs/utils/ollama.sh
Normal file
209
tabs/utils/ollama.sh
Normal file
|
@ -0,0 +1,209 @@
|
||||||
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
. ../common-script.sh
|
||||||
|
|
||||||
|
installollama() {
|
||||||
|
clear
|
||||||
|
printf "%b\n" "${YELLOW}Checking if ollama is already installed...${RC}"
|
||||||
|
|
||||||
|
# Check if ollama is already installed
|
||||||
|
if command_exists ollama; then
|
||||||
|
printf "%b\n" "${GREEN}ollama is already installed.${RC}"
|
||||||
|
else
|
||||||
|
printf "%b\n" "${YELLOW}Installing ollama...${RC}"
|
||||||
|
curl -fsSL https://ollama.com/install.sh | sh
|
||||||
|
$ESCALATION_TOOL systemctl start ollama
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
list_models() {
|
||||||
|
clear
|
||||||
|
printf "%b\n" "${YELLOW}Listing all models available on your system...${RC}"
|
||||||
|
ollama list
|
||||||
|
}
|
||||||
|
|
||||||
|
show_model_info() {
|
||||||
|
clear
|
||||||
|
list_models
|
||||||
|
printf "%b\n" "${YELLOW}Enter the name of the model you want to show information for (e.g., llama3.1):${RC}"
|
||||||
|
read -r model_name
|
||||||
|
|
||||||
|
printf "%b\n" "${YELLOW}Showing information for model '$model_name'...${RC}"
|
||||||
|
ollama show "$model_name"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to display available models
|
||||||
|
display_models() {
|
||||||
|
clear
|
||||||
|
printf "%b\n" "${RED}Available Models${RC}"
|
||||||
|
printf "1. Llama 3.1 - 8B (4.7GB)\n"
|
||||||
|
printf "2. Llama 3.1 - 70B (40GB)\n"
|
||||||
|
printf "3. Llama 3.1 - 405B (231GB)\n"
|
||||||
|
printf "4. Phi 3 Mini - 3.8B (2.3GB)\n"
|
||||||
|
printf "5. Phi 3 Medium - 14B (7.9GB)\n"
|
||||||
|
printf "6. Gemma 2 - 2B (1.6GB)\n"
|
||||||
|
printf "7. Gemma 2 - 9B (5.5GB)\n"
|
||||||
|
printf "8. Gemma 2 - 27B (16GB)\n"
|
||||||
|
printf "9. Mistral - 7B (4.1GB)\n"
|
||||||
|
printf "10. Moondream 2 - 1.4B (829MB)\n"
|
||||||
|
printf "11. Neural Chat - 7B (4.1GB)\n"
|
||||||
|
printf "12. Starling - 7B (4.1GB)\n"
|
||||||
|
printf "13. Code Llama - 7B (3.8GB)\n"
|
||||||
|
printf "14. Llama 2 Uncensored - 7B (3.8GB)\n"
|
||||||
|
printf "15. LLaVA - 7B (4.5GB)\n"
|
||||||
|
printf "16. Solar - 10.7B (6.1GB)\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to select model based on user input
|
||||||
|
select_model() {
|
||||||
|
local choice="$1"
|
||||||
|
case $choice in
|
||||||
|
1) echo "llama3.1";;
|
||||||
|
2) echo "llama3.1:70b";;
|
||||||
|
3) echo "llama3.1:405b";;
|
||||||
|
4) echo "phi3";;
|
||||||
|
5) echo "phi3:medium";;
|
||||||
|
6) echo "gemma2:2b";;
|
||||||
|
7) echo "gemma2";;
|
||||||
|
8) echo "gemma2:27b";;
|
||||||
|
9) echo "mistral";;
|
||||||
|
10) echo "moondream";;
|
||||||
|
11) echo "neural-chat";;
|
||||||
|
12) echo "starling-lm";;
|
||||||
|
13) echo "codellama";;
|
||||||
|
14) echo "llama2-uncensored";;
|
||||||
|
15) echo "llava";;
|
||||||
|
16) echo "solar";;
|
||||||
|
*) echo "$choice";; # Treat any other input as a custom model name
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
run_model() {
|
||||||
|
clear
|
||||||
|
display_models
|
||||||
|
|
||||||
|
printf "%b\n" "${GREEN}Installed Models${RC}"
|
||||||
|
installed_models=$(ollama list)
|
||||||
|
printf "%b\n" "${installed_models}"
|
||||||
|
|
||||||
|
printf "%b\n" "${YELLOW}Custom Models${RC}"
|
||||||
|
custom_models=$(ollama list | grep 'custom-model-prefix')
|
||||||
|
|
||||||
|
printf "%b\n" "${YELLOW}Please select a model to run:${RC}"
|
||||||
|
printf "%b\n" "${YELLOW}Enter the number corresponding to the model or enter the name of a custom model:${RC}"
|
||||||
|
|
||||||
|
read -r model_choice
|
||||||
|
|
||||||
|
model=$(select_model "$model_choice")
|
||||||
|
|
||||||
|
printf "%b\n" "${YELLOW}Running the model: $model...${RC}"
|
||||||
|
ollama run "$model"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
create_model() {
|
||||||
|
clear
|
||||||
|
printf "%b\n" "${YELLOW}Let's create a new model in Ollama!${RC}"
|
||||||
|
display_models
|
||||||
|
|
||||||
|
# Prompt for base model
|
||||||
|
printf "%b\n" "${YELLOW}Enter the base model (e.g. '13' for codellama):${RC}"
|
||||||
|
read -r base_model
|
||||||
|
|
||||||
|
model=$(select_model "$base_model")
|
||||||
|
|
||||||
|
printf "%b\n" "${YELLOW}Running the model: $model...${RC}"
|
||||||
|
ollama pull "$model"
|
||||||
|
|
||||||
|
# Prompt for custom model name
|
||||||
|
printf "%b\n" "${YELLOW}Enter a name for the new customized model:${RC}"
|
||||||
|
read -r custom_model_name
|
||||||
|
|
||||||
|
# Prompt for temperature setting
|
||||||
|
printf "%b\n" "${YELLOW}Enter the desired temperature (higher values are more creative, lower values are more coherent, e.g., 1):${RC}"
|
||||||
|
read -r temperature
|
||||||
|
|
||||||
|
if [ -z "$temperature" ]; then
|
||||||
|
temperature=${temperature:-1}
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Prompt for system message
|
||||||
|
printf "%b\n" "${YELLOW}Enter the system message for the model customization (e.g., 'You are Mario from Super Mario Bros. Answer as Mario, the assistant, only.'):${RC}"
|
||||||
|
read -r system_message
|
||||||
|
|
||||||
|
# Create the Modelfile
|
||||||
|
printf "%b\n" "${YELLOW}Creating the Modelfile...${RC}"
|
||||||
|
cat << EOF > Modelfile
|
||||||
|
FROM $base_model
|
||||||
|
|
||||||
|
# set the temperature to $temperature
|
||||||
|
PARAMETER temperature $temperature
|
||||||
|
|
||||||
|
# set the system message
|
||||||
|
SYSTEM """
|
||||||
|
$system_message
|
||||||
|
"""
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Create the model in Ollama
|
||||||
|
printf "%b\n" "${YELLOW}Creating the model in Ollama...${RC}"
|
||||||
|
ollama create "$custom_model_name" -f Modelfile
|
||||||
|
printf "%b\n" "${GREEN}Model '$custom_model_name' created successfully.${RC}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to remove a model
|
||||||
|
remove_model() {
|
||||||
|
clear
|
||||||
|
printf "%b\n" "${GREEN}Installed Models${RC}"
|
||||||
|
installed_models=$(ollama list)
|
||||||
|
printf "%b\n" "${installed_models}"
|
||||||
|
|
||||||
|
printf "%b\n" "${YELLOW}Please select a model to remove:${RC}"
|
||||||
|
printf "%b\n" "${YELLOW}Enter the name of the model you want to remove:${RC}"
|
||||||
|
|
||||||
|
read -r model_to_remove
|
||||||
|
|
||||||
|
if echo "$installed_models" | grep -q "$model_to_remove"; then
|
||||||
|
printf "%b\n" "${YELLOW}Removing the model: $model_to_remove...${RC}"
|
||||||
|
ollama rm "$model_to_remove"
|
||||||
|
printf "%b\n" "${GREEN}Model '$model_to_remove' has been removed.${RC}"
|
||||||
|
else
|
||||||
|
printf "%b\n" "${RED}Model '$model_to_remove' is not installed. Exiting.${RC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
menu() {
|
||||||
|
while true; do
|
||||||
|
clear
|
||||||
|
printf "%b\n" "${YELLOW}Please select an option:${RC}"
|
||||||
|
printf "1) List all models\n"
|
||||||
|
printf "2) Show model information\n"
|
||||||
|
printf "3) Create a new model\n"
|
||||||
|
printf "4) Run a model\n"
|
||||||
|
printf "5) Remove a model\n"
|
||||||
|
printf "6) Exit\n"
|
||||||
|
|
||||||
|
printf "%b" "${YELLOW}Enter your choice (1-5): ${RC}"
|
||||||
|
read -r choice
|
||||||
|
|
||||||
|
case $choice in
|
||||||
|
1) list_models ;;
|
||||||
|
2) show_model_info ;;
|
||||||
|
3) create_model ;;
|
||||||
|
4) run_model ;;
|
||||||
|
5) remove_model;;
|
||||||
|
6) printf "%b\n" "${GREEN}Exiting...${RC}"; exit 0 ;;
|
||||||
|
*) printf "%b\n" "${RED}Invalid choice. Please try again.${RC}" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
printf "%b\n" "${YELLOW}Press Enter to continue...${RC}"
|
||||||
|
read -r dummy
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
checkEnv
|
||||||
|
checkEscalationTool
|
||||||
|
installollama
|
||||||
|
menu
|
||||||
|
|
100
tabs/utils/power-profile.sh
Normal file
100
tabs/utils/power-profile.sh
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
. ../common-script.sh
|
||||||
|
|
||||||
|
installAutoCpufreq() {
|
||||||
|
clear
|
||||||
|
printf "%b\n" "${YELLOW}Checking if auto-cpufreq is already installed...${RC}"
|
||||||
|
|
||||||
|
# Check if auto-cpufreq is already installed
|
||||||
|
if command_exists auto-cpufreq; then
|
||||||
|
printf "%b\n" "${GREEN}auto-cpufreq is already installed.${RC}"
|
||||||
|
else
|
||||||
|
printf "%b\n" "${YELLOW}Installing auto-cpufreq...${RC}"
|
||||||
|
|
||||||
|
# Install git if not already installed
|
||||||
|
if ! command_exists git; then
|
||||||
|
printf "%b\n" "${YELLOW}git not found. Installing git...${RC}"
|
||||||
|
case ${PACKAGER} in
|
||||||
|
pacman)
|
||||||
|
$ESCALATION_TOOL ${PACKAGER} -S --needed --noconfirm git
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
$ESCALATION_TOOL ${PACKAGER} install -y git
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Clone the auto-cpufreq repository and run the installer
|
||||||
|
if [ ! -d "auto-cpufreq" ]; then
|
||||||
|
printf "%b\n" "${YELLOW}Cloning auto-cpufreq repository...${RC}"
|
||||||
|
git clone https://github.com/AdnanHodzic/auto-cpufreq.git
|
||||||
|
fi
|
||||||
|
|
||||||
|
case ${PACKAGER} in
|
||||||
|
*)
|
||||||
|
cd auto-cpufreq
|
||||||
|
printf "%b\n" "${YELLOW}Running auto-cpufreq installer...${RC}"
|
||||||
|
$ESCALATION_TOOL ./auto-cpufreq-installer
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
cd ..
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
configureAutoCpufreq() {
|
||||||
|
printf "%b\n" "${YELLOW}Configuring auto-cpufreq...${RC}"
|
||||||
|
|
||||||
|
if command_exists auto-cpufreq; then
|
||||||
|
# Check if the system has a battery to determine if it's a laptop
|
||||||
|
if [ -d /sys/class/power_supply/BAT0 ]; then
|
||||||
|
printf "%b\n" "${GREEN}System detected as laptop. Updating auto-cpufreq for laptop...${RC}"
|
||||||
|
$ESCALATION_TOOL auto-cpufreq --force powersave
|
||||||
|
else
|
||||||
|
printf "%b\n" "${GREEN}System detected as desktop. Updating auto-cpufreq for desktop...${RC}"
|
||||||
|
$ESCALATION_TOOL auto-cpufreq --force performance
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printf "%b\n" "${RED}auto-cpufreq is not installed, skipping configuration.${RC}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
removeAutoCpufreqTweak() {
|
||||||
|
printf "%b\n" "${YELLOW}Removing auto-cpufreq tweak...${RC}"
|
||||||
|
|
||||||
|
if command_exists auto-cpufreq; then
|
||||||
|
printf "%b\n" "${YELLOW}Resetting auto-cpufreq configuration...${RC}"
|
||||||
|
$ESCALATION_TOOL auto-cpufreq --force reset
|
||||||
|
else
|
||||||
|
printf "%b\n" "${RED}auto-cpufreq is not installed, skipping removal.${RC}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
apply_or_remove_auto_cpufreq() {
|
||||||
|
# Prompt user for action
|
||||||
|
printf "%b\n" "${YELLOW}Do you want to apply the auto-cpufreq tweak or remove it?${RC}"
|
||||||
|
printf "%b\n" "${YELLOW}1) Apply tweak${RC}"
|
||||||
|
printf "%b\n" "${YELLOW}2) Remove tweak${RC}"
|
||||||
|
printf "%b" "Enter your choice [1/2]: "
|
||||||
|
read -r choice
|
||||||
|
|
||||||
|
case $choice in
|
||||||
|
1)
|
||||||
|
configureAutoCpufreq
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
removeAutoCpufreqTweak
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
printf "%b\n" "${RED}Invalid choice. Exiting.${RC}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
printf "%b\n" "${GREEN}auto-cpufreq setup complete.${RC}"
|
||||||
|
}
|
||||||
|
|
||||||
|
checkEnv
|
||||||
|
checkEscalationTool
|
||||||
|
installAutoCpufreq
|
||||||
|
apply_or_remove_auto_cpufreq
|
278
tabs/utils/service-control.sh
Normal file
278
tabs/utils/service-control.sh
Normal file
|
@ -0,0 +1,278 @@
|
||||||
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
# Load common script functions
|
||||||
|
. ../common-script.sh
|
||||||
|
|
||||||
|
#external services directory
|
||||||
|
SCRIPT_DIR="./services"
|
||||||
|
|
||||||
|
# Function to show the main menu
|
||||||
|
show_menu() {
|
||||||
|
clear
|
||||||
|
echo "============================"
|
||||||
|
echo " Service Management Menu"
|
||||||
|
echo "============================"
|
||||||
|
echo "1. View all services"
|
||||||
|
echo "2. View enabled services"
|
||||||
|
echo "3. View disabled services"
|
||||||
|
echo "4. Add a new service"
|
||||||
|
echo "5. Remove a service"
|
||||||
|
echo "6. Start a service"
|
||||||
|
echo "7. Stop a service"
|
||||||
|
echo "8. Enable a service"
|
||||||
|
echo "9. Disable a service"
|
||||||
|
echo "10. Create a service from external scripts"
|
||||||
|
echo "11. Exit"
|
||||||
|
echo "============================"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to view all services
|
||||||
|
view_all_services() {
|
||||||
|
echo "Listing all services..."
|
||||||
|
$ESCALATION_TOOL systemctl list-units --type=service --all --no-legend | awk '{print $1}' | sed 's/\.service//' | more
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to view enabled services
|
||||||
|
view_enabled_services() {
|
||||||
|
echo "Listing enabled services..."
|
||||||
|
$ESCALATION_TOOL systemctl list-unit-files --type=service --state=enabled --no-legend | awk '{print $1}' | sed 's/\.service//' | more
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to view disabled services
|
||||||
|
view_disabled_services() {
|
||||||
|
echo "Listing disabled services..."
|
||||||
|
$ESCALATION_TOOL systemctl list-unit-files --type=service --state=disabled --no-legend | awk '{print $1}' | sed 's/\.service//' | more
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to view started services
|
||||||
|
view_started_services() {
|
||||||
|
echo "Listing started services:"
|
||||||
|
$ESCALATION_TOOL systemctl list-units --type=service --state=running --no-pager | head -n -6 | awk 'NR>1 {print $1}' | more
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to add a new service
|
||||||
|
add_service() {
|
||||||
|
while [ -z "$SERVICE_NAME" ]; do
|
||||||
|
echo "Enter the name of the new service (e.g., my_service):"
|
||||||
|
read -r SERVICE_NAME
|
||||||
|
|
||||||
|
if $ESCALATION_TOOL systemctl list-units --type=service --all --no-legend | grep -q "$SERVICE_NAME.service"; then
|
||||||
|
echo "Service already exists!"
|
||||||
|
SERVICE_NAME=""
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Enter the description of the service:"
|
||||||
|
read -r SERVICE_DESCRIPTION
|
||||||
|
|
||||||
|
echo "Enter the command to execute the service (e.g., /usr/local/bin/my_service.sh):"
|
||||||
|
read -r EXEC_START
|
||||||
|
|
||||||
|
echo "Enter the user to run the service as (leave empty for default):"
|
||||||
|
read -r SERVICE_USER
|
||||||
|
|
||||||
|
echo "Enter the working directory for the service (leave empty for default):"
|
||||||
|
read -r WORKING_DIRECTORY
|
||||||
|
|
||||||
|
echo "Enter the restart policy (e.g., always, on-failure; leave empty for no restart):"
|
||||||
|
read -r RESTART_POLICY
|
||||||
|
|
||||||
|
# Create the service unit file
|
||||||
|
SERVICE_FILE="/etc/systemd/system/$SERVICE_NAME.service"
|
||||||
|
|
||||||
|
# Create the service file with conditionals for optional fields
|
||||||
|
{
|
||||||
|
echo "[Unit]"
|
||||||
|
echo "Description=$SERVICE_DESCRIPTION"
|
||||||
|
echo ""
|
||||||
|
echo "[Service]"
|
||||||
|
echo "ExecStart=$EXEC_START"
|
||||||
|
[ -n "$SERVICE_USER" ] && echo "User=$SERVICE_USER"
|
||||||
|
[ -n "$WORKING_DIRECTORY" ] && echo "WorkingDirectory=$WORKING_DIRECTORY"
|
||||||
|
[ -n "$RESTART_POLICY" ] && echo "Restart=$RESTART_POLICY"
|
||||||
|
echo ""
|
||||||
|
echo "[Install]"
|
||||||
|
echo "WantedBy=multi-user.target"
|
||||||
|
} | $ESCALATION_TOOL tee "$SERVICE_FILE" > /dev/null
|
||||||
|
|
||||||
|
# Set permissions and reload systemd
|
||||||
|
$ESCALATION_TOOL chmod 644 "$SERVICE_FILE"
|
||||||
|
$ESCALATION_TOOL systemctl daemon-reload
|
||||||
|
echo "Service $SERVICE_NAME has been created and is ready to be started."
|
||||||
|
|
||||||
|
# Optionally, enable and start the service
|
||||||
|
echo "Do you want to start and enable the service now? (y/n)"
|
||||||
|
read -r START_ENABLE
|
||||||
|
|
||||||
|
if [ "$START_ENABLE" = "y" ]; then
|
||||||
|
$ESCALATION_TOOL systemctl start "$SERVICE_NAME"
|
||||||
|
$ESCALATION_TOOL systemctl enable "$SERVICE_NAME"
|
||||||
|
echo "Service $SERVICE_NAME has been started and enabled."
|
||||||
|
else
|
||||||
|
echo "Service $SERVICE_NAME has been created but not started."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to remove a service
|
||||||
|
remove_service() {
|
||||||
|
echo "Enter the name of the service to remove (e.g., my_service):"
|
||||||
|
read -r SERVICE_NAME
|
||||||
|
|
||||||
|
SERVICE_FILE="/etc/systemd/system/$SERVICE_NAME.service"
|
||||||
|
|
||||||
|
if [ -f "$SERVICE_FILE" ]; then
|
||||||
|
echo "Stopping and disabling the service..."
|
||||||
|
$ESCALATION_TOOL systemctl stop "$SERVICE_NAME"
|
||||||
|
$ESCALATION_TOOL systemctl disable "$SERVICE_NAME"
|
||||||
|
|
||||||
|
echo "Removing the service file..."
|
||||||
|
$ESCALATION_TOOL rm -f "$SERVICE_FILE"
|
||||||
|
$ESCALATION_TOOL systemctl daemon-reload
|
||||||
|
|
||||||
|
echo "Service $SERVICE_NAME has been removed."
|
||||||
|
else
|
||||||
|
echo "Service $SERVICE_NAME does not exist."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to start a service
|
||||||
|
start_service() {
|
||||||
|
view_disabled_services
|
||||||
|
echo "Enter the name of the service to start (e.g., my_service):"
|
||||||
|
read -r SERVICE_NAME
|
||||||
|
|
||||||
|
if $ESCALATION_TOOL systemctl start "$SERVICE_NAME"; then
|
||||||
|
echo "Service $SERVICE_NAME has been started."
|
||||||
|
else
|
||||||
|
echo "Failed to start service: $SERVICE_NAME."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to stop a service
|
||||||
|
stop_service() {
|
||||||
|
view_started_services
|
||||||
|
echo "Enter the name of the service to stop (e.g., my_service):"
|
||||||
|
read -r SERVICE_NAME
|
||||||
|
|
||||||
|
if $ESCALATION_TOOL systemctl stop "$SERVICE_NAME"; then
|
||||||
|
echo "Service $SERVICE_NAME has been stopped."
|
||||||
|
else
|
||||||
|
echo "Failed to stop service: $SERVICE_NAME."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to enable a service
|
||||||
|
enable_service() {
|
||||||
|
view_disabled_services
|
||||||
|
echo "Enter the name of the service to enable (e.g., my_service):"
|
||||||
|
read -r SERVICE_NAME
|
||||||
|
|
||||||
|
if $ESCALATION_TOOL systemctl enable "$SERVICE_NAME"; then
|
||||||
|
echo "Service $SERVICE_NAME has been enabled."
|
||||||
|
else
|
||||||
|
echo "Failed to enable service: $SERVICE_NAME."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to enable a service
|
||||||
|
disable_service() {
|
||||||
|
view_enabled_services
|
||||||
|
echo "Enter the name of the service to disable (e.g., my_service):"
|
||||||
|
read -r SERVICE_NAME
|
||||||
|
|
||||||
|
if $ESCALATION_TOOL systemctl disable "$SERVICE_NAME"; then
|
||||||
|
echo "Service $SERVICE_NAME has been enabled."
|
||||||
|
else
|
||||||
|
echo "Failed to enable service: $SERVICE_NAME."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to create, start, and enable a service from an external service file
|
||||||
|
create_service_from_external() {
|
||||||
|
|
||||||
|
# List all .service files in the SCRIPT_DIR
|
||||||
|
echo "============================"
|
||||||
|
echo "Listing available service files"
|
||||||
|
echo "============================"
|
||||||
|
for FILE in "$SCRIPT_DIR"/*.service; do
|
||||||
|
echo "$(basename "$FILE")"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Enter the filename (without the .service extension) of the service to create:"
|
||||||
|
read -r SERVICE_NAME
|
||||||
|
|
||||||
|
SERVICE_FILE="$SCRIPT_DIR/$SERVICE_NAME.service"
|
||||||
|
|
||||||
|
if [ ! -f "$SERVICE_FILE" ]; then
|
||||||
|
echo "Service file $SERVICE_FILE does not exist."
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Enter the username to run the service as (leave empty for no specific user):"
|
||||||
|
read -r SERVICE_USER
|
||||||
|
|
||||||
|
# Create the systemd service file path
|
||||||
|
SYSTEMD_SERVICE_FILE="/etc/systemd/system/$SERVICE_NAME.service"
|
||||||
|
|
||||||
|
# Add or update the User= line in the service file
|
||||||
|
if [ -n "$SERVICE_USER" ]; then
|
||||||
|
# Check if User= exists and append username if needed
|
||||||
|
if grep -q '^User=' "$SERVICE_FILE"; then
|
||||||
|
# Update the existing User= line with the new username
|
||||||
|
sed -i "s/^User=.*/User=$SERVICE_USER/" "$SERVICE_FILE"
|
||||||
|
else
|
||||||
|
# Add the User= line if it doesn't exist
|
||||||
|
sed -i '/^\[Service\]/a User='"$SERVICE_USER" "$SERVICE_FILE"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Copy the modified service file to /etc/systemd/system/
|
||||||
|
$ESCALATION_TOOL cp "$SERVICE_FILE" "$SYSTEMD_SERVICE_FILE"
|
||||||
|
|
||||||
|
# Set permissions and reload systemd
|
||||||
|
$ESCALATION_TOOL chmod 644 "$SYSTEMD_SERVICE_FILE"
|
||||||
|
$ESCALATION_TOOL systemctl daemon-reload
|
||||||
|
echo "Service $SERVICE_NAME has been created and is ready to be started."
|
||||||
|
|
||||||
|
# Optionally, enable and start the service
|
||||||
|
echo "Do you want to start and enable the service now? (y/n)"
|
||||||
|
read -r START_ENABLE
|
||||||
|
|
||||||
|
if [ "$START_ENABLE" = "y" ]; then
|
||||||
|
$ESCALATION_TOOL systemctl start "$SERVICE_NAME"
|
||||||
|
$ESCALATION_TOOL systemctl enable "$SERVICE_NAME"
|
||||||
|
echo "Service $SERVICE_NAME has been started and enabled."
|
||||||
|
else
|
||||||
|
echo "Service $SERVICE_NAME has been created but not started."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
while true; do
|
||||||
|
show_menu
|
||||||
|
echo "Enter your choice:"
|
||||||
|
read -r CHOICE
|
||||||
|
|
||||||
|
case $CHOICE in
|
||||||
|
1) view_all_services ;;
|
||||||
|
2) view_enabled_services ;;
|
||||||
|
3) view_disabled_services ;;
|
||||||
|
4) add_service ;;
|
||||||
|
5) remove_service ;;
|
||||||
|
6) start_service ;;
|
||||||
|
7) stop_service ;;
|
||||||
|
8) enable_service ;;
|
||||||
|
9) disable_service ;;
|
||||||
|
10) create_service_from_external ;;
|
||||||
|
11) echo "Exiting..."; exit 0 ;;
|
||||||
|
*) echo "Invalid choice. Please try again." ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo "Press [Enter] to continue..."
|
||||||
|
read -r dummy
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
checkEnv
|
||||||
|
checkEscalationTool
|
||||||
|
main
|
14
tabs/utils/services/i3lock-on-lid-close.service
Normal file
14
tabs/utils/services/i3lock-on-lid-close.service
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
/etc/systemd/system/
|
||||||
|
|
||||||
|
[Unit]
|
||||||
|
Description=i3lock on Lid Close
|
||||||
|
Before=sleep.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
User=
|
||||||
|
Type=forking
|
||||||
|
Environment=DISPLAY=:0
|
||||||
|
ExecStart=/usr/bin/i3lock
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=sleep.target
|
|
@ -12,6 +12,30 @@ script = "bluetooth-control.sh"
|
||||||
name = "Numlock on Startup"
|
name = "Numlock on Startup"
|
||||||
script = "numlock.sh"
|
script = "numlock.sh"
|
||||||
|
|
||||||
|
[[data]]
|
||||||
|
name = "Ollama"
|
||||||
|
script = "ollama.sh"
|
||||||
|
|
||||||
|
[[data]]
|
||||||
|
name = "Service Manager"
|
||||||
|
script = "service-control.sh"
|
||||||
|
|
||||||
|
[[data]]
|
||||||
|
name = "Auto Login"
|
||||||
|
script = "auto-login.sh"
|
||||||
|
|
||||||
|
[[data]]
|
||||||
|
name = "Bootable USB Creator"
|
||||||
|
script = "create-bootable-usb.sh"
|
||||||
|
|
||||||
|
[[data]]
|
||||||
|
name = "Auto Power Profiling"
|
||||||
|
script = "power-profile.sh"
|
||||||
|
|
||||||
|
[[data]]
|
||||||
|
name = "Timeshift Backup"
|
||||||
|
script = "timeshift.sh"
|
||||||
|
|
||||||
[[data]]
|
[[data]]
|
||||||
name = "Monitor Control"
|
name = "Monitor Control"
|
||||||
|
|
||||||
|
@ -65,3 +89,8 @@ script = "monitor-control/scale_monitor.sh"
|
||||||
name = "Reset Scaling"
|
name = "Reset Scaling"
|
||||||
script = "monitor-control/reset_scaling.sh"
|
script = "monitor-control/reset_scaling.sh"
|
||||||
matches = true
|
matches = true
|
||||||
|
|
||||||
|
[[data.entries]]
|
||||||
|
name = "Set Brightness"
|
||||||
|
script = "monitor-control/set_brightness.sh"
|
||||||
|
matches = true
|
162
tabs/utils/timeshift.sh
Normal file
162
tabs/utils/timeshift.sh
Normal file
|
@ -0,0 +1,162 @@
|
||||||
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
. ../common-script.sh
|
||||||
|
|
||||||
|
# Function to install Timeshift
|
||||||
|
install_timeshift() {
|
||||||
|
clear
|
||||||
|
printf "%b\n" "${YELLOW}Checking if Timeshift is installed...${RC}"
|
||||||
|
|
||||||
|
if ! command_exists timeshift; then
|
||||||
|
case ${PACKAGER} in
|
||||||
|
pacman)
|
||||||
|
$ESCALATION_TOOL "${PACKAGER}" -S --noconfirm timeshift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
$ESCALATION_TOOL "${PACKAGER}" install -y timeshift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
echo "Timeshift is already installed."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to display the menu
|
||||||
|
display_menu() {
|
||||||
|
clear
|
||||||
|
printf "%b\n" "${CYAN}Timeshift CLI Automation${RC}"
|
||||||
|
printf "%b\n" "${CYAN}\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-"
|
||||||
|
printf "%b\n" "${CYAN}1) List Snapshots${RC}"
|
||||||
|
printf "%b\n" "${CYAN}2) List Devices${RC}"
|
||||||
|
printf "%b\n" "${CYAN}3) Create Snapshot${RC}"
|
||||||
|
printf "%b\n" "${CYAN}4) Restore Snapshot${RC}"
|
||||||
|
printf "%b\n" "${CYAN}5) Delete Snapshot${RC}"
|
||||||
|
printf "%b\n" "${CYAN}6) Delete All Snapshots${RC}"
|
||||||
|
printf "%b\n" "${CYAN}7) Exit${RC}"
|
||||||
|
printf "%b\n" "${CYAN}\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to list snapshots
|
||||||
|
list_snapshots() {
|
||||||
|
printf "%b\n" "${CYAN}Listing snapshots...${RC}"
|
||||||
|
$ESCALATION_TOOL timeshift --list-snapshots
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to list devices
|
||||||
|
list_devices() {
|
||||||
|
printf "%b\n" "${CYAN}Listing available devices...${RC}"
|
||||||
|
$ESCALATION_TOOL timeshift --list-devices
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to create a new snapshot
|
||||||
|
create_snapshot() {
|
||||||
|
printf "%b" "${CYAN}Enter a comment for the snapshot (optional): ${RC}"
|
||||||
|
read -r COMMENT
|
||||||
|
printf "%b" "${CYAN}Enter snapshot tag (O,B,H,D,W,M) (leave empty for no tag): ${RC}"
|
||||||
|
read -r TAG
|
||||||
|
|
||||||
|
if [ -z "$COMMENT" ] && [ -z "$TAG" ]; then
|
||||||
|
echo "Creating snapshot with no comment or tag..."
|
||||||
|
$ESCALATION_TOOL timeshift --create
|
||||||
|
elif [ -z "$TAG" ]; then
|
||||||
|
echo "Creating snapshot with no tag..."
|
||||||
|
$ESCALATION_TOOL timeshift --create --comments "$COMMENT"
|
||||||
|
else
|
||||||
|
echo "Creating snapshot with tag: $TAG..."
|
||||||
|
$ESCALATION_TOOL timeshift --create --comments "$COMMENT" --tags "$TAG"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "Snapshot created successfully."
|
||||||
|
else
|
||||||
|
echo "Snapshot creation failed."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to restore a snapshot
|
||||||
|
restore_snapshot() {
|
||||||
|
list_snapshots
|
||||||
|
|
||||||
|
printf "%b" "${CYAN}Enter the snapshot name you want to restore: ${RC}"
|
||||||
|
read -r SNAPSHOT
|
||||||
|
printf "%b" "${CYAN}Enter the target device (e.g., /dev/sda1): ${RC}"
|
||||||
|
read -r TARGET_DEVICE
|
||||||
|
printf "%b" "${CYAN}Do you want to skip GRUB reinstall? (yes/no): ${RC}"
|
||||||
|
read -r SKIP_GRUB
|
||||||
|
|
||||||
|
if [ "$SKIP_GRUB" = "yes" ]; then
|
||||||
|
$ESCALATION_TOOL timeshift --restore --snapshot "$SNAPSHOT" --target-device "$TARGET_DEVICE" --skip-grub --yes
|
||||||
|
else
|
||||||
|
printf "%b" "${CYAN}Enter GRUB device (e.g., /dev/sda): ${RC}"
|
||||||
|
read -r GRUB_DEVICE
|
||||||
|
$ESCALATION_TOOL timeshift --restore --snapshot "$SNAPSHOT" --target-device "$TARGET_DEVICE" --grub-device "$GRUB_DEVICE" --yes
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
printf "%b\n" "${GREEN}Snapshot restored successfully.${RC}"
|
||||||
|
else
|
||||||
|
printf "%b\n" "${RED}Snapshot restore failed.${RC}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to delete a snapshot
|
||||||
|
delete_snapshot() {
|
||||||
|
list_snapshots
|
||||||
|
|
||||||
|
printf "%b" "${CYAN}Enter the snapshot name you want to delete: ${RC}"
|
||||||
|
read -r SNAPSHOT
|
||||||
|
|
||||||
|
printf "%b\n" "${YELLOW}Deleting snapshot $SNAPSHOT...${RC}"
|
||||||
|
$ESCALATION_TOOL timeshift --delete --snapshot "$SNAPSHOT" --yes
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
printf "%b\n" "${GREEN}Snapshot deleted successfully.${RC}"
|
||||||
|
else
|
||||||
|
printf "%b\n" "${RED}Snapshot deletion failed.${RC}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to delete all snapshots
|
||||||
|
delete_all_snapshots() {
|
||||||
|
printf "%b\n" "${RED}WARNING: This will delete all snapshots!${RC}"
|
||||||
|
printf "%b" "${CYAN}Are you sure? (yes/no): ${RC}"
|
||||||
|
read -r CONFIRMATION
|
||||||
|
|
||||||
|
if [ "$CONFIRMATION" = "yes" ]; then
|
||||||
|
echo "Deleting all snapshots..."
|
||||||
|
$ESCALATION_TOOL timeshift --delete-all --yes
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
printf "%b\n" "${GREEN}All snapshots deleted successfully.${RC}"
|
||||||
|
else
|
||||||
|
printf "%b\n" "${RED}Failed to delete snapshots.${RC}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printf "%b\n" "${RED}Operation cancelled.${RC}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
main_menu() {
|
||||||
|
while true; do
|
||||||
|
display_menu
|
||||||
|
printf "%b" "${CYAN}Select an option (1-7): ${RC}"
|
||||||
|
read -r OPTION
|
||||||
|
|
||||||
|
case $OPTION in
|
||||||
|
1) list_snapshots ;;
|
||||||
|
2) list_devices ;;
|
||||||
|
3) create_snapshot ;;
|
||||||
|
4) restore_snapshot ;;
|
||||||
|
5) delete_snapshot ;;
|
||||||
|
6) delete_all_snapshots ;;
|
||||||
|
7) printf "%b\n" "${GREEN}Exiting...${RC}"; exit 0 ;;
|
||||||
|
*) printf "%b\n" "${RED}Invalid option. Please try again.${RC}" ;;
|
||||||
|
esac
|
||||||
|
printf "%b" "${CYAN}Press Enter to continue...${RC}"
|
||||||
|
read -r dummy
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
checkEnv
|
||||||
|
checkEscalationTool
|
||||||
|
install_timeshift
|
||||||
|
main_menu
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
# Function to check if NetworkManager is installed
|
# Function to check if NetworkManager is installed
|
||||||
setupNetworkManager() {
|
setupNetworkManager() {
|
||||||
echo "Install NetworkManger if not already installed..."
|
printf "%b\n" "${YELLOW}Installing NetworkManager...${RC}"
|
||||||
if ! command_exists nmcli; then
|
if ! command_exists nmcli; then
|
||||||
case ${PACKAGER} in
|
case ${PACKAGER} in
|
||||||
pacman)
|
pacman)
|
||||||
|
@ -18,39 +18,26 @@ setupNetworkManager() {
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
else
|
else
|
||||||
echo "NetworkManager is already installed."
|
printf "%b\n" "${YELLOW}NetworkManager is already installed.${RC}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Check if NetworkManager service is running
|
# Check if NetworkManager service is running
|
||||||
if ! systemctl is-active --quiet NetworkManager; then
|
if ! systemctl is-active --quiet NetworkManager; then
|
||||||
echo "NetworkManager service is not running. Starting it now..."
|
printf "%b\n" "${YELLOW}NetworkManager service is not running. Starting it now...${RC}"
|
||||||
$ESCALATION_TOOL systemctl start NetworkManager
|
$ESCALATION_TOOL systemctl start NetworkManager
|
||||||
|
|
||||||
if systemctl is-active --quiet NetworkManager; then
|
if systemctl is-active --quiet NetworkManager; then
|
||||||
echo "NetworkManager service started successfully."
|
printf "%b\n" "${GREEN}NetworkManager service started successfully.${RC}"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Function to display colored text
|
|
||||||
colored_echo() {
|
|
||||||
local color=$1
|
|
||||||
local text=$2
|
|
||||||
case $color in
|
|
||||||
red) echo -e "\033[31m$text\033[0m" ;;
|
|
||||||
green) echo -e "\033[32m$text\033[0m" ;;
|
|
||||||
yellow) echo -e "\033[33m$text\033[0m" ;;
|
|
||||||
blue) echo -e "\033[34m$text\033[0m" ;;
|
|
||||||
*) echo "$text" ;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function to display the main menu
|
# Function to display the main menu
|
||||||
main_menu() {
|
main_menu() {
|
||||||
while true; do
|
while true; do
|
||||||
clear
|
clear
|
||||||
colored_echo blue "WiFi Manager"
|
printf "%b\n" "${YELLOW}WiFi Manager${RC}"
|
||||||
colored_echo blue "============"
|
printf "%b\n" "${YELLOW}============${RC}"
|
||||||
echo "1. Turn WiFi On"
|
echo "1. Turn WiFi On"
|
||||||
echo "2. Turn WiFi Off"
|
echo "2. Turn WiFi Off"
|
||||||
echo "3. Scan for WiFi networks"
|
echo "3. Scan for WiFi networks"
|
||||||
|
@ -59,7 +46,7 @@ main_menu() {
|
||||||
echo "6. Remove a WiFi connection"
|
echo "6. Remove a WiFi connection"
|
||||||
echo "0. Exit"
|
echo "0. Exit"
|
||||||
echo -n "Choose an option: "
|
echo -n "Choose an option: "
|
||||||
read -e choice
|
read choice
|
||||||
|
|
||||||
case $choice in
|
case $choice in
|
||||||
1) wifi_on ;;
|
1) wifi_on ;;
|
||||||
|
@ -69,7 +56,7 @@ main_menu() {
|
||||||
5) disconnect_network ;;
|
5) disconnect_network ;;
|
||||||
6) remove_network ;;
|
6) remove_network ;;
|
||||||
0) exit 0 ;;
|
0) exit 0 ;;
|
||||||
*) colored_echo red "Invalid option. Please try again." ;;
|
*) printf "%b\n" "${RED}Invalid option. Please try again.${RC}" ;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
@ -77,12 +64,12 @@ main_menu() {
|
||||||
# Function to scan for WiFi networks
|
# Function to scan for WiFi networks
|
||||||
scan_networks() {
|
scan_networks() {
|
||||||
clear
|
clear
|
||||||
colored_echo yellow "Scanning for WiFi networks..."
|
printf "%b\n" "${YELLOW}Scanning for WiFi networks...${RC}"
|
||||||
networks=$(nmcli -t -f SSID,BSSID,SIGNAL dev wifi list | head -n 10)
|
networks=$(nmcli -t -f SSID,BSSID,SIGNAL dev wifi list | head -n 10)
|
||||||
if [ -z "$networks" ]; then
|
if [ -z "$networks" ]; then
|
||||||
colored_echo red "No networks found."
|
printf "%b\n" "${RED}No networks found.${RC}"
|
||||||
else
|
else
|
||||||
colored_echo green "Top 10 Networks found:"
|
printf "%b\n" "${GREEN}Top 10 Networks found:${RC}"
|
||||||
echo "$networks" | sed 's/\\//g' | awk -F: '{printf("%d. SSID: %-25s \n", NR, $1)}'
|
echo "$networks" | sed 's/\\//g' | awk -F: '{printf("%d. SSID: %-25s \n", NR, $1)}'
|
||||||
fi
|
fi
|
||||||
echo "Press any key to return to the main menu..."
|
echo "Press any key to return to the main menu..."
|
||||||
|
@ -92,11 +79,11 @@ scan_networks() {
|
||||||
# Function to turn WiFi on
|
# Function to turn WiFi on
|
||||||
wifi_on() {
|
wifi_on() {
|
||||||
clear
|
clear
|
||||||
colored_echo yellow "Turning WiFi on..."
|
printf "%b\n" "${YELLOW}Turning WiFi on...${RC}"
|
||||||
nmcli radio wifi on && {
|
nmcli radio wifi on && {
|
||||||
colored_echo green "WiFi is now turned on."
|
printf "%b\n" "${GREEN}WiFi is now turned on.${RC}"
|
||||||
} || {
|
} || {
|
||||||
colored_echo red "Failed to turn on WiFi."
|
printf "%b\n" "${RED}Failed to turn on WiFi.${RC}"
|
||||||
}
|
}
|
||||||
echo "Press any key to return to the main menu..."
|
echo "Press any key to return to the main menu..."
|
||||||
read -n 1
|
read -n 1
|
||||||
|
@ -105,11 +92,11 @@ wifi_on() {
|
||||||
# Function to turn WiFi off
|
# Function to turn WiFi off
|
||||||
wifi_off() {
|
wifi_off() {
|
||||||
clear
|
clear
|
||||||
colored_echo yellow "Turning WiFi off..."
|
printf "%b\n" "${YELLOW}Turning WiFi off...${RC}"
|
||||||
nmcli radio wifi off && {
|
nmcli radio wifi off && {
|
||||||
colored_echo green "WiFi is now turned off."
|
printf "%b\n" "${GREEN}WiFi is now turned off.${RC}"
|
||||||
} || {
|
} || {
|
||||||
colored_echo red "Failed to turn off WiFi."
|
printf "%b\n" "${RED}Failed to turn off WiFi.${RC}"
|
||||||
}
|
}
|
||||||
echo "Press any key to return to the main menu..."
|
echo "Press any key to return to the main menu..."
|
||||||
read -n 1
|
read -n 1
|
||||||
|
@ -117,64 +104,65 @@ wifi_off() {
|
||||||
|
|
||||||
# Function to prompt for WiFi network selection
|
# Function to prompt for WiFi network selection
|
||||||
prompt_for_network() {
|
prompt_for_network() {
|
||||||
local action=$1
|
action=$1
|
||||||
local prompt_msg=$2
|
prompt_msg=$2
|
||||||
local success_msg=$3
|
success_msg=$3
|
||||||
local failure_msg=$4
|
failure_msg=$4
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
clear
|
clear
|
||||||
networks=$(nmcli -t -f SSID dev wifi list | head -n 10)
|
networks=$(nmcli -t -f SSID dev wifi list | head -n 10)
|
||||||
if [ -z "$networks" ]; then
|
if [ -z "$networks" ]; then
|
||||||
colored_echo red "No networks available. Please scan for networks first."
|
printf "%b\n" "${RED}No networks available. Please scan for networks first.${RC}"
|
||||||
echo "Press any key to return to the main menu..."
|
echo "Press any key to return to the main menu..."
|
||||||
read -n 1
|
read -n 1
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Display networks with numbers
|
# Display networks with numbers
|
||||||
IFS=$'\n' read -r -a network_list <<<"$networks"
|
i=1
|
||||||
for i in "${!network_list[@]}"; do
|
echo "$networks" | while IFS= read -r network; do
|
||||||
ssid=$(echo "${network_list[$i]}" | awk -F: '{print $1}')
|
ssid=$(echo "$network" | awk -F: '{print $1}')
|
||||||
echo "$((i+1)). SSID: $ssid"
|
echo "$i. SSID: $ssid"
|
||||||
|
i=$((i + 1))
|
||||||
done
|
done
|
||||||
echo "0. Exit to main menu"
|
echo "0. Exit to main menu"
|
||||||
echo -n "$prompt_msg"
|
echo -n "$prompt_msg"
|
||||||
read -e choice
|
read choice
|
||||||
|
|
||||||
# Validate the choice
|
# Validate the choice
|
||||||
if [[ $choice =~ ^[0-9]+$ ]] && [ "$choice" -le "${#network_list[@]}" ] && [ "$choice" -gt 0 ]; then
|
if echo "$choice" | grep -qE '^[0-9]+$' && [ "$choice" -le "$((i - 1))" ] && [ "$choice" -gt 0 ]; then
|
||||||
network=${network_list[$((choice-1))]}
|
network=$(echo "$networks" | sed -n "${choice}p")
|
||||||
ssid=$(echo "$network" | awk -F: '{print $1}')
|
ssid=$(echo "$network" | awk -F: '{print $1}')
|
||||||
if [ "$action" == "connect" ]; then
|
if [ "$action" = "connect" ]; then
|
||||||
echo -n "Enter password for SSID $ssid: "
|
echo -n "Enter password for SSID $ssid: "
|
||||||
read -s password
|
read -s password
|
||||||
echo
|
echo
|
||||||
nmcli dev wifi connect "$ssid" password "$password" && {
|
nmcli dev wifi connect "$ssid" password "$password" && {
|
||||||
colored_echo green "$success_msg"
|
printf "%b\n" "${GREEN}$success_msg${RC}"
|
||||||
break
|
break
|
||||||
} || {
|
} || {
|
||||||
colored_echo red "$failure_msg"
|
printf "%b\n" "${RED}$failure_msg${RC}"
|
||||||
}
|
}
|
||||||
elif [ "$action" == "disconnect" ]; then
|
elif [ "$action" = "disconnect" ]; then
|
||||||
nmcli connection down "$ssid" && {
|
nmcli connection down "$ssid" && {
|
||||||
colored_echo green "$success_msg"
|
printf "%b\n" "${GREEN}$success_msg${RC}"
|
||||||
break
|
break
|
||||||
} || {
|
} || {
|
||||||
colored_echo red "$failure_msg"
|
printf "%b\n" "${RED}$failure_msg${RC}"
|
||||||
}
|
}
|
||||||
elif [ "$action" == "remove" ]; then
|
elif [ "$action" = "remove" ]; then
|
||||||
nmcli connection delete "$ssid" && {
|
nmcli connection delete "$ssid" && {
|
||||||
colored_echo green "$success_msg"
|
printf "%b\n" "${GREEN}$success_msg${RC}"
|
||||||
break
|
break
|
||||||
} || {
|
} || {
|
||||||
colored_echo red "$failure_msg"
|
printf "%b\n" "${RED}$failure_msg${RC}"
|
||||||
}
|
}
|
||||||
fi
|
fi
|
||||||
elif [ "$choice" -eq 0 ]; then
|
elif [ "$choice" -eq 0 ]; then
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
colored_echo red "Invalid choice. Please try again."
|
printf "%b\n" "${RED}Invalid choice. Please try again.${RC}"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
echo "Press any key to return to the main menu..."
|
echo "Press any key to return to the main menu..."
|
||||||
|
|
|
@ -64,9 +64,7 @@ impl Float {
|
||||||
// Returns true if the floating window is finished.
|
// Returns true if the floating window is finished.
|
||||||
pub fn handle_key_event(&mut self, key: &KeyEvent) -> bool {
|
pub fn handle_key_event(&mut self, key: &KeyEvent) -> bool {
|
||||||
match key.code {
|
match key.code {
|
||||||
KeyCode::Enter | KeyCode::Char('p') | KeyCode::Esc | KeyCode::Char('q')
|
KeyCode::Enter | KeyCode::Char('p') | KeyCode::Esc if self.content.is_finished() => {
|
||||||
if self.content.is_finished() =>
|
|
||||||
{
|
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
_ => self.content.handle_key_event(key),
|
_ => self.content.handle_key_event(key),
|
||||||
|
|
|
@ -14,7 +14,6 @@ use std::{
|
||||||
use crate::theme::Theme;
|
use crate::theme::Theme;
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use crossterm::{
|
use crossterm::{
|
||||||
cursor::RestorePosition,
|
|
||||||
event::{self, DisableMouseCapture, Event, KeyEventKind},
|
event::{self, DisableMouseCapture, Event, KeyEventKind},
|
||||||
style::ResetColor,
|
style::ResetColor,
|
||||||
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
|
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
|
||||||
|
@ -38,7 +37,7 @@ struct Args {
|
||||||
override_validation: bool,
|
override_validation: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() -> std::io::Result<()> {
|
fn main() -> io::Result<()> {
|
||||||
let args = Args::parse();
|
let args = Args::parse();
|
||||||
|
|
||||||
let mut state = AppState::new(args.theme, args.override_validation);
|
let mut state = AppState::new(args.theme, args.override_validation);
|
||||||
|
@ -55,8 +54,8 @@ fn main() -> std::io::Result<()> {
|
||||||
terminal.backend_mut().execute(LeaveAlternateScreen)?;
|
terminal.backend_mut().execute(LeaveAlternateScreen)?;
|
||||||
terminal.backend_mut().execute(DisableMouseCapture)?;
|
terminal.backend_mut().execute(DisableMouseCapture)?;
|
||||||
terminal.backend_mut().execute(ResetColor)?;
|
terminal.backend_mut().execute(ResetColor)?;
|
||||||
terminal.backend_mut().execute(RestorePosition)?;
|
|
||||||
terminal.show_cursor()?;
|
terminal.show_cursor()?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ use crate::{
|
||||||
running_command::RunningCommand,
|
running_command::RunningCommand,
|
||||||
theme::Theme,
|
theme::Theme,
|
||||||
};
|
};
|
||||||
use crossterm::event::{KeyCode, KeyEvent, KeyEventKind};
|
use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyModifiers};
|
||||||
use ego_tree::NodeId;
|
use ego_tree::NodeId;
|
||||||
use linutil_core::{Command, ListNode, Tab};
|
use linutil_core::{Command, ListNode, Tab};
|
||||||
use ratatui::{
|
use ratatui::{
|
||||||
|
@ -185,6 +185,7 @@ impl AppState {
|
||||||
|
|
||||||
draw_shortcuts(self, frame, vertical[1]);
|
draw_shortcuts(self, frame, vertical[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn handle_key(&mut self, key: &KeyEvent) -> bool {
|
pub fn handle_key(&mut self, key: &KeyEvent) -> bool {
|
||||||
match &mut self.focus {
|
match &mut self.focus {
|
||||||
Focus::FloatingWindow(command) => {
|
Focus::FloatingWindow(command) => {
|
||||||
|
@ -192,31 +193,43 @@ impl AppState {
|
||||||
self.focus = Focus::List;
|
self.focus = Focus::List;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Focus::Search => match self.filter.handle_key(key) {
|
Focus::Search => match self.filter.handle_key(key) {
|
||||||
SearchAction::Exit => self.exit_search(),
|
SearchAction::Exit => self.exit_search(),
|
||||||
SearchAction::Update => self.update_items(),
|
SearchAction::Update => self.update_items(),
|
||||||
_ => {}
|
_ => {}
|
||||||
},
|
},
|
||||||
_ if key.code == KeyCode::Char('q') => return false,
|
|
||||||
|
_ if key.code == KeyCode::Char('q')
|
||||||
|
|| key.code == KeyCode::Char('c')
|
||||||
|
&& key.modifiers.contains(KeyModifiers::CONTROL) =>
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
Focus::TabList => match key.code {
|
Focus::TabList => match key.code {
|
||||||
KeyCode::Enter | KeyCode::Char('l') | KeyCode::Right | KeyCode::Tab => {
|
KeyCode::Enter | KeyCode::Char('l') | KeyCode::Right | KeyCode::Tab => {
|
||||||
self.focus = Focus::List
|
self.focus = Focus::List
|
||||||
}
|
}
|
||||||
|
|
||||||
KeyCode::Char('j') | KeyCode::Down
|
KeyCode::Char('j') | KeyCode::Down
|
||||||
if self.current_tab.selected().unwrap() + 1 < self.tabs.len() =>
|
if self.current_tab.selected().unwrap() + 1 < self.tabs.len() =>
|
||||||
{
|
{
|
||||||
self.current_tab.select_next();
|
self.current_tab.select_next();
|
||||||
self.refresh_tab();
|
self.refresh_tab();
|
||||||
}
|
}
|
||||||
|
|
||||||
KeyCode::Char('k') | KeyCode::Up => {
|
KeyCode::Char('k') | KeyCode::Up => {
|
||||||
self.current_tab.select_previous();
|
self.current_tab.select_previous();
|
||||||
self.refresh_tab();
|
self.refresh_tab();
|
||||||
}
|
}
|
||||||
|
|
||||||
KeyCode::Char('/') => self.enter_search(),
|
KeyCode::Char('/') => self.enter_search(),
|
||||||
KeyCode::Char('t') => self.theme.next(),
|
KeyCode::Char('t') => self.theme.next(),
|
||||||
KeyCode::Char('T') => self.theme.prev(),
|
KeyCode::Char('T') => self.theme.prev(),
|
||||||
_ => {}
|
_ => {}
|
||||||
},
|
},
|
||||||
|
|
||||||
Focus::List if key.kind != KeyEventKind::Release => match key.code {
|
Focus::List if key.kind != KeyEventKind::Release => match key.code {
|
||||||
KeyCode::Char('j') | KeyCode::Down => self.selection.select_next(),
|
KeyCode::Char('j') | KeyCode::Down => self.selection.select_next(),
|
||||||
KeyCode::Char('k') | KeyCode::Up => self.selection.select_previous(),
|
KeyCode::Char('k') | KeyCode::Up => self.selection.select_previous(),
|
||||||
|
@ -235,10 +248,12 @@ impl AppState {
|
||||||
KeyCode::Char('T') => self.theme.prev(),
|
KeyCode::Char('T') => self.theme.prev(),
|
||||||
_ => {}
|
_ => {}
|
||||||
},
|
},
|
||||||
_ => {}
|
|
||||||
|
_ => (),
|
||||||
};
|
};
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_items(&mut self) {
|
fn update_items(&mut self) {
|
||||||
self.filter.update_items(
|
self.filter.update_items(
|
||||||
&self.tabs,
|
&self.tabs,
|
||||||
|
@ -246,12 +261,14 @@ impl AppState {
|
||||||
*self.visit_stack.last().unwrap(),
|
*self.visit_stack.last().unwrap(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Checks either the current tree node is the root node (can we go up the tree or no)
|
/// Checks either the current tree node is the root node (can we go up the tree or no)
|
||||||
/// Returns `true` if we can't go up the tree (we are at the tree root)
|
/// Returns `true` if we can't go up the tree (we are at the tree root)
|
||||||
/// else returns `false`
|
/// else returns `false`
|
||||||
pub fn at_root(&self) -> bool {
|
pub fn at_root(&self) -> bool {
|
||||||
self.visit_stack.len() == 1
|
self.visit_stack.len() == 1
|
||||||
}
|
}
|
||||||
|
|
||||||
fn enter_parent_directory(&mut self) {
|
fn enter_parent_directory(&mut self) {
|
||||||
self.visit_stack.pop();
|
self.visit_stack.pop();
|
||||||
self.selection.select(Some(0));
|
self.selection.select(Some(0));
|
||||||
|
|
Loading…
Reference in New Issue
Block a user