0

I have a python script that I wrote in which I parse most of the output using perl from dkpg -l command as per my need. What i am trying to do with the output is to create a json structure output file like below.

I am very new to python so looking for some tips on what is my best options here to produce such a json file with array structure ?

Json file

{

 "hostname": "xyz-abc-m001",
 "publicIP": "111.00.00.xxx",
 "privateIP": "10.xxx.xx.61",
 "kernal": "4.4.0-72-generic #93-Ubuntu",
 "package": [
   { "name":"nfs-common", "installed":"1:1.2.8-9ubuntu12", "available":"1:1.2.8-9ubuntu12.1" },
   { "name":"grub-common", "installed":"2.02~beta2-36ubuntu3.8", "available":"2.02~beta2-36ubuntu3.9" },
   { "name":"wget", "installed":"1.17.1-1ubuntu1.1", "available":"1.17.1-1ubuntu1.2" }

 ]

}

Python Script

import socket
import os
import subprocess
from subprocess import Popen, PIPE


#Getting Hostname of the machine
hostname=socket.gethostname()

#Getting private IP of the machine on eth0 
f = os.popen(" ip addr show eth0 | grep -Po 'inet \K[\d.]+' ")
private_ip=f.read()

#Getting public IP of the machine on eth1 
f = os.popen(" ip addr show eth1 | grep -Po 'inet \K[\d.]+' ")
public_ip=f.read()

#Getting currently running linux kernal
f = os.popen(" uname -a | awk '{print $3, $4}' ")
running_kernal=f.read()        


pipe = Popen(" apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print \"$1 $2 $3\n\"} ' ", shell=True, stdout=PIPE)

for line in pipe.stdout:
    parts = line.split() # split line into parts
    if len(parts) > 1:   # if at least 2 parts/columns
        print "Hostname = %s  PublicIP = %s PrivateIP = %s Package name = %s INSTALLED  = %s  AVAILABLE = %s kernal = %s " % (hostname, public_ip, private_ip, parts[0], parts[1], parts[2], running_kernal)

1 Answer 1

2

There's a library for that!

import json

Using this you can take your data structure... and convert it to json!

data = [1, 2, 3, {"hello world":42}]
myjson = json.dumps(data)

...and that's basically it. use json.loads and json.load to load from a json class and json file respectively.
You can find out more at this website

P.S. If you want to print with an indent, try

some_dictionary = {'hostname':hostname, 'PublicIP':publicIp, etc}
print(json.dumps(some_dictionary, indent=4))`
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.