[StumpWM] Beginning to work on Systemd interactivity
This commit is contained in:
		
							parent
							
								
									3c4ba3d898
								
							
						
					
					
						commit
						490db564ce
					
				@ -174,6 +174,7 @@ Now, we’ll load a couple of my custom files that will be described below:
 | 
			
		||||
| theme.lisp        |
 | 
			
		||||
| utilities.lisp    |
 | 
			
		||||
| modeline.lisp     |
 | 
			
		||||
| systemd.lisp      |
 | 
			
		||||
 | 
			
		||||
#+name: gen-load-files
 | 
			
		||||
#+header: :wrap src lisp
 | 
			
		||||
@ -185,7 +186,7 @@ Now, we’ll load a couple of my custom files that will be described below:
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
This is equivalent to the Common Lisp code:
 | 
			
		||||
#+RESULTS[29848aaa616d9b2a828a5602ea6b42dd344efaf2]: gen-load-files
 | 
			
		||||
#+RESULTS[ed4f3fe4f7f82b11cd3cd262578abc7146f5807d]: gen-load-files
 | 
			
		||||
#+begin_src lisp
 | 
			
		||||
(load "~/.stumpwm.d/bluetooth.lisp")
 | 
			
		||||
(load "~/.stumpwm.d/commands.lisp")
 | 
			
		||||
@ -194,6 +195,7 @@ This is equivalent to the Common Lisp code:
 | 
			
		||||
(load "~/.stumpwm.d/theme.lisp")
 | 
			
		||||
(load "~/.stumpwm.d/utilities.lisp")
 | 
			
		||||
(load "~/.stumpwm.d/modeline.lisp")
 | 
			
		||||
(load "~/.stumpwm.d/systemd.lisp")
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
Once the modeline file is loaded, let’s indicate StumpWM to activate
 | 
			
		||||
@ -1890,6 +1892,79 @@ following keybind.
 | 
			
		||||
(define-key *root-map* (my/kbd "s") "swm-ssh-menu")
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
** Systemd
 | 
			
		||||
:PROPERTIES:
 | 
			
		||||
:CUSTOM_ID: UtilitiesSystemd-rfb6hs30hmj0
 | 
			
		||||
:header-args:lisp: :mkdirp yes :tangle ~/.stumpwm.d/systemd.lisp :noweb yes
 | 
			
		||||
:END:
 | 
			
		||||
I’m currently in the process of writing functions to interact with
 | 
			
		||||
Systemd directly through StumpWM. For now, not much work is done, but
 | 
			
		||||
it’s a start.
 | 
			
		||||
 | 
			
		||||
First of all, I have the following function that lists all the system
 | 
			
		||||
or user services.
 | 
			
		||||
#+begin_src lisp
 | 
			
		||||
(defun systemd-get-services (&key user-p)
 | 
			
		||||
  "Collect all systemd services running.
 | 
			
		||||
 | 
			
		||||
If USER-P is t, collect user services, otherwise collect system
 | 
			
		||||
services.
 | 
			
		||||
 | 
			
		||||
The value returned is a list of lists. The first element is the
 | 
			
		||||
service’s name, the second is its load state, the third the high-level
 | 
			
		||||
activation state of the service, and the fourth its low-level
 | 
			
		||||
activation state."
 | 
			
		||||
  (mapcar (lambda (elt)
 | 
			
		||||
            (multiple-value-bind (_ result)
 | 
			
		||||
                (ppcre:scan-to-strings "(.*\\.service) *([^ ]+) *([^ ]+) *([^ ]+).*"
 | 
			
		||||
                                       elt)
 | 
			
		||||
              result))
 | 
			
		||||
          (ppcre:split
 | 
			
		||||
           " *\\n●? *"
 | 
			
		||||
           (ppcre:regex-replace
 | 
			
		||||
            "^ *"
 | 
			
		||||
            (run-shell-command (concat "systemctl list-units --type service --all -q"
 | 
			
		||||
                                       (if user-p " --user" ""))
 | 
			
		||||
                               t)
 | 
			
		||||
            ""))))
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
The only command I have right now is for listing the system or user
 | 
			
		||||
services with ~message~. Unfortunately, if there are too many services,
 | 
			
		||||
the list will overflow the screen. I do not know how to fix that yet.
 | 
			
		||||
I set the timeout to 600 seconds in order to have all the time in the
 | 
			
		||||
world to read the services list. It goes away as soon as something
 | 
			
		||||
else appears, such as a ~s-SPC C-g~ since I have ~which-key-mode~ enabled.
 | 
			
		||||
#+begin_src lisp
 | 
			
		||||
(defcommand systemd-list-services (user-p) ((:y-or-n "User services? "))
 | 
			
		||||
  (let ((stumpwm::*timeout-wait* 600))
 | 
			
		||||
   (message (format nil "~{~a~^~&~}"
 | 
			
		||||
                    (mapcar (lambda (service)
 | 
			
		||||
                              (let ((name (aref service 0))
 | 
			
		||||
                                    (load (aref service 1))
 | 
			
		||||
                                    (active (aref service 2))
 | 
			
		||||
                                    (sub (aref service 3)))
 | 
			
		||||
                                (cond ((member load '("not-found" "bad-setting"
 | 
			
		||||
                                                      "error" "masked")
 | 
			
		||||
                                               :test #'string=)
 | 
			
		||||
                                       (format nil
 | 
			
		||||
                                               "^~A~A^0 ^>  Load: ~12@A"
 | 
			
		||||
                                               (if (string= "masked" load) 4 1)
 | 
			
		||||
                                               name load))
 | 
			
		||||
                                      ((member active '("failed" "reloading" "activating"
 | 
			
		||||
                                                        "deactivating" "inactive")
 | 
			
		||||
                                               :test #'string=)
 | 
			
		||||
                                       (format nil "^~A~A^0 ^>Active: ~12@A"
 | 
			
		||||
                                               (case active
 | 
			
		||||
                                                 ("failed" 1)
 | 
			
		||||
                                                 ("inactive" 0)
 | 
			
		||||
                                                 (t 3))
 | 
			
		||||
                                               name
 | 
			
		||||
                                               active))
 | 
			
		||||
                                      (t (format nil "^2~A^0 ^>   Sub: ~12@A" name sub)))))
 | 
			
		||||
                            (systemd-get-services :user-p user-p))))))
 | 
			
		||||
#+end_src
 | 
			
		||||
 | 
			
		||||
* org functions                                                    :noexport:
 | 
			
		||||
:PROPERTIES:
 | 
			
		||||
:CUSTOM_ID: org-functions-syqgzgg0m6j0
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user