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('--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
32 if not os
.path
.isdir(args
.input_path
):
33 sys
.stderr
.write("Folder does not exists: {}\n".format(args
.input_path
))
36 for path
in Path(args
.input_path
).rglob('*.json'):
39 def get_title_name(title
):
43 return "{} {} {}".format(title
.get('vendor', ''), title
['model'], title
.get('variant', '')).strip()
48 with
open(path
, "r") as file:
52 if obj
['metadata_version'] != SUPPORTED_METADATA_VERSION
:
53 sys
.stderr
.write('{} has unsupported metadata version: {} => skip\n'.format(path
, obj
['metadata_version']))
56 code
= obj
.get('version_code', obj
.get('version_commit'))
58 if not 'version_code' in output
:
65 # only support a version_number with images of a single version_commit
66 if output
['version_code'] != code
:
67 sys
.stderr
.write('mixed revisions for a release ({} and {}) => abort\n'.format(output
['version_code'], commit
))
71 for image
in obj
['images']:
72 images
.append({'name': image
['name'], 'type': image
['type']})
74 if args
.change_prefix
:
75 change_prefix(images
, 'openwrt-', args
.change_prefix
)
77 target
= obj
['target']
79 for title
in obj
['titles']:
80 name
= get_title_name(title
)
83 sys
.stderr
.write("Empty title. Skip title in {}\n".format(path
))
86 output
['models'][name
] = {'id': id, 'target': target
, 'images': images
}
88 except json
.decoder
.JSONDecodeError
as e
:
89 sys
.stderr
.write("Skip {}\n {}\n".format(path
, e
))
92 sys
.stderr
.write("Abort on {}\n Missing key {}\n".format(path
, e
))
96 json
.dump(output
, sys
.stdout
, indent
=" ", sort_keys
= True)
98 json
.dump(output
, sys
.stdout
, sort_keys
= True)