vipnet_parser 0.3.3 → 1.0.0
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.
- checksums.yaml +4 -4
- data/lib/vipnet_parser.rb +3 -212
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: f043e287cec988e0e3892e9046c588f81a1a2bde
         | 
| 4 | 
            +
              data.tar.gz: 9eedaba5195eebc282099329486eceba82bca783
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 184ee79a3e19bcf31b990c5d5e29624c84c36fc9cb5f73b9e61c09fb28c0ea474918a2bccb5145cac848c0ad1d41c848d91bbb2a424628143f8b4fa83ee6824c
         | 
| 7 | 
            +
              data.tar.gz: 58bc03342eb484ce873104610e87ee43559daa9a08bce1fc010504a692cde78ec4ed97dc0bc99f7cc4e9589fdbede18fcaa84d5b80e4b34233815af65e1257f8
         | 
    
        data/lib/vipnet_parser.rb
    CHANGED
    
    | @@ -1,212 +1,3 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
             | 
| 3 | 
            -
             | 
| 4 | 
            -
                  string = args
         | 
| 5 | 
            -
                  array = Array.new
         | 
| 6 | 
            -
                elsif args.class == Hash
         | 
| 7 | 
            -
                  string = args[:string]
         | 
| 8 | 
            -
                  array = args[:array]
         | 
| 9 | 
            -
                  threshold = args[:threshold]
         | 
| 10 | 
            -
                end
         | 
| 11 | 
            -
                string = string.downcase
         | 
| 12 | 
            -
                cyrillic_sub = {
         | 
| 13 | 
            -
                  "а" => "a", "б" => "b", "с" => "c", "д" => "d", "е" => "e", "ф" => "f",
         | 
| 14 | 
            -
                  "А" => "a", "Б" => "b", "С" => "c", "Д" => "d", "Е" => "e", "Ф" => "f",
         | 
| 15 | 
            -
                }
         | 
| 16 | 
            -
                cyrillic_sub.each do |cyr, lat|
         | 
| 17 | 
            -
                  string = string.gsub(cyr, lat)
         | 
| 18 | 
            -
                end
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                array = [] unless array
         | 
| 21 | 
            -
                regexps = {
         | 
| 22 | 
            -
                  /(.*)(0x[0-9a-f]{1,8}-0x[0-9a-f]{1,8})(.*)/m => method(:id_parse_variant1),
         | 
| 23 | 
            -
                  /(.*)([0-9a-f]{8})(.*)/m => method(:id_parse_variant2),
         | 
| 24 | 
            -
                  /(.*)0x([0-9a-f]{1,8})(.*)/m => method(:id_parse_variant3),
         | 
| 25 | 
            -
                }
         | 
| 26 | 
            -
                string_matches_anything = false
         | 
| 27 | 
            -
                regexps.each do |regexp, callback|
         | 
| 28 | 
            -
                  if string =~ regexp && !string_matches_anything
         | 
| 29 | 
            -
                    string_matches_anything = true
         | 
| 30 | 
            -
                    array += callback.call({ string: Regexp.last_match(2), threshold: threshold })
         | 
| 31 | 
            -
                    [Regexp.last_match(1), Regexp.last_match(3)].each do |side_match|
         | 
| 32 | 
            -
                      unless side_match.empty?
         | 
| 33 | 
            -
                        array += id({ string: side_match, array: array, threshold: threshold })
         | 
| 34 | 
            -
                      end
         | 
| 35 | 
            -
                    end
         | 
| 36 | 
            -
                  end
         | 
| 37 | 
            -
                end
         | 
| 38 | 
            -
                if string_matches_anything
         | 
| 39 | 
            -
                  return array.uniq.sort
         | 
| 40 | 
            -
                else
         | 
| 41 | 
            -
                  return []
         | 
| 42 | 
            -
                end
         | 
| 43 | 
            -
              end
         | 
| 44 | 
            -
             | 
