forked from openbmc/openbmc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
oe-publish-sdk
executable file
·145 lines (127 loc) · 5.1 KB
/
oe-publish-sdk
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#!/usr/bin/env python3
#
# OpenEmbedded SDK publishing tool
#
# Copyright (C) 2015-2016 Intel Corporation
#
# SPDX-License-Identifier: GPL-2.0-only
#
import sys
import os
import argparse
import glob
import re
import subprocess
import logging
import shutil
import errno
scripts_path = os.path.dirname(os.path.realpath(__file__))
lib_path = scripts_path + '/lib'
sys.path = sys.path + [lib_path]
import scriptutils
import argparse_oe
logger = scriptutils.logger_create('sdktool')
def mkdir(d):
try:
os.makedirs(d)
except OSError as e:
if e.errno != errno.EEXIST:
raise e
def publish(args):
logger.debug("In publish function")
target_sdk = args.sdk
destination = args.dest
logger.debug("target_sdk = %s, update_server = %s" % (target_sdk, destination))
sdk_basename = os.path.basename(target_sdk)
# Ensure the SDK exists
if not os.path.exists(target_sdk):
logger.error("Specified SDK %s doesn't exist" % target_sdk)
return -1
if os.path.isdir(target_sdk):
logger.error("%s is a directory - expected path to SDK installer file" % target_sdk)
return -1
if ':' in destination:
is_remote = True
host, destdir = destination.split(':')
dest_sdk = os.path.join(destdir, sdk_basename)
else:
is_remote = False
dest_sdk = os.path.join(destination, sdk_basename)
destdir = destination
# Making sure the directory exists
logger.debug("Making sure the destination directory exists")
if not is_remote:
mkdir(destination)
else:
cmd = "ssh %s 'mkdir -p %s'" % (host, destdir)
ret = subprocess.call(cmd, shell=True)
if ret != 0:
logger.error("Making directory %s on %s failed" % (destdir, host))
return ret
# Copying the SDK to the destination
logger.info("Copying the SDK to destination")
if not is_remote:
if os.path.exists(dest_sdk):
os.remove(dest_sdk)
if (os.stat(target_sdk).st_dev == os.stat(destination).st_dev):
os.link(target_sdk, dest_sdk)
else:
shutil.copy(target_sdk, dest_sdk)
else:
cmd = "scp %s %s" % (target_sdk, destination)
ret = subprocess.call(cmd, shell=True)
if ret != 0:
logger.error("scp %s %s failed" % (target_sdk, destination))
return ret
# Unpack the SDK
logger.info("Unpacking SDK")
if not is_remote:
cmd = "sh %s -p -y -d %s" % (dest_sdk, destination)
ret = subprocess.call(cmd, shell=True)
if ret == 0:
logger.info('Successfully unpacked %s to %s' % (dest_sdk, destination))
os.remove(dest_sdk)
else:
logger.error('Failed to unpack %s to %s' % (dest_sdk, destination))
return ret
else:
cmd = "ssh %s 'sh %s -p -y -d %s && rm -f %s'" % (host, dest_sdk, destdir, dest_sdk)
ret = subprocess.call(cmd, shell=True)
if ret == 0:
logger.info('Successfully unpacked %s to %s' % (dest_sdk, destdir))
else:
logger.error('Failed to unpack %s to %s' % (dest_sdk, destdir))
return ret
# Setting up the git repo
if not is_remote:
cmd = 'set -e; mkdir -p %s/layers; cd %s/layers; if [ ! -e .git ]; then git init .; cp .git/hooks/post-update.sample .git/hooks/post-commit; echo "*.pyc\n*.pyo\npyshtables.py" > .gitignore; fi; git add -A .; git config user.email "[email protected]" && git config user.name "OE" && git commit -q -m "init repo" || true' % (destination, destination)
else:
cmd = "ssh %s 'set -e; mkdir -p %s/layers; cd %s/layers; if [ ! -e .git ]; then git init .; cp .git/hooks/post-update.sample .git/hooks/post-commit; echo '*.pyc\n*.pyo\npyshtables.py' > .gitignore; fi; git add -A .; git config user.email '[email protected]' && git config user.name 'OE' && git commit -q -m \"init repo\" || true'" % (host, destdir, destdir)
ret = subprocess.call(cmd, shell=True)
if ret == 0:
logger.info('SDK published successfully')
else:
logger.error('Failed to set up layer git repo')
return ret
def main():
parser = argparse_oe.ArgumentParser(description="OpenEmbedded extensible SDK publishing tool - writes server-side data to support the extensible SDK update process to a specified location")
parser.add_argument('-d', '--debug', help='Enable debug output', action='store_true')
parser.add_argument('-q', '--quiet', help='Print only errors', action='store_true')
parser.add_argument('sdk', help='Extensible SDK to publish (path to .sh installer file)')
parser.add_argument('dest', help='Destination to publish SDK to; can be local path or remote in the form of user@host:/path (in the latter case ssh/scp will be used).')
parser.set_defaults(func=publish)
args = parser.parse_args()
if args.debug:
logger.setLevel(logging.DEBUG)
elif args.quiet:
logger.setLevel(logging.ERROR)
ret = args.func(args)
return ret
if __name__ == "__main__":
try:
ret = main()
except Exception:
ret = 1
import traceback
traceback.print_exc()
sys.exit(ret)