Communication between privileged (function) and non-privileged (GUI) python script on macOS
Clash Royale CLAN TAG#URR8PPP
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty margin-bottom:0;
up vote
1
down vote
favorite
Ok, so I am creating my own macOS cleaning app. Something like OnyX but then open-source and python based.
The removal process requires administrative privileges but since I have read that it is usually considered best practice to not run your entire GUI via sudo, I am now in the process of separating the GUI from the actual removal process.
For both aesthetics and security, when I launch the actual deletion process I want to ask the user for his password via macOS's native GUI screen. That way, I can prevent having to store the password in a variable and it just looks & feels better.
In it's most basic form my current setup thus consists of 2 python scripts:
Script1
: A non-priviliged GUI (wx-based)Script2
: A priviliged deletion script
Script2
is initiated by Script1
, and I need it to communicate back to Script1
.
The idea is that if Script2
has to delete for example 100 files it needs to report back after each file so that the wx-Progressbar contained in Script1
can be updated accordingly.
In its most basic and stripped form my current working proof-of-concept looks like this:
Script1
Important: The line with the launch-command
is commented out because it somehow messed up the code-layout here on StackExchange, but if you want to tryout the code it should be un-commented.
from pathlib import Path
import subprocess
import sys
import io
import shlex
from threading import Thread
import time
class LaunchDeletionProcess(Thread):
def __init__(self, nr_of_steps):
self.nr_of_steps = nr_of_steps
Thread.__init__(self)
def run(self):
#launch_command = r"""/usr/bin/osascript -e 'do shell script "/usr/local/bin/python3.6 -u /path/to/script2 """ + str(self.nr_of_steps) + """" with prompt "Sart Deletion Process " with administrator privileges'"""
split_command = shlex.split(launch_command)
print("Thread 1 started")
testprogram = subprocess.Popen(split_command)
testprogram.wait()
class ReadStatus(Thread):
def __init__(self, nr_of_steps):
self.nr_of_steps = nr_of_steps
Thread.__init__(self)
def run(self):
print("Thread 2 started")
check_status_file = Path("/path/to/statusfile.txt")
while not check_status_file.is_file():
time.sleep(1)
if check_status_file.is_file():
nr = 0
while nr < self.nr_of_steps:
time.sleep(1)
with open("/path/to/statusfile.txt", "r") as status_file:
status = status_file.read()
print("Current status = ", status)
nr += 1
else:
pass
if __name__ == "__main__":
nr_of_steps = 100
thread1 = LaunchDeletionProcess(nr_of_steps)
thread2 = ReadStatus(nr_of_steps)
thread1.start()
thread2.start()
Script2
import time
import sys
import os
nr_of_lines = int((sys.argv)[1])
print("nr of lines = ", nr_of_lines)
for i in range(nr_of_lines):
with open("/path/to/statusfile.txt", "w") as status_file:
status_file.write(str(i))
time.sleep(1)
print(i)
os.remove("/path/to/statusfile.txt")
sys.exit()
As you might have noticed my current setup uses a textfile
to communicate between the two scripts. I am wondering if there is a better (performance wise: so more efficient, etc.), more pythonic, or more secure solution? Like, could I use multithreading for this somehow maybe? Just guessing..
Earlier attempts I've made, made use of stdin
& stdout
to communicate, but because Script2
is now called via osascript
(needed in order to get the native GUI pop-up for administrative privileges) it is run in a non-interactive shell, thus any method using stdout
won't work properly.
python performance python-3.x multithreading security
add a comment |Â
up vote
1
down vote
favorite
Ok, so I am creating my own macOS cleaning app. Something like OnyX but then open-source and python based.
The removal process requires administrative privileges but since I have read that it is usually considered best practice to not run your entire GUI via sudo, I am now in the process of separating the GUI from the actual removal process.
For both aesthetics and security, when I launch the actual deletion process I want to ask the user for his password via macOS's native GUI screen. That way, I can prevent having to store the password in a variable and it just looks & feels better.
In it's most basic form my current setup thus consists of 2 python scripts:
Script1
: A non-priviliged GUI (wx-based)Script2
: A priviliged deletion script
Script2
is initiated by Script1
, and I need it to communicate back to Script1
.
The idea is that if Script2
has to delete for example 100 files it needs to report back after each file so that the wx-Progressbar contained in Script1
can be updated accordingly.
In its most basic and stripped form my current working proof-of-concept looks like this:
Script1
Important: The line with the launch-command
is commented out because it somehow messed up the code-layout here on StackExchange, but if you want to tryout the code it should be un-commented.
from pathlib import Path
import subprocess
import sys
import io
import shlex
from threading import Thread
import time
class LaunchDeletionProcess(Thread):
def __init__(self, nr_of_steps):
self.nr_of_steps = nr_of_steps
Thread.__init__(self)
def run(self):
#launch_command = r"""/usr/bin/osascript -e 'do shell script "/usr/local/bin/python3.6 -u /path/to/script2 """ + str(self.nr_of_steps) + """" with prompt "Sart Deletion Process " with administrator privileges'"""
split_command = shlex.split(launch_command)
print("Thread 1 started")
testprogram = subprocess.Popen(split_command)
testprogram.wait()
class ReadStatus(Thread):
def __init__(self, nr_of_steps):
self.nr_of_steps = nr_of_steps
Thread.__init__(self)
def run(self):
print("Thread 2 started")
check_status_file = Path("/path/to/statusfile.txt")
while not check_status_file.is_file():
time.sleep(1)
if check_status_file.is_file():
nr = 0
while nr < self.nr_of_steps:
time.sleep(1)
with open("/path/to/statusfile.txt", "r") as status_file:
status = status_file.read()
print("Current status = ", status)
nr += 1
else:
pass
if __name__ == "__main__":
nr_of_steps = 100
thread1 = LaunchDeletionProcess(nr_of_steps)
thread2 = ReadStatus(nr_of_steps)
thread1.start()
thread2.start()
Script2
import time
import sys
import os
nr_of_lines = int((sys.argv)[1])
print("nr of lines = ", nr_of_lines)
for i in range(nr_of_lines):
with open("/path/to/statusfile.txt", "w") as status_file:
status_file.write(str(i))
time.sleep(1)
print(i)
os.remove("/path/to/statusfile.txt")
sys.exit()
As you might have noticed my current setup uses a textfile
to communicate between the two scripts. I am wondering if there is a better (performance wise: so more efficient, etc.), more pythonic, or more secure solution? Like, could I use multithreading for this somehow maybe? Just guessing..
Earlier attempts I've made, made use of stdin
& stdout
to communicate, but because Script2
is now called via osascript
(needed in order to get the native GUI pop-up for administrative privileges) it is run in a non-interactive shell, thus any method using stdout
won't work properly.
python performance python-3.x multithreading security
add a comment |Â
up vote
1
down vote
favorite
up vote
1
down vote
favorite
Ok, so I am creating my own macOS cleaning app. Something like OnyX but then open-source and python based.
The removal process requires administrative privileges but since I have read that it is usually considered best practice to not run your entire GUI via sudo, I am now in the process of separating the GUI from the actual removal process.
For both aesthetics and security, when I launch the actual deletion process I want to ask the user for his password via macOS's native GUI screen. That way, I can prevent having to store the password in a variable and it just looks & feels better.
In it's most basic form my current setup thus consists of 2 python scripts:
Script1
: A non-priviliged GUI (wx-based)Script2
: A priviliged deletion script
Script2
is initiated by Script1
, and I need it to communicate back to Script1
.
The idea is that if Script2
has to delete for example 100 files it needs to report back after each file so that the wx-Progressbar contained in Script1
can be updated accordingly.
In its most basic and stripped form my current working proof-of-concept looks like this:
Script1
Important: The line with the launch-command
is commented out because it somehow messed up the code-layout here on StackExchange, but if you want to tryout the code it should be un-commented.
from pathlib import Path
import subprocess
import sys
import io
import shlex
from threading import Thread
import time
class LaunchDeletionProcess(Thread):
def __init__(self, nr_of_steps):
self.nr_of_steps = nr_of_steps
Thread.__init__(self)
def run(self):
#launch_command = r"""/usr/bin/osascript -e 'do shell script "/usr/local/bin/python3.6 -u /path/to/script2 """ + str(self.nr_of_steps) + """" with prompt "Sart Deletion Process " with administrator privileges'"""
split_command = shlex.split(launch_command)
print("Thread 1 started")
testprogram = subprocess.Popen(split_command)
testprogram.wait()
class ReadStatus(Thread):
def __init__(self, nr_of_steps):
self.nr_of_steps = nr_of_steps
Thread.__init__(self)
def run(self):
print("Thread 2 started")
check_status_file = Path("/path/to/statusfile.txt")
while not check_status_file.is_file():
time.sleep(1)
if check_status_file.is_file():
nr = 0
while nr < self.nr_of_steps:
time.sleep(1)
with open("/path/to/statusfile.txt", "r") as status_file:
status = status_file.read()
print("Current status = ", status)
nr += 1
else:
pass
if __name__ == "__main__":
nr_of_steps = 100
thread1 = LaunchDeletionProcess(nr_of_steps)
thread2 = ReadStatus(nr_of_steps)
thread1.start()
thread2.start()
Script2
import time
import sys
import os
nr_of_lines = int((sys.argv)[1])
print("nr of lines = ", nr_of_lines)
for i in range(nr_of_lines):
with open("/path/to/statusfile.txt", "w") as status_file:
status_file.write(str(i))
time.sleep(1)
print(i)
os.remove("/path/to/statusfile.txt")
sys.exit()
As you might have noticed my current setup uses a textfile
to communicate between the two scripts. I am wondering if there is a better (performance wise: so more efficient, etc.), more pythonic, or more secure solution? Like, could I use multithreading for this somehow maybe? Just guessing..
Earlier attempts I've made, made use of stdin
& stdout
to communicate, but because Script2
is now called via osascript
(needed in order to get the native GUI pop-up for administrative privileges) it is run in a non-interactive shell, thus any method using stdout
won't work properly.
python performance python-3.x multithreading security
Ok, so I am creating my own macOS cleaning app. Something like OnyX but then open-source and python based.
The removal process requires administrative privileges but since I have read that it is usually considered best practice to not run your entire GUI via sudo, I am now in the process of separating the GUI from the actual removal process.
For both aesthetics and security, when I launch the actual deletion process I want to ask the user for his password via macOS's native GUI screen. That way, I can prevent having to store the password in a variable and it just looks & feels better.
In it's most basic form my current setup thus consists of 2 python scripts:
Script1
: A non-priviliged GUI (wx-based)Script2
: A priviliged deletion script
Script2
is initiated by Script1
, and I need it to communicate back to Script1
.
The idea is that if Script2
has to delete for example 100 files it needs to report back after each file so that the wx-Progressbar contained in Script1
can be updated accordingly.
In its most basic and stripped form my current working proof-of-concept looks like this:
Script1
Important: The line with the launch-command
is commented out because it somehow messed up the code-layout here on StackExchange, but if you want to tryout the code it should be un-commented.
from pathlib import Path
import subprocess
import sys
import io
import shlex
from threading import Thread
import time
class LaunchDeletionProcess(Thread):
def __init__(self, nr_of_steps):
self.nr_of_steps = nr_of_steps
Thread.__init__(self)
def run(self):
#launch_command = r"""/usr/bin/osascript -e 'do shell script "/usr/local/bin/python3.6 -u /path/to/script2 """ + str(self.nr_of_steps) + """" with prompt "Sart Deletion Process " with administrator privileges'"""
split_command = shlex.split(launch_command)
print("Thread 1 started")
testprogram = subprocess.Popen(split_command)
testprogram.wait()
class ReadStatus(Thread):
def __init__(self, nr_of_steps):
self.nr_of_steps = nr_of_steps
Thread.__init__(self)
def run(self):
print("Thread 2 started")
check_status_file = Path("/path/to/statusfile.txt")
while not check_status_file.is_file():
time.sleep(1)
if check_status_file.is_file():
nr = 0
while nr < self.nr_of_steps:
time.sleep(1)
with open("/path/to/statusfile.txt", "r") as status_file:
status = status_file.read()
print("Current status = ", status)
nr += 1
else:
pass
if __name__ == "__main__":
nr_of_steps = 100
thread1 = LaunchDeletionProcess(nr_of_steps)
thread2 = ReadStatus(nr_of_steps)
thread1.start()
thread2.start()
Script2
import time
import sys
import os
nr_of_lines = int((sys.argv)[1])
print("nr of lines = ", nr_of_lines)
for i in range(nr_of_lines):
with open("/path/to/statusfile.txt", "w") as status_file:
status_file.write(str(i))
time.sleep(1)
print(i)
os.remove("/path/to/statusfile.txt")
sys.exit()
As you might have noticed my current setup uses a textfile
to communicate between the two scripts. I am wondering if there is a better (performance wise: so more efficient, etc.), more pythonic, or more secure solution? Like, could I use multithreading for this somehow maybe? Just guessing..
Earlier attempts I've made, made use of stdin
& stdout
to communicate, but because Script2
is now called via osascript
(needed in order to get the native GUI pop-up for administrative privileges) it is run in a non-interactive shell, thus any method using stdout
won't work properly.
python performance python-3.x multithreading security
asked Apr 4 at 20:03
Montmons
1062
1062
add a comment |Â
add a comment |Â
active
oldest
votes
active
oldest
votes
active
oldest
votes
active
oldest
votes
active
oldest
votes
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f191275%2fcommunication-between-privileged-function-and-non-privileged-gui-python-scri%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password