| 45 | 
            -
              def self.id_parse_variant1(args)
         | 
| 46 | 
            -
                string = args[:string]
         | 
| 47 | 
            -
                threshold = args[:threshold]
         | 
| 48 | 
            -
                string =~ /0x([0-9a-f]{1,8})-0x([0-9a-f]{1,8})/
         | 
| 49 | 
            -
                interval_begin = Regexp.last_match(1).to_i(16)
         | 
| 50 | 
            -
                interval_end = Regexp.last_match(2).to_i(16)
         | 
| 51 | 
            -
                return [] if interval_end < interval_begin
         | 
| 52 | 
            -
                if threshold
         | 
| 53 | 
            -
                  return [] if interval_end - interval_begin + 1 > threshold
         | 
| 54 | 
            -
                end
         | 
| 55 | 
            -
                array = Array.new
         | 
| 56 | 
            -
                (interval_end - interval_begin + 1).times do |n|
         | 
| 57 | 
            -
                  array.push("0x#{(interval_begin + n).to_s(16).rjust(8, '0')}")
         | 
| 58 | 
            -
                end
         | 
| 59 | 
            -
                array
         | 
| 60 | 
            -
              end
         | 
| 61 | 
            -
             | 
| 62 | 
            -
              def self.id_parse_variant2(args)
         | 
| 63 | 
            -
                string = args[:string]
         | 
| 64 | 
            -
                ["0x" + string.downcase]
         | 
| 65 | 
            -
              end
         | 
| 66 | 
            -
             | 
| 67 | 
            -
              def self.id_parse_variant3(args)
         | 
| 68 | 
            -
                string = args[:string]
         | 
| 69 | 
            -
                ["0x" + string.rjust(8, "0")]
         | 
| 70 | 
            -
              end
         | 
| 71 | 
            -
             | 
| 72 | 
            -
              def network(id)
         | 
| 73 | 
            -
                normal_ids = id(id)
         | 
| 74 | 
            -
                if normal_ids
         | 
| 75 | 
            -
                  normal_id = normal_ids[0]
         | 
| 76 | 
            -
                  return id[2..5].to_i(16).to_s(10)
         | 
| 77 | 
            -
                end
         | 
| 78 | 
            -
                false
         | 
| 79 | 
            -
              end
         | 
| 80 | 
            -
             | 
| 81 | 
            -
              module_function :id, :network
         | 
| 82 | 
            -
             | 
| 83 | 
            -
              class VipnetConfig
         | 
| 84 | 
            -
                def ==(other)
         | 
| 85 | 
            -
                  res = true
         | 
| 86 | 
            -
                  @props.each do |prop|
         | 
| 87 | 
            -
                    res = res && self.send(prop.to_s) == other.send(prop.to_s)
         | 
| 88 | 
            -
                  end
         | 
| 89 | 
            -
                  res
         | 
| 90 | 
            -
                end
         | 
| 91 | 
            -
              end
         | 
| 92 | 
            -
             | 
| 93 | 
            -
              class Iplirconf < VipnetConfig
         | 
| 94 | 
            -
                PROPS = [:content, :id, :sections]
         | 
| 95 | 
            -
                attr_accessor *PROPS, :last_error
         | 
| 96 | 
            -
                private_constant :PROPS
         | 
| 97 | 
            -
             | 
| 98 | 
            -
                def initialize(*args)
         | 
| 99 | 
            -
                  @props = PROPS
         | 
| 100 | 
            -
                  unless args.size == 1
         | 
| 101 | 
            -
                    return false
         | 
| 102 | 
            -
                  end
         | 
| 103 | 
            -
                  args = args[0]
         | 
| 104 | 
            -
                  if args.class == String
         | 
| 105 | 
            -
                    @content = args
         | 
| 106 | 
            -
                  elsif args.class == Hash
         | 
| 107 | 
            -
                    @content = args[:content]
         | 
| 108 | 
            -
                  end
         | 
