mirror of
https://github.com/tcsenpai/autoflatpakdmenu.git
synced 2025-06-02 15:30:03 +00:00
first commit
This commit is contained in:
commit
3a6ee79824
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
*.service
|
||||
__pycache__
|
57
README.md
Normal file
57
README.md
Normal file
@ -0,0 +1,57 @@
|
||||
# flatpak-menu-sync
|
||||
|
||||
A simple script to sync flatpak menu entries to dmenu.
|
||||
|
||||
## Use case
|
||||
|
||||
This script is useful for users who want to use flatpak and dmenu apps like `rofi` or `fuzzel`.
|
||||
Once a flatpak app is installed, it will automatically appear in dmenu (while keeping the traditional applications).
|
||||
|
||||
## Configuration
|
||||
|
||||
You have to modify the `flatpak-menu-sync.service.example` file to your needs, then rename it to `flatpak-menu-sync.service`.
|
||||
For most users, the default miniconda3 path should be in `/home/yourusername/miniconda3/` and thus the example file should be fine.
|
||||
Remember to set your username in the `ExecStart` line.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
If the service doesn't start, check the logs with `journalctl -u flatpak-menu-sync.service`.
|
||||
|
||||
### Error: "flatpak-menu-sync.service not found"
|
||||
|
||||
This error occurs if the service file was not renamed to `flatpak-menu-sync.service`. Please see the previous section for more information.
|
||||
|
||||
### Errors related to the `pyinotify` packages
|
||||
|
||||
Please install the `pyinotify` package through your package manager.
|
||||
Pip should be supported but if it doesn't work, please try:
|
||||
|
||||
#### Ubuntu/Debian
|
||||
|
||||
```bash
|
||||
sudo apt install python3-pyinotify
|
||||
```
|
||||
|
||||
#### Arch Linux
|
||||
|
||||
```bash
|
||||
sudo pacman -S python-pyinotify
|
||||
```
|
||||
|
||||
#### Fedora
|
||||
|
||||
```bash
|
||||
sudo dnf install python3-pyinotify
|
||||
```
|
||||
|
||||
And restart the service with `sudo systemctl restart flatpak-menu-sync.service`.
|
||||
|
||||
## Installation
|
||||
|
||||
Once you have cloned the repository and followed the configuration section, you can run the `integrate.sh` script to install the service.
|
||||
|
||||
```bash
|
||||
./integrate.sh
|
||||
```
|
||||
|
||||
If you prefer, you can manually execute the script with the correct user and miniconda path.
|
138
flatpak-menu-sync.py
Executable file
138
flatpak-menu-sync.py
Executable file
@ -0,0 +1,138 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import sys
|
||||
import shutil
|
||||
import time
|
||||
import logging
|
||||
from pathlib import Path
|
||||
|
||||
try:
|
||||
import pyinotify
|
||||
except ImportError as e:
|
||||
sys.exit(
|
||||
f"Error: pyinotify module not found. Please install it using 'sudo apt install python3-pyinotify'\nDetails: {e}"
|
||||
)
|
||||
|
||||
# Configure logging with more detailed error reporting
|
||||
logging.basicConfig(
|
||||
level=logging.DEBUG, # Changed to DEBUG for more detailed logs
|
||||
format="%(asctime)s - %(levelname)s - %(message)s",
|
||||
handlers=[
|
||||
logging.FileHandler("/var/log/flatpak-menu-sync.log"),
|
||||
logging.StreamHandler(sys.stdout), # Also log to stdout
|
||||
],
|
||||
)
|
||||
|
||||
FLATPAK_DIR = "/var/lib/flatpak/exports/share/applications"
|
||||
TARGET_DIR = "/usr/share/applications"
|
||||
|
||||
|
||||
def check_directories():
|
||||
"""Verify that required directories exist and are accessible"""
|
||||
if not os.path.exists(FLATPAK_DIR):
|
||||
logging.error(f"Flatpak directory does not exist: {FLATPAK_DIR}")
|
||||
return False
|
||||
if not os.path.exists(TARGET_DIR):
|
||||
logging.error(f"Target directory does not exist: {TARGET_DIR}")
|
||||
return False
|
||||
if not os.access(FLATPAK_DIR, os.R_OK):
|
||||
logging.error(f"Cannot read from Flatpak directory: {FLATPAK_DIR}")
|
||||
return False
|
||||
if not os.access(TARGET_DIR, os.W_OK):
|
||||
logging.error(f"Cannot write to target directory: {TARGET_DIR}")
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def sync_desktop_files():
|
||||
try:
|
||||
if not check_directories():
|
||||
return False
|
||||
|
||||
# Create target directory if it doesn't exist
|
||||
Path(TARGET_DIR).mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# Get current files in both directories
|
||||
flatpak_files = set(Path(FLATPAK_DIR).glob("*.desktop"))
|
||||
target_files = set(Path(TARGET_DIR).glob("org.flatpak.*.desktop"))
|
||||
|
||||
# Copy new files
|
||||
for src_file in flatpak_files:
|
||||
dst_file = Path(TARGET_DIR) / src_file.name
|
||||
if not dst_file.exists():
|
||||
try:
|
||||
shutil.copy2(src_file, dst_file)
|
||||
os.chmod(dst_file, 0o644)
|
||||
logging.info(f"Copied new file: {src_file.name}")
|
||||
except Exception as e:
|
||||
logging.error(f"Error copying {src_file.name}: {str(e)}")
|
||||
|
||||
# Remove obsolete files
|
||||
for target_file in target_files:
|
||||
src_file = Path(FLATPAK_DIR) / target_file.name
|
||||
if not src_file.exists():
|
||||
try:
|
||||
target_file.unlink()
|
||||
logging.info(f"Removed obsolete file: {target_file.name}")
|
||||
except Exception as e:
|
||||
logging.error(f"Error removing {target_file.name}: {str(e)}")
|
||||
return True
|
||||
except Exception as e:
|
||||
logging.error(f"Unexpected error in sync_desktop_files: {str(e)}")
|
||||
return False
|
||||
|
||||
|
||||
class FlatpakWatcher(pyinotify.ProcessEvent):
|
||||
def process_IN_CREATE(self, event):
|
||||
if event.name.endswith(".desktop"):
|
||||
logging.info(f"New file created: {event.name}")
|
||||
sync_desktop_files()
|
||||
|
||||
def process_IN_DELETE(self, event):
|
||||
if event.name.endswith(".desktop"):
|
||||
logging.info(f"File deleted: {event.name}")
|
||||
sync_desktop_files()
|
||||
|
||||
def process_IN_MODIFY(self, event):
|
||||
if event.name.endswith(".desktop"):
|
||||
logging.info(f"File modified: {event.name}")
|
||||
sync_desktop_files()
|
||||
|
||||
|
||||
def main():
|
||||
try:
|
||||
logging.info("Flatpak menu sync service started")
|
||||
|
||||
if not check_directories():
|
||||
sys.exit(1)
|
||||
|
||||
# Initialize inotify
|
||||
wm = pyinotify.WatchManager()
|
||||
mask = pyinotify.IN_CREATE | pyinotify.IN_DELETE | pyinotify.IN_MODIFY
|
||||
|
||||
# Create notifier
|
||||
handler = FlatpakWatcher()
|
||||
notifier = pyinotify.Notifier(wm, handler)
|
||||
|
||||
# Add watch
|
||||
wdd = wm.add_watch(FLATPAK_DIR, mask)
|
||||
if FLATPAK_DIR not in wdd or not wdd[FLATPAK_DIR]:
|
||||
logging.error(f"Failed to add watch for {FLATPAK_DIR}")
|
||||
sys.exit(1)
|
||||
|
||||
# Initial sync
|
||||
if not sync_desktop_files():
|
||||
logging.error("Initial sync failed")
|
||||
sys.exit(1)
|
||||
|
||||
logging.info("Starting watch loop")
|
||||
# Start watching
|
||||
notifier.loop()
|
||||
except Exception as e:
|
||||
logging.error(f"Fatal error in main: {str(e)}")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
17
flatpak-menu-sync.service.example
Normal file
17
flatpak-menu-sync.service.example
Normal file
@ -0,0 +1,17 @@
|
||||
[Unit]
|
||||
Description=Flatpak Menu Entry Sync Service
|
||||
After=flatpak.service
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=/bin/bash -c 'source /home/youruser/miniconda3/bin/activate base && /usr/local/bin/flatpak-menu-sync.py'
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
User=root
|
||||
Group=root
|
||||
CPUQuota=20%
|
||||
MemoryMax=50M
|
||||
Nice=10
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
46
integrate.sh
Executable file
46
integrate.sh
Executable file
@ -0,0 +1,46 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Define paths
|
||||
SCRIPT_PATH="/usr/local/bin/flatpak-menu-sync.py"
|
||||
SERVICE_PATH="/etc/systemd/system/flatpak-menu-sync.service"
|
||||
LOG_PATH="/var/log/flatpak-menu-sync.log"
|
||||
|
||||
# Copy the Python script
|
||||
echo "Copying Python script to $SCRIPT_PATH..."
|
||||
sudo cp flatpak-menu-sync.py $SCRIPT_PATH
|
||||
sudo chmod +x $SCRIPT_PATH
|
||||
|
||||
# Copy the systemd service file
|
||||
echo "Copying systemd service file to $SERVICE_PATH..."
|
||||
if [ ! -f flatpak-menu-sync.service ]; then
|
||||
echo "flatpak-menu-sync.service not found. Please see the example file flatpak-menu-sync.service.example and modify it to your needs, then rename it to flatpak-menu-sync.service and run this script again."
|
||||
exit 1
|
||||
fi
|
||||
sudo cp flatpak-menu-sync.service $SERVICE_PATH || echo "Failed to copy service file. Please check the permissions and try again."
|
||||
|
||||
# Reload systemd daemon
|
||||
echo "Reloading systemd daemon..."
|
||||
sudo systemctl daemon-reload
|
||||
|
||||
# Enable and start the service
|
||||
echo "Enabling and starting the flatpak-menu-sync service..."
|
||||
sudo systemctl enable flatpak-menu-sync
|
||||
sudo systemctl start flatpak-menu-sync
|
||||
|
||||
# Create log file if it doesn't exist
|
||||
if [ ! -f "$LOG_PATH" ]; then
|
||||
echo "Creating log file at $LOG_PATH..."
|
||||
sudo touch $LOG_PATH
|
||||
sudo chown root:root $LOG_PATH
|
||||
sudo chmod 644 $LOG_PATH
|
||||
fi
|
||||
|
||||
# Check if the service is running
|
||||
if sudo systemctl is-active flatpak-menu-sync.service > /dev/null 2>&1; then
|
||||
echo "The flatpak-menu-sync service is now running."
|
||||
echo "You can check the status of the service with 'systemctl status flatpak-menu-sync.service'"
|
||||
echo "You can check the logs of the service with 'journalctl -u flatpak-menu-sync.service'"
|
||||
echo "Happy flatpakbing!"
|
||||
else
|
||||
echo "The flatpak-menu-sync service failed to start. Please check the logs for more information."
|
||||
fi
|
1
requirements.txt
Normal file
1
requirements.txt
Normal file
@ -0,0 +1 @@
|
||||
pyinotify
|
Loading…
x
Reference in New Issue
Block a user