Advertisement
Guest User

Untitled

a guest
Mar 27th, 2014
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 6.47 KB | None | 0 0
  1. package com.proceranetworks.deployer
  2.  
  3. import pl._
  4.  
  5. import scala.annotation.tailrec
  6. import java.io._
  7.  
  8. import net.lag.configgy._
  9. import st.salanki.libsalank.Logged
  10.  
  11. private abstract class TreeItem
  12. private case class TreeFolder(name: String, items: List[TreeItem]) extends TreeItem
  13. private case class TreeLeaf[A](item: A) extends TreeItem
  14.  
  15. private case class SystemTree(systems: List[SystemActor]) {
  16.   protected val treeComponents = for (system <- systems) yield system.groups.foldLeft[TreeItem](TreeLeaf(system))((in, item) => TreeFolder(item, List(in)))
  17.  
  18.   private def filterInTree(tree: List[TreeItem], node: TreeFolder): List[TreeFolder] = {
  19.     tree.filter(item => {
  20.       item match {
  21.         case x: TreeFolder if (x.name == node.name) => true
  22.         case _ => false
  23.       }
  24.     }).asInstanceOf[List[TreeFolder]]
  25.   }
  26.   private def filterNotInTree(tree: List[TreeItem], node: TreeFolder) = {
  27.     tree.filterNot(item => {
  28.       item match {
  29.         case x: TreeFolder if (x.name == node.name) => true
  30.         case _ => false
  31.       }
  32.     })
  33.   }
  34.  
  35.   private def collapseTree(tree: List[TreeItem], merged: List[TreeItem]): List[TreeItem] = {
  36.     tree match {
  37.       case Nil => for (node <- merged) yield node match {
  38.         case x: TreeFolder => TreeFolder(x.name, collapseTree(x.items, Nil))
  39.         case x: TreeLeaf[_] => x
  40.       }
  41.       case head :: tail => head match {
  42.         case x: TreeFolder => collapseTree(filterNotInTree(tree, x), TreeFolder(x.name, filterInTree(tree, x).map(_.items).flatten) :: merged)
  43.         case x: TreeLeaf[_] => collapseTree(tail, head :: merged)
  44.       }
  45.     }
  46.   }
  47.   val asList = collapseTree(treeComponents, Nil)
  48. }
  49.  
  50. object Generator {
  51.   /* Using the existing systems map and re-arranging it in a tree */
  52.   private val systems = deployerMain.markets.map(_._2).flatten.toList.distinct
  53.   private val systemTree = SystemTree(systems).asList
  54.  
  55.   private def preFilter(s: SystemActor) = try {
  56.     s.pl.model.archType != ArchTypes.PSM && s.pl.model.archType != ArchTypes.PLS
  57.     } catch {
  58.       case e: Exception => false
  59.     }
  60.  
  61.  
  62.   /**
  63.    * Generate PacketLogic client systems file
  64.    */
  65.   def generatePsx(mole: Boolean, filterSystems: Boolean = false) = {
  66.     /* This part is really ugly. It is for removing the "All" folder by first filtering the systemTree for the "All" folder, then finding the "All" folder in it again to add all the items in it to the tree root */
  67.     val patchedSystemTree = systemTree.filterNot(item => {
  68.       item match {
  69.         case x: TreeFolder if (x.name.compareToIgnoreCase("all") == 0) => true
  70.         case _ => false
  71.       }
  72.     }) ::: systemTree.find(item => {
  73.       item match {
  74.         case x: TreeFolder if (x.name.compareToIgnoreCase("all") == 0) => true
  75.         case _ => false
  76.       }
  77.     }).map(case x:TreeFolder => x.items).getOrElse(List[TreeFolder]()) // Do I need {} here?
  78.    
  79.    
  80.     def systemEntry(system: SystemActor, moleIp: Boolean, customName: Option[String] = None, syncedSystems: List[SystemActor] = Nil) = {
  81.           val password = system.userMap.get("admin").map(_.clearTextPassword.get).getOrElse("pldemo00")
  82.           val ip = moleIp match {
  83.             case true => system.moleIp
  84.             case false => system.ip
  85.           }
  86.           val name = customName.getOrElse(system.name)
  87.           val syncedsystems = syncedSystems.map(system => moleIp match {
  88.             case true => system.moleIp
  89.             case false => system.ip
  90.           }).mkString(",")
  91.  
  92.           <system password={ password } defaultview="Surveillance" differentpasswords="0" useproxy="0" username="admin" autoconnect="0" address={ ip } usecompression="1" syncedsystems={syncedsystems} name={ name }/>
  93.         }
  94.    
  95.     def walkTree(tree: List[TreeItem], moleIp: Boolean, atRoot: Boolean = true): xml.NodeSeq = {
  96.       val items = for (node <- tree) yield node match {
  97.         case node: TreeFolder => <folder name={ node.name }>{ walkTree(node.items, moleIp, false) }</folder>
  98.         case TreeLeaf(systema) => {
  99.           systemEntry(systema.asInstanceOf[SystemActor], moleIp)
  100.         }
  101.       }
  102.      
  103.       val allSystems: List[SystemActor] = tree.filter(_ match {case _: TreeLeaf[_] => true case _ => false}).asInstanceOf[List[TreeLeaf[SystemActor]]].map(_.item).filter(s => (filterSystems && preFilter(s)) || (!filterSystems))
  104.       allSystems.reverse match {
  105.         case head :: tail if(tail.size > 0) => systemEntry(head, moleIp, Some("All Systems"), tail) :: items
  106.         case _ if atRoot == true => {if(filterSystems) systems.filter(s => preFilter(s)) else systems } match {
  107.           case head :: tail if(tail.size > 0) => systemEntry(head, moleIp, Some("All Systems"), tail) :: items
  108.           case _ => items
  109.         }
  110.         case _ => items
  111.       }
  112.     }
  113.  
  114.     val folderName = if (deployerMain.marketFile == "markets.conf") "Deployer" else deployerMain.marketFile.split("/").last.replace("markets.", "").replace(".conf", "")
  115.  
  116.     val content =
  117.       <Systems>
  118.         <folder name={ folderName }>
  119.           { if(mole) <folder name="Direct"> {walkTree(patchedSystemTree, false)}</folder>
  120.           else walkTree(patchedSystemTree, false) }
  121.           { if(mole) <folder name="SSH Forwarded"> {walkTree(patchedSystemTree, true)}</folder>}
  122.         </folder>
  123.       </Systems>
  124.  
  125.     val fileName = "psx/" + folderName + ".psx"
  126.     val fos = new DataOutputStream(new FileOutputStream(new File(fileName)))
  127.     fos writeBytes "<!DOCTYPE plclient-systemmanager-export>\n"
  128.     fos writeBytes content.toString
  129.     fos close
  130.  
  131.     fileName
  132.   }
  133.  
  134.   /** Generates forward section of mole configs */
  135.   def generateMole() = {
  136.     val forwards = for (system <- systems) yield {
  137.       def forward(port: Int) = system.moleIp+":"+{if(port == 22) 42002 else port} +"="+system.ip+":"+port
  138.       "[forwards."+system.name+"]" :: forward(42000) :: forward(42001) :: forward(system.configMap.getInt("ssh_port",42002)) :: forward(8443) :: "" :: Nil
  139.     }
  140.    
  141.     if(systems.size*4 > 250) println("Warning: A lot of systems are being forwarded in this mole configuration. You will need to increase the number of file descriptors by doing: 'ulimit -n " + (systems.size*4+100) + "' before you run mole")
  142.     val data = "; Autogenerated forwards by Deployer from: "+deployerMain.marketFile.split("/").last+ "\n\n" + forwards.flatten.mkString("\n")
  143.    
  144.     val fos = new DataOutputStream(new FileOutputStream(new File("mole-generated.ini")))
  145.     fos writeBytes data
  146.     fos close
  147.    
  148.     "mole-generated.ini"
  149.   }
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement