3 from pathlib
import Path
9 parser
= argparse
.ArgumentParser()
10 parser
.add_argument("input_path", nargs
='+',
11 help="Input folder that is traversed for OpenWrt JSON device files.")
12 parser
.add_argument('--download-url', action
="store", default
="",
13 help="Link to get the image from. May contain {target}, {version} and {commit}")
14 parser
.add_argument('--formatted', action
="store_true",
15 help="Output formatted JSON data.")
16 parser
.add_argument('--change-prefix',
17 help="Change the openwrt- file name prefix.")
19 args
= parser
.parse_args()
21 SUPPORTED_METADATA_VERSION
= 1
23 def change_prefix(images
, old_prefix
, new_prefix
):
25 if image
['name'].startswith(old_prefix
):
26 image
['name'] = new_prefix
+ image
['name'][len(old_prefix
):]
28 # OpenWrt JSON device files
34 for path
in args
.input_path
:
35 if os
.path
.isdir(path
):
36 for file in Path(path
).rglob('*.json'):
39 if not path
.endswith('.json'):
40 sys
.stderr
.write("Folder does not exists: {}\n".format(path
))
44 def get_title_name(title
):
48 return "{} {} {}".format(title
.get('vendor', ''), title
['model'], title
.get('variant', '')).strip()
50 def add_profile(id, target
, profile
):
52 for image
in profile
['images']:
53 images
.append({'name': image
['name'], 'type': image
['type']})
56 target
= profile
['target']
58 if args
.change_prefix
:
59 change_prefix(images
, 'openwrt-', args
.change_prefix
)
61 for title
in profile
['titles']:
62 name
= get_title_name(title
)
65 sys
.stderr
.write("Empty title. Skip title in {}\n".format(path
))
68 output
['models'][name
] = {'id': id, 'target': target
, 'images': images
}
71 with
open(path
, "r") as file:
74 if obj
['metadata_version'] != SUPPORTED_METADATA_VERSION
:
75 sys
.stderr
.write('{} has unsupported metadata version: {} => skip\n'.format(path
, obj
['metadata_version']))
78 code
= obj
.get('version_code', obj
.get('version_commit'))
80 if not 'version_code' in output
:
83 'download_url': args
.download_url
,
87 # only support a version_number with images of a single version_commit
88 if output
['version_code'] != code
:
89 sys
.stderr
.write('mixed revisions for a release ({} and {}) => abort\n'.format(output
['version_code'], commit
))
94 for id in obj
['profiles']:
95 add_profile(id, obj
.get('target'), obj
['profiles'][id])
97 add_profile(obj
['id'], obj
['target'], obj
)
98 except json
.decoder
.JSONDecodeError
as e
:
99 sys
.stderr
.write("Skip {}\n {}\n".format(path
, e
))
100 except KeyError as e
:
101 sys
.stderr
.write("Abort on {}\n Missing key {}\n".format(path
, e
))
105 json
.dump(output
, sys
.stdout
, indent
=" ", sort_keys
= True)
107 json
.dump(output
, sys
.stdout
, sort_keys
= True)