def version_compare(v1, v2): """Function compares two versions, handling differences with conversion to LegacyVersion""" # getting raw version, while striping 'v' char at the start. if exists. # removing this char lets us safely compare the two version. v1_raw, v2_raw = CveUtils.to_raw_version(v1).strip('v'), CveUtils.to_raw_version(v2).strip('v') new_v1 = version.LegacyVersion(v1_raw) new_v2 = version.LegacyVersion(v2_raw) return CveUtils.basic_compare(new_v1, new_v2)
def _get_def_for_version(self, defn: List, version: str) -> Dict: '''Extract the right definition for the version''' if isinstance(defn, dict): return defn if not isinstance(defn, list): return defn for item in defn: os_version = item.get('version', '') if os_version == "all": return item if version == 0: # There are various outputs that due to an old parsing bug # return a node version of 0. Use 'all' for those continue opdict = { '>': operator.gt, '<': operator.lt, '>=': operator.ge, '<=': operator.le, '=': operator.eq, '!=': operator.ne } op = operator.eq for elem, val in opdict.items(): if os_version.startswith(elem): os_version = os_version.replace(elem, '').strip() op = val break if op(version_parse.LegacyVersion(version), version_parse.LegacyVersion(os_version)): return item return None
def get(self, **kwargs): """Get the information requested""" view = kwargs.get('view', self.iobj.view) columns = kwargs.get('columns', ['default']) addnl_fields = kwargs.pop('addnl_fields', []) user_query = kwargs.pop('query_str', '') status = kwargs.pop('status', '') os_version = kwargs.pop('version', '') vendor = kwargs.get('vendor', '') model = kwargs.get('model', '') os = kwargs.get('os', '') drop_cols = [] if 'active' not in addnl_fields+columns and columns != ['*']: addnl_fields.append('active') drop_cols.append('active') # os is not included in the default column list. Why? I was dumb if (columns == ['default'] and os) or (os and 'os' not in columns): addnl_fields.append('os') drop_cols.append('os') for col in ['namespace', 'hostname', 'status', 'address']: if columns not in [['default'], ['*']] and col not in columns: addnl_fields.append(col) drop_cols.append(col) if columns == ['*'] or 'uptime' in columns: if columns != ['*'] and 'bootupTimestamp' not in columns: addnl_fields.append('bootupTimestamp') drop_cols.append('bootupTimestamp') df = super().get(active_only=False, addnl_fields=addnl_fields, **kwargs) if view == 'latest' and 'status' in df.columns: df['status'] = np.where(df.active, df['status'], 'dead') poller_df = self._get_table_sqobj('sqPoller').get( namespace=kwargs.get('namespace', []), hostname=kwargs.get('hostname', []), service='device', columns='namespace hostname status'.split()) if not poller_df.empty: # Identify the address to namespace/hostname mapping addr_dict = {f"{x['namespace']}-{x['address']}": x['hostname'] for x in df[['namespace', 'address', 'hostname']] .to_dict(orient='records')} poller_df['hostname'] = poller_df.apply( lambda x, y: y.get(f"{x['namespace']}-{x['hostname']}", x['hostname']), args=(addr_dict,), axis=1) poller_df = poller_df\ .drop_duplicates(subset=['namespace', 'hostname'], keep='last') \ .reset_index(drop=True) df = df.merge(poller_df, on=['namespace', 'hostname'], how='outer', suffixes=['', '_y']) \ .fillna({'bootupTimestamp': 0, 'timestamp': 0, 'active': True}) \ .fillna('N/A') df.status = np.where( (df['status_y'] != 0) & (df['status_y'] != 200) & (df['status'] == "N/A"), 'neverpoll', df['status']) df = df[df.status != 'N/A'] df.timestamp = np.where(df['timestamp'] == 0, df['timestamp_y'], df['timestamp']) if 'address' in df.columns: df.address = np.where(df['address'] == 'N/A', df['hostname'], df['address']) drop_cols.extend(['status_y', 'timestamp_y']) if 'uptime' in columns or columns == ['*']: uptime_cols = (df['timestamp'] - humanize_timestamp(df['bootupTimestamp']*1000, self.cfg.get('analyzer', {}).get('timezone', None))) uptime_cols = pd.to_timedelta(uptime_cols, unit='s') df.insert(len(df.columns)-1, 'uptime', uptime_cols) if df.empty: return df # The poller merge kills the filtering we did earlier, so redo: if status: df = df.loc[df.status.isin(status)] if vendor: df = df.loc[df.vendor.isin(vendor)] if model: df = df.loc[df.model.isin(model)] if os: df = df.loc[df.os.isin(os)] if os_version: opdict = {'>': operator.gt, '<': operator.lt, '>=': operator.ge, '<=': operator.le, '=': operator.eq, '!=': operator.ne} op = operator.eq for elem, val in opdict.items(): if os_version.startswith(elem): os_version = os_version.replace(elem, '') op = val break df = df.loc[df.version.apply( lambda x: op(version.LegacyVersion(x), version.LegacyVersion(os_version)))] df = self._handle_user_query_str(df, user_query) # if poller has failed completely, Can mess up the order of columns cols = self.iobj.schema.get_display_fields(columns) if columns == ['default'] and 'timestamp' not in cols: cols.append('timestamp') if 'sqvers' in cols: cols.remove('sqvers') return df.drop(columns=drop_cols, errors='ignore')[cols]
def to_legacy(full_ver): # converting version to version.LegacyVersion return version.LegacyVersion('.'.join(map(str, full_ver._version.release)))