Skip to content

Commit 31baeb2

Browse files
committed
migrate submodule back
1 parent f780043 commit 31baeb2

File tree

6 files changed

+134
-47
lines changed

6 files changed

+134
-47
lines changed

Cargo.toml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ description = "BGPKIT Parser Python Binding"
44
keywords = ["bgp", "mrt", "parser"]
55
repository = "https://github.com/bgpkit/bgpkit-parser-py"
66
documentation = "https://docs.rs/bgpkit-parser-py"
7-
version = "0.3.0"
7+
version = "0.4.3"
88
authors = ["Mingwei Zhang <[email protected]>"]
99
edition = "2021"
1010
license = "MIT"
@@ -15,10 +15,9 @@ name = "pybgpkit_parser"
1515
crate-type = ["cdylib", "rlib"]
1616

1717
[dependencies]
18-
bgpkit-parser = "0.8.1"
19-
pyo3 = { version = "0.17.3", features = ["extension-module"] }
18+
bgpkit-parser = "0.9.4"
19+
pyo3 = { version = "0.18.2", features = ["extension-module"] }
2020
dict_derive = "0.4.0"
21-
openssl = { version = "0.10", features = ["vendored"] }
2221

2322
[build-dependencies]
24-
pyo3-build-config = "0.17.3"
23+
pyo3-build-config = "0.18.2"

Dockerfile

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,26 @@
1-
FROM messense/manylinux2014-cross:x86_64
1+
FROM ubuntu:bionic
22

3-
RUN apt update && apt install cargo libssl-dev pkg-config -y
4-
RUN python3 -m pip install maturin
3+
RUN apt update && DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt install -y curl libssl-dev pkg-config build-essential software-properties-common tzdata git vim
4+
5+
# install different versions of Python
6+
RUN add-apt-repository ppa:deadsnakes/ppa -y && apt update
7+
RUN apt install -y \
8+
python3.7 python3.7-distutils \
9+
python3.8 python3.8-distutils \
10+
python3.9 python3.9-distutils \
11+
python3.10 python3.10-distutils \
12+
python3.11 python3.11-distutils
13+
14+
RUN \
15+
curl -sS https://bootstrap.pypa.io/get-pip.py | python3.7 && \
16+
curl -sS https://bootstrap.pypa.io/get-pip.py | python3.8 && \
17+
curl -sS https://bootstrap.pypa.io/get-pip.py | python3.9 && \
18+
curl -sS https://bootstrap.pypa.io/get-pip.py | python3.10 && \
19+
curl -sS https://bootstrap.pypa.io/get-pip.py | python3.11
20+
21+
# install maturin
22+
RUN python3.11 -m pip install maturin patchelf
23+
# install Rust
24+
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
525

626
WORKDIR /io
7-
ENTRYPOINT ["/usr/local/bin/maturin"]

README.md

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,32 @@ Python binding for bgpkit-parser
55
## Example
66

77
```python
8+
from pybgpkit_parser import Parser
9+
import json
10+
11+
parser = Parser(
12+
url="https://spaces.bgpkit.org/parser/update-example",
13+
filters={"peer_ips": "185.1.8.65, 2001:7f8:73:0:3:fa4:0:1"},
14+
)
15+
16+
for elem in parser:
17+
print(elem["origin_asns"])
18+
print(json.dumps(elem, indent=4))
19+
break
20+
```
821

22+
You can also add `cache_dir` to Parser to cache the downloaded files to a specified directory.
23+
24+
Here is an example:
25+
```python
926
from pybgpkit_parser import Parser
1027
import json
1128

12-
parser = Parser(url="https://spaces.bgpkit.org/parser/update-example", filters={"peer_ips": "185.1.8.65, 2001:7f8:73:0:3:fa4:0:1"})
29+
parser = Parser(
30+
url="https://spaces.bgpkit.org/parser/update-example",
31+
filters={"peer_ips": "185.1.8.65, 2001:7f8:73:0:3:fa4:0:1"},
32+
cache_dir="./"
33+
)
1334

1435
for elem in parser:
1536
print(elem["origin_asns"])
@@ -53,8 +74,47 @@ maturin publish --interpreter python3.10 --skip-existing
5374
maturin publish --interpreter python3.11 --skip-existing
5475
```
5576

