-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathfolder_migrate.py
70 lines (59 loc) · 2.51 KB
/
folder_migrate.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/usr/bin/env python3
# This script will create 1Password vaults from each unique value
# in the `grouping` column of a LastPass export generated through their
# web-based exported or the lpass CLI (this has not
# been tested on exports from their browser extension or other methods).
# Shared/Nested folders in 1Password will have separate, non-nested
# vaults created.
#
# This script does NOT create items in 1Password.
import csv
import json
import subprocess
from utils import normalize_vault_name
def migrate_folders(csv_data, options):
created_vault_list = {}
lp_folder_list = set()
is_csv_from_web_exporter = False
stats = {
'total': 0,
'migrated': 0,
'skipped': 0,
}
linereader = csv.reader(csv_data, delimiter=',', quotechar='"')
heading = next(linereader)
if 'totp' in heading:
is_csv_from_web_exporter = True
for row in linereader:
vault_name = row[6] if is_csv_from_web_exporter else row[5]
if vault_name.startswith("Shared") and options['ignore-shared']:
print(f"\tLastPass folder \"{vault_name}\" => skipped (ignore shared folders)")
stats["skipped"] += 1
continue
if vault_name:
lp_folder_list.add(normalize_vault_name(vault_name))
stats['total'] = len(lp_folder_list)
for folder in lp_folder_list:
if not options['dry-run']:
try:
vault_create_command_output = subprocess.run([
"op", "vault", "create",
folder,
"--format=json"
], check=True, capture_output=True)
except:
print(f"\tLastPass folder \"{folder}\" => skipped (cannot be created)")
stats["skipped"] += 1
continue
new_vault_uuid = json.loads(vault_create_command_output.stdout)["id"]
created_vault_list[folder] = new_vault_uuid
print(f"\t\"{folder}\" => created")
stats["migrated"] += 1
else: # if dry run
created_vault_list[folder] = folder
print(f"\t\"{folder}\" => created; skipped (dry run)")
stats["migrated"] += 1
if not options['dry-run']:
print(f"\nFolders migration complete!\nTotal {stats['total']} folders.\nCreated {stats['migrated']} vaults.\nSkipped {stats['skipped']}.")
else:
print(f"\nFolders migration dry run complete!\nTotal {stats['total']} folders.\nCreated {stats['migrated']} vaults.\nSkipped {stats['skipped']} folders.")