config-fs-gen: Initial commit
Change-Id: Ie9655475aa46a393ea829f9321452d315c68d7fa
This commit is contained in:
164
config-fs-gen/README.md
Normal file
164
config-fs-gen/README.md
Normal file
@@ -0,0 +1,164 @@
|
||||
# config-fs-gen
|
||||
|
||||
```
|
||||
usage: config-fs-gen.py [-h]
|
||||
capability_header_path
|
||||
android_filesystem_config_header_path
|
||||
vendor_group_path fs_config_paths
|
||||
[fs_config_paths ...]
|
||||
|
||||
Convert /vendor/etc/group ×
|
||||
/(system|vendor)/etc/(fs_config_dirs|fs_config_files) to config.fs
|
||||
|
||||
positional arguments:
|
||||
capability_header_path
|
||||
path to
|
||||
{android}/bionic/libc/kernel/uapi/linux/capability.h
|
||||
android_filesystem_config_header_path
|
||||
path to {android}/system/core/libcutils/include/privat
|
||||
e/android_filesystem_config.h
|
||||
vendor_group_path path to {rom}/vendor/etc/group
|
||||
fs_config_paths paths to
|
||||
{rom}/(system|vendor)/etc/fs_config_(dirs|files)
|
||||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
```
|
||||
```
|
||||
Example usage:
|
||||
$ ./config-fs-gen.py ~/lineage-16.0/bionic/libc/kernel/uapi/linux/capability.h \
|
||||
~/lineage-16.0/system/core/libcutils/include/private/android_filesystem_config.h \
|
||||
~/lineage-16.0/out/target/product/guacamole/vendor/etc/group \
|
||||
~/lineage-16.0/out/target/product/guacamole/{system,vendor}/etc/{fs_config_dirs,fs_config_files}
|
||||
[AID_VENDOR_QTI_DIAG]
|
||||
value:2901
|
||||
|
||||
[AID_VENDOR_QDSS]
|
||||
value:2902
|
||||
|
||||
[AID_VENDOR_RFS]
|
||||
value:2903
|
||||
|
||||
[AID_VENDOR_RFS_SHARED]
|
||||
value:2904
|
||||
|
||||
[AID_VENDOR_ADPL_ODL]
|
||||
value:2905
|
||||
|
||||
[AID_VENDOR_QRTR]
|
||||
value:2906
|
||||
|
||||
[bt_firmware/]
|
||||
mode: 0771
|
||||
user: AID_SYSTEM
|
||||
group: AID_SYSTEM
|
||||
caps: 0
|
||||
|
||||
[dsp/]
|
||||
mode: 0771
|
||||
user: AID_MEDIA
|
||||
group: AID_MEDIA
|
||||
caps: 0
|
||||
|
||||
[firmware/]
|
||||
mode: 0771
|
||||
user: AID_SYSTEM
|
||||
group: AID_SYSTEM
|
||||
caps: 0
|
||||
|
||||
[firmware/image/*]
|
||||
mode: 0771
|
||||
user: AID_SYSTEM
|
||||
group: AID_SYSTEM
|
||||
caps: 0
|
||||
|
||||
[persist/]
|
||||
mode: 0771
|
||||
user: AID_SYSTEM
|
||||
group: AID_SYSTEM
|
||||
caps: 0
|
||||
|
||||
[vendor/bin/cnd]
|
||||
mode: 0755
|
||||
user: AID_SYSTEM
|
||||
group: AID_SYSTEM
|
||||
caps: NET_BIND_SERVICE NET_ADMIN BLOCK_SUSPEND
|
||||
|
||||
[vendor/bin/hw/android.hardware.bluetooth@1.0-service-qti]
|
||||
mode: 0755
|
||||
user: AID_BLUETOOTH
|
||||
group: AID_BLUETOOTH
|
||||
caps: NET_ADMIN BLOCK_SUSPEND
|
||||
|
||||
[vendor/bin/ims_rtp_daemon]
|
||||
mode: 0755
|
||||
user: AID_SYSTEM
|
||||
group: AID_RADIO
|
||||
caps: NET_BIND_SERVICE
|
||||
|
||||
[vendor/bin/imsdatadaemon]
|
||||
mode: 0755
|
||||
user: AID_SYSTEM
|
||||
group: AID_SYSTEM
|
||||
caps: NET_BIND_SERVICE
|
||||
|
||||
[vendor/bin/imsrcsd]
|
||||
mode: 0755
|
||||
user: AID_SYSTEM
|
||||
group: AID_RADIO
|
||||
caps: NET_BIND_SERVICE WAKE_ALARM BLOCK_SUSPEND
|
||||
|
||||
[vendor/bin/loc_launcher]
|
||||
mode: 0755
|
||||
user: AID_GPS
|
||||
group: AID_GPS
|
||||
caps: SETGID SETUID
|
||||
|
||||
[vendor/bin/pd-mapper]
|
||||
mode: 0755
|
||||
user: AID_SYSTEM
|
||||
group: AID_SYSTEM
|
||||
caps: NET_BIND_SERVICE
|
||||
|
||||
[vendor/bin/pm-service]
|
||||
mode: 0755
|
||||
user: AID_SYSTEM
|
||||
group: AID_SYSTEM
|
||||
caps: NET_BIND_SERVICE
|
||||
|
||||
[vendor/bin/sensors.qti]
|
||||
mode: 0755
|
||||
user: AID_SYSTEM
|
||||
group: AID_SYSTEM
|
||||
caps: NET_BIND_SERVICE
|
||||
|
||||
[vendor/bin/slim_daemon]
|
||||
mode: 0755
|
||||
user: AID_GPS
|
||||
group: AID_GPS
|
||||
caps: NET_BIND_SERVICE
|
||||
|
||||
[vendor/bin/wcnss_filter]
|
||||
mode: 0755
|
||||
user: AID_BLUETOOTH
|
||||
group: AID_BLUETOOTH
|
||||
caps: BLOCK_SUSPEND
|
||||
|
||||
[vendor/bin/xtwifi-client]
|
||||
mode: 0755
|
||||
user: AID_GPS
|
||||
group: AID_GPS
|
||||
caps: NET_BIND_SERVICE WAKE_ALARM BLOCK_SUSPEND
|
||||
|
||||
[vendor/firmware_mnt/image/*]
|
||||
mode: 0771
|
||||
user: AID_ROOT
|
||||
group: AID_SYSTEM
|
||||
caps: 0
|
||||
|
||||
[vendor/lib/modules-aging/*]
|
||||
mode: 0644
|
||||
user: AID_ROOT
|
||||
group: AID_ROOT
|
||||
caps: 0
|
||||
```
|
||||
137
config-fs-gen/config-fs-gen.py
Executable file
137
config-fs-gen/config-fs-gen.py
Executable file
@@ -0,0 +1,137 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import argparse
|
||||
import parse
|
||||
import struct
|
||||
|
||||
|
||||
def parse_cmdline():
|
||||
parser = argparse.ArgumentParser(
|
||||
description='Convert /vendor/etc/group × /(system|vendor)/etc/(fs_config_dirs|fs_config_files) to config.fs')
|
||||
parser.add_argument('capability_header_path',
|
||||
help='path to {android}/bionic/libc/kernel/uapi/linux/capability.h')
|
||||
parser.add_argument('android_filesystem_config_header_path',
|
||||
help='path to {android}/system/core/libcutils/include/private/android_filesystem_config.h')
|
||||
parser.add_argument('vendor_group_path',
|
||||
help='path to {rom}/vendor/etc/group')
|
||||
parser.add_argument('fs_config_paths', nargs='+',
|
||||
help='paths to {rom}/(system|vendor)/etc/fs_config_(dirs|files)')
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def get_capabilities(capability_header_path):
|
||||
capabilities = {}
|
||||
|
||||
with open(capability_header_path, 'r') as file:
|
||||
for line in file:
|
||||
s = parse.search('#define CAP_{:w} {:d}', line)
|
||||
|
||||
if s is not None:
|
||||
capabilities[s[1]] = s[0]
|
||||
|
||||
return capabilities
|
||||
|
||||
|
||||
def get_groups(android_filesystem_config_header_path, vendor_group_path):
|
||||
system_groups = {}
|
||||
vendor_groups = {}
|
||||
|
||||
with open(android_filesystem_config_header_path, 'r') as file:
|
||||
for line in file:
|
||||
s = parse.search('#define AID_{:w} {:d}', line)
|
||||
|
||||
if s is not None:
|
||||
system_groups[s[1]] = 'AID_' + s[0]
|
||||
|
||||
with open(vendor_group_path, 'r') as file:
|
||||
for line in file:
|
||||
name, _, uid, _ = line.split(':', 3)
|
||||
vendor_groups[uid] = 'AID_' + name.upper()
|
||||
|
||||
return system_groups, vendor_groups
|
||||
|
||||
|
||||
def get_fs_path_configs(fs_config_paths, system_groups, vendor_groups):
|
||||
fs_path_config = {}
|
||||
|
||||
for fs_config_path in args.fs_config_paths:
|
||||
with open(fs_config_path, 'rb') as file:
|
||||
while True:
|
||||
bytes = file.read(struct.calcsize('<HHHHQ'))
|
||||
|
||||
if bytes is b'':
|
||||
break
|
||||
|
||||
length, mode, uid, gid, caps = struct.unpack('<HHHHQ', bytes)
|
||||
name = file.read(length - len(bytes)).decode().rstrip('\x00')
|
||||
|
||||
fs_path_config[name] = {
|
||||
'mode': mode,
|
||||
'user': gid_to_str(uid, system_groups, vendor_groups),
|
||||
'group': gid_to_str(gid, system_groups, vendor_groups),
|
||||
'caps': caps_to_str(caps)
|
||||
}
|
||||
|
||||
return fs_path_config
|
||||
|
||||
|
||||
def caps_to_str(caps):
|
||||
caps_list = []
|
||||
|
||||
# return '0' directly if there are no special capabilities set
|
||||
if caps == 0:
|
||||
return str(caps)
|
||||
|
||||
# try to match well known linux capabilities
|
||||
for cap in capabilities:
|
||||
cap_mask_long = 1 << cap
|
||||
|
||||
if caps & cap_mask_long:
|
||||
caps = caps & ~cap_mask_long
|
||||
caps_list.append(capabilities[cap])
|
||||
|
||||
# append unmatched caps if needed
|
||||
if caps > 0:
|
||||
caps_list.append(str(caps))
|
||||
|
||||
return ' '.join(caps_list)
|
||||
|
||||
|
||||
def gid_to_str(gid, system_groups, vendor_groups):
|
||||
if gid in system_groups:
|
||||
return system_groups[gid]
|
||||
|
||||
if gid in vendor_groups:
|
||||
return vendor_groups[gid]
|
||||
|
||||
return gid
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
args = parse_cmdline()
|
||||
capabilities = get_capabilities(args.capability_header_path)
|
||||
system_groups, vendor_groups = get_groups(
|
||||
args.android_filesystem_config_header_path,
|
||||
args.vendor_group_path)
|
||||
fs_path_configs = get_fs_path_configs(
|
||||
args.fs_config_paths,
|
||||
system_groups,
|
||||
vendor_groups)
|
||||
|
||||
# print vendor AIDs
|
||||
for gid in sorted(vendor_groups):
|
||||
print('[{}]'.format(vendor_groups[gid]))
|
||||
print('value:{}'.format(gid))
|
||||
print()
|
||||
|
||||
# print {system,vendor} fs path configs
|
||||
for name in sorted(fs_path_configs):
|
||||
print('[{}]'.format(name))
|
||||
print('mode: {:04o}'.format(fs_path_configs[name]['mode']))
|
||||
print('user: {}'.format(fs_path_configs[name]['user']))
|
||||
print('group: {}'.format(fs_path_configs[name]['group']))
|
||||
print('caps: {}'.format(fs_path_configs[name]['caps']))
|
||||
print()
|
||||
Reference in New Issue
Block a user