Homelab, Linux, JS & ABAP (~˘▾˘)~

[Mint] Install Bitwarden-CLI on Linux Mint 19.2 Cinnamon

Find their Github here and their Documentation here. They recommend to install via NPM. So first we have to install the Node.js runtime if you have not yet.
If you follow the Node.js installation guide you would use:

sudo apt-get install curl python-software-properties
curl -sL https://deb.nodesource.com/setup_12.x | sudo bash -

But this will lead into the following, since 19.2 Tina is not yet support (on 19.1 Tara it will run fine).

## Confirming "tina" is supported...

+ curl -sLf -o /dev/null 'https://deb.nodesource.com/node_12.x/dists/tina/Release'

## Your distribution, identified as "tina", is not currently supported, please contact NodeSource at https://github.com/nodesource/distributions/issues if you think this is incorrect or would like your distribution to be considered for support

So we have to do it manually. I used this little how-to i found on Github:

# Add missing signature
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key 1655A0AB68576280

# Replace misconfigured  sources file. Change version of node you like to have. 8/10/12
echo -e "deb https://deb.nodesource.com/node_10.x bionic main" | sudo tee /etc/apt/sources.list.d/nodesource.list
echo -e "deb-src https://deb.nodesource.com/node_10.x bionic main" | sudo tee -a /etc/apt/sources.list.d/nodesource.list

# Update packages and install
sudo apt update
sudo apt install nodejs

Finally install Bitwarden-CLI with a single line.

sudo npm install -g @bitwarden/cli

Now you can login into Bitwarden. If you have enabled any two-step login method, you have to add the parameter “–method” and a specific value for the login in method you can find here. In my case “0”, as I’m using TOTP.

bw login --method 0

If you successfully logged in, you will get your session key and are able to read your passwords:

To unlock your vault, set your session key to the `BW_SESSION` environment variable. ex:
$ export BW_SESSION="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
> $env:BW_SESSION="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
You can also pass the session key to any command with the `--session` option. ex:
$ bw list items --session xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

[ABAP] Read SO10 Standard Text with Textsymbol replacement

METHOD read_text.

    DATA: lines   TYPE TABLE OF tline,
          header  TYPE THEAD,
          lt_text TYPE soli_tab.

        id                      = 'ST'
        language                = sy-langu
        name                    = "Textname"
        object                  = 'TEXT'
        header                  = header
        lines                   = lines
        id                      = 1
        language                = 2
        name                    = 3
        not_found               = 4
        object                  = 5
        reference_check         = 6
        wrong_access_to_archive = 7
        OTHERS                  = 8.
    IF sy-subrc <> 0.


        name    = '&MATNR&'
        value   = '00000001'
        replace = 'X'.

        endline   = lines( lines )
        startline = 1
        lines     = lines.

        language    = sy-langu
        itf_text    = lines
        text_stream = lt_text.


[Nextcloud] Restrict access to your ONLYOFFICE Document Service to the users of your Nextcloud instance

Enable JWT token

Add a Token in you local.json file. If your running ONLYOFFICE on linux you will find the file here:


Set inbox, outbox and browser to true and add you token in the secret part for inbox, outbox and session. I just generated a random string via Bitwarden.

   "token": {
        "enable": {
          "request": {
            "inbox": true,
            "outbox": true
          "browser": true
        "inbox": {
          "header": "Authorization"
        "outbox": {
          "header": "Authorization"
      "secret": {
        "inbox": {
          "string": "token_string"
        "outbox": {
          "string": "token_string"
        "session": {
          "string": "token_string"

Save the file and run:

supervisorctl restart all

Go to your Nextcloud web interface, open your ONLYOFFICE App and add your token beneath your server url.

Configure IP Filter

Search in the following file for “ipfilter”:


Add you domain or IP to the IP rules. Disallow everything else. Use * as wildcard. Also set useforrequest to true.

"ipfilter": {
              "rules": [{"address": "url_or_ip", "allowed": true},
                        {"address": "*",         "allowed": false}],
              "useforrequest": true,
              "errorcode": 403

Now run again:

supervisorctl restart all

And test if the service is reachable.

[ABAP] Read smartform textmodule


    DATA(ls_languages) = VALUE ssfrlang( langu1 = sy-langu ).
    DATA(lt_text_stream) = VALUE soli_tab( ).

        i_textmodule       = 'Z_SMARTFORM_TEXT'
        i_languages        = ls_languages
        o_text             = lt_text
        error              = 1
        language_not_found = 2
        OTHERS             = 3.

    IF lt_text IS NOT INITIAL.

          language    = sy-langu
          itf_text    = lt_text
          text_stream = lt_object_content.



        DATA(lr_form) = NEW cl_ssf_fb_smart_form( ).
        lr_form->load( im_formname = 'ZECOS_GM_ERROR' ).

        DATA(ls_varheader) = lr_form->varheader[ 1 ].
        DATA(lr_node) = CAST cl_ssf_fb_node( ls_varheader-pagetree ).
        DATA(lr_text) = CAST cl_ssf_fb_text_item( lr_node->obj ).

        LOOP AT lr_text->text INTO DATA(ls_text).
          WRITE:/ ls_text-tdline.

      CATCH cx_ssf_fb.
      CATCH cx_sy_itab_line_not_found.

[Jellyfin] Deleting files on a mounted dataset inside LXC

If you have installed Jellyfin inside LXC and have all your media mounted from a ZFS dataset inside your container, it’s possible that you are not able to delete files directly from the Jellyfin WebUi. In this case, you have to add the user “jellyfin” to a group with write access on your dataset. In my case, the group “nocin”.

usermod -a -G nocin jellyfin

[Shell] zsh-autosuggestions

Simple plugin to get autosuggestions from your history while typing in your Zsh shell. If you are using Oh My Zsh, the installtion is done in 3 steps. Look here.
Just grab the plugin:

git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

Add it in your ~/.zshrc (zsh config):


And restart the terminal. Done.

[macOS] Homebrew & Neofetch

First install Hoembrew, a package manager for macOS.

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

With this package manager installed, further software installation is pretty easy. For Neofetch just use:

brew install neofetch

[Mint] Install PyWal on Linux Mint 19.2 Cinnamon

“Pywal is a tool that generates a color palette from the dominant colors in an image. It then applies the colors system-wide and on-the-fly in all of your favourite programs.”
For the installation look at Github. In my case I had to run the following command:

sudo apt purge python3-pip && sudo apt install --install-recommends python3-pip && pip3 install pywal

To get an overview of your PyWal installation run:

pip3 show pywal

Test it with:

wal -v

If it returns “zsh: command not found: pywal” you have to add the PIP install directory to your path

export PATH="${PATH}:${HOME}/.local/bin/"

To use PyWal, just run it with wal -i and the path to an image.

wal -i /path/to/image.jpg

[Mint] Install Polybar on Linux Mint 19.2 Cinnamon

Install dependencies:

sudo apt-get install cmake cmake-data libcairo2-dev libxcb1-dev libxcb-ewmh-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-randr0-dev libxcb-util0-dev libxcb-xkb-dev pkg-config python-xcbgen xcb-proto libxcb-xrm-dev i3-wm libasound2-dev libmpdclient-dev libiw-dev libcurl4-openssl-dev libpulse-dev

Clone Polybar repo:

git clone https://github.com/jaagr/polybar.git

Build Polybar:

cd polybar && ./build.sh

During the installtion choose “install example configuration” and you will find it here:


Testrun the example configuration with the following command (the bar in this config is called “example”):

polybar example

Further configuration options can be found on their Github page.