@@ -49,35 +49,36 @@ def __init__(self, *inParams):
4949        self .stdout  =  []
5050        self .stderr  =  []
5151        self .called  =  False 
52-          
52+ 
5353    def  _NewPipe (self , * inParams ):
5454        if  len (inParams ) ==  1  and  isinstance (inParams , (list , tuple )):
5555                params  =  inParams [0 ]
5656        else :
5757            params  =  inParams 
58-              
58+ 
5959        self .pipe  =  subprocess .Popen (params ,
6060            stdin = subprocess .PIPE ,
6161            stdout = subprocess .PIPE ,
6262            stderr = subprocess .PIPE ,
63+             text = True ,
6364            close_fds = True )
6465        self .called  =  False 
65-      
66+ 
6667    def  Stdout (self ):
6768        if  not  self .called :
6869            self .Call ()
6970        return  self .stdout 
70-          
71+ 
7172    def  Stderr (self ):
7273        if  not  self .called :
7374            self .Call ()
7475        return  self .stderr 
75-      
76+ 
7677    def  AllOutput (self ):
7778        if  not  self .called :
7879            self .Call ()
7980        return  self .stdout  +  self .stderr 
80-      
81+ 
8182    def  Communicate (self , inInput  =  None ):
8283        if  self .called :
8384            raise  Exception ("ShellPipe called more than once" )
@@ -88,19 +89,19 @@ def Communicate(self, inInput = None):
8889                    stdout , stderr  =  self .pipe .communicate ("\n " .join (inInput ))
8990                else :
9091                    stdout , stderr  =  self .pipe .communicate (inInput )
91-                      
92+ 
9293                self .stdout  +=  stdout .splitlines ()
9394                self .stderr  +=  stderr .splitlines ()
9495                break 
9596            except  IOError  as  e :
9697                if  e .errno  !=  errno .EINTR : # Loop if EINTR 
9798                    raise 
9899            # Other exceptions propagate to the caller 
99-          
100+ 
100101    def  CallRC (self , inInput  =  None ): # Raise exception or return the return code 
101102        self .Communicate (inInput )
102103        return  self .pipe .returncode 
103-      
104+ 
104105    def  Call (self , inInput  =  None ): # Raise exception on failure 
105106        self .Communicate (inInput )
106107        if  self .pipe .returncode  !=  0 :
@@ -111,14 +112,14 @@ def Call(self, inInput = None): # Raise exception on failure
111112            else :
112113                raise  Exception ("Unknown failure" )
113114        return  self 
114-      
115+ 
115116    def  Chain (self , * inParams ):
116117        if  not  self .called :
117118            self .Call ()
118119        self ._NewPipe (* inParams )
119120        self .Call ()
120121        return  self 
121-      
122+ 
122123    def  Pipe (self , * inParams ):
123124        if  not  self .called :
124125            self .Call ()
@@ -135,7 +136,7 @@ def MakeSafeParam(cls, inParam):
135136        if  not  re .match (r'[-A-Za-z0-9/._~:@]*$' , inParam ):
136137            raise  Exception ("Invalid characters in parameter '" + inParam + "'" )
137138        return  inParam 
138-          
139+ 
139140    @classmethod  
140141    def  WaitOnPipe (cls , inPipe ):
141142        # Wait on a popen2 pipe, handling Interrupted System Call exceptions 
@@ -154,7 +155,7 @@ class TimeUtils:
154155    @staticmethod  
155156    def  AlarmHandler (inSigNum , inStackFrame ):
156157        raise  TimeException ("Operation timed out" )
157-          
158+ 
158159    @classmethod  
159160    def  TimeoutWrapper (cls , inCallable , inTimeout ):
160161        oldHandler  =  signal .signal (signal .SIGALRM , TimeUtils .AlarmHandler )
@@ -164,11 +165,11 @@ def TimeoutWrapper(cls, inCallable, inTimeout):
164165        finally :
165166            signal .alarm (0 )
166167            signal .signal (signal .SIGALRM , oldHandler )
167-              
168+ 
168169    @classmethod  
169170    def  DurationString (cls , inSecs ):
170171        secs  =  max (0 , int (inSecs ))
171-          
172+ 
172173        hours  =  int (secs  /  3600 )
173174        secs  -=  hours  *  3600 
174175        mins  =  int (secs  /  60 )
@@ -178,15 +179,15 @@ def DurationString(cls, inSecs):
178179        else :
179180            retVal  =  "%d:%2.2d"  %  (mins , secs )
180181        return  retVal 
181-          
182+ 
182183    @classmethod  
183184    def  DateTimeToSecs (cls , inDateTime ):
184185        structTime  =  time .strptime (inDateTime .value , '%Y%m%dT%H:%M:%SZ' )
185186        retVal  =  time .mktime (structTime )
186187        if  retVal  <=  3601.0 : # Handle the effect of daylight savings on start of epoch 
187188            retVal  =  0.0 
188189        return  retVal 
189-      
190+ 
190191class  IPUtils :
191192    @classmethod  
192193    def  ValidateIP (cls , text ):
@@ -199,7 +200,7 @@ def ValidateIP(cls, text):
199200            largest  =  max (largest , i )
200201        if  largest  ==  0 : return  False 
201202        return  True 
202-          
203+ 
203204    @classmethod  
204205    def  ValidateNetmask (cls , text ):
205206        rc  =  re .match ("^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$" , text )
@@ -229,7 +230,7 @@ def AssertValidHostname(cls, inName):
229230        if  not  re .match (r'[0-9A-Za-z]([-0-9A-Za-z]{0,61}[0-9A-Za-z]|)$' , inName ):
230231            raise  Exception (Lang ('Invalid hostname' ))
231232        return  inName 
232-          
233+ 
233234    @classmethod  
234235    def  AssertValidNetworkName (cls , inName ):
235236        # Also allow FQDN-style names 
@@ -261,7 +262,7 @@ def AssertValidNFSPathName(cls, inName):
261262        for  subName  in  splitNames [1 :]:
262263            cls .AssertValidNFSDirectoryName (subName )
263264        return  inName 
264-          
265+ 
265266    @classmethod  
266267    def  AssertValidCIFSPathName (cls , inName ):
267268        splitNames  =  inName .split ('\\ ' )
@@ -277,7 +278,7 @@ def BinarySizeString(cls, inBytes, inInFix = None):
277278        else :
278279            inFix  =  FirstValue (inInFix , '' )
279280            bytes  =  int (inBytes )
280-              
281+ 
281282            if  bytes  is  None  or  bytes  <  0 :
282283                retVal  =  Lang ('<Unknown>' )
283284            elif  bytes  >=  1073741824 : # 1GiB 
@@ -320,12 +321,12 @@ def DecimalSizeString(cls, inBytes, inPrefix = None):
320321    @classmethod  
321322    def  MemorySizeString (cls , inBytes ):
322323        return  cls .BinarySizeString (inBytes )
323-          
324+ 
324325    @classmethod  
325326    def  SRSizeString (cls , inBytes ):
326327        return  cls .BinarySizeString (inBytes )
327328
328329    @classmethod  
329330    def  DiskSizeString (cls , inBytes ):
330331        return  cls .BinarySizeString (inBytes )+ ' (' + cls .DecimalSizeString (inBytes )+ ')' 
331-          
332+ 
0 commit comments