mirror of
https://github.com/omaha-consulting/winget.pro.git
synced 2026-10-25 21:29:50 +00:00
114 lines
3.5 KiB
Markdown
114 lines
3.5 KiB
Markdown
# api.winget.pro
|
|
|
|
A Python implementation of a private winget repository server (/REST API).
|
|
|
|
## Running locallly
|
|
|
|
### Install a local SSL certificate
|
|
|
|
`winget` only allows `https://` sources. This means that if we want to run
|
|
locally, then we need a self-signed SSL certificate for `localhost`.
|
|
|
|
[`localhost.pfx`](conf/localhost.pfx) can be used for this purpose. It was
|
|
created from [these instructions](https://gist.github.com/alicoskun/57acda07d5ab672a3c820da57b9531e3).
|
|
To install it, issue the following in a Powershell Admin prompt:
|
|
|
|
```bash
|
|
$password=ConvertTo-SecureString "12345" -asplaintext -force
|
|
Import-PfxCertificate -FilePath conf\localhost.pfx Cert:\LocalMachine\My -Password $password -Exportable
|
|
Import-Certificate -FilePath conf\localhost.cert -CertStoreLocation Cert:\CurrentUser\Root
|
|
```
|
|
|
|
To remove it later, run `mmc`, click `File/Add or Remove Snap-in` then
|
|
`Certificates/Add/My User account` then `Finish` and again for
|
|
`Computer account`. Then click `OK`. Then delete `localhost` expiring 2041 from
|
|
`Current User/Personal`, `Current User/Trusted Root Certification Authorities`,
|
|
and `Local Computer/Personal`.
|
|
|
|
### Set up the development environment
|
|
|
|
pip install -Ur requirements/base-full.txt
|
|
|
|
### Initialise the database
|
|
|
|
1. Run `python manage.py migrate`
|
|
2. Run `python manage.py createsuperuser`
|
|
3. Run `python manage.py runserver`
|
|
4. Log into `/admin` and create a _Tenant_.
|
|
|
|
### Run locally
|
|
|
|
python manage.py runserver
|
|
|
|
Then:
|
|
|
|
python sslproxy.py
|
|
|
|
Then you can add the REST source (note the `httpS`):
|
|
|
|
winget source add -n dev -a https://localhost:8443/ab... -t "Microsoft.Rest"
|
|
|
|
Here, `ab...` is the UUID of the Tenant.
|
|
|
|
Then you can perform queries against the new source. Eg.:
|
|
|
|
winget search "search term" -s dev
|
|
|
|
## Sniffing Microsoft's implementation
|
|
|
|
Look at the `msstore` source shown by `winget source list`. Typically, it is:
|
|
|
|
https://storeedgefd.dsx.mp.microsoft.com/v9.0
|
|
|
|
Start `sslproxy` as a man-in-the-middle proxy for the above domain:
|
|
|
|
python sslproxy.py 8444 storeedgefd.dsx.mp.microsoft.com 443
|
|
|
|
Then you can add the proxied source via:
|
|
|
|
winget source add -n ms -a https://localhost:8444/v9.0 -t "Microsoft.Rest"
|
|
|
|
(Note that we used the path `/v9.0` from above.)
|
|
|
|
Now you can inspect the traffic in the output of `sslproxy` when you perform
|
|
`winget` commands such as:
|
|
|
|
winget search "search term" -s ms
|
|
|
|
## Deploying
|
|
|
|
Upload [`install.sh`](install.sh) and a `.bashrc` file with the settings below
|
|
to a Debian 11 server, then run `install.sh` as root.
|
|
|
|
```bash
|
|
# Email address of server administrator.
|
|
export ADMIN_EMAIL=michael.herrmann@omaha-consulting.com
|
|
|
|
# The domain under which this server runs
|
|
export HOST_NAME=api.winget.pro
|
|
|
|
# The server that hosts this repository:
|
|
export GIT_SERVER=github.com
|
|
|
|
# The path on GIT_SERVER where this repository lies:
|
|
export GIT_REPO_NAME=omaha-consulting/api.winget.pro
|
|
|
|
# The branch of this repository that should be checked out:
|
|
export GIT_REPO_BRANCH=main
|
|
|
|
# The SSH public key for fetching this repository from GIT_SERVER:
|
|
export GIT_REPO_PUBKEY="ssh-rsa ... user@machine"
|
|
|
|
# The SSH private key for fetching this repository from GIT_SERVER.
|
|
# "\n"s separate lines:
|
|
export GIT_REPO_PRIVKEY="-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----"
|
|
|
|
# Emails to the admin will be sent via this account:
|
|
export SMTP_HOST=email-smtp.eu-central-1.amazonaws.com
|
|
export SMTP_USER=ABC123...
|
|
export SMTP_PASSWORD=aBc1234...
|
|
export SMTP_FROM=api.winget.pro@servers.omaha-consulting.com
|
|
|
|
# Django SECRET_KEY:
|
|
export SECRET_KEY=atLeast50RandomChars
|
|
``` |