rda-python-metrics 2.0.4__tar.gz → 2.0.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. {rda_python_metrics-2.0.4/src/rda_python_metrics.egg-info → rda_python_metrics-2.0.6}/PKG-INFO +1 -1
  2. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/pyproject.toml +1 -1
  3. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fillawsusage.py +1 -1
  4. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fillcdgusage.py +1 -1
  5. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fillcodusage.py +1 -1
  6. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fillglobususage.py +1 -1
  7. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fillipinfo.py +3 -5
  8. rda_python_metrics-2.0.6/src/rda_python_metrics/fillrdadb.py +130 -0
  9. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/viewallusage.py +6 -2
  10. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/viewawsusage.py +6 -2
  11. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/viewcheckusage.py +1 -1
  12. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/viewcodusage.py +6 -2
  13. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/viewordusage.py +1 -1
  14. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/viewosdfusage.py +8 -4
  15. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/viewrqstusage.py +6 -2
  16. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/viewtdsusage.py +6 -2
  17. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6/src/rda_python_metrics.egg-info}/PKG-INFO +1 -1
  18. rda_python_metrics-2.0.4/src/rda_python_metrics/fillrdadb.py +0 -129
  19. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/LICENSE +0 -0
  20. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/MANIFEST.in +0 -0
  21. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/README.md +0 -0
  22. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/setup.cfg +0 -0
  23. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/PgIPInfo.py +0 -0
  24. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/PgView.py +0 -0
  25. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/__init__.py +0 -0
  26. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fill_awsusage.py +0 -0
  27. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fill_cdgusage.py +0 -0
  28. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fill_codusage.py +0 -0
  29. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fill_country.py +0 -0
  30. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fill_endtime.py +0 -0
  31. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fill_globususage.py +0 -0
  32. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fill_ipinfo.py +0 -0
  33. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fill_oneorder.py +0 -0
  34. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fill_osdfusage.py +0 -0
  35. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fill_rdadb.py +0 -0
  36. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fill_tdsusage.py +0 -0
  37. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fill_user.py +0 -0
  38. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fillawsusage.usg +0 -0
  39. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fillcdgusage.usg +0 -0
  40. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fillcodusage.usg +0 -0
  41. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fillcountry.py +0 -0
  42. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fillendtime.py +0 -0
  43. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fillgdexusage.py +0 -0
  44. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fillgdexusage.usg +0 -0
  45. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fillglobususage.usg +0 -0
  46. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fillipinfo.usg +0 -0
  47. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/filloneorder.py +0 -0
  48. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/filloneorder.usg +0 -0
  49. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fillosdfusage.py +0 -0
  50. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fillosdfusage.usg +0 -0
  51. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fillrdadb.usg +0 -0
  52. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/filltdsusage.py +0 -0
  53. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/filltdsusage.usg +0 -0
  54. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/filluser.py +0 -0
  55. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/filluser.usg +0 -0
  56. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/fillzenodousage.py +0 -0
  57. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/log_arch.py +0 -0
  58. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/logarch.py +0 -0
  59. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/logarch.usg +0 -0
  60. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/pg_ipinfo.py +0 -0
  61. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/pg_person.py +0 -0
  62. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/pg_username.py +0 -0
  63. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/pg_view.py +0 -0
  64. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/pgperson.py +0 -0
  65. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/pgsyspath.py +0 -0
  66. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/pgusername.py +0 -0
  67. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/view_allusage.py +0 -0
  68. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/view_awsusage.py +0 -0
  69. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/view_checkusage.py +0 -0
  70. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/view_codusage.py +0 -0
  71. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/view_ordusage.py +0 -0
  72. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/view_osdfusage.py +0 -0
  73. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/view_rqstusage.py +0 -0
  74. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/view_tdsusage.py +0 -0
  75. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/view_webfile.py +0 -0
  76. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/view_webusage.py +0 -0
  77. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/viewallusage.usg +0 -0
  78. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/viewawsusage.usg +0 -0
  79. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/viewcheckusage.usg +0 -0
  80. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/viewcodusage.usg +0 -0
  81. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/viewordusage.usg +0 -0
  82. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/viewosdfusage.usg +0 -0
  83. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/viewrqstusage.usg +0 -0
  84. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/viewtdsusage.usg +0 -0
  85. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/viewwebfile.py +0 -0
  86. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/viewwebfile.usg +0 -0
  87. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/viewwebusage.py +0 -0
  88. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics/viewwebusage.usg +0 -0
  89. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics.egg-info/SOURCES.txt +0 -0
  90. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics.egg-info/dependency_links.txt +0 -0
  91. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics.egg-info/entry_points.txt +0 -0
  92. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics.egg-info/requires.txt +0 -0
  93. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/src/rda_python_metrics.egg-info/top_level.txt +0 -0
  94. {rda_python_metrics-2.0.4 → rda_python_metrics-2.0.6}/tests/test_metrics.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rda_python_metrics
