Sfoglia il codice sorgente

updated tle_database update_tles parameters to accept a list instead of a dict, updated home folder for log

Bryon Bailey 4 anni fa
parent
commit
9692dd2a5a
4 ha cambiato i file con 56 aggiunte e 42 eliminazioni
  1. 16 7
      celestrak tles.create_tables.sql
  2. 12 13
      tle_database.py
  3. 6 2
      tle_fetcher.py
  4. 22 20
      tle_reader.py

+ 16 - 7
celestrak tles.create_tables.sql

@@ -1,21 +1,27 @@
+drop table sat_groups;
+drop table tles;
+delete from groups;
+
 create table
 tles (
-    sat varchar(70) not null primary key,
+    sat varchar(70) not null,
+    sat_cat_num varchar(5) primary key,
     tle varchar(140) not null
 );
 
 create table
 sat_groups (
     id mediumint not null auto_increment primary key,
-    sat varchar(70) not null,
-    group_name varchar(20),
+    sat_cat_num varchar(5) not null,
+    group_name varchar(20) not null,
+    foreign key (sat_cat_num) references tles(sat_cat_num),
     foreign key (group_name) references groups(group_name)
 );
 
 create table
 groups (
     group_name varchar(20) primary key
-)
+);
 
 insert into groups (group_name) values ('weather'), ('noaa'), ('goes'), ('resource'), ('sarsat'), ('dmc'), ('tdrss'), ('argos'), ('planet'), ('spire'), ('geo'), ('intelsat'), ('ses'), ('iridium'), ('iridium-NEXT'), ('starlink'), ('oneweb'), ('orbcomm'), ('globalstar'), ('swarm'), ('amateur'), ('x-comm'), ('other-comm'), ('satnogs'), ('gorizont'), ('raduga'), ('molniya'), ('gnss'), ('gps-ops'), ('glo-ops'), ('galileo'), ('beidou'), ('sbas'), ('nnss'), ('musson'), ('science'), ('geodetic'), ('education'), ('engineering'), ('military'), ('radar'), ('cubesat'), ('other');
 
@@ -23,8 +29,11 @@ select * from groups;
 select * from sat_groups;
 select * from tles;
 
-drop table sat_groups;
+delete from tles;
+delete from sat_groups;
 delete from groups;
 
-select group_name from sat_groups
-where sat like 'NOAA 15%';
+
+select sat 
+from sat_groups natural join tles
+where group_name = 'weather';

+ 12 - 13
tle_database.py

@@ -4,7 +4,7 @@ import sys
 
 logger = logging.getLogger('tle_fetcher.' + __name__)
 
-class TleDatabase: 
+class TleDatabase:
 
     def __init__(self):
         self.conn = None
@@ -14,7 +14,7 @@ class TleDatabase:
         # Connect to MariaDB
         try:
             conn = mariadb.connect(
-                user='tle_getter',
+                user='tle_fetcher',
                 host='localhost',
                 port=3306,
                 database='celestrak_tles'
@@ -30,29 +30,28 @@ class TleDatabase:
 
         try:
             cur.execute('delete from sat_groups')
-            cur.execute('delete from tles')     
-        except mariadb.Error as e: 
+            cur.execute('delete from tles')
+        except mariadb.Error as e:
             logger.error("Error clearing tables: %s", e.msg)
         self.conn.commit()
 
-    def update_tles(self, tles: dict):
+    def update_tles(self, tles: list):
         cur = self.conn.cursor()
 
-        try: 
-            cur.executemany('INSERT INTO tles (sat, tle) values (?,?)', list(tles.items()))
-        except mariadb.Error as e: 
+        try:
+            cur.executemany('insert into tles (sat, sat_cat_num, tle) values (?,?,?)', tles)
+        except mariadb.Error as e:
             logger.error("Error updating TLEs: %s", e.msg)
-        self.conn.commit() 
+        self.conn.commit()
 
     def update_sat_group(self, group: list):
         cur = self.conn.cursor()
 
-        try:    
-            cur.executemany('INSERT INTO sat_groups (sat, group_name) values (?,?)', group)
-        except mariadb.Error as e: 
+        try:
+            cur.executemany('insert ignore into sat_groups (sat_cat_num, group_name) values (?,?)', group)
+        except mariadb.Error as e:
             logger.error("Error updating groups: %s", e.msg)
         self.conn.commit()
 
     def close_db(self):
         self.conn.close()
-        

+ 6 - 2
tle_fetcher.py

@@ -3,6 +3,7 @@
 from tle_database import TleDatabase
 from tle_reader import TleReader
 import logging
+import os
 
 CELESTRAK_ROOT = 'https://www.celestrak.com/NORAD/elements/'
 
@@ -61,7 +62,8 @@ formatter = logging.Formatter(
     datefmt=time_string,
     style='{')
 
-f_handler = logging.FileHandler('/home/bryon/dev/tle_fetcher/tle_fetcher.log', mode='a')
+log_path = os.path.join(os.path.expanduser('~'), 'log/tle_fetcher.log')
+f_handler = logging.FileHandler(log_path, mode='a')
 f_handler.setLevel(logging.INFO)
 f_handler.setFormatter(formatter)
 log.addHandler(f_handler)
@@ -81,12 +83,14 @@ def main(tle_rd: TleReader, tle_db: TleDatabase) -> None:
     tle_db.connect_db()
     tle_db.delete_rows()
     tle_db.update_tles(tles)
+
     for group in groups:
         gp = tle_rd.get_group(group)
         tle_db.update_sat_group(gp)
+
     tle_db.close_db()
 
     log.info("TLE fetcher completed")
 
 if __name__ == "__main__":
-    main(TleReader(CELESTRAK_ROOT), TleDatabase())
+    main(TleReader(CELESTRAK_ROOT), TleDatabase())

+ 22 - 20
tle_reader.py

@@ -6,47 +6,49 @@ logger = logging.getLogger('tle_fetcher.' + __name__)
 
 class TleReader():
     def __init__(self, url_root: str):
-        self.url_root = url_root   
+        self.url_root = url_root
 
-    def get_tles(self) -> dict:
+    def get_tles(self) -> list:
         url = self.url_root + 'active.txt'
-        tles = {}
+        tles = []
 
         try:
             with urllib.request.urlopen(url) as txt:
-                i = 0  
-                key = ""
-                value = ""
+                i = 0
+                sat = ''
+                tle = ''
                 for line in txt:
                     line = line.strip().decode('utf-8')
                     if i % 3 == 0:
-                        key = line
+                        sat = line
                     elif i % 3 == 1:
-                        value = line
+                        tle = line
                     else:
-                        value += "\n" + line
-                        tles[key] = value
+                        tle += "\n" + line
+                        tles.append((sat, line.split()[1], tle))
                     i += 1
+
         except Exception as ex:
-            logger.error("Error getting TLEs: %s", ex.msg)
+            logger.error("Error getting TLEs: %s", ex)
             sys.exit(1)
-        
+
         return tles
 
     def get_group(self, group_name: str) -> list:
         url = self.url_root + group_name + '.txt'
         group = []
-        
-        try:    
+
+        try:
             with urllib.request.urlopen(url) as txt:
-                i = 0  
+                i = 0
                 for line in txt:
                     line = line.strip().decode('utf-8')
-                    if i % 3 == 0:
-                        group.append((line, group_name))
+                    if i % 3 == 2:
+                        group.append((line.split()[1], group_name))
                     i += 1
+
         except Exception as ex:
-            logger.error("Error getting groups: %s", ex.msg)
+            logger.error("Error getting groups: %s", ex)
             sys.exit(1)
-        
-        return group
+
+        return group