On this page, you will find information about MatterLinux package pools.

# List
Here is a list of all the official MatterLinux software package pools, you can
find URL(s) for these pools in the [mirrors page](/wiki/mirrors).

# Base 
- **Name**: base
- **Signed with**: `F9E70878C2FB389AEC2BA34CA3654DF5AD9F641D`
- **Maintainer**: ngn | [Email](mailto:ngn@ngn.tf) [PGP](https://keys.openpgp.org/pks/lookup?op=get&options=mr&search=0xF9E70878C2FB389AEC2BA34CA3654DF5AD9F641D) 

Contains software packages for the core system (for example `glibc`, `grub`),
so you need these packages in order to have a bootable system, however the base
pool alone won't get you further from a simple installation.

# Desktop
- **Name**: desktop 
- **Signed with**: `F9E70878C2FB389AEC2BA34CA3654DF5AD9F641D`
- **Maintainer**: ngn | [Email](mailto:ngn@ngn.tf) [PGP](https://keys.openpgp.org/pks/lookup?op=get&options=mr&search=0xF9E70878C2FB389AEC2BA34CA3654DF5AD9F641D) 

Contains software packages for your desktop needs (for example `xorg`, `xfce4`),
however they are not necessarily needed for a simple installation.

# Server
- **Name**: desktop 
- **Signed with**: `F9E70878C2FB389AEC2BA34CA3654DF5AD9F641D`
- **Maintainer**: ngn | [Email](mailto:ngn@ngn.tf) [PGP](https://keys.openpgp.org/pks/lookup?op=get&options=mr&search=0xF9E70878C2FB389AEC2BA34CA3654DF5AD9F641D) 

Contains software packages for your server needs (for example `apache`, `nginx`),
similar to the `desktop` pool, you do not necessarily need these for a simple installation.

# Structure 
A pool contains:

- [Packages](/wiki/packages) (`.mpf` files)
- Package signatures (`.mpf.sig` files)
- Pool info file (`INFO`)
- Package list file (`LIST`)

### Package files and signatures
MatterLinux pools contain at least two packages. Each package also has a PGP signature 
that can be used to verify the package. These signatures belong to public key fingerprint
specified in the pool info file.

### Pool info file
Pool info file contains information about the pool itself. This information includes
- Pool name
- Pool size
- Pool maintainer
- Pool public key (used for package signatures)

This info file can be found in the at the root of the pool. For example the pool info file 
for `https://pkgs.matterlinux.xyz/base` is located at `https://pkgs.matterlinux.xyz/base/INFO`.
`.ini` format is used for this file.

### Package list file
A list containing all the package information can be found in an archive file named `LIST`.
This file is located at the root of the pool. For example the package list for `https://pkgs.matterlinux.xyz/base`
is located at `https://pkgs.matterlinux.xyz/base/LIST`.

This archive has the following structure:
```
list
├── package-one_version 
│   └── DATA
├── package-two_version
│   └── DATA 
...
```
The `DATA` file contains the information for that specific package and it's extracted from packages.
To learn more about these please check out the page for [packages](/wiki/packages).

### Pool sources
Source for a pool has a simple structure. It also contains all the source files for all the packages in
that pool. For example lets take a look the structure of the [`base`](https://pkgs.matterlinux.xyz/base) 
pool source:
```
base
├── dist
│   ├── acl_2.3.1.mpf
│   ├── acl_2.3.1.mpf.sig
│   ├── INFO
│   ...
│   ├── LIST
│   ├── sed_4.9.mpf
│   ├── sed_4.9.mpf.sig
│   ...
├── LICENSE.txt
├── README.md
├── pool.sh
├── sign-dist.sh
└── src
    ├── acl
    │   └── pkg.sh
    ├── attr
    │   └── pkg.sh
    ├── autoconf
    │   └── pkg.sh
    ├── automake
    │   └── pkg.sh
    ├── bash
    │   ├── pkg.sh
    │   ├── skelprof
    │   └── skelrc
    ...
```
Let's break this down:

- `LICENSE.txt`: License used for the pool. **All the packages in the pool should use a license
compatible with this license.**
- `README.md`: README file. Contains a small description about the pool.
- `pool.sh`: Pool script contains information about the pool, used to build the 
pool info file.
- `src`: Contains package sources (package scripts, extra patches, configuration files etc.)
- `dist`: Contains the compiled (built) packages. 
- `sign-dist.sh`: An extra shell script that you can find in the official pools. It is just a 
small script that is used to sign all the packages in the `dist` directory if they are built 
without the signatures.

# Using different pools
MatterLinux releases offer 2 different pools, `base` and `desktop`. There are also development/testing 
`base` and `desktop` pools (named "next"). URLs for these pools and the mirrors can be found at the [mirrors page](/wiki/mirrors). 

These pools can provide packages for users, these packages can be managed using the 
[MatterLinux package manager (`matt`)](/wiki/matt).

### Building an already existing pool 
To build an already existing pool, such as the `base` or the `desktop` pool, first you will need to 
download the pool's source. Source for the `base`, `desktop` and `server` pool can be found on [MatterLinux Git Server](https://git.matterlinux.xyz/matter).

After downloading the pool source, you will need to install the `mp-pool` tool, which is the tool 
used for building MatterLinux pools. To do so please you can simply install the [`mtsc`](https://git.matterlinux.xyz/matter/mtsc)
package from the `base` pool.

Finally to build the pool:
```
$ mp-pool <pool dir>
```

You will mostly likely want to disable package signing though, as you are probably don't have the 
PGP keys for the official pools:
```
$ mp-pool --no-sign <pool dir>
```

### Hosting pools
Unlike most of the package managers, `matt` does not use HTTP, FTP or RSYNC to communicate with the pools. It has it's own
custom protocol named [MPTP](/wiki/libmp). Pools are hosted over this protocol using [pooler](https://git.matterlinux.xyz/matter/pooler).

To host a pool using `pooler`, download and install the `pooler` by following the instructions on the [README](https://git.matterlinux.xyz/matter/pooler). It's also in the `server` pool so you can install it with `matt` as well. 

After installing it, you'll need to create/edit the configuration file (`/etc/pooler/config.ini`).
Here is an example configuration file:
```
# address to host the MPTP server on
addr = 0.0.0.0:5858

# pool name
[my-pool]

# pool directory
dir  = /srv/my-pool

# pool hostname
host = my-pool.example.com
```
After editing this configuration for your needs, you can run pooler with the configuration file:
```
$ pooler /etc/pooler/config.ini
```
After running this command, pooler should start hosting your pool over MPTP on port 5858. If you experience
any issues, you should check the error logs.

### Creating a new pool 
If you want to create an unofficial pool, setup the directory structure for the source pool as 
explained above. Then create a `pool.sh` script, you can copy one from the official pools and 
edit it.

After adding your packages and building them with `mp-pool`, you can host it using pooler.
I suggest you also host them on a HTTP or a FTP server just to make them easier to access.

Also you can add your unofficial pool to this wiki page [by creating an issue](https://git.matterlinux.xyz/Matter/content/issues).
