~alai/charms/trusty/contrail-configuration-inc-timeout/trunk

« back to all changes in this revision

Viewing changes to hooks/charmhelpers/core/host.py

  • Committer: Robert Ayres
  • Date: 2015-08-28 10:58:17 UTC
  • Revision ID: robert.ayres@canonical.com-20150828105817-c8ar12o1x0o35uxc
Sync charm helpers

Show diffs side-by-side

added added

removed removed

Lines of Context:
63
63
    return service_result
64
64
 
65
65
 
 
66
def service_pause(service_name, init_dir=None):
 
67
    """Pause a system service.
 
68
 
 
69
    Stop it, and prevent it from starting again at boot."""
 
70
    if init_dir is None:
 
71
        init_dir = "/etc/init"
 
72
    stopped = service_stop(service_name)
 
73
    # XXX: Support systemd too
 
74
    override_path = os.path.join(
 
75
        init_dir, '{}.override'.format(service_name))
 
76
    with open(override_path, 'w') as fh:
 
77
        fh.write("manual\n")
 
78
    return stopped
 
79
 
 
80
 
 
81
def service_resume(service_name, init_dir=None):
 
82
    """Resume a system service.
 
83
 
 
84
    Reenable starting again at boot. Start the service"""
 
85
    # XXX: Support systemd too
 
86
    if init_dir is None:
 
87
        init_dir = "/etc/init"
 
88
    override_path = os.path.join(
 
89
        init_dir, '{}.override'.format(service_name))
 
90
    if os.path.exists(override_path):
 
91
        os.unlink(override_path)
 
92
    started = service_start(service_name)
 
93
    return started
 
94
 
 
95
 
66
96
def service(action, service_name):
67
97
    """Control a system service"""
68
98
    cmd = ['service', service_name, action]
118
148
    return user_info
119
149
 
120
150
 
 
151
def user_exists(username):
 
152
    """Check if a user exists"""
 
153
    try:
 
154
        pwd.getpwnam(username)
 
155
        user_exists = True
 
156
    except KeyError:
 
157
        user_exists = False
 
158
    return user_exists
 
159
 
 
160
 
121
161
def add_group(group_name, system_group=False):
122
162
    """Add a group to the system"""
123
163
    try:
140
180
 
141
181
def add_user_to_group(username, group):
142
182
    """Add a user to a group"""
143
 
    cmd = [
144
 
        'gpasswd', '-a',
145
 
        username,
146
 
        group
147
 
    ]
 
183
    cmd = ['gpasswd', '-a', username, group]
148
184
    log("Adding user {} to group {}".format(username, group))
149
185
    subprocess.check_call(cmd)
150
186
 
254
290
    return system_mounts
255
291
 
256
292
 
 
293
def fstab_mount(mountpoint):
 
294
    """Mount filesystem using fstab"""
 
295
    cmd_args = ['mount', mountpoint]
 
296
    try:
 
297
        subprocess.check_output(cmd_args)
 
298
    except subprocess.CalledProcessError as e:
 
299
        log('Error unmounting {}\n{}'.format(mountpoint, e.output))
 
300
        return False
 
301
    return True
 
302
 
 
303
 
257
304
def file_hash(path, hash_type='md5'):
258
305
    """
259
306
    Generate a hash checksum of the contents of 'path' or None if not found.
370
417
    return(''.join(random_chars))
371
418
 
372
419
 
373
 
def list_nics(nic_type):
 
420
def is_phy_iface(interface):
 
421
    """Returns True if interface is not virtual, otherwise False."""
 
422
    if interface:
 
423
        sys_net = '/sys/class/net'
 
424
        if os.path.isdir(sys_net):
 
425
            for iface in glob.glob(os.path.join(sys_net, '*')):
 
426
                if '/virtual/' in os.path.realpath(iface):
 
427
                    continue
 
428
 
 
429
                if interface == os.path.basename(iface):
 
430
                    return True
 
431
 
 
432
    return False
 
433
 
 
434
 
 
435
def get_bond_master(interface):
 
436
    """Returns bond master if interface is bond slave otherwise None.
 
437
 
 
438
    NOTE: the provided interface is expected to be physical
 
439
    """
 
440
    if interface:
 
441
        iface_path = '/sys/class/net/%s' % (interface)
 
442
        if os.path.exists(iface_path):
 
443
            if '/virtual/' in os.path.realpath(iface_path):
 
444
                return None
 
445
 
 
446
            master = os.path.join(iface_path, 'master')
 
447
            if os.path.exists(master):
 
448
                master = os.path.realpath(master)
 
449
                # make sure it is a bond master
 
450
                if os.path.exists(os.path.join(master, 'bonding')):
 
451
                    return os.path.basename(master)
 
452
 
 
453
    return None
 
454
 
 
455
 
 
456
def list_nics(nic_type=None):
374
457
    '''Return a list of nics of given type(s)'''
375
458
    if isinstance(nic_type, six.string_types):
376
459
        int_types = [nic_type]
377
460
    else:
378
461
        int_types = nic_type
 
462
 
379
463
    interfaces = []
380
 
    for int_type in int_types:
381
 
        cmd = ['ip', 'addr', 'show', 'label', int_type + '*']
 
464
    if nic_type:
 
465
        for int_type in int_types:
 
466
            cmd = ['ip', 'addr', 'show', 'label', int_type + '*']
 
467
            ip_output = subprocess.check_output(cmd).decode('UTF-8')
 
468
            ip_output = ip_output.split('\n')
 
469
            ip_output = (line for line in ip_output if line)
 
470
            for line in ip_output:
 
471
                if line.split()[1].startswith(int_type):
 
472
                    matched = re.search('.*: (' + int_type +
 
473
                                        r'[0-9]+\.[0-9]+)@.*', line)
 
474
                    if matched:
 
475
                        iface = matched.groups()[0]
 
476
                    else:
 
477
                        iface = line.split()[1].replace(":", "")
 
478
 
 
479
                    if iface not in interfaces:
 
480
                        interfaces.append(iface)
 
481
    else:
 
482
        cmd = ['ip', 'a']
382
483
        ip_output = subprocess.check_output(cmd).decode('UTF-8').split('\n')
383
 
        ip_output = (line for line in ip_output if line)
 
484
        ip_output = (line.strip() for line in ip_output if line)
 
485
 
 
486
        key = re.compile('^[0-9]+:\s+(.+):')
384
487
        for line in ip_output:
385
 
            if line.split()[1].startswith(int_type):
386
 
                matched = re.search('.*: (' + int_type + r'[0-9]+\.[0-9]+)@.*', line)
387
 
                if matched:
388
 
                    interface = matched.groups()[0]
389
 
                else:
390
 
                    interface = line.split()[1].replace(":", "")
391
 
                interfaces.append(interface)
 
488
            matched = re.search(key, line)
 
489
            if matched:
 
490
                iface = matched.group(1)
 
491
                iface = iface.partition("@")[0]
 
492
                if iface not in interfaces:
 
493
                    interfaces.append(iface)
392
494
 
393
495
    return interfaces
394
496