#!/usr/bin/python
# Copyright 2012 Google Inc. All Rights Reserved.
#

import re
import sys


__author__ = 'Avery Pennarun (apenwarr@google.com)'


def main():
  data = sys.stdin.read().strip()
  header_comment = re.sub(re.compile(r'^', re.M), '# ', data)
  elements = []
  ether = None

  g = re.search(re.compile(r'^(?:1ST_SERIAL_NUMBER=|SERIAL_NO=)(.+)', re.M),
                data)
  if g:
    elements.append('serialno=%r' % g.group(1))

  g = re.search(re.compile(r'^PLATFORM_NAME=(.+)', re.M), data)
  if g:
    platform = g.group(1).upper()
    elements.append('platform=%r' % platform)
    if platform.startswith('GFMS'):
      elements.append('is_storage=1')
    elif platform.startswith('GFHD'):
      elements.append('is_tv=1')

  if re.search(re.compile(r'^NET_OK=1', re.M), data):
    elements.append('is_alive=1')
    elements.append('is_alive_net=1')

  if re.search(re.compile(r'^IS_NFSROOT=1', re.M), data):
    elements.append('is_nfsroot=1')

  g = re.search(re.compile(r'^SERIALPORT=(.+)', re.M), data)
  if g:
    elements.append('is_alive=1')
    elements.append('serialport=%r' % g.group(1))

  g = re.search(r'inet ([\d\.]+)', data)
  if g:
    elements.append('ip=%r' % g.group(1))

  g = re.search(r'inet6 ([a-fA-F0-9:]+)', data)
  if g:
    elements.append('ip6=%r' % g.group(1).lower())

  g = re.search(r'link/ether ([a-fA-F0-9:]+)', data)
  if g:
    ether = g.group(1)
    elements.append('ether=%r' % g.group(1).lower())

  if re.search(r'eth0:.*LOWER_UP', data):
    elements.append('has_ether=1')
  if re.search(r'eth1:.*LOWER_UP', data):
    elements.append('has_moca=1')
  if re.search(r'eth2:.*LOWER_UP', data):
    elements.append('has_wifi=1')

  g = re.search(r'system type\s*:\s*(\S+)', data)
  if g:
    elements.append('cpu=%r' % g.group(1).upper())

  sys.stdout.write('\n%s\n' % header_comment)
  if elements and ether:
    sys.stdout.write('h = hosts.FindOrAdd(ether=%r)\n' % ether)
    for e in elements:
      sys.stdout.write('h.%s\n' % e)


if __name__ == '__main__':
  main()
