mirror of
https://github.com/jakeswenson/BitBetter.git
synced 2025-05-27 16:03:26 +00:00
Compare commits
34 Commits
8e6429d533
...
3c703f517d
Author | SHA1 | Date | |
---|---|---|---|
|
3c703f517d | ||
|
b93c9487eb | ||
|
e173c06320 | ||
|
80c0808e72 | ||
|
b819fe0c7d | ||
|
960894cff4 | ||
|
6038a8668b | ||
|
101f078a98 | ||
|
338ea68b08 | ||
|
a58baf0186 | ||
|
50cdb10b2c | ||
|
d2377d0f84 | ||
|
0f2f9274cf | ||
|
af2d744061 | ||
|
a17681e82b | ||
|
21bffcf262 | ||
|
59ee2e3c3a | ||
|
7ddf01fdf6 | ||
|
46934b0ddd | ||
|
a5516220fd | ||
|
91d0155725 | ||
|
f2b3b1babf | ||
|
7d8f0b1082 | ||
|
6527ac8362 | ||
|
faf7833f44 | ||
|
006fa1fecf | ||
|
9c62a6f2ca | ||
|
a2189a874e | ||
|
d98d4cad6a | ||
|
3e44d7347b | ||
|
5d01d3c661 | ||
|
6c8789cd67 | ||
|
15371c362c | ||
|
5f85d83e45 |
|
@ -1,15 +1,15 @@
|
|||
version: 2
|
||||
jobs:
|
||||
build:
|
||||
docker:
|
||||
- image: microsoft/dotnet:2-sdk
|
||||
machine: true
|
||||
steps:
|
||||
- checkout
|
||||
- run:
|
||||
name: Print the Current Time
|
||||
command: date
|
||||
- setup_remote_docker
|
||||
- run: { name: 'Get docker', command: 'curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh' }
|
||||
- run:
|
||||
name: Generate Keys
|
||||
command: ./.keys/generate-keys.sh
|
||||
- run:
|
||||
name: Build script
|
||||
command: ./build.sh
|
||||
|
|
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -4,4 +4,5 @@ obj/
|
|||
*.dll
|
||||
*.pem
|
||||
.vscode/
|
||||
*.pfx
|
||||
*.pfx
|
||||
*.cert
|
|
@ -3,13 +3,18 @@
|
|||
# Check for openssl
|
||||
command -v openssl >/dev/null 2>&1 || { echo >&2 "openssl required but not found. Aborting."; exit 1; }
|
||||
|
||||
DIR=`dirname "$0"`
|
||||
DIR=`exec 2>/dev/null;(cd -- "$DIR") && cd -- "$DIR"|| cd "$DIR"; unset PWD; /usr/bin/pwd || /bin/pwd || pwd`
|
||||
|
||||
# Remove any existing key files
|
||||
[ ! -e cert.pem ] || rm cert.pem
|
||||
[ ! -e key.pem ] || rm key.pem
|
||||
[ ! -e cert.cert ] || rm cert.cert
|
||||
[ ! -e cert.pfx ] || rm cert.pfx
|
||||
[ ! -e "$DIR/cert.pem" ] || rm "$DIR/cert.pem"
|
||||
[ ! -e "$DIR/key.pem" ] || rm "$DIR/key.pem"
|
||||
[ ! -e "$DIR/cert.cert" ] || rm "$DIR/cert.cert"
|
||||
[ ! -e "$DIR/cert.pfx" ] || rm "$DIR/cert.pfx"
|
||||
|
||||
# Generate new keys
|
||||
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.cert -days 36500 -outform DER -passout pass:test
|
||||
openssl x509 -inform DER -in cert.cert -out cert.pem
|
||||
openssl pkcs12 -export -out cert.pfx -inkey key.pem -in cert.pem -passin pass:test -passout pass:test
|
||||
openssl req -x509 -newkey rsa:4096 -keyout "$DIR/key.pem" -out "$DIR/cert.cert" -days 36500 -subj '/CN=www.mydom.com/O=My Company Name LTD./C=US' -outform DER -passout pass:test
|
||||
openssl x509 -inform DER -in "$DIR/cert.cert" -out "$DIR/cert.pem"
|
||||
openssl pkcs12 -export -out "$DIR/cert.pfx" -inkey "$DIR/key.pem" -in "$DIR/cert.pem" -passin pass:test -passout pass:test
|
||||
|
||||
ls
|
||||
|
|
167
README.md
167
README.md
|
@ -1,53 +1,79 @@
|
|||
# BitBetter
|
||||
|
||||
BitBetter is is a tool to modify bitwardens core dll to allow you to generate your own individual and organisation licenses. Please see the FAQ below for details on why this software was created.
|
||||
BitBetter is is a tool to modify Bitwarden's core dll to allow you to generate your own individual and organisation licenses. **You must have an existing installation of Bitwarden for BitBetter to modify.**
|
||||
|
||||
_Beware! BitBetter does janky IL magic to rewrite the bitwarden core dll and install a self signed certificate. Use at your own risk!_
|
||||
Please see the FAQ below for details on why this software was created.
|
||||
|
||||
Credit to https://github.com/h44z/BitBetter and https://github.com/jakeswenson/BitBetter
|
||||
_Beware! BitBetter does janky stuff to rewrite the bitwarden core dll and allow the installation of a self signed certificate. Use at your own risk!_
|
||||
|
||||
Credit to https://github.com/h44z/BitBetter and https://github.com/jakeswenson/BitBetter
|
||||
|
||||
# Table of Contents
|
||||
1. [Getting Started](#gettingstarted)
|
||||
+ [Pre-requisites](#prereq)
|
||||
+ [Setting up BitBetter](#setup)
|
||||
+ [Building BitBetter](#building)
|
||||
+ [Generating Signed Licenses](#generating)
|
||||
2. [FAQ](#faq)
|
||||
3. [Footnotes](#footnotes)
|
||||
- [BitBetter](#bitbetter)
|
||||
- [Table of Contents](#table-of-contents)
|
||||
- [Getting Started](#getting-started)
|
||||
- [Dependencies](#dependencies)
|
||||
- [Setting up BitBetter](#setting-up-bitbetter)
|
||||
- [Building BitBetter](#building-bitbetter)
|
||||
- [Note: Manually generating Certificate & Key](#note-manually-generating-certificate--key)
|
||||
- [Updating Bitwarden and BitBetter](#updating-bitwarden-and-bitbetter)
|
||||
- [Generating Signed Licenses](#generating-signed-licenses)
|
||||
- [Note: Alternative Ways to Generate License](#note-alternative-ways-to-generate-license)
|
||||
- [FAQ: Questions you might have.](#faq-questions-you-might-have)
|
||||
- [Why build a license generator for open source software?](#why-build-a-license-generator-for-open-source-software)
|
||||
- [Shouldn't you have reached out to Bitwarden to ask them for alternative licensing structures?](#shouldnt-you-have-reached-out-to-bitwarden-to-ask-them-for-alternative-licensing-structures)
|
||||
- [Footnotes](#footnotes)
|
||||
|
||||
# Getting Started <a name=#gettingstarted></a>
|
||||
# Getting Started
|
||||
The following instructions are for unix-based systems (Linux, BSD, macOS), it is possible to use a Windows systems assuming you are able to enable and install [WSL](https://docs.microsoft.com/en-us/windows/wsl/install-win10).
|
||||
|
||||
## Pre-requisites <a name=#prereq></a>
|
||||
## Dependencies
|
||||
Aside from docker, which you also need for Bitwarden, BitBetter requires the following:
|
||||
|
||||
* openssl (probably already installed on most Linux or WSL systems)
|
||||
* dotnet-sdk-2.1 (install instructions can be found [here](https://dotnet.microsoft.com/download/linux-package-manager/rhel/sdk-2.1.604))
|
||||
* Bitwarden (tested with 1.47.1, might work on lower versions)
|
||||
* openssl (probably already installed on most Linux or WSL systems, any version should work)
|
||||
|
||||
## Setting up BitBetter <a name=#setup></a>
|
||||
With your pre-requisites installed, begin the installation of BitBetter by downloading it through Github or using the git command:
|
||||
## Setting up BitBetter
|
||||
With your dependencies installed, begin the installation of BitBetter by downloading it through Github or using the git command:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/online-stuff/BitBetter.git
|
||||
git clone https://github.com/jakeswenson/BitBetter.git
|
||||
```
|
||||
|
||||
First, we need to add the correct version of Newtonsoft.Json to the license generator and the BitBetter docker directories.
|
||||
## Building BitBetter
|
||||
|
||||
Now that you've set up your build environment, you can **run the main build script** to generate a modified version of the `bitwarden/api` and `bitwarden/identity` docker images.
|
||||
|
||||
From the BitBetter directory, simply run:
|
||||
```bash
|
||||
cd BitBetter/src/licenseGen/
|
||||
dotnet add package Newtonsoft.Json --version 12.0.1
|
||||
|
||||
cd ../bitBetter
|
||||
dotnet add package Newtonsoft.Json --version 12.0.1
|
||||
./build.sh
|
||||
```
|
||||
|
||||
Next, we need to generate the self-signed certificate we will use to sign any licenses we generate.
|
||||
This will create a new self-signed certificate in the `.keys` directory if one does not already exist and then create a modified version of the official `bitwarden/api` called `bitbetter/api` and a modified version of the `bitwarden/identity` called `bitbetter/identity`.
|
||||
|
||||
To sign your own license you first need to generate your own signing cert using the `.keys/generate-keys.sh` script.
|
||||
You may now simply create the file `/path/to/bwdata/docker/docker-compose.override.yml` with the following contents to utilize the modified images.
|
||||
|
||||
Running this script will prompt you to enter some information about your new certificate, you may leave these at the defaults or set them to your preference. The script will then create a pkcs12 file (.pfx) containing your new key/cert.
|
||||
```yaml
|
||||
version: '3'
|
||||
|
||||
You may also choose to do this manually via the following commands.
|
||||
services:
|
||||
api:
|
||||
image: bitbetter/api
|
||||
|
||||
identity:
|
||||
image: bitbetter/identity
|
||||
```
|
||||
|
||||
You'll also want to edit the `/path/to/bwdata/scripts/run.sh` file. In the `function restart()` block, comment out the call to `dockerComposePull`.
|
||||
|
||||
> Replace `dockerComposePull`<br>with `#dockerComposePull`
|
||||
|
||||
You can now start or restart Bitwarden as normal and the modified api will be used. **It is now ready to accept self-issued licenses.**
|
||||
|
||||
---
|
||||
### Note: Manually generating Certificate & Key
|
||||
|
||||
If you wish to generate your self-signed cert & key manually, you can run the following commands.
|
||||
|
||||
```bash
|
||||
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.cert -days 36500 -outform DER -passout pass:test
|
||||
|
@ -55,70 +81,87 @@ openssl x509 -inform DER -in cert.cert -out cert.pem
|
|||
openssl pkcs12 -export -out cert.pfx -inkey key.pem -in cert.pem -passin pass:test -passout pass:test
|
||||
```
|
||||
|
||||
Note that the password here must be `test`.<sup>[1](#f1)</sup>
|
||||
> Note that the password here must be `test`.<sup>[1](#f1)</sup>
|
||||
|
||||
## Building BitBetter <a name=#building></a>
|
||||
---
|
||||
|
||||
Now that you've generated your own own self-signed certificate, you can run the main `BitBetter/build.sh` script to generate a modified version of the `bitwarden/api` docker image.
|
||||
## Updating Bitwarden and BitBetter
|
||||
|
||||
From the BitBetter directory, simply run:
|
||||
To update Bitwarden, the provided `update-bitwarden.sh` script can be used. It will rebuild the BitBetter images and automatically update Bitwarden afterwards. Docker pull errors can be ignored for api and identity images.
|
||||
|
||||
You can either run this script without providing any parameters in interactive mode (`./update-bitwarden.sh`) or by setting the parameters as follows, to run the script in non-interactive mode:
|
||||
```bash
|
||||
./build.sh
|
||||
./update-bitwarden.sh param1 param2 param3
|
||||
```
|
||||
`param1`: The path to the directory containing your bwdata directory
|
||||
|
||||
This will create a modified version of the official `bitwarden/api` called `bitbetter/api`. You may now simply edit your bitwarden docker-compose.yml to utilize the modified image.
|
||||
`param2`: If you want the docker-compose file to be overwritten (either `y` or `n`)
|
||||
|
||||
Edit your `/path/to/bwdata/docker/docker-compose.yml`.
|
||||
`param3`: If you want the bitbetter images to be rebuild (either `y` or `n`)
|
||||
|
||||
> Replace `image: bitwarden/api:x.xx.x`<br>with `image: bitbetter/api`
|
||||
If you are updating from versions <= 1.46.2, you may need to run `update-bitwarden.sh` twice to complete the update process.
|
||||
|
||||
You'll also want to edit the `/path/to/bwdata/scripts/run.sh` file. In the `function restart()` block, comment out the call to `dockerComposePull`.
|
||||
|
||||
> Replace `dockerComposePull`<br>with `#dockerComposePull`
|
||||
|
||||
You can now start or restart Bitwarden as normal and the modified api will be used. <b>It is now ready to accept self-issued licenses.</b>
|
||||
|
||||
## Generating Signed Licenses <a name=#generating></a>
|
||||
## Generating Signed Licenses
|
||||
|
||||
There is a tool included in the directory `src/licenseGen/` that will generate new individual and organization licenses. These licenses will be accepted by the modified Bitwarden because they will be signed by the certificate you generated in earlier steps.
|
||||
|
||||
First, from the `BitBetter/src/licenseGen` directory, build the license generator.<sup>[2](#f2)</sup>
|
||||
|
||||
First, from the `BitBetter/src/licenseGen` directory, **build the license generator**.<sup>[2](#f2)</sup>
|
||||
|
||||
```bash
|
||||
./build.sh
|
||||
```
|
||||
|
||||
Now, from the `BitBetter/src/licenseGen` directory, you can run the tool to generate licenses.
|
||||
In order to run the tool and generate a license you'll need to get a **user's GUID** in order to generate an **invididual license** or the server's **install ID** to generate an **Organization license**. These can be retrieved most easily through the Bitwarden [Admin Portal](https://help.bitwarden.com/article/admin-portal/).
|
||||
|
||||
You'll need to get a user's <b>GUID</b> in order to generate an <b>invididual license</b> and the server's <b>install ID</b> to generate an <b>Organization license</b>. These can be retrieved most easily through the Bitwarden [Admin Portal](https://help.bitwarden.com/article/admin-portal/).
|
||||
**The user must have a verified email address at the time of license import, otherwise Bitwarden will reject the license key. Nevertheless, the license key can be generated even before the user's email is verified.**
|
||||
|
||||
If you generated your keys in the default `BitBetter/.keys` directory, you can **simply run the license gen in interactive mode** from the `Bitbetter` directory and **follow the prompts to generate your license**.
|
||||
|
||||
```bash
|
||||
./run.sh ~/BitBetter/.keys/cert.pfx user "Name" "EMail" "User-GUID"
|
||||
./run.sh ~/BitBetter/.keys/cert.pfx org "Name" "EMail" "Install-ID used to install the server"
|
||||
./src/licenseGen/run.sh interactive
|
||||
```
|
||||
|
||||
<b>The license generator will spit out a JSON-formatted license which can then be used within the Bitwarden web front-end to license your user or org!</b>
|
||||
**The license generator will spit out a JSON-formatted license which can then be used within the Bitwarden web front-end to license your user or org!**
|
||||
|
||||
# FAQ: Questions (you might have?) <a name=#faq></a>
|
||||
---
|
||||
|
||||
I'll work on updates in the next couple weeks, right now, I just wanted something to start with.
|
||||
### Note: Alternative Ways to Generate License
|
||||
|
||||
## But why? Its open source?
|
||||
If you wish to run the license gen from a directory aside from the root `BitBetter` one, you'll have to provide the absolute path to your cert.pfx.
|
||||
|
||||
Yes, bitwarden is great. If I didn't care about it i wouldn't be doing this.
|
||||
I was bothered that if i want to host bitwarden myself, at my house,
|
||||
for my family to use (with the ability to share access) I would still have to pay a monthly ENTERPRISE organization fee.
|
||||
To host it myself. And maintain it myself. Basically WTH was bitwarden doing that I was paying them for?
|
||||
```bash
|
||||
./src/licenseGen/run.sh /Absolute/Path/To/BitBetter/.keys/cert.pfx interactive
|
||||
```
|
||||
|
||||
## You should have reached out to bitwarden
|
||||
Additional, instead of interactive mode, you can also pass the parameters directly to the command as follows.
|
||||
|
||||
Thanks, good idea. And I did. Currently they're not focused on solving this issue - yet.
|
||||
To be clear i'm totally happy to give them my money. Offer a perpetual server license, and i'd pay for it. Let me license the server, period. Allow an orginzation to have Premium for all users.. 500 seats, let the 500 users in the orginzation have the Premium features too.
|
||||
```bash
|
||||
./src/licenseGen/run.sh /Absolute/Path/To/BitBetter/.keys/cert.pfx user "Name" "E-Mail" "User-GUID" ["Storage Space in GB"] ["Custom LicenseKey"]
|
||||
./src/licenseGen/run.sh /Absolute/Path/To/BitBetter/.keys/cert.pfx org "Name" "E-Mail" "Install-ID used to install the server" ["Storage Space in GB"] ["Custom LicenseKey"]
|
||||
```
|
||||
|
||||
I'm still in the testing/evaluating phase. If I am hosting the server/data, let me license the server, period. How many licenses does one user need to have...
|
||||
---
|
||||
|
||||
# Footnotes <a name=#footnotes></a>
|
||||
|
||||
<a name="#f1"><sup>1</sup></a> If you wish to change this you'll need to change the value that `src/licenseGen/Program.cs` uses for it's `GenerateUserLicense` and `GenerateOrgLicense` calls, but this is really unnecessary as this certificate does not represent any type of security issue.
|
||||
# FAQ: Questions you might have.
|
||||
|
||||
## Why build a license generator for open source software?
|
||||
|
||||
We agree that Bitwarden is great. If we didn't care about it then we wouldn't be doing this. We believe that if a user wants to host Bitwarden themselves, in their house, for their family to use and with the ability to share access, they would still have to pay a **monthly** enterprise organization fee. When hosting and maintaining the software yourself there is no need to pay for the level of service that an enterprise customer needs.
|
||||
|
||||
Unfortunately, Bitwarden doesn't seem to have any method for receiving donations so we recommend making a one-time donation to your open source project of choice for each BitBetter license you generate if you can afford to do so.
|
||||
|
||||
## Shouldn't you have reached out to Bitwarden to ask them for alternative licensing structures?
|
||||
|
||||
In the past we have done so but they were not focused on the type of customer that would want a one-time license and would be happy to sacrifice customer service. We believe the features that are currently behind this subscription paywall to be critical ones and believe they should be available to users who can't afford an enterprise payment structure. We'd even be happy to see a move towards a Gitlab-like model where premium features are rolled out *first* to the enterprise subscribers before being added to the fully free version.
|
||||
|
||||
UPDATE: Bitwarden now offers a cheap license called [Families Organization](https://bitwarden.com/pricing/) that provides premium features and the ability to self-host Bitwarden for six persons.
|
||||
|
||||
|
||||
# Footnotes
|
||||
|
||||
<a name="#f1"><sup>1</sup></a> If you wish to change this you'll need to change the value that `src/licenseGen/Program.cs` uses for its `GenerateUserLicense` and `GenerateOrgLicense` calls. Remember, this is really unnecessary as this certificate does not represent any type of security-related certificate.
|
||||
|
||||
<a name="#f2"><sup>2</sup></a>This tool builds on top of the `bitbetter/api` container image so make sure you've built that above using the root `./build.sh` script.
|
||||
|
||||
<a name="#f2"><sup>2</sup></a>This tool build ontop of the `bitbetter/api` container image so make sure you've built that above using the root `./build.sh` script.
|
29
build.sh
29
build.sh
|
@ -1,13 +1,28 @@
|
|||
#!/bin/bash
|
||||
#!/bin/sh
|
||||
|
||||
mkdir ./src/bitBetter/.keys
|
||||
DIR=`dirname "$0"`
|
||||
DIR=`exec 2>/dev/null;(cd -- "$DIR") && cd -- "$DIR"|| cd "$DIR"; unset PWD; /usr/bin/pwd || /bin/pwd || pwd`
|
||||
BW_VERSION=$(curl -sL https://go.btwrdn.co/bw-sh-versions | grep '^ *"'coreVersion'":' | awk -F\: '{ print $2 }' | sed -e 's/,$//' -e 's/^"//' -e 's/"$//')
|
||||
|
||||
cp .keys/cert.cert ./src/bitBetter/.keys
|
||||
echo "Building BitBetter for BitWarden version $BW_VERSION"
|
||||
|
||||
cd ./src/bitBetter
|
||||
# If there aren't any keys, generate them first.
|
||||
[ -e "$DIR/.keys/cert.cert" ] || "$DIR/.keys/generate-keys.sh"
|
||||
|
||||
dotnet restore
|
||||
dotnet publish
|
||||
[ -e "$DIR/src/bitBetter/.keys" ] || mkdir "$DIR/src/bitBetter/.keys"
|
||||
|
||||
docker build --pull . -t bitbetter/api # --squash
|
||||
cp "$DIR/.keys/cert.cert" "$DIR/src/bitBetter/.keys"
|
||||
|
||||
docker run --rm -v "$DIR/src/bitBetter:/bitBetter" -w=/bitBetter mcr.microsoft.com/dotnet/sdk:8.0 sh build.sh
|
||||
|
||||
docker build --no-cache --build-arg BITWARDEN_TAG=bitwarden/api:$BW_VERSION --label com.bitwarden.product="bitbetter" -t bitbetter/api "$DIR/src/bitBetter" # --squash
|
||||
docker build --no-cache --build-arg BITWARDEN_TAG=bitwarden/identity:$BW_VERSION --label com.bitwarden.product="bitbetter" -t bitbetter/identity "$DIR/src/bitBetter" # --squash
|
||||
|
||||
docker tag bitbetter/api bitbetter/api:latest
|
||||
docker tag bitbetter/identity bitbetter/identity:latest
|
||||
docker tag bitbetter/api bitbetter/api:$BW_VERSION
|
||||
docker tag bitbetter/identity bitbetter/identity:$BW_VERSION
|
||||
|
||||
# Remove old instances of the image after a successful build.
|
||||
ids=$( docker images bitbetter/* | grep -E -v -- "CREATED|latest|${BW_VERSION}" | awk '{ print $3 }' )
|
||||
[ -n "$ids" ] && docker rmi $ids || true
|
||||
|
|
Binary file not shown.
|
@ -1,12 +1,11 @@
|
|||
FROM bitwarden/api
|
||||
ARG BITWARDEN_TAG
|
||||
FROM ${BITWARDEN_TAG}
|
||||
|
||||
COPY bin/Debug/netcoreapp2.0/publish/* /bitBetter/
|
||||
COPY bin/Release/netcoreapp8.0/publish/* /bitBetter/
|
||||
COPY ./.keys/cert.cert /newLicensing.cer
|
||||
|
||||
RUN dotnet /bitBetter/bitBetter.dll && \
|
||||
echo "modified dll" && \
|
||||
RUN set -e; set -x; \
|
||||
dotnet /bitBetter/bitBetter.dll && \
|
||||
mv /app/Core.dll /app/Core.orig.dll && \
|
||||
mv /app/modified.dll /app/Core.dll && \
|
||||
echo "replaced dll" && \
|
||||
rm -rf /bitBetter && rm -rf /newLicensing.cer && \
|
||||
echo "cleaned up"
|
||||
rm -rf /bitBetter && rm -rf /newLicensing.cer
|
||||
|
|
|
@ -51,10 +51,10 @@ namespace bitwardenSelfLicensor
|
|||
|
||||
var existingCert = new X509Certificate2(x.GetResourceData());
|
||||
|
||||
Console.WriteLine($"Existing Cert Thumbprin: {existingCert.Thumbprint}");
|
||||
Console.WriteLine($"Existing Cert Thumbprint: {existingCert.Thumbprint}");
|
||||
X509Certificate2 certificate = new X509Certificate2(cert);
|
||||
|
||||
Console.WriteLine($"New cert Thumbprint: {certificate.Thumbprint}");
|
||||
Console.WriteLine($"New Cert Thumbprint: {certificate.Thumbprint}");
|
||||
|
||||
var ctor = licensingType.GetConstructors().Single();
|
||||
|
||||
|
|
|
@ -2,11 +2,11 @@
|
|||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>netcoreapp2.0</TargetFramework>
|
||||
<TargetFramework>netcoreapp8.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Mono.Cecil" Version="0.10.0-beta6" />
|
||||
<PackageReference Include="Mono.Cecil" Version="0.11.2" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
|
7
src/bitBetter/build.sh
Executable file
7
src/bitBetter/build.sh
Executable file
|
@ -0,0 +1,7 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
set -x
|
||||
|
||||
dotnet restore
|
||||
dotnet publish
|
|
@ -1,5 +1,17 @@
|
|||
FROM mcr.microsoft.com/dotnet/sdk:8.0 as build
|
||||
|
||||
WORKDIR /licenseGen
|
||||
|
||||
COPY . /licenseGen
|
||||
|
||||
RUN set -e; set -x; \
|
||||
dotnet add package Newtonsoft.Json --version 13.0.1 \
|
||||
&& dotnet restore \
|
||||
&& dotnet publish
|
||||
|
||||
|
||||
FROM bitbetter/api
|
||||
|
||||
COPY bin/Debug/netcoreapp2.0/publish/* /app/
|
||||
COPY --from=build /licenseGen/bin/Release/netcoreapp8.0/publish/* /app/
|
||||
|
||||
ENTRYPOINT [ "dotnet", "/app/licenseGen.dll", "--core", "/app/Core.dll", "--cert", "/cert.pfx" ]
|
||||
ENTRYPOINT [ "dotnet", "/app/licenseGen.dll", "--core", "/app/Core.dll", "--cert", "/cert.pfx" ]
|
||||
|
|
|
@ -33,11 +33,141 @@ namespace bitwardenSelfLicensor
|
|||
certExists() && coreExists();
|
||||
}
|
||||
|
||||
app.Command("interactive", config =>
|
||||
{
|
||||
string buff="", licensetype="", name="", email="", businessname="";
|
||||
short storage = 0;
|
||||
|
||||
bool valid_guid = false, valid_installid = false;
|
||||
Guid guid = new Guid(), installid = new Guid();
|
||||
|
||||
config.OnExecute(() =>
|
||||
{
|
||||
if (!verifyTopOptions())
|
||||
{
|
||||
if (!coreExists()) config.Error.WriteLine($"Cant find core dll at: {coreDll.Value()}");
|
||||
if (!certExists()) config.Error.WriteLine($"Cant find certificate at: {cert.Value()}");
|
||||
|
||||
config.ShowHelp();
|
||||
return 1;
|
||||
}
|
||||
|
||||
WriteLine("Interactive license mode...");
|
||||
|
||||
while (licensetype == "")
|
||||
{
|
||||
WriteLine("What would you like to generate, a [u]ser license or an [o]rg license?");
|
||||
buff = Console.ReadLine();
|
||||
|
||||
if(buff == "u")
|
||||
{
|
||||
licensetype = "user";
|
||||
WriteLineOver("Okay, we will generate a user license.");
|
||||
|
||||
while (valid_guid == false)
|
||||
{
|
||||
WriteLine("Please provide the user's guid — refer to the Readme for details on how to retrieve this. [GUID]:");
|
||||
buff = Console.ReadLine();
|
||||
|
||||
if (Guid.TryParse(buff, out guid))valid_guid = true;
|
||||
else WriteLineOver("The user-guid provided does not appear to be valid.");
|
||||
}
|
||||
}
|
||||
else if (buff == "o")
|
||||
{
|
||||
licensetype = "org";
|
||||
WriteLineOver("Okay, we will generate an organization license.");
|
||||
|
||||
while (valid_installid == false)
|
||||
{
|
||||
WriteLine("Please provide your Bitwarden Install-ID — refer to the Readme for details on how to retrieve this. [Install-ID]:");
|
||||
buff = Console.ReadLine();
|
||||
|
||||
if (Guid.TryParse(buff, out installid)) valid_installid = true;
|
||||
else WriteLineOver("The install-id provided does not appear to be valid.");
|
||||
}
|
||||
|
||||
while (businessname == "")
|
||||
{
|
||||
WriteLineOver("Please enter a business name, default is BitBetter. [Business Name]:");
|
||||
buff = Console.ReadLine();
|
||||
if (buff == "") businessname = "BitBetter";
|
||||
else if (checkBusinessName(buff)) businessname = buff;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
WriteLineOver("Unrecognized option \'" + buff + "\'. ");
|
||||
}
|
||||
}
|
||||
|
||||
while (name == "")
|
||||
{
|
||||
WriteLineOver("Please provide the username this license will be registered to. [username]:");
|
||||
buff = Console.ReadLine();
|
||||
if ( checkUsername(buff) ) name = buff;
|
||||
}
|
||||
|
||||
while (email == "")
|
||||
{
|
||||
WriteLineOver("Please provide the email address for the user " + name + ". [email]");
|
||||
buff = Console.ReadLine();
|
||||
if ( checkEmail(buff) ) email = buff;
|
||||
}
|
||||
|
||||
while (storage == 0)
|
||||
{
|
||||
WriteLineOver("Extra storage space for the user " + name + ". (max.: " + short.MaxValue + "). Defaults to maximum value. [storage]");
|
||||
buff = Console.ReadLine();
|
||||
if (string.IsNullOrWhiteSpace(buff))
|
||||
{
|
||||
storage = short.MaxValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (checkStorage(buff)) storage = short.Parse(buff);
|
||||
}
|
||||
}
|
||||
|
||||
if (licensetype == "user")
|
||||
{
|
||||
WriteLineOver("Confirm creation of \"user\" license for username: \"" + name + "\", email: \"" + email + "\", Storage: \"" + storage + " GB\", User-GUID: \"" + guid + "\"? Y/n");
|
||||
buff = Console.ReadLine();
|
||||
if ( buff == "" || buff == "y" || buff == "Y" )
|
||||
{
|
||||
GenerateUserLicense(new X509Certificate2(cert.Value(), "test"), coreDll.Value(), name, email, storage, guid, null);
|
||||
}
|
||||
else
|
||||
{
|
||||
WriteLineOver("Exiting...");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else if (licensetype == "org")
|
||||
{
|
||||
WriteLineOver("Confirm creation of \"organization\" license for business name: \"" + businessname + "\", username: \"" + name + "\", email: \"" + email + "\", Storage: \"" + storage + " GB\", Install-ID: \"" + installid + "\"? Y/n");
|
||||
buff = Console.ReadLine();
|
||||
if ( buff == "" || buff == "y" || buff == "Y" )
|
||||
{
|
||||
GenerateOrgLicense(new X509Certificate2(cert.Value(), "test"), coreDll.Value(), name, email, storage, installid, businessname, null);
|
||||
}
|
||||
else
|
||||
{
|
||||
WriteLineOver("Exiting...");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
});
|
||||
});
|
||||
|
||||
app.Command("user", config =>
|
||||
{
|
||||
var name = config.Argument("Name", "your name");
|
||||
var email = config.Argument("Email", "your email");
|
||||
var userIdArg = config.Argument("User ID", "your user id");
|
||||
var storage = config.Argument("Storage", "extra storage space in GB. Maximum is " + short.MaxValue + " (optional, default = max)");
|
||||
var key = config.Argument("Key", "your key id (optional)");
|
||||
var help = config.HelpOption("--help | -h | -?");
|
||||
|
||||
|
@ -64,7 +194,6 @@ namespace bitwardenSelfLicensor
|
|||
return 1;
|
||||
}
|
||||
|
||||
|
||||
if (string.IsNullOrWhiteSpace(userIdArg.Value) || !Guid.TryParse(userIdArg.Value, out Guid userId))
|
||||
{
|
||||
config.Error.WriteLine($"User ID not provided");
|
||||
|
@ -72,7 +201,20 @@ namespace bitwardenSelfLicensor
|
|||
return 1;
|
||||
}
|
||||
|
||||
GenerateUserLicense(new X509Certificate2(cert.Value(), "test"), coreDll.Value(), name.Value, email.Value, userId, key.Value);
|
||||
short storageShort = 0;
|
||||
if (!string.IsNullOrWhiteSpace(storage.Value))
|
||||
{
|
||||
var parsedStorage = double.Parse(storage.Value);
|
||||
if (parsedStorage > short.MaxValue || parsedStorage < 0)
|
||||
{
|
||||
config.Error.WriteLine("The storage value provided is outside the accepted range of [0-" + short.MaxValue + "]");
|
||||
config.ShowHelp("org");
|
||||
return 1;
|
||||
}
|
||||
storageShort = (short) parsedStorage;
|
||||
}
|
||||
|
||||
GenerateUserLicense(new X509Certificate2(cert.Value(), "test"), coreDll.Value(), name.Value, email.Value, storageShort, userId, key.Value);
|
||||
|
||||
return 0;
|
||||
});
|
||||
|
@ -82,6 +224,8 @@ namespace bitwardenSelfLicensor
|
|||
var name = config.Argument("Name", "your name");
|
||||
var email = config.Argument("Email", "your email");
|
||||
var installId = config.Argument("InstallId", "your installation id (GUID)");
|
||||
var storage = config.Argument("Storage", "extra storage space in GB. Maximum is " + short.MaxValue + " (optional, default = max)");
|
||||
var businessName = config.Argument("BusinessName", "name for the organization (optional)");
|
||||
var key = config.Argument("Key", "your key id (optional)");
|
||||
var help = config.HelpOption("--help | -h | -?");
|
||||
|
||||
|
@ -118,7 +262,20 @@ namespace bitwardenSelfLicensor
|
|||
return 1;
|
||||
}
|
||||
|
||||
GenerateOrgLicense(new X509Certificate2(cert.Value(), "test"), coreDll.Value(), name.Value, email.Value, installationId, key.Value);
|
||||
short storageShort = 0;
|
||||
if (!string.IsNullOrWhiteSpace(storage.Value))
|
||||
{
|
||||
var parsedStorage = double.Parse(storage.Value);
|
||||
if (parsedStorage > short.MaxValue || parsedStorage < 0)
|
||||
{
|
||||
config.Error.WriteLine("The storage value provided is outside the accepted range of [0-" + short.MaxValue + "]");
|
||||
config.ShowHelp("org");
|
||||
return 1;
|
||||
}
|
||||
storageShort = (short) parsedStorage;
|
||||
}
|
||||
|
||||
GenerateOrgLicense(new X509Certificate2(cert.Value(), "test"), coreDll.Value(), name.Value, email.Value, storageShort, installationId, businessName.Value, key.Value);
|
||||
|
||||
return 0;
|
||||
});
|
||||
|
@ -143,12 +300,71 @@ namespace bitwardenSelfLicensor
|
|||
}
|
||||
}
|
||||
|
||||
static void GenerateUserLicense(X509Certificate2 cert, string corePath,
|
||||
string userName, string email, Guid userId, string key)
|
||||
// checkUsername Checks that the username is a valid username
|
||||
static bool checkUsername(string s)
|
||||
{
|
||||
if ( string.IsNullOrWhiteSpace(s) ) {
|
||||
WriteLineOver("The username provided doesn't appear to be valid.\n");
|
||||
return false;
|
||||
}
|
||||
return true; // TODO: Actually validate
|
||||
}
|
||||
|
||||
// checkBusinessName Checks that the Business Name is a valid username
|
||||
static bool checkBusinessName(string s)
|
||||
{
|
||||
if ( string.IsNullOrWhiteSpace(s) ) {
|
||||
WriteLineOver("The Business Name provided doesn't appear to be valid.\n");
|
||||
return false;
|
||||
}
|
||||
return true; // TODO: Actually validate
|
||||
}
|
||||
|
||||
// checkEmail Checks that the email address is a valid email address
|
||||
static bool checkEmail(string s)
|
||||
{
|
||||
if ( string.IsNullOrWhiteSpace(s) ) {
|
||||
WriteLineOver("The email provided doesn't appear to be valid.\n");
|
||||
return false;
|
||||
}
|
||||
return true; // TODO: Actually validate
|
||||
}
|
||||
|
||||
// checkStorage Checks that the storage is in a valid range
|
||||
static bool checkStorage(string s)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(s))
|
||||
{
|
||||
WriteLineOver("The storage provided doesn't appear to be valid.\n");
|
||||
return false;
|
||||
}
|
||||
if (double.Parse(s) > short.MaxValue || double.Parse(s) < 0)
|
||||
{
|
||||
WriteLineOver("The storage value provided is outside the accepted range of [0-" + short.MaxValue + "].\n");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// WriteLineOver Writes a new line to console over last line.
|
||||
static void WriteLineOver(string s)
|
||||
{
|
||||
Console.SetCursorPosition(0, Console.CursorTop -1);
|
||||
Console.WriteLine(s);
|
||||
}
|
||||
|
||||
// WriteLine This wrapper is just here so that console writes all look similar.
|
||||
static void WriteLine(string s)
|
||||
{
|
||||
Console.WriteLine(s);
|
||||
}
|
||||
|
||||
static void GenerateUserLicense(X509Certificate2 cert, string corePath, string userName, string email, short storage, Guid userId, string key)
|
||||
{
|
||||
var core = AssemblyLoadContext.Default.LoadFromAssemblyPath(corePath);
|
||||
|
||||
var type = core.GetType("Bit.Core.Models.Business.UserLicense");
|
||||
var licenseTypeEnum = core.GetType("Bit.Core.Enums.LicenseType");
|
||||
|
||||
var license = Activator.CreateInstance(type);
|
||||
|
||||
|
@ -161,13 +377,14 @@ namespace bitwardenSelfLicensor
|
|||
set("Id", userId);
|
||||
set("Name", userName);
|
||||
set("Email", email);
|
||||
set("MaxStorageGb", short.MaxValue);
|
||||
set("Premium", true);
|
||||
set("MaxStorageGb", storage == 0 ? short.MaxValue : storage);
|
||||
set("Version", 1);
|
||||
set("Issued", DateTime.UtcNow);
|
||||
set("Refresh", DateTime.UtcNow.AddYears(100).AddMonths(-1));
|
||||
set("Expires", DateTime.UtcNow.AddYears(100));
|
||||
set("Trial", false);
|
||||
set("LicenseType", Enum.Parse(licenseTypeEnum, "User"));
|
||||
|
||||
set("Hash", Convert.ToBase64String((byte[])type.GetMethod("ComputeHash").Invoke(license, new object[0])));
|
||||
set("Signature", Convert.ToBase64String((byte[])type.GetMethod("Sign").Invoke(license, new object[] { cert })));
|
||||
|
@ -175,12 +392,13 @@ namespace bitwardenSelfLicensor
|
|||
Console.WriteLine(JsonConvert.SerializeObject(license, Formatting.Indented));
|
||||
}
|
||||
|
||||
static void GenerateOrgLicense(X509Certificate2 cert, string corePath,
|
||||
string userName, string email, Guid instalId, string key)
|
||||
static void GenerateOrgLicense(X509Certificate2 cert, string corePath, string userName, string email, short storage, Guid instalId, string businessName, string key)
|
||||
{
|
||||
var core = AssemblyLoadContext.Default.LoadFromAssemblyPath(corePath);
|
||||
|
||||
var type = core.GetType("Bit.Core.Models.Business.OrganizationLicense");
|
||||
var licenseTypeEnum = core.GetType("Bit.Core.Enums.LicenseType");
|
||||
var planTypeEnum = core.GetType("Bit.Core.Enums.PlanType");
|
||||
|
||||
var license = Activator.CreateInstance(type);
|
||||
|
||||
|
@ -194,25 +412,38 @@ namespace bitwardenSelfLicensor
|
|||
set("Id", Guid.NewGuid());
|
||||
set("Name", userName);
|
||||
set("BillingEmail", email);
|
||||
set("BusinessName", "BitBetter");
|
||||
set("BusinessName", string.IsNullOrWhiteSpace(businessName) ? "BitBetter" : businessName);
|
||||
set("Enabled", true);
|
||||
set("Plan", "Custom");
|
||||
set("PlanType", (byte)6);
|
||||
set("Seats", (short)32767);
|
||||
set("Plan", "Enterprise (Annually)");
|
||||
set("PlanType", Enum.Parse(planTypeEnum, "EnterpriseAnnually"));
|
||||
set("Seats", int.MaxValue);
|
||||
set("MaxCollections", short.MaxValue);
|
||||
set("UsePolicies", true);
|
||||
set("UseSso", true);
|
||||
set("UseKeyConnector", true);
|
||||
set("UseScim", true);
|
||||
set("UseGroups", true);
|
||||
set("UseEvents", true);
|
||||
set("UseDirectory", true);
|
||||
set("UseTotp", true);
|
||||
set("Use2fa", true);
|
||||
set("MaxStorageGb", short.MaxValue);
|
||||
set("UseApi", true);
|
||||
set("UseResetPassword", true);
|
||||
set("UseCustomPermissions", true);
|
||||
set("MaxStorageGb", storage == 0 ? short.MaxValue : storage);
|
||||
set("SelfHost", true);
|
||||
set("UsersGetPremium", true);
|
||||
set("Version", 4);
|
||||
set("UsePasswordManager", true);
|
||||
set("UseSecretsManager", true);
|
||||
set("SmSeats", int.MaxValue);
|
||||
set("SmServiceAccounts", int.MaxValue);
|
||||
set("Version", 14); //This is set to 14 to use LimitCollectionCreationDeletion can be changed to 13 to just use Secrets Manager
|
||||
set("Issued", DateTime.UtcNow);
|
||||
set("Refresh", DateTime.UtcNow.AddYears(100).AddMonths(-1));
|
||||
set("Expires", DateTime.UtcNow.AddYears(100));
|
||||
set("Trial", false);
|
||||
set("LicenseType", Enum.Parse(licenseTypeEnum, "Organization"));
|
||||
set("LimitCollectionCreationDeletion", true); //This will be used in the new version of BitWarden but can be applied now
|
||||
|
||||
set("Hash", Convert.ToBase64String((byte[])type.GetMethod("ComputeHash").Invoke(license, new object[0])));
|
||||
set("Signature", Convert.ToBase64String((byte[])type.GetMethod("Sign").Invoke(license, new object[] { cert })));
|
||||
|
|
|
@ -1,11 +1,6 @@
|
|||
#!/bin/bash
|
||||
#!/bin/sh
|
||||
|
||||
script_dir=`cd $(dirname $0); pwd`
|
||||
|
||||
cd $script_dir
|
||||
|
||||
dotnet restore
|
||||
dotnet publish
|
||||
|
||||
docker build . -t bitbetter/licensegen # --squash
|
||||
DIR=`dirname "$0"`
|
||||
DIR=`exec 2>/dev/null;(cd -- "$DIR") && cd -- "$DIR"|| cd "$DIR"; unset PWD; /usr/bin/pwd || /bin/pwd || pwd`
|
||||
|
||||
docker build -t bitbetter/licensegen "$DIR" # --squash
|
||||
|
|
|
@ -2,12 +2,12 @@
|
|||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>netcoreapp2.0</TargetFramework>
|
||||
<TargetFramework>netcoreapp8.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Extensions.CommandLineUtils" Version="1.1.1" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
||||
<PackageReference Include="System.Runtime.Loader" Version="4.3.0" />
|
||||
</ItemGroup>
|
||||
|
||||
|
|
|
@ -1,12 +1,26 @@
|
|||
#!/bin/bash
|
||||
#!/bin/sh
|
||||
|
||||
script_dir=`cd $(dirname $0); pwd`
|
||||
DIR=`dirname "$0"`
|
||||
DIR=`exec 2>/dev/null;(cd -- "$DIR") && cd -- "$DIR"|| cd "$DIR"; unset PWD; /usr/bin/pwd || /bin/pwd || pwd`
|
||||
|
||||
if [ "$#" -lt "1" ]; then
|
||||
echo "USAGE: $0 <ABSOLUTE PATH TO CERT.PFX> [License Gen args...]"
|
||||
# Grab the absolute path to the default pfx location
|
||||
cert_path="$DIR/../../.keys/cert.pfx"
|
||||
|
||||
if [ "$#" -lt "2" ]; then
|
||||
echo "USAGE: $0 <ABSOLUTE PATH TO CERT.PFX> <License Gen action> [License Gen args...]"
|
||||
echo "ACTIONS:"
|
||||
echo " interactive"
|
||||
echo " user"
|
||||
echo " org"
|
||||
exit 1
|
||||
fi
|
||||
cert_path=$1
|
||||
shift
|
||||
docker run -it -v "$cert_path:/cert.pfx" bitbetter/licensegen "$@"
|
||||
|
||||
cert_path="$1"
|
||||
action="$2"
|
||||
shift
|
||||
|
||||
if [ $action = "interactive" ]; then
|
||||
docker run -it --rm -v "$cert_path:/cert.pfx" bitbetter/licensegen "$@"
|
||||
else
|
||||
docker run --rm -v "$cert_path:/cert.pfx" bitbetter/licensegen "$@"
|
||||
fi
|
||||
|
|
85
update-bitwarden.sh
Executable file
85
update-bitwarden.sh
Executable file
|
@ -0,0 +1,85 @@
|
|||
#!/bin/bash
|
||||
ask () {
|
||||
local __resultVar=$1
|
||||
local __result="$2"
|
||||
if [ -z "$2" ]; then
|
||||
read -p "$3" __result
|
||||
fi
|
||||
eval $__resultVar="'$__result'"
|
||||
}
|
||||
|
||||
SCRIPT_BASE="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
|
||||
BW_VERSION=$(curl -sL https://go.btwrdn.co/bw-sh-versions | grep '^ *"'coreVersion'":' | awk -F\: '{ print $2 }' | sed -e 's/,$//' -e 's/^"//' -e 's/"$//')
|
||||
|
||||
echo "Starting Bitwarden update, newest server version: $BW_VERSION"
|
||||
|
||||
# Default path is the parent directory of the BitBetter location
|
||||
BITWARDEN_BASE="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." >/dev/null 2>&1 && pwd )"
|
||||
|
||||
# Get Bitwarden base from user (or keep default value) or use first argument
|
||||
ask tmpbase "$1" "Enter Bitwarden base directory [$BITWARDEN_BASE]: "
|
||||
BITWARDEN_BASE=${tmpbase:-$BITWARDEN_BASE}
|
||||
|
||||
# Check if directory exists and is valid
|
||||
[ -d "$BITWARDEN_BASE" ] || { echo "Bitwarden base directory $BITWARDEN_BASE not found!"; exit 1; }
|
||||
[ -f "$BITWARDEN_BASE/bitwarden.sh" ] || { echo "Bitwarden base directory $BITWARDEN_BASE is not valid!"; exit 1; }
|
||||
|
||||
# Check if user wants to recreate the docker-compose override file
|
||||
RECREATE_OV="y"
|
||||
ask tmprecreate "$2" "Rebuild docker-compose override? [Y/n]: "
|
||||
RECREATE_OV=${tmprecreate:-$RECREATE_OV}
|
||||
|
||||
if [[ $RECREATE_OV =~ ^[Yy]$ ]]
|
||||
then
|
||||
{
|
||||
echo "version: '3'"
|
||||
echo ""
|
||||
echo "services:"
|
||||
echo " api:"
|
||||
echo " image: bitbetter/api:$BW_VERSION"
|
||||
echo ""
|
||||
echo " identity:"
|
||||
echo " image: bitbetter/identity:$BW_VERSION"
|
||||
echo ""
|
||||
} > $BITWARDEN_BASE/bwdata/docker/docker-compose.override.yml
|
||||
echo "BitBetter docker-compose override created!"
|
||||
else
|
||||
echo "Make sure to check if the docker override contains the correct image version ($BW_VERSION) in $BITWARDEN_BASE/bwdata/docker/docker-compose.override.yml!"
|
||||
fi
|
||||
|
||||
# Check if user wants to rebuild the bitbetter images
|
||||
docker images bitbetter/api --format="{{ .Tag }}" | grep -F -- "${BW_VERSION}" > /dev/null
|
||||
retval=$?
|
||||
REBUILD_BB="n"
|
||||
REBUILD_BB_DESCR="[y/N]"
|
||||
if [ $retval -ne 0 ]; then
|
||||
REBUILD_BB="y"
|
||||
REBUILD_BB_DESCR="[Y/n]"
|
||||
fi
|
||||
ask tmprebuild "$3" "Rebuild BitBetter images? $REBUILD_BB_DESCR: "
|
||||
REBUILD_BB=${tmprebuild:-$REBUILD_BB}
|
||||
|
||||
if [[ $REBUILD_BB =~ ^[Yy]$ ]]
|
||||
then
|
||||
$SCRIPT_BASE/build.sh
|
||||
echo "BitBetter images updated to version: $BW_VERSION"
|
||||
fi
|
||||
|
||||
# Now start the bitwarden update
|
||||
cd $BITWARDEN_BASE
|
||||
|
||||
./bitwarden.sh updateself
|
||||
|
||||
# Update the bitwarden.sh: automatically patch run.sh to fix docker-compose pull errors for private images
|
||||
awk '1;/function downloadRunFile/{c=6}c&&!--c{print "sed -i '\''s/dccmd pull/dccmd pull --ignore-pull-failures || true/g'\'' $SCRIPTS_DIR/run.sh"}' $BITWARDEN_BASE/bitwarden.sh > tmp_bw.sh && mv tmp_bw.sh $BITWARDEN_BASE/bitwarden.sh
|
||||
chmod +x $BITWARDEN_BASE/bitwarden.sh
|
||||
echo "Patching bitwarden.sh completed..."
|
||||
|
||||
./bitwarden.sh update
|
||||
|
||||
# Prune Docker images without at least one container associated to them.
|
||||
echo "Pruning Docker images without at least one container associated to them..."
|
||||
docker image prune -a
|
||||
|
||||
cd $SCRIPT_BASE
|
||||
echo "Bitwarden update completed!"
|
Loading…
Reference in New Issue
Block a user