2016-05-19 00:12:44 +00:00
|
|
|
#!/usr/bin/python3
|
|
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
import shutil
|
|
|
|
|
import subprocess
|
|
|
|
|
import sys
|
|
|
|
|
|
|
|
|
|
|
2016-07-18 05:54:04 +00:00
|
|
|
class Error(Exception):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
class SubprocessFailure(Error):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
2016-05-19 00:12:44 +00:00
|
|
|
class IconModule(object):
|
|
|
|
|
|
|
|
|
|
def __init__(self, chroot_path):
|
|
|
|
|
self._chroot_path = chroot_path
|
|
|
|
|
|
|
|
|
|
def Exec(self, *args, **kwargs):
|
|
|
|
|
print('+', args)
|
2016-08-04 04:25:02 +00:00
|
|
|
env = kwargs.pop('env', os.environ.copy())
|
|
|
|
|
env['LC_ALL'] = 'C'
|
2016-07-18 05:54:04 +00:00
|
|
|
try:
|
2016-08-04 04:25:02 +00:00
|
|
|
subprocess.check_call(args, env=env, **kwargs)
|
2016-07-18 05:54:04 +00:00
|
|
|
except subprocess.CalledProcessError as e:
|
|
|
|
|
print('ERROR:', e)
|
|
|
|
|
raise SubprocessFailure(e)
|
2016-05-19 00:12:44 +00:00
|
|
|
|
|
|
|
|
def ExecChroot(self, *args, **kwargs):
|
|
|
|
|
self.Exec('chroot', self._chroot_path, *args, **kwargs)
|
|
|
|
|
|
|
|
|
|
def CopyRootFSOverlay(self, source_dir):
|
|
|
|
|
start_pos = len(source_dir) + 1
|
|
|
|
|
for dirpath, dirnames, filenames in os.walk(source_dir):
|
|
|
|
|
dest_dir = os.path.join(self._chroot_path, dirpath[start_pos:])
|
|
|
|
|
# pylint: disable=unexpected-keyword-arg
|
|
|
|
|
os.makedirs(dest_dir, exist_ok=True)
|
|
|
|
|
shutil.copystat(dirpath, dest_dir)
|
|
|
|
|
for dirname in dirnames:
|
|
|
|
|
source_path = os.path.join(dirpath, dirname)
|
|
|
|
|
dest_path = os.path.join(dest_dir, dirname)
|
|
|
|
|
try:
|
|
|
|
|
link = os.readlink(source_path)
|
|
|
|
|
os.symlink(link, dest_path)
|
|
|
|
|
except OSError:
|
|
|
|
|
pass
|
|
|
|
|
for filename in filenames:
|
|
|
|
|
source_path = os.path.join(dirpath, filename)
|
|
|
|
|
dest_path = os.path.join(dest_dir, filename)
|
|
|
|
|
try:
|
|
|
|
|
link = os.readlink(source_path)
|
|
|
|
|
os.symlink(link, dest_path)
|
|
|
|
|
except OSError:
|
|
|
|
|
shutil.copy(source_path, dest_path)
|
|
|
|
|
|
|
|
|
|
# In case we copied libraries
|
|
|
|
|
self.ExecChroot('ldconfig')
|
|
|
|
|
|
|
|
|
|
def InstallPackages(self, *packages):
|
2016-05-19 00:46:30 +00:00
|
|
|
env = os.environ.copy()
|
|
|
|
|
env['DEBIAN_FRONTEND'] = 'noninteractive'
|
|
|
|
|
self.ExecChroot('apt-get', 'install', '--assume-yes', '--no-install-recommends', *packages, env=env)
|
2016-05-19 00:12:44 +00:00
|
|
|
|
|
|
|
|
def InstallPythonPackages(self, *packages):
|
|
|
|
|
self.InstallPackages('python-pip')
|
|
|
|
|
self.ExecChroot('pip', 'install', *packages)
|
|
|
|
|
|
|
|
|
|
def AddSystemUsers(self, *users):
|
|
|
|
|
for user in users:
|
|
|
|
|
self.ExecChroot('adduser', '--system', '--group', '--no-create-home', '--disabled-login', user)
|
|
|
|
|
|
|
|
|
|
def AddKernelModules(self, *modules):
|
|
|
|
|
with open(os.path.join(self._chroot_path, 'etc', 'modules'), 'a') as fh:
|
|
|
|
|
for module in modules:
|
|
|
|
|
fh.write('%s\n' % module)
|
2016-07-18 18:40:07 +00:00
|
|
|
|
|
|
|
|
def ServiceFile(self, service):
|
|
|
|
|
path = os.path.join(self._chroot_path, 'lib', 'systemd', 'system', service)
|
|
|
|
|
return open(path, 'w')
|
|
|
|
|
|
|
|
|
|
def EnableService(self, service):
|
|
|
|
|
self.ExecChroot('systemctl', 'enable', service)
|