77+
#### Using docker
78+
79+
```
80+
docker build -t bgpkit-builder:latest .
81+
docker run --rm -it bgpkit-builder:latest bash
82+
83+
####
84+
# TODO: copy the content of .pypirc to the root folder
85+
####
86+
git clone https://github.com/bgpkit/bgpkit-parser.git
87+
cd bgpkit-parser/bgpkit-parser-py
88+
89+
maturin publish --interpreter python3.7 --skip-existing
90+
maturin publish --interpreter python3.8 --skip-existing
91+
maturin publish --interpreter python3.9 --skip-existing
92+
maturin publish --interpreter python3.10 --skip-existing
93+
maturin publish --interpreter python3.11 --skip-existing
94+
95+
```
96+
5697
### Publish for MacOS
5798

99+
#### M1-based
100+
101+
**Minimum support version for M1 Macs is Python 3.8**
102+
103+
Install multiple Python interpreters:
58104
```bash
59-
maturin publish --skip-existing
105+
brew install [email protected]
106+
brew install [email protected]
107+
brew install [email protected]
108+
brew install [email protected]
60109
```
110+
111+
```bash
112+
maturin publish --interpreter python3.8 --skip-existing
113+
maturin publish --interpreter python3.9 --skip-existing
114+
maturin publish --interpreter python3.10 --skip-existing
115+
maturin publish --interpreter python3.11 --skip-existing
116+
```
117+
118+
#### Intel-based
119+
120+
- [ ] add support for packaging for Intel-based Macs

build.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
fn main() {
22
pyo3_build_config::add_extension_module_link_args();
3-
}
3+
}

src/lib.rs

Lines changed: 39 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,43 @@
1-
use std::collections::HashMap;
1+
use bgpkit_parser::models::*;
22
use bgpkit_parser::*;
3+
use dict_derive::{FromPyObject, IntoPyObject};
34
use pyo3::exceptions::PyValueError;
45
use pyo3::prelude::*;
5-
use dict_derive::{FromPyObject, IntoPyObject};
6+
use std::collections::HashMap;
7+
use std::io::Read;
68

79
#[pymodule]
810
fn pybgpkit_parser(_py: Python, m: &PyModule) -> PyResult<()> {
9-
1011
fn convert_elem(elem: BgpElem) -> Elem {
1112
Elem {
1213
timestamp: elem.timestamp,
1314
elem_type: match elem.elem_type {
14-
ElemType::ANNOUNCE => {"A".to_string()}
15-
ElemType::WITHDRAW => {"W".to_string()}
16-
}
17-
,
15+
ElemType::ANNOUNCE => "A".to_string(),
16+
ElemType::WITHDRAW => "W".to_string(),
17+
},
1818
peer_ip: elem.peer_ip.to_string(),
1919
peer_asn: elem.peer_asn.asn,
2020
prefix: elem.prefix.to_string(),
2121
next_hop: elem.next_hop.map(|v| v.to_string()),
2222
as_path: elem.as_path.map(|v| v.to_string()),
23-
origin_asns: elem.origin_asns.map(|v| v.into_iter().map(|x|x.asn).collect()),
23+
origin_asns: elem
24+
.origin_asns
25+
.map(|v| v.into_iter().map(|x| x.asn).collect()),
2426
origin: elem.origin.map(|v| v.to_string()),
2527
local_pref: elem.local_pref,
2628
med: elem.med,
27-
communities: elem.communities.map(|v| v.into_iter().map(|x|x.to_string()).collect()),
29+
communities: elem
30+
.communities
31+
.map(|v| v.into_iter().map(|x| x.to_string()).collect()),
2832
atomic: match elem.atomic {
29-
None => {
30-
None
31-
}
32-
Some(v) => {match v {
33-
AtomicAggregate::NAG => {Some("NAG".to_string())}
34-
AtomicAggregate::AG => {Some("AG".to_string())}
35-
}}
33+
None => None,
34+
Some(v) => match v {
35+
AtomicAggregate::NAG => Some("NAG".to_string()),
36+
AtomicAggregate::AG => Some("AG".to_string()),
37+
},
3638
},
3739
aggr_asn: elem.aggr_asn.map(|v| v.asn),
38-
aggr_ip: elem.aggr_ip.map(|v| v.to_string())
40+
aggr_ip: elem.aggr_ip.map(|v| v.to_string()),
3941
}
4042
}
4143

@@ -55,44 +57,47 @@ fn pybgpkit_parser(_py: Python, m: &PyModule) -> PyResult<()> {
5557
pub communities: Option<Vec<String>>,
5658
pub atomic: Option<String>,
5759
pub aggr_asn: Option<u32>,
58-
pub aggr_ip: Option<String>
60+
pub aggr_ip: Option<String>,
5961
}
6062

6163
#[pyclass]
6264
#[pyo3(text_signature = "(url, filters, /)")]
6365
struct Parser {
64-
elem_iter: ElemIterator,
66+
elem_iter: ElemIterator<Box<dyn Send + Read>>,
6567
}
6668

6769
#[pymethods]
6870
impl Parser {
6971
#[new]
70-
fn new(url: String, filters: Option<HashMap<String, String>>) -> PyResult<Self> {
71-
let mut parser = BgpkitParser::new(url.as_str()).unwrap();
72+
fn new(
73+
url: String,
74+
filters: Option<HashMap<String, String>>,
75+
cache_dir: Option<String>,
76+
) -> PyResult<Self> {
77+
let mut parser = match cache_dir {
78+
None => BgpkitParser::new(url.as_str()).unwrap(),
79+
Some(dir) => BgpkitParser::new_cached(url.as_str(), dir.as_str()).unwrap(),
80+
};
7281

7382
if let Some(filters) = filters {
74-
for (k,v) in filters {
75-
parser = match parser.add_filter(k.as_str(), v.as_str()) {
76-
Ok(p) => {p}
77-
Err(e) => {
78-
return Err(PyValueError::new_err(e.to_string()))
79-
}
80-
}
83+
for (k, v) in filters {
84+
parser = match parser.add_filter(k.as_str(), v.as_str()) {
85+
Ok(p) => p,
86+
Err(e) => return Err(PyValueError::new_err(e.to_string())),
87+
}
8188
}
8289
}
8390
let elem_iter = parser.into_iter();
84-
Ok(Parser{elem_iter})
91+
Ok(Parser { elem_iter })
8592
}
8693

8794
fn parse_all(&mut self) -> PyResult<Vec<Elem>> {
8895
let mut elems = vec![];
8996

9097
loop {
9198
match self.elem_iter.next() {
92-
None => {break}
93-
Some(e) => {
94-
elems.push(convert_elem(e))
95-
}
99+
None => break,
100+
Some(e) => elems.push(convert_elem(e)),
96101
}
97102
}
98103
Ok(elems)
@@ -114,4 +119,4 @@ fn pybgpkit_parser(_py: Python, m: &PyModule) -> PyResult<()> {
114119

115120
m.add_class::<Parser>()?;
116121
Ok(())
117-
}
122+
}

test.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
from pybgpkit_parser import Parser
22
import json
33

4-
parser = Parser(url="https://spaces.bgpkit.org/parser/update-example", filters={"peer_ips": "185.1.8.65, 2001:7f8:73:0:3:fa4:0:1"})
4+
parser = Parser(
5+
url="https://spaces.bgpkit.org/parser/update-example",
6+
filters={"peer_ips": "185.1.8.65, 2001:7f8:73:0:3:fa4:0:1"},
7+
cache_dir="./cache"
8+
)
59

610
for elem in parser:
711
print(elem["origin_asns"])

0 commit comments

Comments
 (0)