syntax = "proto3";
package ix;

message GetIXMembersRequest {
    // IX ID from PeeringDB
    int64 id = 1;
}

message PeeringDBMember {
    int64 asn = 1;
    // AS/network name.
    string name = 2;

    message Router {
        // Per PeeringDB, at least one of the following two address families
        // will be set.
        string ipv4 = 1;
        string ipv6 = 2;
    }
    repeated Router routers = 3;
}

message GetIXMembersResponse {
    repeated PeeringDBMember members = 1;
}

service PeeringDBProxy {
    // GetIXMembers returns information about membership of a given PeeringDB IX.
    rpc GetIXMembers(GetIXMembersRequest) returns (GetIXMembersResponse);
}

message IRRQueryRequest {
    // AS to query for. This needs be the AS number of the AS, possibly
    // prefixed with 'as'/'AS'.
    string as = 1;
}

message IRRAttribute {
    message ImportExport {
        message Expression {
            string peering = 1;
            string router_us = 2;
            string router_them = 3;
            repeated string actions = 4;
        }
        string protocol_from = 1;
        string protocol_into = 2;
        repeated Expression expressions = 3;
        string filter = 4;
    }

    oneof value {
        string remarks = 1;
        ImportExport import = 2;
        ImportExport export = 3;
    }
}
        
message IRRQueryResponse {
    enum Source {
        SOURCE_INVALID = 0;
        SOURCE_RIPE = 1;
        SOURCE_ARIN = 2;
    }
    Source source = 1;
    repeated IRRAttribute attributes = 2;
}

service IRR {
    // Query returns parsed RPSL data from supported IRRs for a given aut-num.
    rpc Query(IRRQueryRequest) returns (IRRQueryResponse);
}

message ProcessorStatusRequest {
}

message ProcessorStatusResponse {
    message Processor {
        enum Status {
            STATUS_INVALID = 0;
            STATUS_OK = 1;
            STATUS_ERROR = 2;
        }
        string name = 1;
        Status status = 2;
        int64 last_run = 3;
        int64 next_run = 4;
    }
    repeated Processor processors = 1;
}

message PeerSummaryRequest {
}

message PeerSummaryResponse {
    PeeringDBMember peeringdb_info = 1;
    enum Status {
        STATUS_INVALID = 0;
        STATUS_OK = 1;
        STATUS_FAILED = 2;
        STATUS_UNKNOWN = 3;
    }
    Status check_status = 2;
}

message PeerDetailsRequest {
    int64 asn = 1;
}

message PeerDetailsResponse {
    message Check {
        enum Status {
            STATUS_INVALID = 0;
            STATUS_OK = 1;
            STATUS_FAILED = 2;
        };
        string name = 1;
        Status status = 2;
        int64 time = 3;
        string msg = 4;
    };
    repeated Check checks = 1;

    message AllowedPrefix {
        string prefix = 1;
        int64 max_length = 2;
        string ta = 3;
    };
    repeated AllowedPrefix allowed_prefixes = 2;
    PeeringDBMember peeringdb_info = 3;
}

message RouterHeartbeatRequest {
    string name = 1;
    string current_version = 2; 
}

message RouterHeartbeatResponse {
    message ASConfig {
        int64 asn = 1;
        message Router {
            string ipv6 = 1;
            string ipv4 = 2;
            string password = 3;
        };
        repeated Router routers = 2;
        message AllowedPrefix {
            string prefix = 1;
            int64 max_length = 2;
        };
        repeated AllowedPrefix prefixes = 3;
    };
    repeated ASConfig as_configs = 1;
    string version = 2;
    uint64 call_again = 3;
}

message PeerSecretsRequest {
    int64 asn = 1;
}

message PeerSecretsResponse {
    bytes pgp_data = 1;
}

service Verifier {
    rpc ProcessorStatus(ProcessorStatusRequest) returns (ProcessorStatusResponse);
    rpc PeerSummary(PeerSummaryRequest) returns (stream PeerSummaryResponse);
    rpc PeerDetails(PeerDetailsRequest) returns (PeerDetailsResponse);
    rpc RouterHeartbeat(RouterHeartbeatRequest) returns (RouterHeartbeatResponse);
    rpc PeerSecrets(PeerSecretsRequest) returns (PeerSecretsResponse);
}

message KeyInfoRequest {
    // Public key fingerprint. 20 bytes.
    bytes fingerprint = 1;
    enum Caching {
        CACHING_INVALID = 0;
        // Contact keyservers only if not locally (positively or negatively) cached.
        CACHING_AUTO = 1;
        // Force contacting keyservers.
        CACHING_FORCE_REMOTE = 2;
        // Force not contacting keyservers.
        CACHING_FORCE_LOCAL = 3;
    };
    Caching caching = 2;
}

message KeyInfoResponse {
    // Currently no data is returned. An error will be returned if the key doesn't exist.
}

message EncryptRequest {
    // A chunk of plaintext data. Small enough to fit in gRPC message (<<2 MiB).
    bytes data = 1;
    enum ChunkInfo {
        CHUNK_INFO_INVALID = 0;
        // More data to come after this chunked.
        CHUNK_INFO_MORE = 1;
        // Last chunk.
        CHUNK_LAST = 2;
    };
    ChunkInfo info = 2;
    // Fingerprint of key to encrypt with. Only the first chunk is consulted,
    // the key in the rest of the chunks are ignored. 20 bytes.
    bytes fingerprint = 3;
}

message EncryptResponse {
    // A chunk of encrypted data. Small enough to fit in gRPC message (<<2 MiB).
    bytes data = 1;
    enum ChunkInfo {
        CHUNK_INFO_INVALID = 0;
        // More data to come after this chunked.
        CHUNK_INFO_MORE = 1;
        // Last chunk.
        CHUNK_LAST = 2;
    };
    ChunkInfo info = 2;
}

service PGPEncryptor {
    // KeyInfo returns information about a given key from the public keyserver infrastructure.
    // If key doesn't exist, error (NotFound).
    rpc KeyInfo(KeyInfoRequest) returns (KeyInfoResponse);
    // Encrypt encrypts a given data blob with a given key from public keyserver infrastructure.
    // If key doesn't exist, error (NotFound).
    rpc Encrypt(stream EncryptRequest) returns (stream EncryptResponse);
}
