completes nis
This commit is contained in:
parent
7aa246b080
commit
69a2c25745
|
@ -245,3 +245,504 @@ It gives modern setup instructions for an old service.
|
||||||
|
|
||||||
#### The server
|
#### The server
|
||||||
|
|
||||||
|
There is a *meta package* available called `nis` which installs all necessary components for both the server **and** the client.
|
||||||
|
We'll do the server first.
|
||||||
|
The configuration changed drastically between Debian 10 and 11 but the fundamentals still apply.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
➜ ~ sudo apt install nis
|
||||||
|
Reading package lists... Done
|
||||||
|
Building dependency tree... Done
|
||||||
|
Reading state information... Done
|
||||||
|
nis is already the newest version (4.4).
|
||||||
|
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
|
||||||
|
➜ ~
|
||||||
|
```
|
||||||
|
|
||||||
|
Now NIS is installed but we need to configure it to offer the local accounts onto the LAN.
|
||||||
|
The installation added a few interesting configuration files to you server.
|
||||||
|
The following four files determine *how* your server **and/or** client behave.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
➜ ~ ls /etc/default/nis
|
||||||
|
/etc/default/nis
|
||||||
|
➜ ~ ls /etc/yp*
|
||||||
|
/etc/yp.conf /etc/ypserv.conf /etc/ypserv.securenets
|
||||||
|
➜ ~
|
||||||
|
```
|
||||||
|
|
||||||
|
One file that is not added but essential for NIS to function is `/etc/defaultdomain`.
|
||||||
|
Each server exposes a **domain** onto the network and its name has to be defined in the latter file.
|
||||||
|
The domain can be anything you like but most administrators would make it the same as the hostname of the server.
|
||||||
|
I'll set it differently just for demonstration purposes.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
➜ ~ ls -l /etc/defaultdomain
|
||||||
|
-rw-r--r-- 1 root root 12 Sep 27 11:18 /etc/defaultdomain
|
||||||
|
➜ ~ cat /etc/defaultdomain
|
||||||
|
waldekworld
|
||||||
|
➜ ~
|
||||||
|
```
|
||||||
|
|
||||||
|
Clients work in *broadcast* by default.
|
||||||
|
The documentation suggests to change the `/etc/default/rpcbind` file to accommodate this.
|
||||||
|
The change is the `-r` argument to the `OPTIONS="-w"` line.
|
||||||
|
What does this argument do?
|
||||||
|
A quick `man rpcbind` offers the following explanation.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
-r Turn on remote calls. Cause rpcbind to open up random listening ports. Note that rpcinfo need this feature turned on
|
||||||
|
for work properly. (This flag is a Debian extension.)
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
➜ ~ cat /etc/default/rpcbind
|
||||||
|
# /etc/init.d/rpcbind
|
||||||
|
|
||||||
|
OPTIONS=""
|
||||||
|
|
||||||
|
# Cause rpcbind to do a "warm start" utilizing a state file (default)
|
||||||
|
OPTIONS="-w -r"
|
||||||
|
|
||||||
|
# Uncomment the following line to restrict rpcbind to localhost only for UDP requests
|
||||||
|
# OPTIONS="${OPTIONS} -h 127.0.0.1 -h ::1"
|
||||||
|
|
||||||
|
# Uncomment the following line to enable libwrap TCP-Wrapper connection logging
|
||||||
|
# OPTIONS="${OPTIONS} -l "
|
||||||
|
➜ ~
|
||||||
|
```
|
||||||
|
|
||||||
|
Now that the domain is defined we can enable and start the services related to NIS.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
➜ ~ sudo /usr/lib/yp/ypinit -m
|
||||||
|
|
||||||
|
At this point, we have to construct a list of the hosts which will run NIS
|
||||||
|
servers. debiannis.lan is in the list of NIS server hosts. Please continue to add
|
||||||
|
the names for the other hosts, one per line. When you are done with the
|
||||||
|
list, type a <control D>.
|
||||||
|
next host to add: debiannis.lan
|
||||||
|
next host to add:
|
||||||
|
The current list of NIS servers looks like this:
|
||||||
|
|
||||||
|
debiannis.lan
|
||||||
|
|
||||||
|
Is this correct? [y/n: y] y
|
||||||
|
We need a few minutes to build the databases...
|
||||||
|
Building /var/yp/waldekworld/ypservers...
|
||||||
|
Running /var/yp/Makefile...
|
||||||
|
gmake[1]: Entering directory '/var/yp/waldekworld'
|
||||||
|
Updating passwd.byname...
|
||||||
|
Updating passwd.byuid...
|
||||||
|
Updating group.byname...
|
||||||
|
Updating group.bygid...
|
||||||
|
Updating hosts.byname...
|
||||||
|
Updating hosts.byaddr...
|
||||||
|
Updating rpc.byname...
|
||||||
|
Updating rpc.bynumber...
|
||||||
|
Updating services.byname...
|
||||||
|
Updating services.byservicename...
|
||||||
|
Updating netid.byname...
|
||||||
|
Updating protocols.bynumber...
|
||||||
|
Updating protocols.byname...
|
||||||
|
Updating netgroup...
|
||||||
|
Updating netgroup.byhost...
|
||||||
|
Updating netgroup.byuser...
|
||||||
|
Updating shadow.byname...
|
||||||
|
gmake[1]: Leaving directory '/var/yp/waldekworld'
|
||||||
|
|
||||||
|
debiannis.lan has been set up as a NIS master server.
|
||||||
|
|
||||||
|
Now you can run ypinit -s debiannis.lan on all slave server.
|
||||||
|
➜ ~
|
||||||
|
```
|
||||||
|
|
||||||
|
#### The first client
|
||||||
|
|
||||||
|
On the clients we'll have to install the same `nis` package as we did on the server.
|
||||||
|
We'll also have to define the `/etc/defaultdomain` the same way we did on the server.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
➜ ~ sudo apt install nis
|
||||||
|
Reading package lists... Done
|
||||||
|
Building dependency tree... Done
|
||||||
|
Reading state information... Done
|
||||||
|
nis is already the newest version (4.4).
|
||||||
|
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
|
||||||
|
➜ ~ cat /etc/defaultdomain
|
||||||
|
waldekworld
|
||||||
|
➜ ~
|
||||||
|
```
|
||||||
|
|
||||||
|
To start the client service we need to enable and start `ypbind.service`.
|
||||||
|
But by default it **will** give errors!
|
||||||
|
|
||||||
|
```bash
|
||||||
|
➜ ~ sudo systemctl start ypbind.service
|
||||||
|
Job for ypbind.service failed because the control process exited with error code.
|
||||||
|
See "systemctl status ypbind.service" and "journalctl -xe" for details.
|
||||||
|
➜ ~ sudo journalctl -e --unit ypbind.service --no-pager
|
||||||
|
-- Journal begins at Mon 2021-09-27 13:40:56 CEST, ends at Mon 2021-09-27 13:52:10 CEST. --
|
||||||
|
Sep 27 13:48:12 debianclient1 systemd[1]: Starting NIS Binding Service...
|
||||||
|
Sep 27 13:48:12 debianclient1 ypbind[3494]: No NIS server and no -broadcast option specified.
|
||||||
|
Sep 27 13:48:12 debianclient1 ypbind[3494]: Add a NIS server to the /etc/yp.conf configuration file,
|
||||||
|
Sep 27 13:48:12 debianclient1 ypbind[3494]: or start ypbind with the -broadcast option.
|
||||||
|
Sep 27 13:48:12 debianclient1 systemd[1]: ypbind.service: Control process exited, code=exited, status=1/FAILURE
|
||||||
|
Sep 27 13:48:12 debianclient1 systemd[1]: ypbind.service: Failed with result 'exit-code'.
|
||||||
|
Sep 27 13:48:12 debianclient1 systemd[1]: Failed to start NIS Binding Service.
|
||||||
|
➜ ~
|
||||||
|
```
|
||||||
|
|
||||||
|
We can solve the problem in two ways:
|
||||||
|
|
||||||
|
1. add our NIS server address to the client's `/etc/yp.conf` file
|
||||||
|
2. let the client *broadcast* it's requests.
|
||||||
|
|
||||||
|
I'll opt for the latter because I find it easier.
|
||||||
|
This configuration is done in the `/etc/default/nis` file.
|
||||||
|
The argument needed is the `-broadcast` to `YPBINDARGS`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
➜ ~ cat /etc/default/nis
|
||||||
|
#
|
||||||
|
# /etc/defaults/nis Optional configuration settings for the NIS programs.
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# The following two variables are still used in the init script, but
|
||||||
|
# ignored by systemd. See `nis.debian.howto` in the documentation
|
||||||
|
# directory for more information.
|
||||||
|
#
|
||||||
|
# Are we a NIS server and if so what kind (values: false, slave, master)?
|
||||||
|
NISSERVER=false
|
||||||
|
# Are we a NIS client?
|
||||||
|
NISCLIENT=false
|
||||||
|
|
||||||
|
# Location of the master NIS password file (for yppasswdd).
|
||||||
|
# If you change this make sure it matches with /var/yp/Makefile.
|
||||||
|
YPPWDDIR=/etc
|
||||||
|
|
||||||
|
# Do we allow the user to use ypchsh and/or ypchfn ? The YPCHANGEOK
|
||||||
|
# fields are passed with -e to yppasswdd, see it's manpage.
|
||||||
|
# Possible values: "chsh", "chfn", "chsh,chfn"
|
||||||
|
YPCHANGEOK=chsh
|
||||||
|
|
||||||
|
# NIS master server. If this is configured on a slave server then ypinit
|
||||||
|
# will be run each time NIS is started.
|
||||||
|
NISMASTER=
|
||||||
|
|
||||||
|
# Additional options to be given to ypserv when it is started.
|
||||||
|
YPSERVARGS=
|
||||||
|
|
||||||
|
# Additional options to be given to ypbind when it is started.
|
||||||
|
YPBINDARGS="-broadcast"
|
||||||
|
|
||||||
|
# Additional options to be given to yppasswdd when it is started. Note
|
||||||
|
# that if -p is set then the YPPWDDIR above should be empty.
|
||||||
|
YPPASSWDDARGS=
|
||||||
|
|
||||||
|
# Additional options to be given to ypxfrd when it is started.
|
||||||
|
YPXFRDARGS=
|
||||||
|
➜ ~
|
||||||
|
```
|
||||||
|
|
||||||
|
When we restart `ypbind.service` now we won't get any errors!
|
||||||
|
|
||||||
|
```bash
|
||||||
|
➜ ~ sudo systemctl start ypbind.service
|
||||||
|
➜ ~
|
||||||
|
```
|
||||||
|
|
||||||
|
Last thing to do is to *initialize* the client.
|
||||||
|
This is done by running the `ypinit` program.
|
||||||
|
By default it's not in your `PATH` but you can specifically call it as follows.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
➜ ~ sudo /usr/lib/yp/ypinit -s debiannis.lan
|
||||||
|
We will need a few minutes to copy the data from debiannis.lan.
|
||||||
|
Transferring group.bygid...
|
||||||
|
Trying ypxfrd ... success
|
||||||
|
|
||||||
|
Transferring protocols.byname...
|
||||||
|
Trying ypxfrd ... success
|
||||||
|
|
||||||
|
Transferring ypservers...
|
||||||
|
Trying ypxfrd ... success
|
||||||
|
|
||||||
|
Transferring rpc.byname...
|
||||||
|
Trying ypxfrd ... success
|
||||||
|
|
||||||
|
Transferring passwd.byname...
|
||||||
|
Trying ypxfrd ... success
|
||||||
|
|
||||||
|
Transferring hosts.byname...
|
||||||
|
Trying ypxfrd ... success
|
||||||
|
|
||||||
|
Transferring netgroup.byuser...
|
||||||
|
Trying ypxfrd ... success
|
||||||
|
|
||||||
|
Transferring protocols.bynumber...
|
||||||
|
Trying ypxfrd ... success
|
||||||
|
|
||||||
|
Transferring hosts.byaddr...
|
||||||
|
Trying ypxfrd ... success
|
||||||
|
|
||||||
|
Transferring passwd.byuid...
|
||||||
|
Trying ypxfrd ... success
|
||||||
|
|
||||||
|
Transferring services.byname...
|
||||||
|
Trying ypxfrd ... success
|
||||||
|
|
||||||
|
Transferring shadow.byname...
|
||||||
|
Trying ypxfrd ... success
|
||||||
|
|
||||||
|
Transferring netid.byname...
|
||||||
|
Trying ypxfrd ... success
|
||||||
|
|
||||||
|
Transferring group.byname...
|
||||||
|
Trying ypxfrd ... success
|
||||||
|
|
||||||
|
Transferring services.byservicename...
|
||||||
|
Trying ypxfrd ... success
|
||||||
|
|
||||||
|
Transferring netgroup...
|
||||||
|
Trying ypxfrd ... success
|
||||||
|
|
||||||
|
Transferring netgroup.byhost...
|
||||||
|
Trying ypxfrd ... success
|
||||||
|
|
||||||
|
Transferring rpc.bynumber...
|
||||||
|
Trying ypxfrd ... success
|
||||||
|
|
||||||
|
|
||||||
|
debianclient1's NIS data base has been set up.
|
||||||
|
If there were warnings, please figure out what went wrong, and fix it.
|
||||||
|
|
||||||
|
At this point, make sure that /etc/passwd and /etc/group have
|
||||||
|
been edited so that when the NIS is activated, the data bases you
|
||||||
|
have just created will be used, instead of the /etc ASCII files.
|
||||||
|
➜ ~
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Querying the server
|
||||||
|
|
||||||
|
A couple of additional programs got installed when installing the `nis` package.
|
||||||
|
Try a `yp` plus tab complete in your shell to get a list of them.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
~ yp
|
||||||
|
ypcat ypchfn ypchsh ypdomainname ypmatch yppasswd ypwhich
|
||||||
|
```
|
||||||
|
|
||||||
|
`ypwhich` can be used to see *which* ypserver your client is connected to.
|
||||||
|
You can also list you domain and get a peak look at the available accounts on the server.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
➜ ~ ypwhich
|
||||||
|
192.168.0.185
|
||||||
|
➜ ~ ypdomainname
|
||||||
|
waldekworld
|
||||||
|
➜ ~ ypcat passwd
|
||||||
|
bob:x:1001:1001:,,,:/home/bob:/bin/bash
|
||||||
|
alice:x:1002:1002:,,,:/home/alice:/bin/bash
|
||||||
|
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
|
||||||
|
waldek:x:1000:1000:waldek,,,:/home/waldek:/usr/bin/zsh
|
||||||
|
➜ ~
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Adding more accounts on the server
|
||||||
|
|
||||||
|
I'll add two new accounts on the server to test whether we can actually log in on the client machine.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
➜ ~ sudo adduser bert
|
||||||
|
adduser: The user `bert' already exists.
|
||||||
|
➜ ~ sudo adduser naomi
|
||||||
|
adduser: The user `naomi' already exists.
|
||||||
|
➜ ~
|
||||||
|
```
|
||||||
|
|
||||||
|
Let's see how this reflects on the client.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
➜ ~ ypcat passwd
|
||||||
|
bob:x:1001:1001:,,,:/home/bob:/bin/bash
|
||||||
|
alice:x:1002:1002:,,,:/home/alice:/bin/bash
|
||||||
|
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
|
||||||
|
waldek:x:1000:1000:waldek,,,:/home/waldek:/usr/bin/zsh
|
||||||
|
➜ ~
|
||||||
|
```
|
||||||
|
|
||||||
|
The accounts don't seem to be available?
|
||||||
|
This is because when you make changes on the server you need to update the database on that end.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
➜ ~ sudo /usr/lib/yp/ypinit -m
|
||||||
|
|
||||||
|
At this point, we have to construct a list of the hosts which will run NIS
|
||||||
|
servers. debiannis.lan is in the list of NIS server hosts. Please continue to add
|
||||||
|
the names for the other hosts, one per line. When you are done with the
|
||||||
|
list, type a <control D>.
|
||||||
|
next host to add: debiannis.lan
|
||||||
|
next host to add:
|
||||||
|
The current list of NIS servers looks like this:
|
||||||
|
|
||||||
|
debiannis.lan
|
||||||
|
|
||||||
|
Is this correct? [y/n: y] t
|
||||||
|
We need a few minutes to build the databases...
|
||||||
|
Building /var/yp/waldekworld/ypservers...
|
||||||
|
Running /var/yp/Makefile...
|
||||||
|
gmake[1]: Entering directory '/var/yp/waldekworld'
|
||||||
|
Updating passwd.byname...
|
||||||
|
Updating passwd.byuid...
|
||||||
|
Updating group.byname...
|
||||||
|
Updating group.bygid...
|
||||||
|
Updating hosts.byname...
|
||||||
|
Updating hosts.byaddr...
|
||||||
|
Updating rpc.byname...
|
||||||
|
Updating rpc.bynumber...
|
||||||
|
Updating services.byname...
|
||||||
|
Updating services.byservicename...
|
||||||
|
Updating netid.byname...
|
||||||
|
Updating protocols.bynumber...
|
||||||
|
Updating protocols.byname...
|
||||||
|
Updating netgroup...
|
||||||
|
Updating netgroup.byhost...
|
||||||
|
Updating netgroup.byuser...
|
||||||
|
Updating shadow.byname...
|
||||||
|
gmake[1]: Leaving directory '/var/yp/waldekworld'
|
||||||
|
|
||||||
|
debiannis.lan has been set up as a NIS master server.
|
||||||
|
|
||||||
|
Now you can run ypinit -s debiannis.lan on all slave server.
|
||||||
|
➜ ~
|
||||||
|
```
|
||||||
|
|
||||||
|
On the client you **don't** have to do **anything**!
|
||||||
|
|
||||||
|
```bash
|
||||||
|
➜ ~ ypcat passwd
|
||||||
|
bob:x:1001:1001:,,,:/home/bob:/bin/bash
|
||||||
|
alice:x:1002:1002:,,,:/home/alice:/bin/bash
|
||||||
|
naomi:x:1004:1004:,,,:/home/naomi:/bin/bash
|
||||||
|
bert:x:1003:1003:,,,:/home/bert:/bin/bash
|
||||||
|
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
|
||||||
|
waldek:x:1000:1000:waldek,,,:/home/waldek:/usr/bin/zsh
|
||||||
|
➜ ~
|
||||||
|
```
|
||||||
|
|
||||||
|
Both accounts are now available on the client!
|
||||||
|
Let's try switching to the `bert` or `naomi` account.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
➜ ~ su bert
|
||||||
|
su: user bert does not exist or the user entry does not contain all the required fields
|
||||||
|
➜ ~
|
||||||
|
```
|
||||||
|
|
||||||
|
This does not seem to work!
|
||||||
|
Everything is set in place to communicate with the `nis` server **but** the client machine has not been configured to **use** NIS as a valid authentication mechanism.
|
||||||
|
This is why we're looking at this first centralized authentication process because every other system, such as LDAP, also need to play by these rules.
|
||||||
|
|
||||||
|
#### Setting up the client for authentication
|
||||||
|
|
||||||
|
On each Linux system you'll find a `/etc/nsswitch.conf` file.
|
||||||
|
Let's have a look at it on our client.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
➜ ~ cat /etc/nsswitch.conf
|
||||||
|
# /etc/nsswitch.conf
|
||||||
|
#
|
||||||
|
# Example configuration of GNU Name Service Switch functionality.
|
||||||
|
# If you have the `glibc-doc-reference' and `info' packages installed, try:
|
||||||
|
# `info libc "Name Service Switch"' for information about this file.
|
||||||
|
|
||||||
|
passwd: files systemd
|
||||||
|
group: files systemd
|
||||||
|
shadow: files
|
||||||
|
gshadow: files
|
||||||
|
|
||||||
|
hosts: files dns
|
||||||
|
networks: files
|
||||||
|
|
||||||
|
protocols: db files
|
||||||
|
services: db files
|
||||||
|
ethers: db files
|
||||||
|
rpc: db files
|
||||||
|
|
||||||
|
netgroup: nis
|
||||||
|
➜ ~
|
||||||
|
```
|
||||||
|
|
||||||
|
This file describes where and how different services get there information from.
|
||||||
|
I highly advise you to have a read of the `man nsswitch.conf` pages because it's a lot more flexible than you think.
|
||||||
|
We can now either append `nis` to the necessary lines, or fully replace them.
|
||||||
|
The necessary lines are the passwd, group and shadow lines.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
➜ ~ cat /etc/nsswitch.conf
|
||||||
|
# /etc/nsswitch.conf
|
||||||
|
#
|
||||||
|
# Example configuration of GNU Name Service Switch functionality.
|
||||||
|
# If you have the `glibc-doc-reference' and `info' packages installed, try:
|
||||||
|
# `info libc "Name Service Switch"' for information about this file.
|
||||||
|
|
||||||
|
passwd: files systemd nis
|
||||||
|
group: files systemd nis
|
||||||
|
shadow: files nis
|
||||||
|
gshadow: files
|
||||||
|
|
||||||
|
hosts: files dns
|
||||||
|
networks: files
|
||||||
|
|
||||||
|
protocols: db files
|
||||||
|
services: db files
|
||||||
|
ethers: db files
|
||||||
|
rpc: db files
|
||||||
|
|
||||||
|
netgroup: nis
|
||||||
|
➜ ~
|
||||||
|
```
|
||||||
|
|
||||||
|
The last thing to do is to add a special entry in the local (on each client) passwd, group and shadow files to make *room* for accounts coming from the NIS server.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
➜ ~ sudo tail -n 2 /etc/passwd /etc/shadow /etc/group
|
||||||
|
==> /etc/passwd <==
|
||||||
|
+::::::
|
||||||
|
|
||||||
|
|
||||||
|
==> /etc/shadow <==
|
||||||
|
+::::::::
|
||||||
|
|
||||||
|
|
||||||
|
==> /etc/group <==
|
||||||
|
+:::
|
||||||
|
|
||||||
|
➜ ~
|
||||||
|
```
|
||||||
|
|
||||||
|
With this set and done we can use one centralized service to manage all of our account.
|
||||||
|
|
||||||
|
### Some tips
|
||||||
|
|
||||||
|
In short, to add a second client you need to:
|
||||||
|
|
||||||
|
1. install `nis`
|
||||||
|
2. configure the `ypbind.service` to `-broadcast`
|
||||||
|
3. enable and start the `ypbind.service`
|
||||||
|
* test the connection with `ypwhich`
|
||||||
|
4. add `nis` to the `/etc/nsswitch.conf` file as an authentication method
|
||||||
|
5. add *placeholder* lines for external accounts
|
||||||
|
* in the `/etc/passwd` file
|
||||||
|
* in the `/etc/shadow` file
|
||||||
|
* in the `/etc/group` file
|
||||||
|
|
||||||
|
If the account changes made on the server aren't reflected onto the clients, make sure your database is up to date.
|
||||||
|
If it is and the client still doesn't behave like it should, have a look at the `man nscd` pages.
|
||||||
|
Once you understand what it is, maybe try restarting it, or even disabling it all together.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue