Jump to content

dnf i wybór: [y/N] z "zewnątrz"


Recommended Posts

Aktualizuję sobie system dnf'em z użyciem kdialog (lista), a w konsoli wyskakuje co będzie się aktualizowało i czy potwierdzam lub rezygnuję:

 

Podsumowanie transakcji:
 Aktualizowanie:                       33 pakietów
 Zastępowanie:                         33 pakietów

Całkowity rozmiar pakietów przychodzących wynosi 97 MiB. Należy pobrać 97 MiB.
Po tej operacji zostanie użyte dodatkowo 396 KiB (zainstaluje 353 MiB, usunie 353 MiB).
Is this ok [y/N]:

Mam pid'a dnf'a robiącego tę aktualizację. w drugim terminalu daję:

echo -en "y\n" > /proc/[PID DNF'a]/fd/0

w terminalu aktualizacji wskakuje "y" i przełamuje Return tak jak by potwierdzenie wskakuje, ale proces nie idzie.

Próbowałem też pid'a tego bash'a i pid'a okna konsoli KDE. Pojawia się "y" z Enterem, ale nie idzie.

Co robię źle?

 

Radek Głębicki

 

PS: docelowo chcę wychwycić pojawianie się [y/N] i dać kdialog Yes No
 

Link to comment
Share on other sites

3 godziny temu, Radosław napisał:

Co robię źle?

Zakładasz, że to działa tak jak Ci się wydaje, a tak nie jest :)

 Pisanie do stdin programu przez jego fd nie jest równe "pisaniu z klawiatury" czy nawet np. przekierowaniu "<"

Aby "symulować" trzeba użyć ioctl dla terminali

man ioctl_tty

Prosty program wysyłający znak "y" w pythonie

# tty.py

import sys
import fcntl
import termios

with open(sys.argv[1], 'w') as fd:
    for char in "y\n":
        fcntl.ioctl(fd, termios.TIOCSTI, char)

Uruchomienie

python tty.py /proc/PID_DNF/fd/0

PS.

Może łatwiej podziel to na etapy

dnf5 check-upgrade --refresh

I jak Ci opowiada to uruchom 

sudo dnf upgrade --assumeyes

Edited by sunrise
Link to comment
Share on other sites

Ciekawe jest, że myślisz, że to ja "zakładam, że tak to działa". Po prostu szukałem w necie i znalazłem to z echo, a nic z ioctl.

to podpowiedź z dnf to odpada. Ja nie aktualizuję wszystkiego na raz. Gdzieś tu na forum zrobiłem wątek z użycia kdialog z wyborem pakietów do instalacji. Instaluję aktualizacje grupami ([y/N] wolę mieć, aby przerwać (użycie --assumeyes odpada) i co jakich czas sobie clonezillą zgrywam stan partycji  / (root). 

Oczywiście popróbuję coś zdziałać z ioctl. Dzięki za podpowiedź.

Radek Glebicki

PS.: nawet sobie w Pythonie z użycie QT napisałem własny "kdialog list" z "live filter" i  "grep -v" :-D

 

filterList.png

Link to comment
Share on other sites

@sunrise jeszcze pytanko.

Próbuję zrozumieć ten skrypt. Czytam manuale. Niepokoi mnie "w" czyli "write: w:

Cytuj
with open(sys.argv[1], 'w') as fd:

Czym grozi pomyłka w ścieżce z sys.argv[1] dla pomylonego pliku/katalogu ?

Pozdrawiam

Radek Glebicki

Link to comment
Share on other sites

Godzinę temu, Radosław napisał:

Czym grozi pomyłka w ścieżce z sys.argv[1] dla pomylonego pliku/katalogu ?

Generalnie grozi tym, że będziesz wysyłał ciąg znaków nie do tego "pliku" co chcesz, a co się zdarzy, to już zależy od tego do jakiego "pliku".

Jeżeli będzie to urządzenie znakowe (np. terminal lub port szeregowy) no to wyślesz do niego ten ciąg, a co on  z nim zrobi to już zależy od procesu.

A jak wyślesz do zwykłego pliku to program "się wykrzaczy" ponieważ to nie jest urządzenie znakowe i w tym prostym przykładzie nie ma napisanej obsługi błędów.

np. przy zapisie do zwykłego pliku.

# python tty.py zwykly_plik 
Traceback (most recent call last):
  File "/root/tty.py", line 7, in <module>
    fcntl.ioctl(fd, termios.TIOCSTI, char)
    ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^
OSError: [Errno 25] Inappropriate ioctl for device


 

  • Upvote 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...