| 109 | 
            -
                  # remove comments
         | 
| 110 | 
            -
                  content_nc = @content.gsub(/^#.*\n/, "")
         | 
| 111 | 
            -
                  # remove ending
         | 
| 112 | 
            -
                  @sections = Hash.new
         | 
| 113 | 
            -
                  adapter_position = content_nc.index("[adapter]")
         | 
| 114 | 
            -
                  unless adapter_position
         | 
| 115 | 
            -
                    @last_error = "unable to parse iplirconf (no [adapter] section)"
         | 
| 116 | 
            -
                    return false
         | 
| 117 | 
            -
                  end
         | 
| 118 | 
            -
                  # prepare for split
         | 
| 119 | 
            -
                  content_nc = content_nc[0..(adapter_position - 2)]
         | 
| 120 | 
            -
                  content_nc = "\n" + content_nc
         | 
| 121 | 
            -
                  content_nc.split("\n[id]\n").reject{ |t| t.empty? }.each_with_index do |section_content, i|
         | 
| 122 | 
            -
                    tmp_section = Hash.new
         | 
| 123 | 
            -
                    props = {
         | 
| 124 | 
            -
                      :single => [
         | 
| 125 | 
            -
                        :id, :name, :filterdefault, :tunnel,
         | 
| 126 | 
            -
                        :firewallip, :port, :proxyid, :dynamic_timeout, :accessip,
         | 
| 127 | 
            -
                        :usefirewall, :fixfirewall, :virtualip, :version,
         | 
| 128 | 
            -
                      ],
         | 
| 129 | 
            -
                      :multi => [:ip, :filterudp, :filtertcp]
         | 
| 130 | 
            -
                    }
         | 
| 131 | 
            -
                    props.each do |type, props|
         | 
| 132 | 
            -
                      props.each do |prop|
         | 
| 133 | 
            -
                        get_section_param({ prop: prop, section: tmp_section, content: section_content, type: type, opts: args })
         | 
| 134 | 
            -
                      end
         | 
| 135 | 
            -
                    end
         | 
| 136 | 
            -
                    # self section id
         | 
| 137 | 
            -
                    @id = tmp_section[:id] if i == 0
         | 
| 138 | 
            -
                    @sections[tmp_section[:id]] = tmp_section
         | 
| 139 | 
            -
                  end
         | 
| 140 | 
            -
                  true
         | 
| 141 | 
            -
                end
         | 
| 142 | 
            -
             | 
| 143 | 
            -
                def get_section_param(args)
         | 
| 144 | 
            -
                  opts = {} if args[:opts].class == String
         | 
| 145 | 
            -
                  opts = args[:opts] if args[:opts].class == Hash
         | 
| 146 | 
            -
                  value_regexp = Regexp.new("^#{args[:prop].to_s}=\s(.*)$")
         | 
| 147 | 
            -
                  if args[:type] == :multi
         | 
| 148 | 
            -
                    tmp_array = Array.new
         | 
| 149 | 
            -
                    args[:content].each_line do |line|
         | 
| 150 | 
            -
                      value = line[value_regexp, 1]
         | 
| 151 | 
            -
                      tmp_array.push(value) if value
         | 
| 152 | 
            -
                    end
         | 
| 153 | 
            -
                    unless tmp_array.empty?
         | 
| 154 | 
            -
                      tmp_array = tmp_array.to_s if opts[:arrays_to_s]
         | 
| 155 | 
            -
                      args[:section][args[:prop]] = tmp_array
         | 
| 156 | 
            -
                    end
         | 
| 157 | 
            -
                  elsif args[:type] == :single
         | 
| 158 | 
            -
                    value = args[:content][value_regexp, 1]
         | 
| 159 | 
            -
                    args[:section][args[:prop]] = value if value
         | 
| 160 | 
            -
                  end
         | 
| 161 | 
            -
                end
         | 
| 162 | 
            -
             | 
| 163 | 
            -
                private :get_section_param
         | 
| 164 | 
            -
              end
         | 
| 165 | 
            -
             | 
| 166 | 
            -
              class Nodename < VipnetConfig
         | 
| 167 | 
            -
                PROPS = [:content, :records]
         | 
| 168 | 
            -
                attr_accessor *PROPS, :last_error
         | 
| 169 | 
            -
                private_constant :PROPS
         | 
| 170 | 
            -
             | 
| 171 | 
            -
                def initialize(*args)
         | 
| 172 | 
            -
                  @props = PROPS
         | 
| 173 | 
            -
                  unless args.size == 1
         | 
| 174 | 
            -
                    return false
         | 
| 175 | 
            -
                  end
         | 
| 176 | 
            -
                  @content = args[0]
         | 
| 177 | 
            -
                  lines = content.force_encoding("cp866").encode("utf-8", replace: nil).split("\r\n")
         | 
| 178 | 
            -
                  if lines.size == 0
         | 
| 179 | 
            -
                    @last_error = "error parsing nodename"
         | 
| 180 | 
            -
                    return false
         | 
| 181 | 
            -
                  end
         | 
| 182 | 
            -
                  @records = Hash.new
         | 
| 183 | 
            -
                  lines.each do |line|
         | 
| 184 | 
            -
                    tmp_record = Hash.new
         | 
| 185 | 
            -
                    tmp_record = get_record_params(line)
         | 
| 186 | 
            -
                    tmp_record[:name].rstrip!
         | 
| 187 | 
            -
                    tmp_record[:enabled] = { "1" => true, "0" => false }[tmp_record[:enabled]]
         | 
| 188 | 
            -
                    tmp_record[:category] = { "A" => :client, "S" => :server, "G" => :group }[tmp_record[:category]]
         | 
| 189 | 
            -
                    @records[VipnetParser::id(tmp_record[:id])[0]] = tmp_record.reject { |k, _| k == :id }
         | 
| 190 | 
            -
                  end
         | 
| 191 | 
            -
                  true
         | 
| 192 | 
            -
                end
         | 
| 193 | 
            -
             | 
| 194 | 
            -
                def get_record_params(line)
         | 
| 195 | 
            -
                  record_regexp = /^
         | 
| 196 | 
            -
                    (?<name>.{50})\s
         | 
| 197 | 
            -
                    (?<enabled>[01])\s
         | 
| 198 | 
            -
                    (?<category>[ASG])\s
         | 
| 199 | 
            -
                    [0-9A-F]{8}
         | 
| 200 | 
            -
                    (?<server_number>[0-9A-F]{4})
         | 
| 201 | 
            -
                    (?<abonent_number>[0-9A-F]{4})\s
         | 
| 202 | 
            -
                    (?<id>[0-9A-F]{8})
         | 
| 203 | 
            -
                  $/x
         | 
| 204 | 
            -
                  match = record_regexp.match(line)
         | 
| 205 | 
            -
                  names = match.names.map { |name| name.to_sym }
         | 
| 206 | 
            -
                  # https://gist.github.com/flarnie/6221219
         | 
| 207 | 
            -
                  return Hash[names.zip(match.captures)]
         | 
| 208 | 
            -
                end
         | 
| 209 | 
            -
             | 
| 210 | 
            -
                private :get_record_params
         | 
| 211 | 
            -
              end
         | 
| 212 | 
            -
            end
         | 
| 1 | 
            +
            require "vipnet_parser/strings"
         | 
| 2 | 
            +
            require "vipnet_parser/iplirconf"
         | 
| 3 | 
            +
            require "vipnet_parser/nodename"
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: vipnet_parser
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 1.0.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Alexander Morozov
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2016- | 
| 11 | 
            +
            date: 2016-11-19 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies: []
         | 
| 13 13 | 
             
            description: Parses ViPNet IDs, iplir.conf and other files
         | 
| 14 14 | 
             
            email: ntcomp12@gmail.com
         |