ConfigGenerator.py #1

  • //
  • guest/
  • sven_erik_knop/
  • P4Pythonlib/
  • scripts/
  • ConfigGenerator.py
  • View
  • Commits
  • Open Download .zip Download (2 KB)
#!/usr/bin/env python
# 
# Script to generate P4CONFIG files
#
# Input:
# 	Workspace root
#	P4PORT
#	P4CLIENT
#	P4USER

from __future__ import print_function

import sys
import os, os.path
from subprocess import Popen, PIPE
import re

P4="/usr/local/bin/p4"

class ConfigGenerator:
	def __init__(self, root, port, client, user):
		self.root = root
		self.port = port
		self.client = client
		self.user = user
		self.dict = {}
		self.comments = []
		self.updated = False
		
	def create(self):
		if not os.path.isdir(self.root):
			os.makedirs(self.root)
		os.chdir(self.root)
		
		print("Creating P4CONFIG at %s with \n\tPort\t= %s\n\tClient\t= %s\n\tUser\t= %s" % (self.root, self.port, self.client, self.user))
		
		configFile, configPath = self.findConfig()
		if not configPath or configPath == "noconfig": # config file does not exist yet 
			configPath = os.path.join(self.root, configFile)
		else:
			print("Found %s" % configPath)
		
		if os.path.exists(configPath):
			with open(configPath) as f:
				for line in f:
					if line.startswith('#'):
						self.comments.append(line)
					elif "=" in line:
						key,value = line.split('=')
						self.dict[key]=value.rstrip()
		
		self.set("P4PORT", self.port)
		self.set("P4CLIENT", self.client)
		self.set("P4USER", self.user)
		
		if self.updated:
			with open(configPath, 'w') as f:
				for comment in self.comments:
					f.write(comment)
				for key, value in self.dict.iteritems():
					f.write(key+'='+value + "\n")
			print("Created or updated %s" % configPath)
		
	def set(self, key, value):
		if not key in self.dict or self.dict[key] != value:
			self.dict[key] = value
			self.updated = True
		
	def findConfig(self):
		with Popen("%s -d %s set P4CONFIG" % (P4, self.root), stdout = PIPE, shell=True).stdout as s:
			output = s.read()
		
		# match either
		#   P4CONFIG=configfile\n
		# or
		#   P4CONFIG=configfile (config 'configpath')\n
		
		r = re.compile("P4CONFIG=([\w.]+)(\s*\(\w+\)\s*)?( \(config '(.*)'\))?\n")
		m = r.match(output)
		if m:
			config = m.group(1)
			path = m.group(4)
			return config, path
		else:
			print("Cannot extract config file from >%s<" % output)
			sys.exit(1)
		
if __name__ == '__main__':
	if len(sys.argv) < 4:
		print("Usage: ConfigGenerator ws_root P4PORT P4CLIENT P4USER")
		print("Got parameters: ", sys.argv)
		sys.exit(1)
	
	root = sys.argv[1]
	port = sys.argv[2]
	client = sys.argv[3]
	user = sys.argv[4]
	
	c = ConfigGenerator(root, port, client, user)
	c.create()
# Change User Description Committed
#2 8183 Sven Erik Knop Fixed problems on Windows:
               P4="p4" usually sufficient (overwrite if p4 not in path)
               os.linesep instead of "\n" in the regular expression
               (should have rstrip'd the output instead)
#1 8182 Sven Erik Knop ConfigGenerator.py Mark 1

A simple Python tool for P4V that takes four parameters:

root PORT CLIENT USER

and generates a config file out of it. Requires that P4CONFIG is set either in
the environment or registry and accessible from P4V (Mac users need to use p4 set)

Also requires a simple custom tool with these parameters:

Application: /path/to/ConfigGenerator.py
Arguments = $r $p $c $u
Run in terminal window recommended for debugging purposes

Tested with Python 2.7, but should run with at least 2.6 and 3.X (not tested)