first commit

This commit is contained in:
Claudio Lepín Mena
2024-11-22 12:29:44 -03:00
commit 4d127531ab
2 changed files with 180 additions and 0 deletions
+10
View File
@@ -0,0 +1,10 @@
# remote-lock-pc
A little and helpful app for lock and unlock your desktop PC with your smartphone.
The way this thing works it's pretty simple:
- It's an scanner of your BLE device(e.g. smartphone).
- If the scanner detects your device, your PC will be unlocked, if is not, your PC will be locked.
All you need to do is download and install this module, After that, just activate the bluetooth in your device.
- https://github.com/pybluez/pybluez
+170
View File
@@ -0,0 +1,170 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import bluetooth
import os
import subprocess
import time
import datetime
import sys
import json
import configparser
import argparse
import shutil
CONFIG_DIR = os.getenv("XDG_CONFIG_HOME", os.path.expanduser("~/.config"))
CONFIG_FILE = os.path.join(CONFIG_DIR, "ble-lock-session/config.ini")
LOGFILE = "/tmp/ble-lock-session.log"
# Function to load the configuration from a JSON file
def load_config():
config = configparser.ConfigParser()
if not os.path.exists(CONFIG_FILE):
if not os.path.exists(os.path.dirname(CONFIG_FILE)):
os.makedirs(os.path.dirname(CONFIG_FILE))
desktop = os.getenv('XDG_CURRENT_DESKTOP', '').upper()
config['SETTINGS'] = {
'target_address': '',
'lock_cmd': get_default_lock_command(desktop),
'unlock_cmd': get_default_unlock_command(desktop),
'sleep_time': '5',
'discover_time': '25'
}
with open(CONFIG_FILE, 'w') as configfile:
config.write(configfile)
else:
config.read(CONFIG_FILE)
return config
# Function to save the configuration
def save_config(config):
with open(CONFIG_FILE, 'w') as configfile:
config.write(configfile)
def get_default_lock_command(desktop):
if 'GNOME' in desktop:
return "gnome-screensaver-command --lock"
elif 'SWAY' in desktop:
return "swaylock"
else:
return "loginctl lock-session"
def get_default_unlock_command(desktop):
if 'GNOME' in desktop:
return "gnome-screensaver-command -d"
elif 'SWAY' in desktop:
return "pkill -USR1 swaylock"
else:
return "loginctl unlock-session"
# Function to scan for Bluetooth devices
def scan_device(target_name, discover_time):
try:
for bdaddr in bluetooth.discover_devices(duration=discover_time):
if target_name == bluetooth.lookup_name(bdaddr):
return bdaddr
except bluetooth.BluetoothError as e:
print(f"Error scanning for device: {e}")
return None
# Main function to activate automatic lock/unlock
def start(target_address, lock_cmd, unlock_cmd, sleep_time, discover_time):
if not shutil.which(lock_cmd.split()[0]) or not shutil.which(unlock_cmd.split()[0]):
print("Error: lock_cmd or unlock_cmd is not a valid command.")
sys.exit(1)
state = 1
try:
with open(LOGFILE, 'w') as file:
while True:
try:
check = bluetooth.lookup_name(target_address, timeout=discover_time)
event = datetime.datetime.now().strftime("%d-%m-%y %H:%M:%S")
if check and state == 0:
subprocess.Popen(unlock_cmd, shell=True, stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
output = f" [{event}] ➔ [UNLOCKED]"
file.write(output + '\n')
file.flush()
state = 1
elif not check and state == 1:
subprocess.Popen(lock_cmd, shell=True, stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
output = f" [{event}] ➔ [LOCKED]"
file.write(output + '\n')
file.flush()
state = 0
time.sleep(sleep_time)
except bluetooth.BluetoothError as e:
print(f"Error checking device: {e}")
except KeyboardInterrupt:
print("Monitoring stopped by user.")
except Exception as e:
print(f"Unexpected error: {e}")
# Command-line arguments using argparse
def main():
parser = argparse.ArgumentParser(description="Automatic PC Lock/Unlock using Bluetooth proximity")
parser.add_argument("--scan", action="store_true", help="Search and save a Bluetooth device")
parser.add_argument("--start", action="store_true", help="Activate automatic lock/unlock")
parser.add_argument("--config", action="store_true", help="Modify the current configuration")
args = parser.parse_args()
config = load_config()
if args.scan:
target_name = input("Enter the name of the device to search : ")
bdaddr = scan_device(target_name, int(config["SETTINGS"]["discover_time"]))
if bdaddr:
print(f"Device found: {bdaddr}")
config["SETTINGS"]["target_address"] = bdaddr
save_config(config)
print("Address saved to configuration file.")
else:
print("Device not found.")
elif args.start:
if config["SETTINGS"]["target_address"] == "":
print("Error: No Bluetooth device configured. Use --scan to configure it.")
return
start(
config["SETTINGS"]["target_address"],
config["SETTINGS"]["lock_cmd"],
config["SETTINGS"]["unlock_cmd"],
int(config["SETTINGS"]["sleep_time"]),
int(config["SETTINGS"]["discover_time"])
)
elif args.config:
lock_cmd = input(f"Lock command (current: {config['lock_cmd']}) ➔ ")
if lock_cmd:
config["SETTINGS"]["lock_cmd"] = lock_cmd
unlock_cmd = input(f"Unlock command (current: {config['unlock_cmd']}) ➔ ")
if unlock_cmd:
config["SETTINGS"]["unlock_cmd"] = unlock_cmd
sleep_time = input(f"Time interval between checks in seconds (current: {config['sleep_time']}) ➔ ")
if sleep_time:
config["SETTINGS"]["sleep_time"] = int(sleep_time)
discover_time = input(f"Bluetooth device discovery time (current: {config['discover_time']}) ➔ ")
if discover_time:
config["SETTINGS"]["discover_time"] = int(discover_time)
save_config(config)
print("Configuration saved.")
else:
parser.print_help()
if __name__ == "__main__":
main()