3
- Version: 2.0.4
3
+ Version: 2.0.6
4
4
  Summary: RDA Python Package to gather and view data usage metrics
5
5
  Author-email: Zaihua Ji <zji@ucar.edu>
6
6
  Project-URL: Homepage, https://github.com/NCAR/rda-python-metrics
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
6
6
 
7
7
  [project]
8
8
  name = "rda_python_metrics"
9
- version = "2.0.4"
9
+ version = "2.0.6"
10
10
  authors = [
11
11
  { name="Zaihua Ji", email="zji@ucar.edu" },
12
12
  ]
@@ -20,7 +20,7 @@ from .pg_ipinfo import PgIPInfo
20
20
  class FillAWSUsage(PgIPInfo, PgFile):
21
21
 
22
22
  def __init__(self):
23
- super().__init()
23
+ super().__init__()
24
24
  self.USAGE = {
25
25
  'PGTBL' : "awsusage",
26
26
  'AWSDIR' : self.PGLOG["TRANSFER"] + "/AWSera5log",
@@ -19,7 +19,7 @@ from .pg_ipinfo import PgIPInfo
19
19
  class FillCDGUsage(PgSplit, PgIPInfo):
20
20
 
21
21
  def __init__(self):
22
- super().__init()
22
+ super().__init__()
23
23
  self.USAGE = {
24
24
  'TDSTBL' : "tdsusage",
25
25
  'WEBTBL' : "wusage",
@@ -19,7 +19,7 @@ from .pg_ipinfo import PgIPInfo
19
19
  class FillCODUsage(PgIPInfo):
20
20
 
21
21
  def __init__(self):
22
- super().__init()
22
+ super().__init__()
23
23
  # the define options for gathering COD data usage, one at a time
24
24
  self.MONTH = 0x02 # fet COD data usages for given months
25
25
  self.YEARS = 0x04 # get COD data usages for given years
@@ -21,7 +21,7 @@ from .pg_ipinfo import PgIPInfo
21
21
  class FillGlobusUsage(PgIPInfo, PgSplit, PgFile):
22
22
 
23
23
  def __init__(self):
24
- super().__init()
24
+ super().__init__()
25
25
  self.USAGE = {
26
26
  'PGTBL' : "wusage",
27
27
  'GBSDIR' : self.PGLOG["GDEXWORK"] + "/logs/gridftp/",
@@ -25,12 +25,10 @@ class FillIPInfo(PgIPInfo):
25
25
  self.NDAYS = 0x08 # fix data usages in recent number of days
26
26
  self.MULTI = (self.DATES|self.MONTH|self.YEARS)
27
27
  self.SINGL = (self.NDAYS)
28
- self.IPINFO = {
29
- 'USGTBL' : ['ipinfo', 'wuser', 'allusage', 'codusage', 'tdsusage'],
30
- 'CDATE' : self.curdate(),
31
- }
28
+ self.IPINFO['USGTBL'] = ['ipinfo', 'wuser', 'allusage', 'codusage', 'tdsusage']
29
+ self.IPINFO['CDATE'] = self.curdate()
32
30
  self.inputs = [] # array of input values
33
- self.table = None # table names: ipinfo, allusage, globususage, or tdsusage
31
+ self.table = None
34
32
  self.option = 0
35
33
 
36
34
  # function to read parameters
@@ -0,0 +1,130 @@
1
+ #!/usr/bin/env python3
2
+ ###############################################################################
3
+ # Title : fillrdadb
4
+ # Author : Zaihua Ji, zji@ucar.edu
5
+ # Date : 04/07/2022
6
+ # 2025-03-26 transferred to package rda_python_metrics from
7
+ # https://github.com/NCAR/rda-database.git
8
+ # 2025-12-17 convert to class FillRDADB
9
+ # Purpose : python program to retrieve info from data logs, and fill tables
10
+ # in PostgreSQL database.schema rdadb.dssdb
11
+ # Github : https://github.com/NCAR/rda-pythn-metrics.git
12
+ ###############################################################################
13
+ import sys
14
+ import re
15
+ from rda_python_common.pg_util import PgUtil
16
+ from rda_python_common.pg_dbi import PgDBI
17
+
18
+ class FillRDADB(PgUtil, PgDBI):
19
+
20
+ def __init__(self):
21
+ super().__init__()
22
+ # the define options for gathering web online file usage, one at a time
23
+ self.DATES = 0x01 # get web file usages for given dates
24
+ self.MONTH = 0x02 # fet web file usages for given months
25
+ self.YEARS = 0x04 # get web file usages for given years
26
+ self.NDAYS = 0x08 # get web file usages in recent number of days
27
+ self.CLNFL = 0x10 # clean unused file only
28
+ self.MASKS = (self.MONTH|self.YEARS|self.DATES|self.NDAYS)
29
+ self.RDADB = {
30
+ 'OPTION' : 0,
31
+ 'OPTVAL' : '',
32
+ 'DOMAIL' : 1,
33
+ 'BCKGRND' : ''
34
+ }
35
+ self.params = [] # array of input values
36
+
37
+ # function to read parameters
38
+ def read_parameters(self):
39
+ argv = sys.argv[1:]
40
+ for arg in argv:
41
+ if arg == "-b":
42
+ self.PGLOG['BCKGRND'] = "-b"
43
+ self.RDADB['BCKGRND'] = " -b"
44
+ elif arg == "-n":
45
+ self.RDADB['DOMAIL'] = 0
46
+ self.PGLOG['LOGMASK'] &= ~(self.EMLALL)
47
+ elif re.match(r'^-[cdmNy]$', arg) and not self.RDADB['OPTVAL']:
48
+ self.RDADB['OPTVAL'] = arg
49
+ if arg == "-c":
50
+ self.RDADB['OPTION'] |= self.CLNFL
51
+ elif arg == "-d":
52
+ self.RDADB['OPTION'] |= self.DATES
53
+ elif arg == "-m":
54
+ self.RDADB['OPTION'] |= self.MONTH
55
+ elif arg == "-y":
56
+ self.RDADB['OPTION'] |= self.YEARS
57
+ elif arg == "-N":
58
+ self.RDADB['OPTION'] |= self.NDAYS
59
+ elif re.match(r'^-.*', arg):
60
+ self.pglog(arg + ": Invalid Option", self.LGWNEX)
61
+ elif self.RDADB['OPTION']&self.MASKS:
62
+ self.params.append(arg)
63
+ else:
64
+ self.pglog(arg + ": Invalid Parameter", self.LGWNEX)
65
+ if not self.RDADB['OPTION'] or (self.RDADB['OPTION']&self.MASKS and not self.params):
66
+ self.show_usage('fillrdadb')
67
+ self.cmdlog("fillrdadb {}".format(' '.join(argv)))
68
+
69
+ # function to start actions
70
+ def start_actions(self):
71
+ self.dssdb_dbname()
72
+ if self.RDADB['OPTION']&self.CLNFL: # clean unused file only
73
+ self.clean_unused_files()
74
+ elif self.RDADB['OPTION']&self.MASKS:
75
+ self.fill_rdadb(self.RDADB['OPTVAL'])
76
+
77
+ # Fill self.RDADB info for given condition
78
+ def fill_rdadb(self, option):
79
+ filecond = '{} {}'.format(option, ' '.join(self.params))
80
+ self.pglog("Filling RDADB info for '{}' at {}".format(filecond, self.current_datetime()), self.LOGWRN)
81
+ # fill available custom OPeNDAP usages
82
+ self.pgsystem("fillcodusage {} {}".format(self.RDADB['BCKGRND'], filecond), self.LGWNEM, 5)
83
+ # fill available globus web data usages
84
+ self.pgsystem("fillglobususage {} {}".format(self.RDADB['BCKGRND'], filecond), self.LGWNEM, 5)
85
+ # fill available AWS web data usages
86
+ self.pgsystem("fillawsusage {} {}".format(self.RDADB['BCKGRND'], filecond), self.LGWNEM, 5)
87
+ # fill available OSDF web data usages
88
+ self.pgsystem("fillosdfusage {} {}".format(self.RDADB['BCKGRND'], filecond), self.LGWNEM, 5)
89
+ if self.RDADB['DOMAIL']: self.send_email_notice()
90
+ self.pglog("End Filling RDADB info at {}".format(self.current_datetime()), self.LGWNEM)
91
+
92
+ # clean unused MSS and Web files
93
+ def clean_unused_files(self):
94
+ self.pglog("Check and clean deleted Web files that never been used at {}".format(self.current_datetime()), self.LOGWRN)
95
+ pgrecs = self.pgmget("wfile", "wid", "status = 'D'", self.LGWNEX)
96
+ allcnt = len(pgrecs['wid']) if pgrecs else 0
97
+ self.pglog("{} record(s) retrieved from Table 'wfile' at {}".format(allcnt, self.current_datetime()), self.LOGWRN)
98
+ procnt = delcnt = 0
99
+ if allcnt:
100
+ fcond = r"wid = {} AND org_type <> 'DSS' AND wuid_read = wuid"
101
+ for fid in pgrecs['wid']:
102
+ procnt += 1
103
+ if procnt%5000 == 0:
104
+ self.pglog("{}/{} record(s) processed/removed from Table 'wfile'".format(procnt, delcnt), self.WARNLG)
105
+ if not self.pgget("wusage, wuser", "", fcond.format(fid), self.LGWNEX):
106
+ # deleted web file never been used
107
+ delcnt += self.pgdel("wfile", "wid = {}".format(fid), self.LGWNEX)
108
+ self.pglog("{} record(s) removed from Table 'wfile' at {}".format(delcnt, self.current_datetime()), self.LOGWRN)
109
+
110
+ # email notice of job done
111
+ def send_email_notice(self):
112
+ msg = ("Hi All,\n\nRDADB weekly data usage gathering is done at {}.\n\n".format(self.current_datetime()) +
113
+ "Please Let me know if you notice any problem.\n\nThanks,\n\nHua\n")
114
+ pgrecs = self.pgmget("dssgrp", "logname", "email_flag = 'Y'", self.LGWNEX)
115
+ if pgrecs:
116
+ receiver = ""
117
+ for logname in pgrecs['logname']:
118
+ if receiver: receiver += ', '
119
+ receiver += (logname + "@ucar.edu")
120
+ self.send_email("RDADB Weekly Data Usage Gathered on " + self.curdate(), receiver, msg)
121
+
122
+ # main function to excecute this script
123
+ def main():
124
+ object = FillRDADB()
125
+ object.read_parameters()
126
+ object.start_actions()
127
+ object.pgexit(0)
128
+
129
+ # call main() to start program
130
+ if __name__ == "__main__": main()
@@ -293,11 +293,15 @@ class ViewALLUsage(PgView):
293
293
  else:
294
294
  self.condition = joins
295
295
  if 'E' in self.params or 'I' in self.params:
296
- self.condition += self.notice_condition(self.params['E'], self.params['I'], self.params['t'][0])
296
+ self.condition += self.notice_condition(
297
+ self.params.get('E'),
298
+ self.params.get('I'),
299
+ self.params.get('t', [None])[0]
300
+ )
297
301
  if groupnames and self.sfields: self.condition += " GROUP BY " + groupnames
298
302
  if having: self.condition += " HAVING " + having
299
303
 
300
- # exand records as needed
304
+ # expand records as needed
301
305
  def expand_records(self, records):
302
306
  recs = self.expand_query("TIME", records, self.params, self.EXPAND)
303
307
  trecs = self.expand_query("USER", records, self.params, self.EXPAND, self.VUSG, self.SNS, self.FLDS)
@@ -261,10 +261,14 @@ class ViewAWSUsage(PgView):
261
261
  else:
262
262
  self.condition = joins
263
263
  if 'E' in self.params or 'I' in self.params:
264
- self.condition += self.notice_condition(self.params['E'], None, self.params['t'][0])
264
+ self.condition += self.notice_condition(
265
+ self.params.get('E'),
266
+ self.params.get('I'),
267
+ self.params.get('t', [None])[0]
268
+ )
265
269
  if groupnames and self.sfields: self.condition += " GROUP BY " + groupnames
266
270
 
267
- # exand records as needed
271
+ # expand records as needed
268
272
  def expand_records(self, records):
269
273
  recs = self.expand_query("TIME", records, self.params, self.EXPAND)
270
274
  trecs = self.expand_query("USER", records, self.params, self.EXPAND, self.VUSG, self.SNS, self.FLDS)
@@ -245,7 +245,7 @@ class ViewCheckUsage(PgView):
245
245
  if groupnames and self.sfields: self.condition += " GROUP BY " + groupnames
246
246
  if having: self.condition += " HAVING " + having
247
247
 
248
- # exand records as needed
248
+ # expand records as needed
249
249
  def expand_records(self, records):
250
250
  recs = self.expand_query("TIME", records, self.params, self.EXPAND)
251
251
  trecs = self.expand_query("CHECK", records, self.params, self.EXPAND, self.VUSG, self.SNS, self.FLDS)
@@ -263,10 +263,14 @@ def build_query_strings(self, usgtable):
263
263
  else:
264
264
  self.condition = joins
265
265
  if 'E' in self.params or 'I' in self.params:
266
- self.condition += self.notice_condition(self.params['E'], self.params['I'], self.params['t'][0])
266
+ self.condition += self.notice_condition(
267
+ self.params.get('E'),
268
+ self.params.get('I'),
269
+ self.params.get('t', [None])[0]
270
+ )
267
271
  if groupnames and self.sfields: self.condition += " GROUP BY " + groupnames
268
272
 
269
- # exand records as needed
273
+ # expand records as needed
270
274
  def expand_records(self, records):
271
275
  recs = self.expand_query("TIME", records, self.params, self.EXPAND)
272
276
  trecs = self.expand_query("USER", records, self.params, self.EXPAND, self.VUSG, self.SNS, self.FLDS)
@@ -282,7 +282,7 @@ class ViewORDUsage(PgView):
282
282
  if groupnames and self.sfields: self.condition += " GROUP BY " + groupnames
283
283
  if having: self.condition += " HAVING " + having
284
284
 
285
- # exand records as needed
285
+ # expand records as needed
286
286
  def expand_records(self, records):
287
287
  recs = self.expand_query("TIME", records, self.params, self.EXPAND)
288
288
  trecs = self.expand_query("USER", records, self.params, self.EXPAND, self.VUSG, self.SNS, self.FLDS)
@@ -253,18 +253,22 @@ class ViewOSDFUsage(PgView):
253
253
  self.condition += cnd
254
254
  (self.tablenames, joins) = self.join_query_tables(fld[3], self.tablenames, joins, usgtable)
255
255
  # append joins, group by, order by, and having strings to condition string
256
- if 'E' in self.params or 'I' in self.self.params:
256
+ if 'E' in self.params or 'I' in self.params:
257
257
  (self.tablenames, joins) = self.join_query_tables("emreceive", self.tablenames, joins, usgtable)
258
258
  if joins:
259
259
  if self.condition:
260
260
  self.condition = "{} AND {}".format(joins, self.condition)
261
261
  else:
262
262
  self.condition = joins
263
- if 'E' in self.self.params or 'I' in self.params:
264
- self.condition += self.notice_condition(self.params['E'], None, self.params['t'][0])
263
+ if 'E' in self.params or 'I' in self.params:
264
+ self.condition += self.notice_condition(
265
+ self.params.get('E'),
266
+ self.params.get('I'),
267
+ self.params.get('t', [None])[0]
268
+ )
265
269
  if groupnames and self.sfields: self.condition += " GROUP BY " + groupnames
266
270
 
267
- # exand records as needed
271
+ # expand records as needed
268
272
  def expand_records(self, records):
269
273
  recs = self.expand_query("TIME", records, self.params, self.EXPAND)
270
274
  trecs = self.expand_query("USER", records, self.params, self.EXPAND, self.VUSG, self.SNS, self.FLDS)
@@ -301,11 +301,15 @@ class ViewRQSTUsage(PgView):
301
301
  self.condition = joins
302
302
  if 'n' in self.params: self.condition += " AND location > ' '"
303
303
  if 'E' in self.params or 'I' in self.params:
304
- self.condition += self.notice_condition(self.params['E'], self.params['I'], self.params['t'][0])
304
+ self.condition += self.notice_condition(
305
+ self.params.get('E'),
306
+ self.params.get('I'),
307
+ self.params.get('t', [None])[0]
308
+ )
305
309
  if groupnames and self.sfields: self.condition += " GROUP BY " + groupnames
306
310
  if having: self.condition += " HAVING " + having
307
311
 
308
- # exand records as needed
312
+ # expand records as needed
309
313
  def expand_records(self, records):
310
314
  recs = self.expand_query("TIME", records, self.params, self.EXPAND)
311
315
  trecs = self.expand_query("USER", records, self.params, self.EXPAND, self.VUSG, self.SNS, self.FLDS)
@@ -266,10 +266,14 @@ class ViewTDSUsage(PgView):
266
266
  else:
267
267
  self.condition = joins
268
268
  if 'E' in self.params or 'I' in self.params:
269
- self.condition += self.notice_condition(self.params['E'], None, self.params['t'][0])
269
+ self.condition += self.notice_condition(
270
+ self.params.get('E'),
271
+ self.params.get('I'),
272
+ self.params.get('t', [None])[0]
273
+ )
270
274
  if groupnames and self.sfields: self.condition += " GROUP BY " + groupnames
271
275
 
272
- # exand records as needed
276
+ # expand records as needed
273
277
  def expand_records(self, records):
274
278
  recs = self.expand_query("TIME", records, self.params, self.EXPAND)
275
279
  trecs = self.expand_query("USER", records, self.params, self.EXPAND, self.VUSG, self.SNS, self.FLDS)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rda_python_metrics
3
- Version: 2.0.4
3
+ Version: 2.0.6
4
4
  Summary: RDA Python Package to gather and view data usage metrics
5
5
  Author-email: Zaihua Ji <zji@ucar.edu>
6
6
  Project-URL: Homepage, https://github.com/NCAR/rda-python-metrics
@@ -1,129 +0,0 @@
1
- #!/usr/bin/env python3
2
- ###############################################################################
3
- # Title : fillrdadb
4
- # Author : Zaihua Ji, zji@ucar.edu
5
- # Date : 04/07/2022
6
- # 2025-03-26 transferred to package rda_python_metrics from
7
- # https://github.com/NCAR/rda-database.git
8
- # 2025-12-17 convert to class FillRDADB
9
- # Purpose : python program to retrieve info from data logs, and fill tables
10
- # in PostgreSQL database.schema rdadb.dssdb
11
- # Github : https://github.com/NCAR/rda-pythn-metrics.git
12
- ###############################################################################
13
- import sys
14
- import re
15
- from rda_python_common.pg_util import PgUtil
16
-
17
- class FillRDADB(PgUtil):
18
-
19
- def __init__(self):
20
- super().__init__()
21
- # the define options for gathering web online file usage, one at a time
22
- self.DATES = 0x01 # get web file usages for given dates
23
- self.MONTH = 0x02 # fet web file usages for given months
24
- self.YEARS = 0x04 # get web file usages for given years
25
- self.NDAYS = 0x08 # get web file usages in recent number of days
26
- self.CLNFL = 0x10 # clean unused file only
27
- self.MASKS = (self.MONTH|self.YEARS|self.DATES|self.NDAYS)
28
- self.RDADB = {
29
- 'OPTION' : 0,
30
- 'OPTVAL' : '',
31
- 'DOMAIL' : 1,
32
- 'BCKGRND' : ''
33
- }
34
- self.params = [] # array of input values
35
-
36
- # function to read parameters
37
- def read_paramers(self):
38
- argv = sys.argv[1:]
39
- for arg in argv:
40
- if arg == "-b":
41
- self.PGLOG['BCKGRND'] = "-b"
42
- self.RDADB['BCKGRND'] = " -b"
43
- elif arg == "-n":
44
- self.RDADB['DOMAIL'] = 0
45
- self.PGLOG['LOGMASK'] &= ~(self.EMLALL)
46
- elif re.match(r'^-[cdmNy]$', arg) and not self.RDADB['OPTVAL']:
47
- self.RDADB['OPTVAL'] = arg
48
- if arg == "-c":
49
- self.RDADB['OPTION'] |= self.CLNFL
50
- elif arg == "-d":
51
- self.RDADB['OPTION'] |= self.DATES
52
- elif arg == "-m":
53
- self.RDADB['OPTION'] |= self.MONTH
54
- elif arg == "-y":
55
- self.RDADB['OPTION'] |= self.YEARS
56
- elif arg == "-N":
57
- self.RDADB['OPTION'] |= self.NDAYS
58
- elif re.match(r'^-.*', arg):
59
- self.pglog(arg + ": Invalid Option", self.LGWNEX)
60
- elif self.RDADB['OPTION']&self.MASKS:
61
- self.params.append(arg)
62
- else:
63
- self.pglog(arg + ": Invalid Parameter", self.LGWNEX)
64
- if not self.RDADB['OPTION'] or (self.RDADB['OPTION']&self.MASKS and not self.params):
65
- self.show_usage('fillrdadb')
66
- self.cmdlog("fillrdadb {}".format(' '.join(argv)))
67
-
68
- # function to start actions
69
- def start_actions(self):
70
- self.dssdb_dbname()
71
- if self.RDADB['OPTION']&self.CLNFL: # clean unused file only
72
- self.clean_unused_files()
73
- elif self.RDADB['OPTION']&self.MASKS:
74
- self.fill_rdadb(self.RDADB['OPTVAL'])
75
-
76
- # Fill self.RDADB info for given condition
77
- def fill_rdadb(self, option):
78
- filecond = '{} {}'.format(option, ' '.join(self.params))
79
- self.pglog("Filling self.RDADB info for '{}' at {}".format(filecond, self.current_datetime()), self.LOGWRN)
80
- # fill available custom OPeNDAP usages
81
- self.pgsystem("fillcodusage {} {}".format(self.RDADB['BCKGRND'], filecond), self.LGWNEM, 5)
82
- # fill available globus web data usages
83
- self.pgsystem("fillglobususage {} {}".format(self.RDADB['BCKGRND'], filecond), self.LGWNEM, 5)
84
- # fill available AWS web data usages
85
- self.pgsystem("fillawsusage {} {}".format(self.RDADB['BCKGRND'], filecond), self.LGWNEM, 5)
86
- # fill available OSDF web data usages
87
- self.pgsystem("fillosdfusage {} {}".format(self.RDADB['BCKGRND'], filecond), self.LGWNEM, 5)
88
- if self.RDADB['DOMAIL']: self.send_email_notice()
89
- self.pglog("End Filling self.RDADB info at {}".format(self.current_datetime()), self.LGWNEM)
90
-
91
- # clean unused MSS and Web files
92
- def clean_unused_files(self):
93
- self.pglog("Check and clean deleted Web files that never been used at {}".format(self.current_datetime()), self.LOGWRN)
94
- pgrecs = self.pgmget("wfile", "wid", "status = 'D'", self.LGWNEX)
95
- allcnt = len(pgrecs['wid']) if pgrecs else 0
96
- self.pglog("{} record(s) retrieved from Table 'wfile' at {}".format(allcnt, self.current_datetime()), self.LOGWRN)
97
- procnt = delcnt = 0
98
- if allcnt:
99
- fcond = r"wid = {} AND org_type <> 'DSS' AND wuid_read = wuid"
100
- for fid in pgrecs['wid']:
101
- procnt += 1
102
- if procnt%5000 == 0:
103
- self.pglog("{}/{} record(s) processed/removed from Table 'wfile'".format(procnt, delcnt), self.WARNLG)
104
- if not self.pgget("wusage, wuser", "", fcond.format(fid), self.LGWNEX):
105
- # deleted web file never been used
106
- delcnt += self.pgdel("wfile", "wid = {}".format(fid), self.LGWNEX)
107
- self.pglog("{} record(s) removed from Table 'wfile' at {}".format(delcnt, self.current_datetime()), self.LOGWRN)
108
-
109
- # email notice of job done
110
- def send_email_notice(self):
111
- msg = ("Hi All,\n\nself.RDADB weekly data usage gathering is done at {}.\n\n".format(self.current_datetime()) +
112
- "Please Let me know if you notice any problem.\n\nThanks,\n\nHua\n")
113
- pgrecs = self.pgmget("dssgrp", "logname", "email_flag = 'Y'", self.LGWNEX)
114
- if pgrecs:
115
- receiver = ""
116
- for logname in pgrecs['logname']:
117
- if receiver: receiver += ', '
118
- receiver += (logname + "@ucar.edu")
119
- self.send_email("self.RDADB Weekly Data Usage Gathered on " + self.curdate(), receiver, msg)
120
-
121
- # main function to excecute this script
122
- def main():
123
- object = FillRDADB()
124
- object.read_parameters()
125
- object.start_actions()
126
- object.pgexit(0)
127
-
128
- # call main() to start program
129
- if __name__ == "__main__": main()