gea-program 0.56.0__tar.gz → 0.57.0__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.
- {gea_program-0.56.0/gea_program.egg-info → gea_program-0.57.0}/PKG-INFO +16 -2
- {gea_program-0.56.0 → gea_program-0.57.0}/README.md +15 -1
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/__init__.py +1 -1
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/__main__.py +9 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/acceptance_tests.py +162 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/cli.py +14 -1
- gea_program-0.57.0/gea/help/IT_SECURITY.md +138 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/helplib.py +8 -0
- {gea_program-0.56.0 → gea_program-0.57.0/gea_program.egg-info}/PKG-INFO +16 -2
- {gea_program-0.56.0 → gea_program-0.57.0}/gea_program.egg-info/SOURCES.txt +1 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/pyproject.toml +1 -1
- {gea_program-0.56.0 → gea_program-0.57.0}/LICENSE +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/BENCH_TEST_PROTOCOL.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/accuracy_statement.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/alarm_engine.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/alerts.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/backup.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/bench.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/blind_harness.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/acex_lomonosov_age_depth_model.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/acex_lomonosov_age_depth_model.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/agassiz77_canada_temperature.csv +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/agassiz77_canada_temperature.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/barbados_110_consolidation.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/barbados_110_consolidation.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/bengal_u1452_grain_size.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/bengal_u1452_grain_size.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/blake_164_methane_isotopes.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/blake_164_methane_isotopes.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/collingwood_1_28_ks_complete.las +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/collingwood_1_28_ks_complete.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/costa_rica_odp_friction_envelope.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/costa_rica_odp_friction_envelope.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/dsdp_504b_physical_properties.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/dsdp_504b_physical_properties.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/dsdp_504b_sound_velocity.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/dsdp_504b_sound_velocity.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/elgygytgyn_5011_turbidites.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/elgygytgyn_5011_turbidites.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/epica_domec_co2_800kyr.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/epica_domec_co2_800kyr.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/fram_909_organic_petrography.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/fram_909_organic_petrography.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/gbr_325_coral_uth_ages.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/gbr_325_coral_uth_ages.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/gisp2_greenland_temperature.csv +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/gisp2_greenland_temperature.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/gom_308_t2p_insitu.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/gom_308_t2p_insitu.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/guaymas_385_dom_d13c.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/guaymas_385_dom_d13c.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/hikurangi_u1520_friction_insitu.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/hikurangi_u1520_friction_insitu.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/iodp_u1324_pore_pressure.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/iodp_u1324_pore_pressure.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/jfast_c0019_slow_slip_events.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/jfast_c0019_slow_slip_events.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/kennetcook_2_p129_excerpt.las +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/kennetcook_2_p129_excerpt.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_hb_bhgm_density.dat +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_hb_bhgm_density.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_hb_complog_6020_excerpt.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_hb_complog_6020_excerpt.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_hb_hlog246_temperature.dat +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_hb_hlog246_temperature.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_hb_rockmech_compress.dat +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_hb_rockmech_compress.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.dat +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_vb_rockmech_compress.dat +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_vb_rockmech_compress.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_vb_vlog251_temperature.dat +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_vb_vlog251_temperature.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/l06_06_nl_survey.csv +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/l06_06_nl_survey.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/l07_01_nl_excerpt.las +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/l07_01_nl_excerpt.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/mariana_1200_serpentinite_geochem.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/mariana_1200_serpentinite_geochem.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/med_160_sapropels.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/med_160_sapropels.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/nankai_megasplay_shear_strength.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/nankai_megasplay_shear_strength.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_1027b_thermal_conductivity.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_1027b_thermal_conductivity.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_1027c_cork_temperature.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_1027c_cork_temperature.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_1165b_thermal_conductivity.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_1165b_thermal_conductivity.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_504b_dike_elastic_moduli.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_504b_dike_elastic_moduli.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_504b_leg137_borehole_fluids.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_504b_leg137_borehole_fluids.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/peru_201_sulfate_reduction.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/peru_201_sulfate_reduction.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/scorpio_e1_sa_excerpt.las +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/scorpio_e1_sa_excerpt.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/sumatra_362_cohesion.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/sumatra_362_cohesion.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/university_6_17_no1_tx_excerpt.las +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/university_6_17_no1_tx_excerpt.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ursa_308_xrd_mineralogy.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ursa_308_xrd_mineralogy.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/volve_15_9_19_sr_excerpt.las +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/volve_15_9_19_sr_excerpt.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/volve_15_9_19a_core_excerpt.csv +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/volve_15_9_19a_core_excerpt.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/volve_f12_f14_production_excerpt.csv +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/volve_f12_f14_production_excerpt.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/walvis_208_petm_carbonate.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/walvis_208_petm_carbonate.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/woodlark_1109_rock_eval.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/woodlark_1109_rock_eval.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog_map.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog_register.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/certificates.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/client_reports.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/collision.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/config_versioning.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/conformance.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/control_room.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/correlation.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/dashboard.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/declarations.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/decline.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/deviation.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/dlis.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/dnp3.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/doctor.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/dossier.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/dossier_verify.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/downhole_engine.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/drift_monitor.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/drill_string.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/earth_model.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/economics.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/ed25519.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/edr.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/elevation.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/etp.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/etp12_schemas.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/example_register_map.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/fat_sat.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/files.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/fixtures/README.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/fixtures/comcat_delaware_basin_2026-09.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/fixtures/comcat_mahoning_1990-2026.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/fixtures/comcat_youngstown_2011-2012.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/fixtures/ne_110m_coastline.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/follower.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/forward_model.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/frac_hits.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/friction_priors.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/gamma.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/gauge_aging.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/gauge_specs.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/geodesy.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/geomag.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/gravity_reference.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/hartip.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/TESTER_GUIDE.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/alarms.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/alerts.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/audit-update.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/backup.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/catalog.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/charts.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/collision.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/company-sign-in.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/conformance.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/control-room.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/data-in.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/declare.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/decline.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/dlis.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/doctor.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/dossier.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/drift.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/drillstring.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/economics.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/edr.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/etp.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/field-ports.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/files.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/frac-hits.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/historian.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/https.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/instruments.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/interval.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/invoice-check.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/map.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/month-end.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/notifications.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/opseis.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/osdu.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/pad-summary.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/patches.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/penetrator.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/plan.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/pore-pressure.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/ppdm.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/quakeml.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/quality.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/report-history.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/rig-time.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/seedlink.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/seismic.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/setup.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/simulation.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/site.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/sites.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/slip.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/soak.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/sra.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/start.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/structure.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/tools.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/torque-drag.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/transients.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/upkeep.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/vibration.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/well-report.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/well-tests.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/well3d.md +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/housekeeping.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/interval.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/inverse_engine.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/invoice_check.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/jobs.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/live_ports.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/loadtest.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/matplotlib_demo.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/modbus.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/modbus_rtu.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/model_card.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/month_end.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/mqtt_port.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/notify.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/oidc.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/oidc_mock.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/op_seismicity.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/opcua_port.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/operator_app.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/osdu.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/pad_summary.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/patches.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/pdf_report.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/penetrator.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/permits.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/piwebapi.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/pore_pressure.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/ports.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/ppdm.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/profile_catalog.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/project.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/qt6_downhole_app.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/quakeml.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reconciler.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/IU_ANMO_10_BHZ_response.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/IU_ANMO_10_BHZ_response.xml +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/WMM2025.COF +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/eia_henry_hub_daily.csv.gz +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/eia_prices.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/eia_wti_daily.csv.gz +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/iscwsa_rev4_example.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/iscwsa_rev5_example.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/l0701_sonic_gr.las.gz +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/l0701_sonic_gr.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/libmseed_steim.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/libmseed_steim1_4096.mseed +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/libmseed_steim2_4096.mseed +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/libmseed_steim2_512.mseed +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/mahoning_example.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/mud_motor_specs.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/owsg_tool_models.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/penetrator_ratings.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/seismicity_protocols.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/tool_sources.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/us_outline.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/us_outline.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/volve_3d.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/volve_f4_interpretation.las.gz +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/volve_f4_logs.provenance.json +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/volve_f4_lwd.las.gz +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/volve_surfaces.json.gz +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/volve_traj_F-10.xml.gz +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/volve_traj_F-4.xml.gz +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/volve_traj_F-5_12.25in.xml.gz +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/volve_traj_F-5_17.5in.xml.gz +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/volve_traj_F-5_36in.xml.gz +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/volve_traj_F-5_8.5in.xml.gz +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/volve_well_picks.csv.gz +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/report_history.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/rig_state.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/rock_inventory.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/sample_record.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/sample_well_profile.csv +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/sbom.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/seedlink.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/segy.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic_array.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic_assoc.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic_detect.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic_film.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic_harmonic.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic_qc.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic_response.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic_signature.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic_track.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic_uncertainty.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic_unlisted.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic_watch.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/sensor_swap.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/series_cache.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/service.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/service_life.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/setup_checklist.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/shapefile.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/shell.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/shut_in.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/simulation.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/site_map.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/sla_report.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/slip.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/soak.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/sra.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/store_forward.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/strata_join.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/structure.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/supervisor.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/survey_cmd.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/survey_view.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/telemetry.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/tls.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/tool_catalog.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/tool_library.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/tool_taxonomy.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/torque_drag.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/transient.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/vibration.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/web/app.html +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/well3d.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/well_assembler.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/well_report.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/well_test_validation.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/wellplan.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/wellpos.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/wits0.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/witsml.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/workspace.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea/xlsx_read.py +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea_program.egg-info/dependency_links.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea_program.egg-info/entry_points.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea_program.egg-info/requires.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/gea_program.egg-info/top_level.txt +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/setup.cfg +0 -0
- {gea_program-0.56.0 → gea_program-0.57.0}/tests/test_acceptance.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gea-program
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.57.0
|
|
4
4
|
Summary: GEA-Program: downhole gauge monitoring - canonical measurement records, quality rules, drift evaluation with a re-fit change log, well-test validation, alarm management, model cards, store-and-forward, monthly SLA measurement, FAT/SAT protocols and a dashboard, generated from live objects in the client's reporting outline.
|
|
5
5
|
Author: Daniel T. Murphy
|
|
6
6
|
License: MPL-2.0
|
|
@@ -1291,6 +1291,19 @@ gea oidc --workspace C:\site --issuer https://login.microsoftonline.com/3f8b2c1d
|
|
|
1291
1291
|
Or Administration -> **Company sign-in**. `gea help company-sign-in` has the
|
|
1292
1292
|
Entra ID app registration step by step.
|
|
1293
1293
|
|
|
1294
|
+
### For an IT department
|
|
1295
|
+
|
|
1296
|
+
`docs/IT_SECURITY.md` (`gea security` prints it from any installation)
|
|
1297
|
+
answers what a reviewer asks before installing: where the data is and every
|
|
1298
|
+
connection the program can make, the one port, HTTPS, company sign-in and
|
|
1299
|
+
roles, the audit log, the bill of materials (`gea sbom`), and how a kit is
|
|
1300
|
+
checked - the build's attestation
|
|
1301
|
+
(`gea-program-0.57.0-win64.zip` checked with
|
|
1302
|
+
`gh attestation verify gea-program-0.57.0-win64.zip -R Daniel8Murphy0007/GEA-Program`)
|
|
1303
|
+
and the file catalog beside the kit's folder, Authenticode-signed once the
|
|
1304
|
+
publisher's certificate is in place. `SECURITY.md` says how to report a
|
|
1305
|
+
vulnerability.
|
|
1306
|
+
|
|
1294
1307
|
### Before a site goes live
|
|
1295
1308
|
|
|
1296
1309
|
`deploy/README.md` is the checklist: HTTPS from the service itself (above),
|
|
@@ -1422,4 +1435,5 @@ https://pypi.org/project/gea-program/ after the first successful run.
|
|
|
1422
1435
|
## Licence
|
|
1423
1436
|
|
|
1424
1437
|
Mozilla Public License 2.0 (MPL-2.0); see `LICENSE`. Every source file carries the MPL-2.0
|
|
1425
|
-
header (Exhibit A). Copyright (c) 2026 Daniel T. Murphy.
|
|
1438
|
+
header (Exhibit A). Copyright (c) 2026 Daniel T. Murphy. The signed kit, its updates and
|
|
1439
|
+
support are a subscription from ENRGYONE (`docs/commercial/COMMERCIAL.md`).
|
|
@@ -1252,6 +1252,19 @@ gea oidc --workspace C:\site --issuer https://login.microsoftonline.com/3f8b2c1d
|
|
|
1252
1252
|
Or Administration -> **Company sign-in**. `gea help company-sign-in` has the
|
|
1253
1253
|
Entra ID app registration step by step.
|
|
1254
1254
|
|
|
1255
|
+
### For an IT department
|
|
1256
|
+
|
|
1257
|
+
`docs/IT_SECURITY.md` (`gea security` prints it from any installation)
|
|
1258
|
+
answers what a reviewer asks before installing: where the data is and every
|
|
1259
|
+
connection the program can make, the one port, HTTPS, company sign-in and
|
|
1260
|
+
roles, the audit log, the bill of materials (`gea sbom`), and how a kit is
|
|
1261
|
+
checked - the build's attestation
|
|
1262
|
+
(`gea-program-0.57.0-win64.zip` checked with
|
|
1263
|
+
`gh attestation verify gea-program-0.57.0-win64.zip -R Daniel8Murphy0007/GEA-Program`)
|
|
1264
|
+
and the file catalog beside the kit's folder, Authenticode-signed once the
|
|
1265
|
+
publisher's certificate is in place. `SECURITY.md` says how to report a
|
|
1266
|
+
vulnerability.
|
|
1267
|
+
|
|
1255
1268
|
### Before a site goes live
|
|
1256
1269
|
|
|
1257
1270
|
`deploy/README.md` is the checklist: HTTPS from the service itself (above),
|
|
@@ -1383,4 +1396,5 @@ https://pypi.org/project/gea-program/ after the first successful run.
|
|
|
1383
1396
|
## Licence
|
|
1384
1397
|
|
|
1385
1398
|
Mozilla Public License 2.0 (MPL-2.0); see `LICENSE`. Every source file carries the MPL-2.0
|
|
1386
|
-
header (Exhibit A). Copyright (c) 2026 Daniel T. Murphy.
|
|
1399
|
+
header (Exhibit A). Copyright (c) 2026 Daniel T. Murphy. The signed kit, its updates and
|
|
1400
|
+
support are a subscription from ENRGYONE (`docs/commercial/COMMERCIAL.md`).
|
|
@@ -67,7 +67,16 @@ def _build_config(a):
|
|
|
67
67
|
return SimulatorConfig(**kw)
|
|
68
68
|
|
|
69
69
|
|
|
70
|
+
# the front door's own commands (gea.cli), reached the same way through `python -m gea` - the kit's gea.cmd and
|
|
71
|
+
# gea wrapper run `python -m gea`, and before v0.57 `gea guide`, `gea help` and the rest answered "invalid choice"
|
|
72
|
+
FRONT_ONLY = ('quickstart', 'guide', 'security', 'docs', 'gui', 'help')
|
|
73
|
+
|
|
74
|
+
|
|
70
75
|
def main(argv=None) -> int:
|
|
76
|
+
_argv = list(sys.argv[1:] if argv is None else argv)
|
|
77
|
+
if _argv and _argv[0] in FRONT_ONLY:
|
|
78
|
+
from .cli import main as _front
|
|
79
|
+
return _front(_argv)
|
|
71
80
|
ap = argparse.ArgumentParser(prog="gea",
|
|
72
81
|
description="GEA Downhole Simulator - headless CLI")
|
|
73
82
|
sub = ap.add_subparsers(dest="cmd", required=True)
|
|
@@ -12660,6 +12660,167 @@ def section_cy_company_sign_in(tmp: str) -> None:
|
|
|
12660
12660
|
"the help page with the Entra ID steps" + (f" - failed: {failed4}" if failed4 else ""))
|
|
12661
12661
|
|
|
12662
12662
|
|
|
12663
|
+
def section_cz_it_review(tmp: str) -> None:
|
|
12664
|
+
"""Section CZ - what an IT department asks: the security overview ships with the program and agrees with the
|
|
12665
|
+
code it describes (the rounds, the sessions, the lock, the port, TLS, every host the program can reach); `gea
|
|
12666
|
+
security`, `gea guide` and `gea help` answer through `python -m gea` as the kit's launcher runs it; in a checkout,
|
|
12667
|
+
the kit tools zip the kit again with its catalog beside it and tell the site how to check it, and the build
|
|
12668
|
+
workflow attests both kits and signs the catalog only when a certificate is configured."""
|
|
12669
|
+
import importlib.util
|
|
12670
|
+
import json as _json
|
|
12671
|
+
import subprocess as _sp
|
|
12672
|
+
import urllib.parse as _up
|
|
12673
|
+
import zipfile as _zf
|
|
12674
|
+
from . import doctor as DR
|
|
12675
|
+
from . import elevation as EL
|
|
12676
|
+
from . import helplib as H
|
|
12677
|
+
from . import seismic_watch as SW
|
|
12678
|
+
from . import service as SVC
|
|
12679
|
+
from . import tls as TLS
|
|
12680
|
+
pkg = Path(__file__).parent
|
|
12681
|
+
checkout = (pkg.parent / "pyproject.toml").exists() and (pkg.parent / "tools" / "build_installer.py").exists()
|
|
12682
|
+
|
|
12683
|
+
# -- CZ1 the overview, and the code it describes -------------------------------------------------------------------
|
|
12684
|
+
text = H.security_text() or ""
|
|
12685
|
+
docs_copy = pkg.parent / "docs" / "IT_SECURITY.md"
|
|
12686
|
+
same = (not docs_copy.exists()) or docs_copy.read_text(encoding="utf-8") == text
|
|
12687
|
+
flat = " ".join(text.split())
|
|
12688
|
+
with open(Path(pkg, "reference", "eia_prices.provenance.json"), encoding="utf-8") as f:
|
|
12689
|
+
eia_hosts = {_up.urlsplit(s["refresh_url"]).hostname for s in _json.load(f)["series"].values() if s.get("refresh_url")}
|
|
12690
|
+
doctor_src = Path(DR.__file__).read_text(encoding="utf-8")
|
|
12691
|
+
hosts = {_up.urlsplit(EL.EPQS_URL).hostname, _up.urlsplit(SW.QUERY_URL).hostname, _up.urlsplit(SW.FEED_URL).hostname, *eia_hosts}
|
|
12692
|
+
hosts |= {"pypi.org"} if "https://pypi.org/pypi/gea-program/json" in doctor_src else {"(the update check moved)"}
|
|
12693
|
+
facts = {
|
|
12694
|
+
"rounds": f"{SVC.PBKDF2_ROUNDS:,}" in flat,
|
|
12695
|
+
"sessions": f"{SVC.SESSION_HOURS} hours" in flat and "256-bit" in flat,
|
|
12696
|
+
"lock": SVC.LOGIN_MAX_FAILURES == 5 and "five failures" in flat and f"{SVC.LOGIN_LOCK_S // 60} minutes" in flat,
|
|
12697
|
+
"port": "TCP 8765" in flat and "8765" in Path(DR.__file__).read_text(encoding="utf-8"),
|
|
12698
|
+
"tls": "TLS 1.2 minimum" in flat and f"last {TLS.EXPIRING_DAYS} days" in flat,
|
|
12699
|
+
"hosts": all(f"`{h}`" in flat for h in hosts),
|
|
12700
|
+
"no_telemetry": "No telemetry" in flat,
|
|
12701
|
+
}
|
|
12702
|
+
# Python 3.14's argparse formats every help string as the parser is built (help % params) and stops on a bare
|
|
12703
|
+
# "%": v0.54.0's first ship stopped at its gate that way while 3.13 passed. The same check, on any Python.
|
|
12704
|
+
import argparse as _ap
|
|
12705
|
+
import contextlib as _cl
|
|
12706
|
+
import io as _io
|
|
12707
|
+
from . import __main__ as _M
|
|
12708
|
+
bad_help = []
|
|
12709
|
+
_orig_add, _orig_sub = _ap.ArgumentParser.add_argument, _ap._SubParsersAction.add_parser
|
|
12710
|
+
_params = {k_: "x" for k_ in ("prog", "default", "dest", "type", "choices", "metavar", "required", "nargs", "const", "option_strings")}
|
|
12711
|
+
|
|
12712
|
+
def _fmt_ok(h):
|
|
12713
|
+
try:
|
|
12714
|
+
h % _params
|
|
12715
|
+
return True
|
|
12716
|
+
except (ValueError, TypeError, KeyError):
|
|
12717
|
+
return False
|
|
12718
|
+
|
|
12719
|
+
def _add(self, *a_, **k_):
|
|
12720
|
+
h_ = k_.get("help")
|
|
12721
|
+
if isinstance(h_, str) and h_ != _ap.SUPPRESS and not _fmt_ok(h_):
|
|
12722
|
+
bad_help.append(f"{self.prog} {'/'.join(a_)}")
|
|
12723
|
+
return _orig_add(self, *a_, **k_)
|
|
12724
|
+
|
|
12725
|
+
def _sub(self, name, **k_):
|
|
12726
|
+
h_ = k_.get("help")
|
|
12727
|
+
if isinstance(h_, str) and not _fmt_ok(h_):
|
|
12728
|
+
bad_help.append(f"gea {name}")
|
|
12729
|
+
return _orig_sub(self, name, **k_)
|
|
12730
|
+
_ap.ArgumentParser.add_argument, _ap._SubParsersAction.add_parser = _add, _sub
|
|
12731
|
+
try:
|
|
12732
|
+
with _cl.redirect_stdout(_io.StringIO()), _cl.redirect_stderr(_io.StringIO()):
|
|
12733
|
+
try:
|
|
12734
|
+
_M.main(["wells"])
|
|
12735
|
+
except SystemExit:
|
|
12736
|
+
pass
|
|
12737
|
+
finally:
|
|
12738
|
+
_ap.ArgumentParser.add_argument, _ap._SubParsersAction.add_parser = _orig_add, _orig_sub
|
|
12739
|
+
facts["help_strings"] = not bad_help
|
|
12740
|
+
r_sec = _sp.run([sys.executable, "-m", "gea", "security"], capture_output=True, text=True, encoding="utf-8", errors="replace")
|
|
12741
|
+
r_guide = _sp.run([sys.executable, "-m", "gea", "guide"], capture_output=True, text=True, encoding="utf-8", errors="replace")
|
|
12742
|
+
r_help = _sp.run([sys.executable, "-m", "gea", "help", "https"], capture_output=True, text=True, encoding="utf-8", errors="replace")
|
|
12743
|
+
bad = [k for k, v in facts.items() if not v]
|
|
12744
|
+
ok(text.startswith("# GEA-Program for an IT department") and same and not bad
|
|
12745
|
+
and r_sec.returncode == 0 and "GEA-Program for an IT department" in r_sec.stdout
|
|
12746
|
+
and r_guide.returncode == 0 and "HOW TO TEST GEA" in r_guide.stdout and r_help.returncode == 0 and "**The command**" in r_help.stdout,
|
|
12747
|
+
"CZ1 the security overview ships in the package (identical to docs/IT_SECURITY.md) and agrees with the code: the password hashing rounds, the "
|
|
12748
|
+
"session length and token size, the sign-in lock, the one port, the TLS floor and the expiry warning, every host the program can reach "
|
|
12749
|
+
"(ComCat, the elevation service, the price series, PyPI); `python -m gea security`, `guide` and `help` answer as the kit's own launcher "
|
|
12750
|
+
"runs them; every option's help text formats the way Python 3.14 checks it as the parser is built"
|
|
12751
|
+
+ (f" - disagrees: {bad}" if bad else "") + (f" - help texts: {bad_help}" if bad_help else ""))
|
|
12752
|
+
|
|
12753
|
+
# -- CZ2 the kit is zipped again with its catalog, and says how to check it ----------------------------------------------
|
|
12754
|
+
if checkout:
|
|
12755
|
+
spec = importlib.util.spec_from_file_location("cz_installer", str(pkg.parent / "tools" / "build_installer.py"))
|
|
12756
|
+
bi = importlib.util.module_from_spec(spec); spec.loader.exec_module(bi)
|
|
12757
|
+
kit = Path(tmp, "cz_kit", "gea-program-9.9.9-win64"); (kit / "python").mkdir(parents=True)
|
|
12758
|
+
(kit / "MANIFEST.json").write_text("{}", encoding="utf-8"); (kit / "python" / "python.exe").write_bytes(b"MZ stand-in")
|
|
12759
|
+
(kit / "SHA256SUMS.txt").write_text("x MANIFEST.json\n", encoding="utf-8")
|
|
12760
|
+
cat = Path(tmp, "cz_kit", "gea-program-9.9.9-win64.cat"); cat.write_bytes(b"0\x82 a catalog stand-in")
|
|
12761
|
+
zp = bi.rezip(kit, [cat])
|
|
12762
|
+
with _zf.ZipFile(zp) as z:
|
|
12763
|
+
names = sorted(z.namelist())
|
|
12764
|
+
cat_back = z.read("gea-program-9.9.9-win64.cat")
|
|
12765
|
+
try:
|
|
12766
|
+
bi.rezip(Path(tmp, "cz_kit"), [])
|
|
12767
|
+
not_kit = "accepted"
|
|
12768
|
+
except SystemExit as e:
|
|
12769
|
+
not_kit = str(e)
|
|
12770
|
+
readme = bi.README.format(version="9.9.9", target="Windows x64", pyline="p", install="i", start="s", verify="v", port="8765",
|
|
12771
|
+
service="sv", stop="st", uninstall="u", workspace="w", check=bi.WIN_CHECK.format(version="9.9.9"))
|
|
12772
|
+
build_src = (pkg.parent / "tools" / "build_installer.py").read_text(encoding="utf-8")
|
|
12773
|
+
c2 = {
|
|
12774
|
+
"rezip": names == ["gea-program-9.9.9-win64.cat", "gea-program-9.9.9-win64/MANIFEST.json", "gea-program-9.9.9-win64/SHA256SUMS.txt",
|
|
12775
|
+
"gea-program-9.9.9-win64/python/python.exe"] and cat_back == cat.read_bytes() and "not a kit folder" in not_kit,
|
|
12776
|
+
"readme": all(x in readme for x in ("gh attestation verify gea-program-9.9.9-win64.zip -R Daniel8Murphy0007/GEA-Program",
|
|
12777
|
+
"Test-FileCatalog -CatalogFilePath .\\gea-program-9.9.9-win64.cat -Path .\\gea-program-9.9.9-win64",
|
|
12778
|
+
"Get-AuthenticodeSignature", "IT_SECURITY.md", "gea help https"))
|
|
12779
|
+
and "368 checks" not in readme and "behind the site's TLS proxy" not in readme,
|
|
12780
|
+
"ships_overview": "docs' / 'IT_SECURITY.md'" in build_src and "kit / 'IT_SECURITY.md'" in build_src,
|
|
12781
|
+
}
|
|
12782
|
+
where = "the checkout's kit tools"
|
|
12783
|
+
else:
|
|
12784
|
+
c2 = {"installed": bool(H.security_text())}
|
|
12785
|
+
where = "an installed copy: the kit tools are checked in the checkout"
|
|
12786
|
+
failed2 = [k for k, v in c2.items() if not v]
|
|
12787
|
+
ok(not failed2,
|
|
12788
|
+
f"CZ2 ({where}) the kit is zipped again from its folder with its file catalog beside the folder, every file kept; a folder that is not a kit "
|
|
12789
|
+
"is refused; the kit's README tells the site how to check the build's attestation and every file against the catalog and its signature, "
|
|
12790
|
+
"and carries the IT overview" + (f" - failed: {failed2}" if failed2 else ""))
|
|
12791
|
+
|
|
12792
|
+
# -- CZ3 the build workflow: attested, signed only with a certificate, never signed in name only ----------------------------
|
|
12793
|
+
wf = pkg.parent / ".github" / "workflows" / "build-installer.yml"
|
|
12794
|
+
if wf.exists():
|
|
12795
|
+
y = wf.read_text(encoding="utf-8")
|
|
12796
|
+
win = y[y.index("windows-kit:"):y.index("linux-kit:")]
|
|
12797
|
+
lin = y[y.index("linux-kit:"):]
|
|
12798
|
+
order = [win.index(s) for s in ("New-FileCatalog", "azure/artifact-signing-action", "signtool", "Test-FileCatalog", "--rezip", "call install.cmd",
|
|
12799
|
+
"attest-build-provenance", "attach-kit.sh")]
|
|
12800
|
+
c3 = {
|
|
12801
|
+
"permissions": "id-token: write" in y and "attestations: write" in y and "contents: write" in y,
|
|
12802
|
+
"attested": "actions/attest-build-provenance" in win and "actions/attest-build-provenance" in lin
|
|
12803
|
+
and "subject-path: dist/gea-program-*-win64.zip" in win and "subject-path: dist/gea-program-*-linux-*.zip" in lin,
|
|
12804
|
+
"conditional": "if: env.ARTIFACT_SIGNING_ACCOUNT != ''" in win and "if: env.ARTIFACT_SIGNING_ACCOUNT == '' && env.SIGNING_PFX_BASE64 != ''" in win
|
|
12805
|
+
and "secrets.ARTIFACT_SIGNING_ACCOUNT" in win and "secrets.SIGNING_PFX_BASE64" in win,
|
|
12806
|
+
"checked": "-CatalogVersion 2.0" in win and "throw 'the catalog does not match the kit'" in win
|
|
12807
|
+
and "throw 'a certificate is configured but the catalog is not validly signed'" in win and "ships unsigned" in win
|
|
12808
|
+
and "Remove-Item $pfx" in win and "/tr http://timestamp" in win and "timestamp-rfc3161" in win,
|
|
12809
|
+
"order": order == sorted(order),
|
|
12810
|
+
"policy": (pkg.parent / "SECURITY.md").exists() and "Report a vulnerability" in " ".join((pkg.parent / "SECURITY.md").read_text(encoding="utf-8").split()),
|
|
12811
|
+
}
|
|
12812
|
+
where3 = "the checkout's workflow"
|
|
12813
|
+
else:
|
|
12814
|
+
c3 = {"installed": True}
|
|
12815
|
+
where3 = "an installed copy: the workflow is checked in the checkout"
|
|
12816
|
+
failed3 = [k for k, v in c3.items() if not v]
|
|
12817
|
+
ok(not failed3,
|
|
12818
|
+
f"CZ3 ({where3}) both kits are attested by the build that made them; the Windows kit's file catalog is made, signed by Azure Artifact "
|
|
12819
|
+
"Signing or a PFX only when its secrets are configured (timestamped; the PFX removed), checked against the kit - a mismatch, or a "
|
|
12820
|
+
"configured certificate that did not sign, stops the build - then zipped beside the kit before the kit is installed and its gate run; "
|
|
12821
|
+
"SECURITY.md says how to report a vulnerability" + (f" - failed: {failed3}" if failed3 else ""))
|
|
12822
|
+
|
|
12823
|
+
|
|
12663
12824
|
def PR_read_ok(path) -> bool:
|
|
12664
12825
|
from . import pdf_report as PR
|
|
12665
12826
|
try:
|
|
@@ -12774,6 +12935,7 @@ def main() -> int:
|
|
|
12774
12935
|
section_cw_decline(tmp)
|
|
12775
12936
|
section_cx_https(tmp)
|
|
12776
12937
|
section_cy_company_sign_in(tmp)
|
|
12938
|
+
section_cz_it_review(tmp)
|
|
12777
12939
|
if _FAILS:
|
|
12778
12940
|
print(f"[ACCEPTANCE] {len(_FAILS)} FAILURES ({_PASS} passed):")
|
|
12779
12941
|
for f in _FAILS:
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
gea model-cards ... gea store-forward ... gea sla-report ... gea fat-sat ...
|
|
11
11
|
gea help [topic] the help library, by the job (gea help drift); same text as the dashboard's panels
|
|
12
12
|
gea guide the click-by-click tester guide
|
|
13
|
+
gea security what an IT department asks before installing, answered (docs/IT_SECURITY.md)
|
|
13
14
|
gea docs where the catalogue and the reports live on this machine
|
|
14
15
|
gea gui the desktop window (desktop extra)
|
|
15
16
|
gea accept the product gate
|
|
@@ -23,7 +24,7 @@ import os
|
|
|
23
24
|
import sys
|
|
24
25
|
from pathlib import Path
|
|
25
26
|
|
|
26
|
-
FRONT = {'quickstart', 'survey', 'guide', 'docs', 'gui', 'help', '-h', '--help'}
|
|
27
|
+
FRONT = {'quickstart', 'survey', 'guide', 'security', 'docs', 'gui', 'help', '-h', '--help'}
|
|
27
28
|
|
|
28
29
|
|
|
29
30
|
def _pkg_root() -> Path:
|
|
@@ -62,6 +63,16 @@ def cmd_guide(_argv) -> int:
|
|
|
62
63
|
return 0
|
|
63
64
|
|
|
64
65
|
|
|
66
|
+
def cmd_security(_argv) -> int:
|
|
67
|
+
from .helplib import security_text
|
|
68
|
+
text = security_text() # ships inside the package (gea/help/IT_SECURITY.md)
|
|
69
|
+
if text is None:
|
|
70
|
+
print('the security overview is missing from this installation; reinstall: python -m pip install --upgrade --force-reinstall "gea-program[live]"')
|
|
71
|
+
return 2
|
|
72
|
+
print(text)
|
|
73
|
+
return 0
|
|
74
|
+
|
|
75
|
+
|
|
65
76
|
def cmd_help(argv) -> int:
|
|
66
77
|
from .helplib import page, index_text, topics
|
|
67
78
|
if not argv:
|
|
@@ -141,6 +152,8 @@ def main(argv=None) -> int:
|
|
|
141
152
|
return cmd_survey(rest)
|
|
142
153
|
if cmd == 'guide':
|
|
143
154
|
return cmd_guide(rest)
|
|
155
|
+
if cmd == 'security':
|
|
156
|
+
return cmd_security(rest)
|
|
144
157
|
if cmd == 'docs':
|
|
145
158
|
return cmd_docs(rest)
|
|
146
159
|
if cmd == 'gui':
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# GEA-Program for an IT department
|
|
2
|
+
|
|
3
|
+
What an IT or security reviewer asks before GEA-Program is installed on a
|
|
4
|
+
site machine, answered from what the program does - each answer names the
|
|
5
|
+
command or file that shows it. The program's version is in `MANIFEST.json`
|
|
6
|
+
of the kit and on the control panel's Audit / Update page.
|
|
7
|
+
`gea security` prints this page from any installation of the program.
|
|
8
|
+
|
|
9
|
+
## What it is
|
|
10
|
+
|
|
11
|
+
One Python package (`gea-program`, MPL-2.0 source on GitHub and PyPI) with
|
|
12
|
+
one required dependency (numpy) and optional extras, delivered for a site as
|
|
13
|
+
a standalone kit: the package, every wheel it needs, the embeddable CPython
|
|
14
|
+
from python.org, and plain launch scripts. It installs into its own folder
|
|
15
|
+
without administrator rights and without network access. It writes nothing
|
|
16
|
+
outside that folder and the site's workspace folder, adds no driver, no
|
|
17
|
+
system service (a per-user scheduled task only if the site runs
|
|
18
|
+
`register-service.cmd`), and no registry keys.
|
|
19
|
+
|
|
20
|
+
`tools/standalone_check.py` (run by the acceptance gate) fails the build if
|
|
21
|
+
any module imports anything outside the standard library, numpy and the
|
|
22
|
+
declared extras.
|
|
23
|
+
|
|
24
|
+
## Data: where it is and where it goes
|
|
25
|
+
|
|
26
|
+
- **At rest**: everything the program keeps for a site is in the workspace
|
|
27
|
+
folder the site chooses (by default `%LOCALAPPDATA%\GEA-Program\site`):
|
|
28
|
+
the client's files as received, hashed; the derived records; the reports;
|
|
29
|
+
the configuration with its version history; `users.json`; the append-only
|
|
30
|
+
audit log `records\audit.jsonl`. Disk encryption, file-system permissions
|
|
31
|
+
and backup are the site's (`gea backup` writes a verified archive to the
|
|
32
|
+
folder or share the site names - never inside the workspace).
|
|
33
|
+
- **Keys** are in the workspace's `keys\` folder, readable by their owner
|
|
34
|
+
where the file system allows: the site's dossier signing key (Ed25519), the
|
|
35
|
+
HTTPS private key when the program made the certificate, the company
|
|
36
|
+
sign-in client secret when one is kept. None of them is ever put in a
|
|
37
|
+
report, an export, an evidence pack or a signed dossier, or sent by the
|
|
38
|
+
service. The backup copies them with the rest of the workspace: protect
|
|
39
|
+
the backup location accordingly.
|
|
40
|
+
- **Outbound connections** - none at install, none unless the site turns a
|
|
41
|
+
feature on or a person asks:
|
|
42
|
+
|
|
43
|
+
| What | To | When |
|
|
44
|
+
|---|---|---|
|
|
45
|
+
| Earthquake watch | `earthquake.usgs.gov` (ComCat) | while an operation runs, if the site enables it |
|
|
46
|
+
| Elevation look-up | `epqs.nationalmap.gov` | when a person asks for a well's ground elevation |
|
|
47
|
+
| Seismic archives | an FDSN service the site names (e.g. `service.iris.edu`) | when a person fetches station data |
|
|
48
|
+
| Price series refresh | `raw.githubusercontent.com` (the EIA series' public mirror) | when a person refreshes them |
|
|
49
|
+
| Update check | `pypi.org` | when a person runs `gea update --check` or opens Audit / Update |
|
|
50
|
+
| Notifications | the site's own SMTP server or webhook | when the site configures a channel |
|
|
51
|
+
| Company sign-in | the site's identity provider (Entra ID: `login.microsoftonline.com`) | at each company sign-in, if configured |
|
|
52
|
+
| Live data | the site's historian (PI Web API), WITSML store, OPC UA server, MQTT broker, Modbus/DNP3/HART-IP device, SeedLink server | when the site defines a patch for it |
|
|
53
|
+
|
|
54
|
+
No telemetry, no usage reporting, no licence server. Everything else runs
|
|
55
|
+
on the machine.
|
|
56
|
+
|
|
57
|
+
## Who can reach it
|
|
58
|
+
|
|
59
|
+
- **Port**: one, TCP 8765 by default (`GEA_PORT` / `--port`), bound to
|
|
60
|
+
`127.0.0.1` unless the site starts it with `--host`. Nothing else listens.
|
|
61
|
+
- **Transport**: HTTPS when the workspace has a certificate - the site's own
|
|
62
|
+
(from its certificate authority) or one the program makes (`gea tls`,
|
|
63
|
+
`gea help https`): TLS 1.2 minimum, the session cookie `Secure`,
|
|
64
|
+
`Strict-Transport-Security`, plain HTTP on the same port redirected; a
|
|
65
|
+
certificate in its last 30 days raises an alert; a broken certificate stops
|
|
66
|
+
the start rather than falling back to plain HTTP. Or the site's reverse
|
|
67
|
+
proxy terminates TLS (`deploy/`).
|
|
68
|
+
- **Sign-in**: company accounts by OpenID Connect (Entra ID, Okta, Google,
|
|
69
|
+
Ping, Keycloak, AD FS; authorization code flow with PKCE; the ID token's
|
|
70
|
+
RS256 signature, issuer, audience, expiry and nonce checked;
|
|
71
|
+
`gea help company-sign-in`), and local accounts (PBKDF2-SHA256, 200,000
|
|
72
|
+
rounds, a salt per user; five failures lock the name and the address for
|
|
73
|
+
15 minutes). Sessions are random 256-bit tokens in `HttpOnly;
|
|
74
|
+
SameSite=Strict` cookies, 12 hours; an administrator sees every live
|
|
75
|
+
session and revokes any.
|
|
76
|
+
- **Roles**: viewer < operator < approver < admin, enforced by the service
|
|
77
|
+
on every request; a company account's role comes from the company's app
|
|
78
|
+
roles or groups at each sign-in.
|
|
79
|
+
- **The page**: every action needs a header a cross-site form cannot set;
|
|
80
|
+
every response carries a Content-Security-Policy (`default-src 'self'`,
|
|
81
|
+
`frame-ancestors 'none'`), `X-Frame-Options: DENY`, `nosniff` and a
|
|
82
|
+
same-origin referrer policy. The page loads nothing from the internet.
|
|
83
|
+
|
|
84
|
+
## What it records
|
|
85
|
+
|
|
86
|
+
Every action - by a person through the page, by a scheduled job, by the
|
|
87
|
+
command line - is a line in `records\audit.jsonl` with the actor, the time
|
|
88
|
+
and the SHA-256 of its inputs; sign-ins and failures with the address and
|
|
89
|
+
the reason. The log is append-only; `gea housekeeping` segments it, never
|
|
90
|
+
truncates it. A signed dossier carries the audit chain's head and lets
|
|
91
|
+
anyone verify, without GEA, that the reports and the log have not changed
|
|
92
|
+
since it was signed.
|
|
93
|
+
|
|
94
|
+
## What is installed, and from where
|
|
95
|
+
|
|
96
|
+
- `gea sbom --out C:\site\reports` writes the software bill of materials of
|
|
97
|
+
the running installation (each component's name, version, supplier,
|
|
98
|
+
licence, hash, package URL and relationship, from the installed metadata).
|
|
99
|
+
- The kit's `SHA256SUMS.txt` holds the hash of every file and `MANIFEST.json`
|
|
100
|
+
the wheels and the commit it was built from.
|
|
101
|
+
- **Provenance**: every kit attached to a GitHub release is attested by the
|
|
102
|
+
build that made it (GitHub artifact attestations, Sigstore). Check a
|
|
103
|
+
downloaded kit with the GitHub CLI, for example:
|
|
104
|
+
`gh attestation verify gea-program-0.57.0-win64.zip -R Daniel8Murphy0007/GEA-Program`.
|
|
105
|
+
The PyPI release is published by GitHub's trusted publishing, which
|
|
106
|
+
attaches the publisher's attestations to the files on PyPI.
|
|
107
|
+
- **Code signing (Windows)**: the batch launchers of the kit cannot carry a
|
|
108
|
+
signature of their own, so the kit carries a file catalog beside its
|
|
109
|
+
folder in the zip - `gea-program-0.57.0-win64.cat` for 0.57.0 - holding
|
|
110
|
+
the SHA-256 of every file in the kit. When the publisher's signing
|
|
111
|
+
certificate is in place the catalog is Authenticode-signed:
|
|
112
|
+
`Get-AuthenticodeSignature .\gea-program-0.57.0-win64.cat` shows the
|
|
113
|
+
publisher, and, in the folder the zip was extracted to and before
|
|
114
|
+
`install.cmd` runs,
|
|
115
|
+
`Test-FileCatalog -CatalogFilePath .\gea-program-0.57.0-win64.cat -Path .\gea-program-0.57.0-win64`
|
|
116
|
+
says Valid when no file has changed. An application-control policy
|
|
117
|
+
(App Control for Business / WDAC) can trust the kit by its signed
|
|
118
|
+
catalog. Until the certificate is in place the catalog ships unsigned and
|
|
119
|
+
the build says so. The embeddable Python's own executables are signed by
|
|
120
|
+
the Python Software Foundation.
|
|
121
|
+
- **Updates**: a new kit is installed beside the old one; the workspace is
|
|
122
|
+
found and opened as it is. Nothing updates itself: on a pip installation,
|
|
123
|
+
`gea update` upgrades from PyPI only when a person runs it.
|
|
124
|
+
- **The acceptance gate**: `verify.cmd` runs every check of the program's
|
|
125
|
+
acceptance suite from the installed kit - the site's own evidence that
|
|
126
|
+
this installation does what the release says.
|
|
127
|
+
|
|
128
|
+
## Reporting a vulnerability
|
|
129
|
+
|
|
130
|
+
See `SECURITY.md`: privately, through the repository's "Report a
|
|
131
|
+
vulnerability" (GitHub private vulnerability reporting) or by email to the
|
|
132
|
+
address there - never in a public issue. A fix or a mitigation ships in a
|
|
133
|
+
release the advisory names.
|
|
134
|
+
|
|
135
|
+
## Support
|
|
136
|
+
|
|
137
|
+
The source is open (MPL-2.0). The signed kit, its updates and support are a
|
|
138
|
+
subscription from ENRGYONE: see `docs/commercial/COMMERCIAL.md`.
|
|
@@ -147,6 +147,14 @@ def index_text() -> str:
|
|
|
147
147
|
return '\n'.join(lines)
|
|
148
148
|
|
|
149
149
|
|
|
150
|
+
def security_text() -> Optional[str]:
|
|
151
|
+
p = os.path.join(HELP_DIR, 'IT_SECURITY.md')
|
|
152
|
+
if not os.path.isfile(p):
|
|
153
|
+
return None
|
|
154
|
+
with open(p, encoding='utf-8') as f:
|
|
155
|
+
return f.read()
|
|
156
|
+
|
|
157
|
+
|
|
150
158
|
def guide_text() -> Optional[str]:
|
|
151
159
|
p = os.path.join(HELP_DIR, 'TESTER_GUIDE.md')
|
|
152
160
|
if not os.path.isfile(p):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gea-program
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.57.0
|
|
4
4
|
Summary: GEA-Program: downhole gauge monitoring - canonical measurement records, quality rules, drift evaluation with a re-fit change log, well-test validation, alarm management, model cards, store-and-forward, monthly SLA measurement, FAT/SAT protocols and a dashboard, generated from live objects in the client's reporting outline.
|
|
5
5
|
Author: Daniel T. Murphy
|
|
6
6
|
License: MPL-2.0
|
|
@@ -1291,6 +1291,19 @@ gea oidc --workspace C:\site --issuer https://login.microsoftonline.com/3f8b2c1d
|
|
|
1291
1291
|
Or Administration -> **Company sign-in**. `gea help company-sign-in` has the
|
|
1292
1292
|
Entra ID app registration step by step.
|
|
1293
1293
|
|
|
1294
|
+
### For an IT department
|
|
1295
|
+
|
|
1296
|
+
`docs/IT_SECURITY.md` (`gea security` prints it from any installation)
|
|
1297
|
+
answers what a reviewer asks before installing: where the data is and every
|
|
1298
|
+
connection the program can make, the one port, HTTPS, company sign-in and
|
|
1299
|
+
roles, the audit log, the bill of materials (`gea sbom`), and how a kit is
|
|
1300
|
+
checked - the build's attestation
|
|
1301
|
+
(`gea-program-0.57.0-win64.zip` checked with
|
|
1302
|
+
`gh attestation verify gea-program-0.57.0-win64.zip -R Daniel8Murphy0007/GEA-Program`)
|
|
1303
|
+
and the file catalog beside the kit's folder, Authenticode-signed once the
|
|
1304
|
+
publisher's certificate is in place. `SECURITY.md` says how to report a
|
|
1305
|
+
vulnerability.
|
|
1306
|
+
|
|
1294
1307
|
### Before a site goes live
|
|
1295
1308
|
|
|
1296
1309
|
`deploy/README.md` is the checklist: HTTPS from the service itself (above),
|
|
@@ -1422,4 +1435,5 @@ https://pypi.org/project/gea-program/ after the first successful run.
|
|
|
1422
1435
|
## Licence
|
|
1423
1436
|
|
|
1424
1437
|
Mozilla Public License 2.0 (MPL-2.0); see `LICENSE`. Every source file carries the MPL-2.0
|
|
1425
|
-
header (Exhibit A). Copyright (c) 2026 Daniel T. Murphy.
|
|
1438
|
+
header (Exhibit A). Copyright (c) 2026 Daniel T. Murphy. The signed kit, its updates and
|
|
1439
|
+
support are a subscription from ENRGYONE (`docs/commercial/COMMERCIAL.md`).
|
|
@@ -257,6 +257,7 @@ gea/fixtures/comcat_delaware_basin_2026-09.txt
|
|
|
257
257
|
gea/fixtures/comcat_mahoning_1990-2026.txt
|
|
258
258
|
gea/fixtures/comcat_youngstown_2011-2012.txt
|
|
259
259
|
gea/fixtures/ne_110m_coastline.json
|
|
260
|
+
gea/help/IT_SECURITY.md
|
|
260
261
|
gea/help/TESTER_GUIDE.md
|
|
261
262
|
gea/help/alarms.md
|
|
262
263
|
gea/help/alerts.md
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "gea-program"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.57.0"
|
|
8
8
|
description = "GEA-Program: downhole gauge monitoring - canonical measurement records, quality rules, drift evaluation with a re-fit change log, well-test validation, alarm management, model cards, store-and-forward, monthly SLA measurement, FAT/SAT protocols and a dashboard, generated from live objects in the client's reporting outline."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/acex_lomonosov_age_depth_model.provenance.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/agassiz77_canada_temperature.provenance.json
RENAMED
|
File without changes
|
{gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/barbados_110_consolidation.provenance.json
RENAMED
|
File without changes
|
|
File without changes
|
{gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/bengal_u1452_grain_size.provenance.json
RENAMED
|
File without changes
|
|
File without changes
|
{gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/blake_164_methane_isotopes.provenance.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/collingwood_1_28_ks_complete.provenance.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.provenance.json
RENAMED
|
File without changes
|
|
File without changes
|
{gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/dsdp_504b_physical_properties.provenance.json
RENAMED
|
File without changes
|
|
File without changes
|
{gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/dsdp_504b_sound_velocity.provenance.json
RENAMED
|
File without changes
|
|
File without changes
|
{gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/elgygytgyn_5011_turbidites.provenance.json
RENAMED
|
File without changes
|
|
File without changes
|
{gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/epica_domec_co2_800kyr.provenance.json
RENAMED
|
File without changes
|
|
File without changes
|
{gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/fram_909_organic_petrography.provenance.json
RENAMED
|
File without changes
|
|
File without changes
|
{gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/gbr_325_coral_uth_ages.provenance.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/gisp2_greenland_temperature.provenance.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|