Make exporting easier with docker-compose
This commit is contained in:
parent
99194c40d3
commit
9fc8bcf9a8
4
.env
Normal file
4
.env
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
DATABASE_PASSWORD=CHANGE_ME
|
||||||
|
#DATABASE_KEYFILE=
|
||||||
|
BW_PATH=/usr/local/bin/bw
|
||||||
|
DATABASE_PATH=/exports/bitwarden-export.kdbx
|
9
Dockerfile
Normal file
9
Dockerfile
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
FROM python:3.9-slim-buster
|
||||||
|
|
||||||
|
WORKDIR /bitwarden-to-keepass
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
RUN apt update && apt install -y npm && \
|
||||||
|
pip install -r requirements.txt && \
|
||||||
|
npm i -g @bitwarden/cli && \
|
||||||
|
apt purge -y npm
|
21
README.md
21
README.md
@ -2,23 +2,32 @@
|
|||||||
Export (most of) your Bitwarden items into KeePass database.
|
Export (most of) your Bitwarden items into KeePass database.
|
||||||
|
|
||||||
## How it works?
|
## How it works?
|
||||||
It uses official [bitwarden-cli](https://help.bitwarden.com/article/cli/) client to export your items from Bitwarden vault and move them into your KeePass database - that includes logins (with TOTP seeds, URIs, custom fields, attachments, notes) and secure notes.
|
It uses official [bitwarden-cli](https://bitwarden.com/help/article/cli/) client to export your items from Bitwarden vault and move them into your KeePass database - that includes logins (with TOTP seeds, URIs, custom fields, attachments, notes) and secure notes.
|
||||||
|
|
||||||
## Install
|
# Usage with docker (docker-compose) - recommended
|
||||||
|
- Clone this repository
|
||||||
|
- Edit `.env` file
|
||||||
|
- ⚠️ make sure to set your own `DATABASE_PASSWORD` - used as password for KeePass database
|
||||||
|
- Run
|
||||||
|
```
|
||||||
|
docker-compose run bitwarden-to-keepass
|
||||||
|
```
|
||||||
|
- You will be interactively asked to login with [bitwarden-cli](https://bitwarden.com/help/article/cli/)
|
||||||
|
- After the process is finished your database export is in `exports` directory
|
||||||
|
|
||||||
|
## Usage without docker (venv)
|
||||||
- Clone this repository
|
- Clone this repository
|
||||||
- Run
|
- Run
|
||||||
```
|
```
|
||||||
make build
|
make build
|
||||||
```
|
```
|
||||||
|
|
||||||
## Run/usage
|
|
||||||
- You can either **create new (empty) KeePass database** (tested with [KeePassXC](https://github.com/keepassxreboot/keepassxc) but it will probably work with others) right now, otherwise one will be created when the script is executed
|
- You can either **create new (empty) KeePass database** (tested with [KeePassXC](https://github.com/keepassxreboot/keepassxc) but it will probably work with others) right now, otherwise one will be created when the script is executed
|
||||||
- Go into the virtual environment
|
- Go into the virtual environment
|
||||||
```
|
```
|
||||||
source .venv/bin/activate
|
source .venv/bin/activate
|
||||||
```
|
```
|
||||||
- [Download](https://help.bitwarden.com/article/cli/#download--install) official bitwarden-cli and do `bw login` (you need `BW_SESSION` for export to work).
|
- [Download](https://bitwarden.com/help/article/cli/#download-and-install) official bitwarden-cli and do `bw login` (you need `BW_SESSION` for export to work).
|
||||||
- Run
|
- Run
|
||||||
```
|
```
|
||||||
python3 bitwarden-to-keepass.py --bw-session BW_SESSION --database-path DATABASE_PATH --database-password DATABASE_PASSWORD [--database-keyfile DATABASE_KEYFILE] [--bw-path BW_PATH]
|
python3 bitwarden-to-keepass.py --bw-session BW_SESSION --database-path DATABASE_PATH --database-password DATABASE_PASSWORD [--database-keyfile DATABASE_KEYFILE] [--bw-path BW_PATH]
|
||||||
```
|
```
|
@ -72,7 +72,7 @@ def bitwarden_to_keepass(args):
|
|||||||
entry.set_custom_property(str(field['name']), field['value'])
|
entry.set_custom_property(str(field['name']), field['value'])
|
||||||
|
|
||||||
for attachment in bw_item.get_attachments():
|
for attachment in bw_item.get_attachments():
|
||||||
attachment_tmp_path = f'./attachment_tmp/{attachment["fileName"]}'
|
attachment_tmp_path = f'/tmp/attachment/{attachment["fileName"]}'
|
||||||
attachment_path = subprocess.check_output(f'{quote(args.bw_path)} get attachment'
|
attachment_path = subprocess.check_output(f'{quote(args.bw_path)} get attachment'
|
||||||
f' --raw {quote(attachment["id"])} '
|
f' --raw {quote(attachment["id"])} '
|
||||||
f'--itemid {quote(bw_item.get_id())} '
|
f'--itemid {quote(bw_item.get_id())} '
|
||||||
@ -99,12 +99,39 @@ def check_args(args):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def environ_or_required(key):
|
||||||
|
return (
|
||||||
|
{'default': os.environ.get(key)} if os.environ.get(key)
|
||||||
|
else {'required': True}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
parser = ArgumentParser()
|
parser = ArgumentParser()
|
||||||
parser.add_argument('--bw-session', help='Session generated from bitwarden-cli (bw login)', required=True)
|
parser.add_argument(
|
||||||
parser.add_argument('--database-path', help='Path to KeePass database. If database does not exists it will be created.', required=True)
|
'--bw-session',
|
||||||
parser.add_argument('--database-password', help='Password for KeePass database', required=True)
|
help='Session generated from bitwarden-cli (bw login)',
|
||||||
parser.add_argument('--database-keyfile', help='Path to Key File for KeePass database', default=None)
|
**environ_or_required('BW_SESSION'),
|
||||||
parser.add_argument('--bw-path', help='Path for bw binary', default='bw')
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--database-path',
|
||||||
|
help='Path to KeePass database. If database does not exists it will be created.',
|
||||||
|
**environ_or_required('DATABASE_PATH'),
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--database-password',
|
||||||
|
help='Password for KeePass database',
|
||||||
|
**environ_or_required('DATABASE_PASSWORD'),
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--database-keyfile',
|
||||||
|
help='Path to Key File for KeePass database',
|
||||||
|
default=os.environ.get('DATABASE_KEYFILE', None),
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--bw-path',
|
||||||
|
help='Path for bw binary',
|
||||||
|
default=os.environ.get('BW_PATH', 'bw'),
|
||||||
|
)
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
check_args(args) and bitwarden_to_keepass(args)
|
check_args(args) and bitwarden_to_keepass(args)
|
||||||
|
12
docker-compose.yaml
Normal file
12
docker-compose.yaml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
version: '3.8'
|
||||||
|
services:
|
||||||
|
bitwarden-to-keepass:
|
||||||
|
build: .
|
||||||
|
command: bash -c 'export BW_SESSION=`$BW_PATH login --raw` && python3 bitwarden-to-keepass.py && $BW_PATH lock'
|
||||||
|
volumes:
|
||||||
|
- ./exports:/exports
|
||||||
|
tmpfs:
|
||||||
|
- /tmp
|
||||||
|
- '/root/.config/Bitwarden CLI'
|
||||||
|
env_file:
|
||||||
|
- .env
|
0
exports/.gitkeep
Normal file
0
exports/.gitkeep
Normal file
Loading…
x
Reference in New Issue
Block a user