#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2018 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Utility functions for dealing with termina images"""

import subprocess

from contextlib import contextmanager

def extract_vmlinux(vmlinuz_path, vmlinux_path):
  gzip_header = b'\x1f\x8b\x08'

  with open(vmlinuz_path, 'rb') as vmlinuz:
    vmlinuz_contents = vmlinuz.read()

    with open(vmlinux_path, 'w+b') as vmlinux:
      index = 0
      while True:
        index = vmlinuz_contents.find(gzip_header, index)
        if index == -1:
          print("no header found")
          return False
        # Attempt to decompress with gzip.
        result = subprocess.run(['gunzip'], input=vmlinuz_contents[index:], stdout=vmlinux, stderr=subprocess.DEVNULL)
        if result.returncode != 0:
          result = subprocess.run(['readelf', '-h', vmlinux_path], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
          if result.returncode == 0:
            return True
        else:
          print('failed to decompress at index', index, 'err', err)
          index += 1

@contextmanager
def mount_disk(src, target):
  subprocess.check_call(['sudo', 'mount', src, target])
  try:
    yield target
  finally:
    try:
      subprocess.check_call(['sudo', 'umount', target])
    except:
      print('failed to unmount', target)

def get_release_version(lsb_release_path):
  with open(str(lsb_release_path), 'r') as lsb_release:
    lsb_release_dict = {}
    for line in lsb_release.readlines():
      split_line = line.split('=')
      if len(split_line) != 2:
        continue
      lsb_release_dict[split_line[0]] = split_line[1]

  build = int(lsb_release_dict['CHROMEOS_RELEASE_BUILD_NUMBER'])
  branch = int(lsb_release_dict['CHROMEOS_RELEASE_BRANCH_NUMBER'])
  patches = lsb_release_dict['CHROMEOS_RELEASE_PATCH_NUMBER'].split('-')
  patch = int(patches[0])
  # HACK: patch is often a date (e.g. on tryjobs), so cap the patch number.
  if patch >= 1000:
    patch = 0

  return '%d.%d.%d' % (build, branch, patch)

