Keeping track of all this IT crap

VirginSnow at vfemail.net VirginSnow at vfemail.net
Fri Feb 1 17:46:29 EST 2008


> Date: Fri, 1 Feb 2008 10:26:03 -0500
> From: "Ben Scott" <dragonhawk at gmail.com>

> On Feb 1, 2008 9:07 AM,  <VirginSnow at vfemail.net> wrote:
> > Ben, Is there any reason you couldn't do this with a set of Prolog
> > rules and use a bunch of facts as your database?
> 
>   Several.  "I don't know anything about Prolog" comes to mind.  :-)

Heh.  Now you do. :)

/*
  Warning: Long, technical, code-ridden, post...
 */

:- discontiguous(contains/2,connection/2).

/* Facts about people/accounts. */

:- discontiguous(user/1,realname/2,title/2,account/3).

user(joe).
realname(joe,'Joe Smith').
title(joe,'Accountant II').
account(joe,'luke.example.com',joesmith).
account(joe,'vader.example.com',jsmith).

user(ben).
realname(ben,'Ben Scott').
title(ben,'Systems Admin Monkey').
account(ben,'luke.example.com',admin).
account(ben,'luke.example.com',root).
account(ben,'vader.example.com',admin).
account(ben,'vader.example.com',root).
account(ben,'deathstar.example.com',admin2).
account(ben,'deathstar.example.com',root).
account(ben,'www.example.com',admin).
account(ben,'www.example.com',root).

user(harry).
realname(harry,'Harry S. Mary').
title(harry,'Shipping Clerk').
account(harry,'dock.wh1.example.com',harry3).

/* Facts about buildings/rooms. */

:- discontiguous(building/1,address/2).

building(headquarters).
address(headquarters,'123 Technology Park, Anytown, NH 12345').
contains(headquarters,hq_rm100).
contains(headquarters,hq_rm110).
contains(headquarters,hq_rm115).
contains(headquarters,hq_rm120).
contains(headquarters,hq_rm201).
contains(headquarters,hq_rm210).
contains(headquarters,hq_rm215).
contains(headquarters,hq_rm225).
contains(headquarters,hq_rm301).

building(salem_facility).
address(salem_facility,'80 Port Number Lane, Salem, NH 12345').
contains(salem_facility,salem_rm101).
contains(salem_facility,salem_rm102).
contains(salem_facility,salem_rm102A).
contains(salem_facility,salem_rm104).
contains(salem_facility,salem_rm105).

building(wharehouse_1).
address(wharehouse_1,'1111 Industrial Park, Forgottenton, NH 12345').
contains(warehouse_1,wh1_warehouse).
contains(warehouse_1,wh1_office).

/* Facts about technology hardware. */

:- discontiguous(computer/1,motherboard/1,graphics/1,hdd/1).
:- discontiguous(nic/1,switch/1,cable/1).
:- discontiguous(pots_phone/1,sip_phone/1,cell_phone/1).
:- discontiguous(mfgr/2,sn/2,capacity/2,firmware/2).
:- discontiguous(purchase_date/2,reliability/2).
:- discontiguous(hdd_tech/2,hdd_rpm/2).
:- discontiguous(sw_tech/2,eth_speed/2,ports/2,cable_tech/2,tp_grade/2).

hdd(hdd_314159).
mfgr(hdd_314159,western_digital).
sn(hdd_314159,'01A10034CE1F').
capacity(hdd_314159,100*gb).
hdd_tech(hdd_314159,pata).
hdd_rpm(hdd_314159,5400).
purchase_date(hdd_314159,date(2005,10,31)).

graphics(radeon_12).
mfgr(radeon_12,ati).
sn(radeon_12,'BA-B00N-1128-12').
driver(radeon_12,win32,'/home/ben/drivers/radeon_win32.zip').
driver(radeon_12,dos,'/home/ben/drivers/radeon_dos.zip').
purchase_date(radeon_12,date(2005,10,33)).

