PNG  IHDR* pHYs+ IDATx]n#; cdLb Ǚ[at¤_:uP}>!Usă cag޿ ֵNu`ݼTâabO7uL&y^wFٝA"l[|ŲHLN밪4*sG3|Dv}?+y߉{OuOAt4Jj.u]Gz*҉sP'VQKbA1u\`& Af;HWj hsO;ogTu uj7S3/QzUr&wS`M$X_L7r2;aE+ώ%vikDA:dR+%KzƉo>eOth$z%: :{WwaQ:wz%4foɹE[9<]#ERINƻv溂E%P1i01 |Jvҗ&{b?9g=^wζXn/lK::90KwrюO\!ջ3uzuGv^;騢wq<Iatv09:tt~hEG`v;3@MNZD.1]L:{ծI3`L(÷ba")Y.iljCɄae#I"1 `3*Bdz>j<fU40⨬%O$3cGt]j%Fߠ_twJ;ABU8vP3uEԑwQ V:h%))LfraqX-ۿX]v-\9I gl8tzX ]ecm)-cgʒ#Uw=Wlێn(0hPP/ӨtQ“&J35 $=]r1{tLuǮ*i0_;NƝ8;-vݏr8+U-kruȕYr0RnC]*ެ(M:]gE;{]tg(#ZJ9y>utRDRMdr9㪩̞zֹb<ģ&wzJM"iI( .ꮅX)Qw:9,i좜\Ԛi7&N0:asϓc];=ΗOӣ APqz93 y $)A*kVHZwBƺnWNaby>XMN*45~ղM6Nvm;A=jֲ.~1}(9`KJ/V F9[=`~[;sRuk]rєT!)iQO)Y$V ی ۤmzWz5IM Zb )ˆC`6 rRa}qNmUfDsWuˤV{ Pݝ'=Kֳbg,UҘVz2ﴻnjNgBb{? ߮tcsͻQuxVCIY۠:(V뺕 ٥2;t`@Fo{Z9`;]wMzU~%UA蛚dI vGq\r82iu +St`cR.6U/M9IENDB`# -*- coding: utf-8 -*- from __future__ import print_function, division, absolute_import # # Copyright (c) 2018 Red Hat, Inc. # # This software is licensed to you under the GNU General Public License, # version 2 (GPLv2). There is NO WARRANTY for this software, express or # implied, including the implied warranties of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 # along with this software; if not, see # http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. # # Red Hat trademarks are not licensed under GPLv2. No permission is # granted to use or replicate Red Hat trademarks that are incorporated # in this software or its documentation. """ Utility methods for the syspurpose command """ import io import json import os import errno import sys import six from syspurpose.i18n import ugettext as _ HOST_CONFIG_DIR = "/etc/rhsm-host/" # symlink inside docker containers # Borrowed from the subscription-manager cli script def system_exit(code, msgs=None): """Exit with a code and optional message(s). Saved a few lines of code.""" if msgs: if type(msgs) not in [type([]), type(())]: msgs = (msgs, ) for msg in msgs: sys.stderr.write(str(msg) + '\n') sys.exit(code) def create_dir(path): """ Attempts to create the path given (less any file) :param path: path :return: True if changes were made, false otherwise """ try: os.makedirs(path, mode=0o755) except OSError as e: if e.errno == errno.EEXIST: # If the directory exists no changes necessary return False if e.errno == errno.EACCES: system_exit(os.EX_NOPERM, _('Cannot create directory {}\nAre you root?').format(path)) return True def create_file(path, contents): """ Attempts to create a file, with the given contents :param path: The desired path to the file :param contents: The contents to write to the file, should json-serializable :return: True if the file was newly created, false otherwise """ try: with io.open(path, 'w', encoding='utf-8') as f: write_to_file_utf8(f, contents) f.flush() except OSError as e: if e.errno == errno.EEXIST: # If the file exists no changes necessary return False if e.errno == errno.EACCES: system_exit(os.EX_NOPERM, _("Cannot create file {}\nAre you root?").format(path)) else: raise return True # Borrowed from the subscription-manager config module def in_container(): """ Are we running in a docker container or not? Assumes that if we see host rhsm configuration shared with us, we must be running in a container. """ if os.path.exists(HOST_CONFIG_DIR): return True return False def make_utf8(obj): """ Transforms the provided string into unicode if it is not already :param obj: the string to decode :return: the unicode format of the string """ if six.PY3: return obj elif obj is not None and isinstance(obj, str) and not isinstance(obj, unicode): obj = obj.decode('utf-8') return obj else: return obj def write_to_file_utf8(file, data): """ Writes out the provided data to the specified file, with user-friendly indentation, and in utf-8 encoding. :param file: The file to write to :param data: The data to be written :return: """ file.write(make_utf8(json.dumps(data, indent=2, ensure_ascii=False, sort_keys=True)))