@ -21,12 +21,10 @@ import json
import os
import stat
from ansible . module_utils . six . moves import configparser
from ansible . module_utils . six . moves import StringIO
from ansible . module_utils . _text import to_text
from ansible . module_utils . facts . utils import get_file_content
from ansible . module_utils . facts . collector import BaseFactCollector
from ansible . module_utils . six . moves import configparser , StringIO
class LocalFactCollector ( BaseFactCollector ) :
@ -46,36 +44,47 @@ class LocalFactCollector(BaseFactCollector):
return local_facts
local = { }
# go over .fact files, run executables, read rest, skip bad with warning and note
for fn in sorted ( glob . glob ( fact_path + ' /*.fact ' ) ) :
# where it will sit under local facts
# use filename for key where it will sit under local facts
fact_base = os . path . basename ( fn ) . replace ( ' .fact ' , ' ' )
if stat . S_IXUSR & os . stat ( fn ) [ stat . ST_MODE ] :
# run it
# try to read it as json first
# if that fails read it with ConfigParser
# if that fails, skip it
failed = None
try :
# run it
rc , out , err = module . run_command ( fn )
except UnicodeError :
fact = ' error loading fact - output of running %s was not utf-8 ' % fn
local [ fact_base ] = fact
local_facts [ ' local ' ] = local
module . warn ( fact )
return local_facts
if rc != 0 :
failed = ' Failure executing fact script ( %s ), rc: %s , err: %s ' % ( fn , rc , err )
except ( IOError , OSError ) as e :
failed = ' Could not execute fact script ( %s ): %s ' % ( fn , to_text ( e ) )
if failed is not None :
local [ fact_base ] = failed
module . warn ( failed )
continue
else :
# ignores exceptions and returns empty
out = get_file_content ( fn , default = ' ' )
# load raw json
fact = ' loading %s ' % fact_base
try :
# ensure we have unicode
out = to_text ( out , errors = ' surrogate_or_strict ' )
except UnicodeError :
fact = ' error loading fact - output of running " %s " was not utf-8 ' % fn
local [ fact_base ] = fact
module . warn ( fact )
continue
# try to read it as json first
try :
fact = json . loads ( out )
except ValueError :
# load raw ini
# if that fails read it with ConfigParser
cp = configparser . ConfigParser ( )
try :
cp . readfp ( StringIO ( out ) )
except configparser . Error :
fact = " error loading fact - please check content"
fact = " error loading fact s as JSON or ini - please check content: %s " % fn
module . warn ( fact )
else :
fact = { }
@ -85,6 +94,9 @@ class LocalFactCollector(BaseFactCollector):
for opt in cp . options ( sect ) :
val = cp . get ( sect , opt )
fact [ sect ] [ opt ] = val
except Exception as e :
fact = " Failed to convert ( %s ) to JSON: %s " % ( fn , to_text ( e ) )
module . warn ( fact )
local [ fact_base ] = fact