motherboard(mb_9).
mfgr(mb_9,via).
sn(mb_9,'V-13123-803-4A12-11303').
reliability(mb_9,flakey).
firmware(mb_9,'/home/ben/fw/viaflash123.exe').
firmware(mb_9,'/home/ben/fw/viaflash139.exe').
purchase_date(mb_9,date(2005,10,4)).

switch(sw_3).
mfgr(sw_3,cabletron).
sn(sw_3,'CT-104-115180912').
sw_tech(sw_3,ethernet).
eth_speed(sw_3,10*mbps).
ports(sw_3,8).

nic(nic_22).
mfgr(nic_22,netgear).
sn(nic_22,'NT-86410-1152').
sw_tech(nic_22,ethernet).
eth_speed(nic_22,100*mbps).

nic(nic_23).
mfgr(nic_23,netgear).
sn(nic_23,'NT-86410-1153').
sw_tech(nic_23,ethernet).
eth_speed(nic_23,100*mbps).

cable(cable_522).
cable_tech(cable_522,ethernet_tp).
tp_grade(cable_522,cat5).

cable(cable_416).
cable_tech(cable_416,ethernet_tp).
tp_grade(cable_416,cat5).

pots_phone(pots_115).
sip_phone(sip_116).
cell_phone(cell_117).

/* Facts establishing relationships among components. */

computer(comp_123).
contains(comp_123,mb_9).
contains(comp_123,radeon_12).
contains(comp_123,nic_22).
contains(comp_123,hdd_314159).

computer(comp_103). /* ..etc. list what's in each computer */
computer(comp_118).
computer(comp_134).

contains(salem_rm104,comp_123). /* list room inventories */
contains(salem_rm104,comp_118).
contains(wh1_office,comp_134).

connection(nic_22,cable_522). /* describe network topology */
connection(port(sw_3,2),cable_522).
connection(nic_23,cable_416).
connection(port(sw_3,6),cable_416).

/* Inference rules relating components. */

room(Room) :- contains(Building,Room), building(Building).

phone(Thing) :- pots_phone(Thing).
phone(Thing) :- sip_phone(Thing).
phone(Thing) :- cell_phone(Thing).

is_in(Container,Object) :- contains(Container,Object).
is_in(Container,Object) :- contains(Container,Something),
                           is_in(Something,Object).

connected(Jack1,Jack2) :- connection(Jack1,Cable),
                          connection(Jack2,Cable).

net_path(From,To,[From,To]) :- connected(From,To).
/* (copy-and-paste the rest of your favorite graph search algorithm here!) */

/*

  Now, you can issue queries against the facts, for example...

  Query: What rooms are in the Salem facility?

  ?- contains(salem_facility,Room).

  Room = salem_rm101 ? a

  Room = salem_rm102

  Room = salem_rm102A

  Room = salem_rm104

  Room = salem_rm105


  Query: What room is hdd_314159 in?

  ?- is_in(Room,hdd_314159), room(Room).

  Room = salem_rm104 ? a


  Query: List everything in the Salem facility!

  ?- is_in(salem_facility,Thing).

  Thing = salem_rm101 ? a

  Thing = salem_rm102

  Thing = salem_rm102A

  Thing = salem_rm104

  Thing = salem_rm105

  Thing = comp_123

  Thing = comp_118

  Thing = mb_9

  Thing = radeon_12

  Thing = nic_22

  Thing = hdd_314159


  Query: What ATI drivers do I have?

  ?- mfgr(Thing,ati), driver(Thing,OS,Driver).

  Driver = '/home/ben/drivers/radeon_win32.zip'
  OS = win32
  Thing = radeon_12 ? a

  Driver = '/home/ben/drivers/radeon_dos.zip'
  OS = dos
  Thing = radeon_12


  Query: What device and port is nic_22 connected to?

  ?- connected(port(Device,Port),nic_22).

  Device = sw_3
  Port = 2 ? a

 See what fun you can have with tech inventories!?  And this is only a
 rough draft of a real tech tracker...

*/


More information about the gnhlug-discuss mailing list