#!/usr/bin/env python
"""
Script to import subscribers to the PacketLogic ruleset. The input
should be a commaseparated file with two fields: "ip, netobject name".
No rules will be created. For a script that takes care of the complete
ruleset, see ruleset_csv_import.py.
Example:
If the input file contains:
10.0.10.20,Customer 12345
10.0.10.25,Customer 23456
10.0.10.28,Customer 34567
Three netobjects will be created:
"Customer 12345" with 10.0.10.20 as item
"Customer 23456" with 10.0.10.25 as item
"Customer 34567" with 10.0.10.28 as item
"""
__version__ = "1.1 2008-11-14 Procera Networks"
###############################################################################
#
# NO WARRANTY
#
# BECAUSE THE PROGRAM IS PROVIDED FREE OF CHARGE, THERE IS NO WARRANTY
# FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
# OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
# PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
# OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
# TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
# PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
# REPAIR OR CORRECTION.
#
# IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
# WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
# REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
# INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
# OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
# TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
# YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
# PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGES.
#
###############################################################################
import sys
import packetlogic2
# Handle arguments
try:
[host, user, pwd, prefix, filename] = sys.argv[1:]
except ValueError:
print "Usage: %s plhost pluser plpass prefix csvfile" % sys.argv[0]
print "Example: %s 192.168.1.25 admin pldemo00 /Users/ users.txt" % sys.argv[0]
sys.exit(1)
# Connect to PacketLogic
try:
pl = packetlogic2.connect(host, user, pwd)
r = pl.Ruleset()
except:
t, v, tb = sys.exc_info()
print "Couldn't connect to PacketLogic: %s" % v
sys.exit(1)
# Make sure we get sane path
if prefix[0] != '/':
prefix = '/' + prefix
if prefix[-1] != '/':
prefix = prefix + '/'
# Make sure the parent object exists
if prefix != '/':
no = r.object_get("/NetObjects%s" % prefix[:-1])
if not no:
r.object_add("/NetObjects%s" % prefix[:-1])
# Open file
if filename == "-":
f = sys.stdin
else:
try:
f = file(filename)
except:
t, v, tb = sys.exc_info()
print "Couldn't open file: %s" % v
sys.exit(1)
for lineno, line in enumerate(f):
lineno += 1
line = line.rstrip()
try:
[ip, name] = line.split(",", 1)
except:
print "Couldn't parse line %d, ignoring" % lineno
continue
name = name.decode("utf-8")
# check if there already is a netobject
no = r.object_get("/NetObjects%s%s" % (prefix, name.encode("utf-8")))
if not no:
# otherwise create it
r.object_add("/NetObjects%s%s" % (prefix, name.encode("utf-8")))
no = r.object_get("/NetObjects%s%s" % (prefix, name.encode("utf-8")))
# add ip to netobject unless it already is in there
if ip not in no.items:
no.add(ip)
r.commit()