mirror of
https://github.com/Telecominfraproject/OpenNetworkLinux.git
synced 2025-11-02 11:18:18 +00:00
python3 is starting to become the default on all major distributions. Using `/usr/bin/python2` should be safe for the near future.
98 lines
2.8 KiB
Python
Executable File
98 lines
2.8 KiB
Python
Executable File
#!/usr/bin/python2
|
|
############################################################
|
|
import argparse
|
|
import sys
|
|
import os
|
|
import zipfile
|
|
import json
|
|
import apt_inst
|
|
import onlu
|
|
|
|
logger = onlu.init_logging('switool')
|
|
|
|
class OnlSwitchImage(object):
|
|
|
|
def __init__(self, fname, mode):
|
|
self.fname = fname
|
|
self.mode = mode
|
|
self.zipfile = zipfile.ZipFile(fname, mode=mode)
|
|
self.manifest = None
|
|
|
|
def add(self, fname, arcname=None, compressed=True):
|
|
self.zipfile.write(fname, arcname=arcname, compress_type = zipfile.ZIP_DEFLATED if compressed else zipefile.ZIP_STORED)
|
|
|
|
def add_rootfs(self, rootfs_sqsh):
|
|
self.add(rootfs_sqsh)
|
|
|
|
def add_manifest(self, manifest):
|
|
self.add(manifest, arcname="manifest.json")
|
|
|
|
def get_manifest(self):
|
|
if 'manifest.json' in self.zipfile.namelist():
|
|
return json.load(self.zipfile.open('manifest.json'))
|
|
else:
|
|
return None
|
|
|
|
def get_arch(self):
|
|
return self.get_manifest()['arch']
|
|
|
|
def get_platforms(self):
|
|
p = self.get_manifest()['platforms']
|
|
if type(p) is list:
|
|
return p
|
|
else:
|
|
return p.split(',')
|
|
|
|
def get_contents(self):
|
|
return self.zipfile.namelist()
|
|
|
|
############################################################
|
|
|
|
ap = argparse.ArgumentParser(description="SWI Tool")
|
|
ap.add_argument('--create', action='store_true', help='Create new SWI.')
|
|
ap.add_argument('--overwrite', action='store_true', help='Overwrite existing file.')
|
|
ap.add_argument('--rootfs', help='Root SquashFS File')
|
|
ap.add_argument('--manifest', help='SWI Manifest file.')
|
|
ap.add_argument('--add-files', help='Add additional files.', default=[], nargs='+')
|
|
ap.add_argument("--contents", help='Show SWI contents.', action='store_true')
|
|
ap.add_argument("--platforms", help='Show SWI contents.', action='store_true')
|
|
ap.add_argument('swi', help='SWI image name.')
|
|
|
|
ops = ap.parse_args()
|
|
|
|
if os.path.exists(ops.swi):
|
|
if ops.create and not ops.overwrite:
|
|
logger.critical("File '%s' exists." % ops.swi)
|
|
sys.exit(1)
|
|
|
|
swi = None
|
|
|
|
if ops.create or ops.overwrite:
|
|
if not ops.rootfs:
|
|
logger.critical("Rootfs required to create new SWI.")
|
|
sys.exit(1)
|
|
|
|
if not ops.manifest:
|
|
logger.critical("Manifest required to create new SWI.")
|
|
sys.exit(1)
|
|
|
|
swi = OnlSwitchImage(ops.swi, 'w')
|
|
swi.add_rootfs(ops.rootfs)
|
|
swi.add_manifest(ops.manifest)
|
|
for f in ops.add_files:
|
|
swi.add(f, arcname=f)
|
|
|
|
if swi is None:
|
|
|
|
if not os.path.exists(ops.swi):
|
|
logger.critical("SWI file %s does not exist." % ops.swi)
|
|
sys.exit(1)
|
|
|
|
swi = OnlSwitchImage(ops.swi, 'r')
|
|
|
|
if ops.contents:
|
|
print " ".join(swi.get_contents())
|
|
|
|
if ops.platforms:
|
|
print " ".join(swi.get_platforms())
|