2023-02-17 13:49:32 +00:00
< p align = "center" >
<!-- Icon by SVGRepo under CC0. Notice at the end of the file -->
< img src = "./assets/text-icon.svg" height = "200px" alt = "Lemur Icon by SVGRepo" / >
< / p >
2021-12-28 21:56:14 +00:00
2023-02-17 13:49:32 +00:00
Lemurs provides a *Terminal User Interface* (TUI) for a [Display/Login
Managers](https://wiki.archlinux.org/title/Display_manager) in Rust for most
GNU/Linux and BSD distributions. It can work both with or without SystemD and
allows for configuration with _One-Time Password_ (OTP) tokens. Lemurs works on
most Unix systems including Linux, FreeBSD and NetBSD.
2021-12-31 18:48:24 +00:00
2023-02-17 13:49:32 +00:00
## Goal
2021-12-28 21:56:14 +00:00
2023-02-17 13:49:32 +00:00
This project creates a small, robust and yet customizable Login Manager which
can serve as the front-end to your TTY, X11 or Wayland sessions. Lemurs uses
[_Pluggable Authentication Modules_][pam] (PAM) as its method of
authentication.
2021-12-28 22:18:22 +00:00
2023-02-17 13:49:32 +00:00
## Screenshot
2021-12-28 22:18:22 +00:00
2023-02-17 13:49:32 +00:00
![Cover image ](./cover.png )
2021-12-28 22:18:22 +00:00
## Installation
2023-02-17 13:49:32 +00:00
[![Packaging status ](https://repology.org/badge/vertical-allrepos/lemurs.svg )](https://repology.org/project/lemurs/versions)
2022-11-22 15:30:26 +00:00
There are two different ways to install Lemurs. Both require the rust toolchain
to be installed. I.e. there is currently no precompiled option.
### Arch Linux --- AUR
Lemurs can be installed from the [AUR ](https://aur.archlinux.org ). This will
build the package on your local machine. It will automatically pull in rustup,
but you might have to set the default toolchain with `rustup default stable` .
```bash
paru -S lemurs-git # paru can be replaced by any other AUR helper
2022-12-05 18:37:10 +00:00
# Not needed if do don't have a window manager yet
2023-02-17 13:49:32 +00:00
sudo systemctl disable display-manager.service
2022-12-05 18:37:10 +00:00
sudo systemctl enable lemurs.service
2022-11-22 15:30:26 +00:00
```
or
```bash
git clone https://aur.archlinux.org/lemurs-git.git
cd lemurs-git
makepkg -si
2022-12-05 18:37:10 +00:00
# Not needed if do don't have a window manager yet
2023-02-17 13:49:32 +00:00
sudo systemctl disable display-manager.service
2022-12-05 18:37:10 +00:00
sudo systemctl enable lemurs.service
2022-11-22 15:30:26 +00:00
```
### Compiling from source
2021-12-31 19:02:53 +00:00
The `install.sh` script can be used to compile and setup the display manager on
your Unix machine. This will perform multiple steps:
2022-07-30 17:41:41 +00:00
1. Build the project in release mode (requires Rust's _cargo_ )
2021-12-31 19:02:53 +00:00
2. Setup the `/etc/lemurs` folder which contains some of the configuration and
necessary files such as your selection of window managers.
3. Disables the previous Display Manager
2022-11-22 15:30:26 +00:00
4. Copies over the _systemd_ service and enables it.
2021-12-31 19:05:45 +00:00
2021-12-31 19:13:23 +00:00
Although you might first want to set up some window managers (see
[Usage ](#Usage )), upon rebooting you should now see Lemurs.
## Usage
2022-11-22 15:30:26 +00:00
After installation you can add your environments by creating runnable scripts.
For your Xorg put your [xinitrc ](https://wiki.archlinux.org/title/Xinit ) scripts
in the `/etc/lemurs/wms` directory. For Wayland, put a script that starts your
compositor in the `/etc/lemurs/wayland` directory. For both cases, the name of
the runnable script file is the name that is shown in the environment switcher
within lemurs. Multiple Xorg and Wayland environments can exist at the same time.
### Example 1: BSPWM
For the [bspwm ](https://github.com/baskerville/bspwm ) window manager, you might
2021-12-31 19:13:23 +00:00
add the script `/etc/lemurs/wms/bspwm` .
```bash
#! /bin/sh
sxhkd &
exec bspwm
```
Remember to make this script runnable. This is done with the `chmod +x
/etc/lemurs/wms/bspwm` command.
2022-07-30 17:45:24 +00:00
Upon rebooting your new `bspwm` should show up within Lemurs.
2021-12-31 19:13:23 +00:00
2022-11-22 15:30:26 +00:00
### Example 2: Sway
For the [sway ](https://swaywm.org/ ) compositor and window manager, you might
add the script `/etc/lemurs/wayland/sway` . Ensure that you have sway installed
and added yourself to the `seat` group.
```bash
#! /bin/sh
exec sway
```
Remember to make this script runnable. This is done with the `chmod +x
/etc/lemurs/wayland/sway` command.
Upon rebooting your new `sway` should show up within Lemurs.
2022-01-05 20:07:36 +00:00
## Configuration
2022-01-05 18:58:43 +00:00
Many parts for the UI can be configured with the `/etc/lemurs/config.toml`
2022-07-30 17:41:41 +00:00
file. This file contains all the options and explanations of their purpose.
2022-01-05 18:58:43 +00:00
The flag `--config <CONFIG FIlE>` can be used to select another configuration
2022-11-22 15:30:26 +00:00
file instead. An example configuration can be found in the `extra` folder in
this repository.
2021-12-31 19:05:45 +00:00
2023-02-17 13:49:32 +00:00
## Documentation of Internals
To make Lemurs a lot of investigation happened into how the Login sequence of
many environments can be supported. [This document ](./doc/internals.md )
describes information learned there. It can be useful when debugging.
2022-11-22 15:30:26 +00:00
## Preview & Debugging
2022-07-30 17:41:41 +00:00
Lemurs logs a lot of information of it running to a logging file. This is
located by default at `/var/log/lemurs.log` , but can be turned of by running
2022-11-22 15:30:26 +00:00
with the `--no-log` flag.
2022-07-30 17:41:41 +00:00
If you want to test your configuration file you can also run `lemurs
--preview`. This will run a preview instance of your configuration. This will
automatically create a `lemurs.log` in the working directory.
2022-11-22 15:30:26 +00:00
## File Structure
Below is overview of the source files in this project and a short description of
each of them and their use. This can be used by people who want to contribute or
want to tweak details for their own installation.
```
|- src: Rust Source Code
| |- main.rs: CLI argument parsing & main logic
| |- auth: Interaction with PAM modules
| |- config.rs: Configuration file format and options
| |- info_caching.rs: Reading and writing cached login information
| |- post_login: All logic after authentication
| | |- env_variables.rs: General environment variables settings
| | |- x.rs: Logic concerning Xorg
| |- ui: TUI code
| | |- mod.rs: UI calling logic, separated over 2 threads
| | |- input_field.rs: TUI input field used for username and password
| | |- power_menu.rs: Shutdown and Reboot options UI
| | |- status_message.rs: UI for error and information messages
| | |- switcher.rs: UI for environment switcher
| | |- chunks.rs: Division of the TUI screen
|- extra: Configuration and extra files needed
| |- config.toml: The default configuration file
| |- xsetup.sh: Script used to setup a Xorg session
| |- lemurs.service: The systemd service used to start at boot
```
2022-12-02 18:26:14 +00:00
## Platforms
Tested on
- ArchLinux (Vanilla, ArcoLinux)
- VoidLinux
2022-12-22 16:04:46 +00:00
- Ubuntu (make sure to install `build-essential` and `libpam-dev` )
## MSRV Policy
2023-02-17 13:49:32 +00:00
Lemurs has a _Minimum Supported Rust Version_ policy of _N - 2_ . This means that we only use Rust languages features that have been in Rust as of 2 releases.
2022-12-02 18:26:14 +00:00
2022-11-22 15:30:26 +00:00
## License
2023-02-17 13:49:32 +00:00
The icon used at the top of the repository is not a logo and taken as an icon
from the [SVGRepo ](https://www.svgrepo.com/svg/252871/lemur ). It is marked
under CC0 and therefore freely distributable and amendable under a new
license.
2022-11-22 15:30:26 +00:00
The project is made available under the MIT and APACHE license. See the
`LICENSE-MIT` and `LICENSE-APACHE` files, respectively, for more information.
2022-07-30 17:41:41 +00:00
## Contributions
Please report any bugs and possible improvements as an issue within this
repository. Pull requests are also welcome.
2023-02-17 13:49:32 +00:00
[pam]: https://en.wikipedia.org/wiki/Pluggable_authentication_module