From 71d118f16007aaa6f4a516db187b2729a73971c4 Mon Sep 17 00:00:00 2001 From: Flare Microsystems Date: Fri, 8 Nov 2024 09:01:36 -0800 Subject: [PATCH] Initial commit --- .classpath | 6 + .project | 17 ++ .settings/org.eclipse.jdt.core.prefs | 11 + .../flaremicro/crossjeeves/AgentInfo.class | Bin 0 -> 456 bytes .../crossjeeves/CrossJeevesClient.class | Bin 0 -> 725 bytes .../crossjeeves/CrossJeevesHost.class | Bin 0 -> 428 bytes .../crossjeeves/CrossJeevesMain.class | Bin 0 -> 3093 bytes .../ScriptProcessingException.class | Bin 0 -> 700 bytes .../crossjeeves/ScriptProcessor.class | Bin 0 -> 8562 bytes .../crossjeeves/net/ClientHandler.class | Bin 0 -> 2779 bytes .../crossjeeves/net/NetworkHandler.class | Bin 0 -> 883 bytes .../crossjeeves/net/ServerHandler.class | Bin 0 -> 1841 bytes .../crossjeeves/net/packet/Packet.class | Bin 0 -> 3062 bytes .../net/packet/Packet0Identify.class | Bin 0 -> 1554 bytes .../net/packet/Packet127KeepAlive.class | Bin 0 -> 1688 bytes .../net/packet/Packet1Status.class | Bin 0 -> 1547 bytes .../net/packet/Packet2Script.class | Bin 0 -> 1529 bytes .../crossjeeves/net/packet/Packet3Clone.class | Bin 0 -> 1704 bytes .../net/packet/Packet4FileData.class | Bin 0 -> 1740 bytes .../net/packet/Packet5Artifact.class | Bin 0 -> 1689 bytes bin/com/flaremicro/util/Util.class | Bin 0 -> 1415 bytes bin/com/flaremicro/util/ZipUtils.class | Bin 0 -> 2086 bytes bin/test.xml | 27 ++ src/com/flaremicro/crossjeeves/AgentInfo.java | 14 + .../crossjeeves/CrossJeevesClient.java | 16 ++ .../crossjeeves/CrossJeevesHost.java | 14 + .../crossjeeves/CrossJeevesMain.java | 75 +++++ .../ScriptProcessingException.java | 18 ++ .../crossjeeves/ScriptProcessor.java | 260 ++++++++++++++++++ .../crossjeeves/net/ClientHandler.java | 81 ++++++ .../crossjeeves/net/NetworkHandler.java | 24 ++ .../crossjeeves/net/ServerHandler.java | 59 ++++ .../crossjeeves/net/packet/Packet.java | 65 +++++ .../net/packet/Packet0Identify.java | 42 +++ .../net/packet/Packet127KeepAlive.java | 44 +++ .../crossjeeves/net/packet/Packet1Status.java | 41 +++ .../crossjeeves/net/packet/Packet2Script.java | 38 +++ .../crossjeeves/net/packet/Packet3Clone.java | 51 ++++ .../net/packet/Packet4FileData.java | 45 +++ .../net/packet/Packet5Artifact.java | 41 +++ src/com/flaremicro/util/Util.java | 35 +++ src/com/flaremicro/util/ZipUtils.java | 49 ++++ src/test.xml | 27 ++ 43 files changed, 1100 insertions(+) create mode 100644 .classpath create mode 100644 .project create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 bin/com/flaremicro/crossjeeves/AgentInfo.class create mode 100644 bin/com/flaremicro/crossjeeves/CrossJeevesClient.class create mode 100644 bin/com/flaremicro/crossjeeves/CrossJeevesHost.class create mode 100644 bin/com/flaremicro/crossjeeves/CrossJeevesMain.class create mode 100644 bin/com/flaremicro/crossjeeves/ScriptProcessingException.class create mode 100644 bin/com/flaremicro/crossjeeves/ScriptProcessor.class create mode 100644 bin/com/flaremicro/crossjeeves/net/ClientHandler.class create mode 100644 bin/com/flaremicro/crossjeeves/net/NetworkHandler.class create mode 100644 bin/com/flaremicro/crossjeeves/net/ServerHandler.class create mode 100644 bin/com/flaremicro/crossjeeves/net/packet/Packet.class create mode 100644 bin/com/flaremicro/crossjeeves/net/packet/Packet0Identify.class create mode 100644 bin/com/flaremicro/crossjeeves/net/packet/Packet127KeepAlive.class create mode 100644 bin/com/flaremicro/crossjeeves/net/packet/Packet1Status.class create mode 100644 bin/com/flaremicro/crossjeeves/net/packet/Packet2Script.class create mode 100644 bin/com/flaremicro/crossjeeves/net/packet/Packet3Clone.class create mode 100644 bin/com/flaremicro/crossjeeves/net/packet/Packet4FileData.class create mode 100644 bin/com/flaremicro/crossjeeves/net/packet/Packet5Artifact.class create mode 100644 bin/com/flaremicro/util/Util.class create mode 100644 bin/com/flaremicro/util/ZipUtils.class create mode 100644 bin/test.xml create mode 100644 src/com/flaremicro/crossjeeves/AgentInfo.java create mode 100644 src/com/flaremicro/crossjeeves/CrossJeevesClient.java create mode 100644 src/com/flaremicro/crossjeeves/CrossJeevesHost.java create mode 100644 src/com/flaremicro/crossjeeves/CrossJeevesMain.java create mode 100644 src/com/flaremicro/crossjeeves/ScriptProcessingException.java create mode 100644 src/com/flaremicro/crossjeeves/ScriptProcessor.java create mode 100644 src/com/flaremicro/crossjeeves/net/ClientHandler.java create mode 100644 src/com/flaremicro/crossjeeves/net/NetworkHandler.java create mode 100644 src/com/flaremicro/crossjeeves/net/ServerHandler.java create mode 100644 src/com/flaremicro/crossjeeves/net/packet/Packet.java create mode 100644 src/com/flaremicro/crossjeeves/net/packet/Packet0Identify.java create mode 100644 src/com/flaremicro/crossjeeves/net/packet/Packet127KeepAlive.java create mode 100644 src/com/flaremicro/crossjeeves/net/packet/Packet1Status.java create mode 100644 src/com/flaremicro/crossjeeves/net/packet/Packet2Script.java create mode 100644 src/com/flaremicro/crossjeeves/net/packet/Packet3Clone.java create mode 100644 src/com/flaremicro/crossjeeves/net/packet/Packet4FileData.java create mode 100644 src/com/flaremicro/crossjeeves/net/packet/Packet5Artifact.java create mode 100644 src/com/flaremicro/util/Util.java create mode 100644 src/com/flaremicro/util/ZipUtils.java create mode 100644 src/test.xml diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..8727917 --- /dev/null +++ b/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..917f655 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + CrossJeeves + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..416f4fb --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/bin/com/flaremicro/crossjeeves/AgentInfo.class b/bin/com/flaremicro/crossjeeves/AgentInfo.class new file mode 100644 index 0000000000000000000000000000000000000000..b2dfab7a17b4bc72948d1e9c86b7b3cff6cd0528 GIT binary patch literal 456 zcma)2O-lk%6g_X8GmraK7#M0%2rZxE)1Hho@n-aYwUD4iKcF8K zooCUiMT>Xd{W$lYd+*2R+dF`B?3LgM97pNQAIH+DnT|~A^JUposfEh?{zN5tkc`t3 zT!D?LTu48b$;7`KPF0i(xNN>uI#gg%2R%PyFIP7P@y5GY>iMCVrm`<=hp zL3hA{>vW_lD4^z{jJiOf(;bvSaSv-KTC3%ugmr;Ns1tQNpAD6Hki%Fp6Q+@j2hwQk z{{-FqNoN8l;eYnz$d&taZX$J~ZO8iW1eOdcb>tm%0p+0DEC$to#AXuU4q9vwq+phrejA$58Ux- zaLo=~?hkk*RlGqaV1P$nH*X+fgFn6NKWXiwrU7N{kM{r$&Z@L zrB460h9Tz&PX@ivVJP&&Y2=D)scv0gQQuTgh9i(u^kV=iLMAe_XLXcAp7zJZxq14A z!Yd`x*racPXdt3Nq!OV+-NZy06^cNOs;E(^LR;7-_736VB2z`35W}v{s4-`>6q~6L WDLo>i6D8e#UP!O0+cWHG*8Vrt*0cfu literal 0 HcmV?d00001 diff --git a/bin/com/flaremicro/crossjeeves/CrossJeevesHost.class b/bin/com/flaremicro/crossjeeves/CrossJeevesHost.class new file mode 100644 index 0000000000000000000000000000000000000000..5af61ae4f860ac2027012595b41858b09a596518 GIT binary patch literal 428 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 RAI7PeW5dqk0)sp(z5>#hqul@i literal 0 HcmV?d00001 diff --git a/bin/com/flaremicro/crossjeeves/ScriptProcessor.class b/bin/com/flaremicro/crossjeeves/ScriptProcessor.class new file mode 100644 index 0000000000000000000000000000000000000000..d820f3634fa77460d5259dcbe4bf20967cb14383 GIT binary patch literal 8562 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 literal 0 HcmV?d00001 diff --git a/bin/com/flaremicro/crossjeeves/net/ClientHandler.class b/bin/com/flaremicro/crossjeeves/net/ClientHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..08b78dbe8a5ad32a45cab441e7c3afcaef4a4c3e GIT binary patch literal 2779 zcmbVNOIO=Q7`;Pm%cyEXoj~f8HjlQ{Bw)n^#}o%rW0S_l#WW^R(x;FIP>>}bS*E3b zsOxMDCpo9fF1pB1%IP<<3^ByVRTdg)9`}BCzL)-e^YU*1DbyqkF-+-pUEMJ?hu00= zu~mAS&F7pS@TO{USIwISx7^2?RWrFGA;d5}0I|y5-)(2#hcHAQ7?$BKGF(VZZZL%M zc8$xpfMEq;L>MlW4U4a~>f78|*S1a05G&idW^QPXA?E&K$lWuV49W5U^F4yI49cFT zeNEH%xyz7B3?gWFC)ExhDy zE=rhTxO!H=Qp+%F+=*hAK^Dc_Bv0^ZnYzY(QMDO{(Raxv*QW5bf_YHkMYKkPTQ!F9 zMCrUF-$Yg*78ERs8$?~Z>fI=cZ|FYBKaGZrB@`s&sg6C7hOG*>D_F)OhKstxHJ7jR zdPA%-%)Ud_d0+Z!d@ho(g!?jzSdma7xo481dppGj zHk-~l)KfLR(`|xv)l)3PLa=_5n#rti-pHB8f#^CUJ5V@#;8ccHyXEM-ljgCWpIlNz z6*oZ@O+R*En7-)GN~1(GmEMfr;oC=uzMzjG$TW&=U<4n~sB{j{`$L*h4&V}v0-UC2 zNUWU&j(Nbb&ZZ9(&=Gt@qo9Zlq8RT>aoMN1GKk_7X(OJCT|dUn`A|Ic50rSQjj!66-h74BR_xvp(l^?eYvV!e;W2Xa;a6DNiieKy zZ9II8$A3Yd568o8tiB-TYj{ZQr{YItf`SK3QTV3GsY%+MrT&`U>hPx0Fzib`J!&7;`%(p3Kst5LEn literal 0 HcmV?d00001 diff --git a/bin/com/flaremicro/crossjeeves/net/NetworkHandler.class b/bin/com/flaremicro/crossjeeves/net/NetworkHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..0600bc536133ca0fdc3618e46bb63e3ee3ddd77b GIT binary patch literal 883 zcmbV~%}xR_6oqeL5J40Kf0ypiMC+giBWgl0Mk7HJ4Es_pQYbT|Q!qZ3D-#z!fDdKt z4Bfag!=m@=o%Xb+lk@%a`2_$j?4}_>;E?-c+Luh>Sa9W2GlF1bS>hHS>DWZnyX><*D@0!x>|6Z)D!vb^6R;57UmW+4fg9Hd~0K)xwFY)!{q zRL`s{kwCHOb0#}XiLkdH9X${M0osgZszx9;i2OY zzK5O`{kKSb9#8DHHPh2z5ox8(m6+&AT8($>NkjS`F7nvZTOsj=X|{;?tgg&|VtnrT zDxPPzQhh+2)TNlsooCzrRB;Rq5h(pl=TR6;XAevaO~L^(W@h4NYT9(vkQk;8K4AIX uOcIbaHCzVB!Aex44W?U#FzIWMw=7t$TNW)#mK&CvmRsgD0^6o0VCNS+r2ex2 literal 0 HcmV?d00001 diff --git a/bin/com/flaremicro/crossjeeves/net/ServerHandler.class b/bin/com/flaremicro/crossjeeves/net/ServerHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..cebabfce928275a3d3b568551c4877ad6d49beee GIT binary patch literal 1841 zcmbW1T~8B16o%g^rIk_zt0I1&AQz$$)&flt)P!J+#D^e< z(jX=kbV-g#e&TU2B3VV5VcnrPBK0+qmsY}1c`IU}-ZMp#pVwG6v{Zm$n}6f1G|&DgfRRyx))?D*L>yNat}YD`;RrdLXD%gt^m z#Xw!d@=D3j_S@ywL6pQ~9JjqTX@%aWx&2W@^nojWjnf=!y=`0jQePn+=E?QDL}M+( zJHPZcH`||y2K$j1&E{hfaK12?|wN(nU`vtgi)Srg3!-MXn;47V_+V+kh*j!UPfr=Rv^Mxq^kr!wh_uNuoy1}gJlx2#iLO_oYXS_mDVCzH(Rt{_@H)$4!1Txe1qH6|a zUkaSs{B}56h9{3ZW~nsXIWm;cjjaW8XoMKLSDf)8#sY=^2MG-(Y6(CH-#BbJwrd9? z0;z1rtU!9)o0l4P2yCmmbIB|%(Ip+*(Q059S_B$~L$eH{u-iZex{~%7Xo9X`AN{R` zN^gE%x`Dm0reiN!bs`-wa1e(Cnti!wmjdaphoC<@R-2a{vl@;F4AjD>Z#rPwN;(ds zRm1Tbt^21f-!29^jw$O7f&N;~9vF8#SL(gZDTxf<l`iz5Rkelf%Bk|oob+eRIft#VeZsR$XV&y>wT_id zmU4S$ttbnwvnJ4+?Wir!I?iB7!|SY>YE!GOFffd>0@|u-+`@vuj_g>+v#quTZ(vlz zIW~H=>{;>##xTy_D3&=I2D1sXXkH|HHr6DuW0j5+E*Q9oHw79OWe|3}B9h!2D%tT3 zUeRI?a_o$85lt9@p4y@zP|tJn^I=<$DenpfuHbF1sTVl@0#}k`Hi)0Ww1F8+a+=LC znBnx}ln9n=wns`OxXG86%^ADiq5EQJ+smm+%)5-;bl^*KWk?Me{lYy<76Y5(RKraM zA&fUS=L;Ke1nO*8pgjur3xIfP(f2G_Dy^T|pM6j1!N(oK^xf-2dI7`xoQP{fB!`d!}+q-rB3J)2hvOnIso_H4>c(vl^t1)ee~ z3A82aj8$N}i$nR2n`1ieVok%nO;>RA-oQurIO>xaB%O^dJ~i+e?z1Z#=`IFKVR7em ze2y@X5_H`%B9v{&{msm8CsmM9-R$|`+`QCFV}DYT;=4P0ql)uEA>Ca+Ddw}fkTiSqK? zST}Rsh^=U$W*c|>9HIbL1>3Jb#?If-wjs5rD%eZq{wH`PUBO|BM=91?Bw48v{JVVr_hFT*p16{ zYL<8Q9QIMC+)`gvui-T1jJm;N^0!Ey?{M%T+V?!cVAoTOq;Tya+PWU$ywXI9>dDQa zyNA(?BRutJh`uYrz$N5~MKruc1}Z$P>G-6x+#~pI2eCVe{S;Gm_#0;);p#6`*Fm|Z zvH;$&in0-H$2){l-*o)C;jfDL0H11KedlA$R+;G`i!P*bA^}jp0dNiPa>sQVrfGg7 zgo1%3z-e*6zh<^3c8 literal 0 HcmV?d00001 diff --git a/bin/com/flaremicro/crossjeeves/net/packet/Packet0Identify.class b/bin/com/flaremicro/crossjeeves/net/packet/Packet0Identify.class new file mode 100644 index 0000000000000000000000000000000000000000..9755ca4e8a9968a550aca441cf82a74eb98a1a9a GIT binary patch literal 1554 zcmb7DZBNrs6n^eD)=>*{1I9ZFDsCN61QBJ(7hmF%$xI+i{8+k+6t;G0JCJ{+i9n)> zKfoVlJh$yehnj^fyXW5CbDrlpFZb8)?>_-N!Al7-h7H4RYKINo;Z4(UY>ob|d(8PM zcQuQ9T1z)h$b9h4YPrrW&pbSrkYHH4O(;XU<=CEW*o_)@T+_A~SeapfxIeiJ$!*gz zy&Z;lzEERGyt30-f zqph1(iHP&%LTwNXBMJtP6uU765|Ru<4mV6HOi&AknSA9~Kh-tU)?VwLUbb3oZ_jhM z-Ykg}Wno z|I1J8F1P9(rL(*$k%uawz%UV&6ZKb6M1~=C=9nH21letpHPxdf z8bL)JqShPSbvt_2^8Na=%e^z(IeDjB^#*sSo-$4Bx`Z``kkJJ&c z)mK34pL6dwc9`BpL>z;5%WSA1M#HxF{&|a6t;RXSYQE49qeoClrnyw8%X@a)G5A|k zJc!XCyY4ivh#q2|Jmd7>V`OQdX$LXRv?l2by)9a0I<1psWCzqM-1$nI7=~z-$%1wX z4AT!#0w<(#mrep8L#qI&lBe)Z3jj5Kfvh@xfzfNIEP;T+5)?9sEWwTVkhvf%gd_l8 zpHP#-INeQ9RDw>EKF#}(CZiTFK?K>*Mu>*}gma{AoaiPZB$+Nrh6=MlpiIpDUnI4V zB&Qay@TjPML-rDng&ie(Go@)N>XIp_rR@7@J@;&+#I}S|cpcywne{k5}0GLi?b9qRGIbj}-JS6(TW|e6Q_4 D?hIE) literal 0 HcmV?d00001 diff --git a/bin/com/flaremicro/crossjeeves/net/packet/Packet127KeepAlive.class b/bin/com/flaremicro/crossjeeves/net/packet/Packet127KeepAlive.class new file mode 100644 index 0000000000000000000000000000000000000000..f8f21b8c3d38196fb328b726422e6d9a73cac278 GIT binary patch literal 1688 zcmb7EYflqF6g>l_rFD4-QbeJkqHech1s|X&%2NvsnADIMKP}r)R?2R(-QweK_(wF6 zl4#-&@JAWX?6$CI2qDexo!NWm+;i@o+uwhF`~onEwFKG(W-NC%|F&X!a@V#zH_xY5 zdoSgltmPf)=c}f*L-R5)lT*`cQdZ|H_MS{2CUEO4rv>6~?TRdv1;naA(%P;&J0<(G z&g-~1T!x9yt1qvBb(MwQNzioW`0A-kD`Kw3iw;%aqKLjs*@bxA`KDS<9e zS~g1;R!d-5FTOYT%)IU9mrUO*IMupe@;zzp&MHNz<&T!E`nK!T5*QWeZv_`N4m~Mc z!L)U2K0z)SfVEUSL$}OrR$Ej}A{U}#e_M8SC z*%T&_PvAD?NBKnKHQd1@`}x7MeHk)}>8sgIb@Z-=d$`ZsfwQ#jdOka=7eeo}h8a8* z=m@;Dx~e(_xpjtJI;JI>ksa!)dafmFwU(YK{j`3sOaFuG?YuCZaz%P_3v?rf9-QY&g)6{5^wTPU3w$epGE>E9(+a>C-N%42@$1Vz z291e*3>_h+c^bru5hF>IULp+er_jd&y6Gl5u>$HUV_J+ zp#~ltWedd(llBOSWhiTutFcJt%wgsX9$_}f{1{JYRT1aNKnaQGj0Wb8a6=W>h&vv^ xiXURdv4rISYX#4nSW`q&rR)3&@%jKSzH%KlRdpWJt4ba=w6lpMPza({{{pptZwCMX literal 0 HcmV?d00001 diff --git a/bin/com/flaremicro/crossjeeves/net/packet/Packet1Status.class b/bin/com/flaremicro/crossjeeves/net/packet/Packet1Status.class new file mode 100644 index 0000000000000000000000000000000000000000..6c17fcb0016cf82a6cd5dd25d18933017cee4fda GIT binary patch literal 1547 zcmb7@eNWR+6vm&sjlI;eA@8pWzU~DmFQVv>L{Z|*0w%*H{8_rI6uNe4??AqlCJKor zegHp|@!YN(9cmW-XwPkX`a92g&b_~WfBy+!8Jh`27*-9Zu6?j{m)A|hbu_v>?}+mg z?rAm`T0=LEDZKN;az*H(=_L?jn7_`C44H=O2*+@&DtA58u^Cv2p^qwm^cZ3<-&gh- z`nMe06S^&`y4B=SlF1n28>VfFO@?STSEbY~r^XdTkx_92Dv`^k&3Bsh1McqW2Nq`- zEIWp7Rdv^t&%w)>I5er!TKPJqRMBdHu=Y4MClgeNzlW?c~yK=Zk_F+)m&Y!&v+46_kou%rPVg zTPxYZ_k?VWnB?cgf9q3qkK47j(wT0hyG;?6Dy@B};vViR$f1xxo?$#JC!DWh9>WaD zQ`Z!{CCF)#tjR7d;XlaAe%cBK_q?{Am29t>>~L}FxW{jFyJm5h{8X@lM+vMlEc6&> z_pd6}@R&h8^hs?2>pcZD{&5QYv8L&agrqTO*X)JtFf7OBduI*4Yg=awOW9m6MwgtT zLc20UGp;yI*WlZxe*{{+1^ahV&JS~xC(l%rVjtqPg51h(sG#lHLn(qH_P0lF)c3SC+F9bwg;?3!)v_jjIi&b|Hn@7EsyPw-Mf7sI0E)r~KX8SuJo1)f1~7#?zd z%tOQFk>Q)x5p^GBSKYP(+m94v8D?*?ks%k#tqiv}4$WiJa7=gK*p33*-Cv>ASGH?M zs|=Y^d6yyk#;b7^8FXt0p>hcG#Zr){M+`*Kb4=6gTTDA`bQ4SBv|R z?YW_X5rzR7IvKBTwN_M&;f{iFhLPs#C6tB{J^t#7&i4(OP#8=$)gi5IC^ioHHQb3U={ONP+&03btriIR*g=7l|eg@q^5x7 zjspB^?t-jyk#0iR4eSSTHqb2O$~Ms0y+i`2_C{T%9d`p^Z9T9taxD2pC?#3%+7 z(MvM{=%ZEu*2q%Wssf-_exm<^Qk1THiPA^5{gN~sTO%e3PePUuF@Ql@8zNSgX2X*H zI-wWz${9x6;IYI(iexASF0{Y}OyRBs)3Lq+{*Zu+dgUB575xYL&+y=~^idKwM)dKN zhhob^5oPGoLj|+ci*&3e++0OJ!`uZgRy#?&sT3>MV&$k3PbF&!&k|OZSR(ED-(a85 Z@%$T&mmnNT(7?!2gi~k_iS~>s# literal 0 HcmV?d00001 diff --git a/bin/com/flaremicro/crossjeeves/net/packet/Packet3Clone.class b/bin/com/flaremicro/crossjeeves/net/packet/Packet3Clone.class new file mode 100644 index 0000000000000000000000000000000000000000..a77c647a2aadd11f65b9f03484b7dbde0af47c7b GIT binary patch literal 1704 zcmb7EYflqF6g^Y=Vp*syP#*F|r4L|vDJqC2pb=8R1k!|$%XWZ;cDLDXLHti9ng}GC z_yhb=#yhjyvLJ?#X6Mf9o^$S*ng0Is;}?Kgyon*iFlX2mZNIELykZ)TtA5+0pmPl#wdfhF&h}jw#0eWY|44YYYp8`>67&Sz?G} zHa4=wRxos`h#)F@-6~>;GPFC~Fv$(i0EU4~;YdHxHPhDCbXQ-us&#kUb+}$x5(Ox4 zKN-C0nzmJop`QR7o7cCRD+&fM6vH4xPh<54l!{@DkWU0#D%jS6w1=ig7$rkU=hnEJJTlPjJ7AJSG`hPaV_co}zGuJR@Ot-DT*% zrYV?7_O@3Y+u*fYL)Tp9u4CHd?y2n@zt^o&nLA{xf;lY2FwZb`#|d9gRq+(h7}P_F z)DWX`P>C&uP{CD#|U#gfE8_GMX`wI66*zC`dD*> zB&>`71lzsD(pTzxCmEIV6B5Zg#kh~eu#6EuU-R=LqS7xnlJkM&NHh7>t;tQ1C%5_?%9~D!#6w+$$*BTEV1-#Q15P9%ZD=G}EcCU!}>l zBx?Kt{-~R~&Y89pA0d30^V(;xz1H4m&yWAUd$X3ahQK{*;o1C8L>FSEtkoTO(Ng*L{VLz?{$(M94*9AmHU{r0EH`@NDz|iw0 zT5o&47cB}5TZMIj#BxxV28NL_F$zN7)Rh7=gD2CmascS29?yN8Kr z!)poLsP2bbU)BP7Se55Xh4oPg95yk6q*_gyNFgnd38m{XHE}isrmgC0=Z#bHf|ANg z*>AR^S`U45dWoq6B zrdgCJq$T}&Pjqg#=(Tn$zKQF&!EkRwFOspggjFf5 zE7zMQZh-|cw6Uu$VU=U+9TSU6-iWqRcF?ByZd|4_#63HJmF#0BQAR~$JwmmMHBTg!<@8sG cXWMxEk?XkV>SX{0jT9F=-9-{u)wkCE2i_5RB>(^b literal 0 HcmV?d00001 diff --git a/bin/com/flaremicro/crossjeeves/net/packet/Packet5Artifact.class b/bin/com/flaremicro/crossjeeves/net/packet/Packet5Artifact.class new file mode 100644 index 0000000000000000000000000000000000000000..27a51edfecd5fe3a62a52269d2ba4d56f8948abc GIT binary patch literal 1689 zcmb7E>rN9v6#j;mwyaz3l)Hd}_5v&y5v7VE7ll+H0h{=9*$%MK?l#*k$XjV5CDFtO z@S%)nW=q+Err}3tb}r|;oH?hz|NQs`U>5JgXku6}?1FZf*BxFk4ae5#S1O%we#T3h z#a*qa8>ckw%4uQ6am_>BaKi{POx`DyA#`Zw`DTuRZ84}0&+D#v#y4n_p)+%$pXpj& zw~n+u*DSKqXX zWtV($y^t1Gl=UwLFS@2}mBQ#}=#uW~^5#zMM8P12!x&=dy*|AKrQ#t*7$O9l%h=YD zOw^W$8&mNJj~T+^=+piN35_T2dJqmKRD=;>XfiE^{{N~b%_VN-uKf+y``anIeuLtX zQYzv|D42p4#xz5p--Q3ZiW$r@w46Jp%RL*x_*Nn-Lg!UH!va~9htfz-mDyh^BBcSl z>@p108SvB4J4TC+ZSYd*+QeMEQAuob_uO_)Kj>C2&mDR?1!=qv;}yeHgKDY|Rk4gW zRQ1Oa=~}>2LjlEqcAu=FR_aclI0o&WZYUu}-nRJuMUn4V`3r^_Dv}1a>I9_~DxfHp z#-3evjA|=)d+urtG%X$;V{|h>e>+X|qmH2wqV8x6(FwIPjSpxwPcx&rIe7*38+|mP zl}1GdMiHb{8?9CE657#0D*@0+qX5_?nxKdf0LhU{blsq|N(t?B-XS9d(x}{1sz`!K z$P*G2DKJ3aJ%|y1FYN_s)hBsAQk*c;kxW%EKr~_=y~Ox!x*l>FBlun^TmVr}jjjVv z@RUHA=$1Pq*(ymanYuzUmHdvb3MR!oUcuZAQ>U~%K+*>h#SjS|_OS_ektUFi=U9|% zFYuCPk+5ZA6`De+WCcq%m|n_933JSc6{=x{@D?i)>m63BSaXCVQWyCN_W25HU+LR> SKrf{ezQ>DHkr>wHt&P700DBJr literal 0 HcmV?d00001 diff --git a/bin/com/flaremicro/util/Util.class b/bin/com/flaremicro/util/Util.class new file mode 100644 index 0000000000000000000000000000000000000000..de99f45796a5e9f09549321ff63331d38cced60e GIT binary patch literal 1415 zcma)5O;Zy=5Pg&EvL6J6K#*WW@Btahd6!>3Q#UPxsGXU%vx5k4X&?h7QXu=bo3iC(5?vxw*i% zOSy-%XiylMU+@*4D{*HjH@)yeSUy9;sO{MP7(+CjnPpHW+(ls`3L^#;4Gf2iwj-v3 z@`CUl@P(3Kh!Tx$RI!N7Fl4CYHH3BVGlTVXUhX~8aE^X_`xoyAj&GO6jW?F4__pil7+`3f3@BfV`=Xn^pO=L% zJQGO|sO!{FH$(gGzF)0u_5RRq>;v{6gE`{{o+WPDa;gkD zr01j<^nfJLOal?JXbNf7$ji~rXjl6-p??amO%M;mBKt)uB1vUBm=CeHtOtFnZeX!!8^ zefA@SP{ znalGKZ4DPOL>}cv2$#Z2tYL(#2r+oLj6CtC2&q8m3dI<>LY7V({dH@UBF5;x4ec7mGRi^LcH$3H3rp4j literal 0 HcmV?d00001 diff --git a/bin/com/flaremicro/util/ZipUtils.class b/bin/com/flaremicro/util/ZipUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..ac3f8ed0506dcf9e6989291f0897b8a5dfbda1c9 GIT binary patch literal 2086 zcmah}T~ixX7=8|HvLRi{XCQ%63RWc{A#E*KL#^^vjnYs{K?AjR6Bbxpvgu}1OE0`~ z^uh~gIy$4{g?PnvZ-OIEz4OAq;`kS=&)Ec<0P19N-m~ZZe%|Mt-~amgDS(S`RWu2l z$=ln>bxU`QZ8PuK$+Bx&$rZD>L|Iay2()kM5A>v^7dDa$xh*5_3iz*@1=GDI&^!`d z7EosFH6w^-v}o|bFVHq`7K}`JJ7+kz^_*o0bk5s(-CEWiQ-0SD6?fAt37nn(uNo!= zv`1!f)^wQKc6I~?N9MhfOgnkqw2aBdFIiA5t(1;U34 z8EB#G7R&CU>lpfW5MAhz-Si4{9LX15RuK^x@O(YISf9kKF+dpoGQb&u$nya8CX>=I|uQnJfV z-XNj^ryIc&P-|6iw(B;B)7N0oP(Do_Nt40w~5Xbt4={kBs%2h7?GnwhhCb%9U)Z>>4+9 zcT=EyBw7vVv73`O3mcO`ypA_ikll66uj(|si7C?GG71~gpVg+N`HY5H%t>U+xsn$} zAT*LbA$S0935YuZq$!fp_gxM1xIy3@qiE@Q&S$nZa<8bFP2E{E?w5^1{*dX%&re9C zVnLwi7)9p_uCo(F2JcC3-jZb=M?ms2jN2NPz{{i&(TwrX^;`w|YYz3K^HepqeV`$W z6|(IU$8_0^Iah2@>z*AaHWnIwHL+9lF_&6(0LpKfdFqpt>R?Rum30B!0u=L^h>9 zo$xnL`1a5pQA55J}Tg<4?CI$=JB!t5W7GRT3Wg=e0efoXDIahardf8d&Zx>MIUjP6A literal 0 HcmV?d00001 diff --git a/bin/test.xml b/bin/test.xml new file mode 100644 index 0000000..6d74a97 --- /dev/null +++ b/bin/test.xml @@ -0,0 +1,27 @@ + + + Variable Contents + + + + + echo this could be a whole batch script or just one command + + + print("this could be a whole python script or just one call") + + + echo "this could be a whole sh script or just one command" + + + echo "this could be a whole powershell script or just one command" + + + + + dist/* + + dist/ + + + \ No newline at end of file diff --git a/src/com/flaremicro/crossjeeves/AgentInfo.java b/src/com/flaremicro/crossjeeves/AgentInfo.java new file mode 100644 index 0000000..e91eb84 --- /dev/null +++ b/src/com/flaremicro/crossjeeves/AgentInfo.java @@ -0,0 +1,14 @@ +package com.flaremicro.crossjeeves; + +import java.net.InetAddress; + +public class AgentInfo { + public final InetAddress addr; + public final int port; + + public AgentInfo(InetAddress addr, int port) + { + this.addr = addr; + this.port = port; + } +} diff --git a/src/com/flaremicro/crossjeeves/CrossJeevesClient.java b/src/com/flaremicro/crossjeeves/CrossJeevesClient.java new file mode 100644 index 0000000..8336a7a --- /dev/null +++ b/src/com/flaremicro/crossjeeves/CrossJeevesClient.java @@ -0,0 +1,16 @@ +package com.flaremicro.crossjeeves; + +import java.util.List; + +public class CrossJeevesClient { + + public CrossJeevesClient(List agentList, String script) { + // TODO Auto-generated constructor stub + } + + public void beginJob() { + // TODO Auto-generated method stub + + } + +} diff --git a/src/com/flaremicro/crossjeeves/CrossJeevesHost.java b/src/com/flaremicro/crossjeeves/CrossJeevesHost.java new file mode 100644 index 0000000..f2e388b --- /dev/null +++ b/src/com/flaremicro/crossjeeves/CrossJeevesHost.java @@ -0,0 +1,14 @@ +package com.flaremicro.crossjeeves; + +public class CrossJeevesHost { + + public CrossJeevesHost(int port) { + // TODO Auto-generated constructor stub + } + + public void startHosting() { + // TODO Auto-generated method stub + + } + +} diff --git a/src/com/flaremicro/crossjeeves/CrossJeevesMain.java b/src/com/flaremicro/crossjeeves/CrossJeevesMain.java new file mode 100644 index 0000000..a745344 --- /dev/null +++ b/src/com/flaremicro/crossjeeves/CrossJeevesMain.java @@ -0,0 +1,75 @@ +package com.flaremicro.crossjeeves; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import com.flaremicro.util.Util; + +public class CrossJeevesMain { + public static void main(String[] args) { + Map parsedArgs = Util.parseArgs(args, true, true); + if (parsedArgs.containsKey("host")) + { + try + { + int port = Integer.parseInt(parsedArgs.get("host")); + CrossJeevesHost host = new CrossJeevesHost(port); + host.startHosting(); + } + catch (NumberFormatException ex) + { + System.out.println("Invalid port specified: " + parsedArgs.get("host")); + System.exit(1); + } + } + else if (parsedArgs.containsKey("agent")) + { + if(!parsedArgs.containsKey("script")) + { + System.out.println("'script' argument must be specified for agent."); + System.exit(1); + } + String[] agents = parsedArgs.get("agent").split("\\s"); + List agentList = new ArrayList(); + for(String agent : agents) + { + String agentArgs[] = agent.split("\\+"); + if(agentArgs.length == 0) + { + System.out.println("IP must be specified"); + System.exit(1); + } + String ipStr = args[0]; + String portStr = "10801"; + if(args.length >= 2) + portStr = args[1]; + try + { + int port = Integer.parseInt(portStr); + InetAddress inetAddress = InetAddress.getByName(ipStr); + agentList.add(new AgentInfo(inetAddress, port)); + } + catch (NumberFormatException ex) + { + System.out.println("Invalid port specified: " + portStr); + System.exit(1); + } + catch (UnknownHostException e) + { + System.out.println("Unknown host: " + ipStr); + System.exit(1); + } + } + CrossJeevesClient client = new CrossJeevesClient(agentList, parsedArgs.get("script")); + client.beginJob(); + } + else + { + System.out.println("Argument 'host' or 'agent' must be specified."); + System.exit(1); + } + } +} diff --git a/src/com/flaremicro/crossjeeves/ScriptProcessingException.java b/src/com/flaremicro/crossjeeves/ScriptProcessingException.java new file mode 100644 index 0000000..ef4f114 --- /dev/null +++ b/src/com/flaremicro/crossjeeves/ScriptProcessingException.java @@ -0,0 +1,18 @@ +package com.flaremicro.crossjeeves; + +public class ScriptProcessingException extends Exception { + + public ScriptProcessingException(String string) { + super(string); + } + + public ScriptProcessingException(String string, Exception ex) { + super(string, ex); + } + + /** + * + */ + private static final long serialVersionUID = 1L; + +} diff --git a/src/com/flaremicro/crossjeeves/ScriptProcessor.java b/src/com/flaremicro/crossjeeves/ScriptProcessor.java new file mode 100644 index 0000000..b86236f --- /dev/null +++ b/src/com/flaremicro/crossjeeves/ScriptProcessor.java @@ -0,0 +1,260 @@ +package com.flaremicro.crossjeeves; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.StringReader; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Properties; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.w3c.dom.DOMException; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; + +public class ScriptProcessor { + public Properties properties; + public Map currentEnvironment = new HashMap(); + public Process runningProcess = null; + + + public ScriptProcessor(Properties properties) + { + this.properties = properties; + } + + public static void main(String[] token) throws ScriptProcessingException, IOException { + + Properties properties = new Properties(); + + String xml = ""; + + BufferedReader br = new BufferedReader(new InputStreamReader(ScriptProcessor.class.getResourceAsStream("/test.xml"))); + String line; + while((line = br.readLine()) != null) + { + xml += line + "\n"; + } + br.close(); + + new ScriptProcessor(properties).processScript(xml); + } + + public String requireAttribute(Element e, String attribute) throws ScriptProcessingException { + if (!e.hasAttribute(attribute)) + { + throw new ScriptProcessingException("Attribute " + attribute + " required for element " + e.toString()); + } + return e.getAttribute(attribute); + } + + public String getAttribute(Element e, String attribute, String fallback) throws ScriptProcessingException { + if (!e.hasAttribute(attribute)) + { + return fallback; + } + return e.getAttribute(attribute); + } + + public Element getElement(Node node) throws ScriptProcessingException { + if (!(node instanceof Element)) + return null; + return (Element) node; + } + + public void processScript(String script) throws ScriptProcessingException { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + try + { + + DocumentBuilder db = dbf.newDocumentBuilder(); + Document doc = db.parse(new InputSource(new StringReader(script))); + + NodeList nodeList = doc.getDocumentElement().getChildNodes(); + + for (int i = 0; i < nodeList.getLength(); i++) + { + Node node = nodeList.item(i); + Element e = getElement(node); + if (e == null) + continue; + + String name = e.getTagName().trim(); + if (name == null || name.length() <= 0) + { + throw new ScriptProcessingException("Got invalid null or empty element"); + } + if (name.equalsIgnoreCase("environment")) + { + environmentProcessor(e); + } + else if (name.equalsIgnoreCase("clone")) + { + cloneProcessor(e); + } + else if (name.equalsIgnoreCase("bat")) + { + batchProcessor(e); + } + else if (name.equalsIgnoreCase("py")) + { + pythonProcessor(e); + } + else if (name.equalsIgnoreCase("sh")) + { + shellProcessor(e); + } + else if (name.equalsIgnoreCase("ps")) + { + powershellProcessor(e); + } + else if (name.equalsIgnoreCase("artifacts")) + { + artifactProcessor(e); + } + else + { + throw new ScriptProcessingException("Got invalid element " + name + ": " + e.toString()); + } + } + } + catch (ScriptProcessingException ex) + { + throw ex; + } + catch (Exception ex) + { + + } + } + + public void environmentProcessor(Element e) throws ScriptProcessingException { + NodeList nodeList = e.getChildNodes(); + for (int i = 0; i < nodeList.getLength(); i++) + { + Element var = getElement(nodeList.item(i)); + if (var == null) + continue; + String name = e.getTagName().trim(); + if (name == null || name.length() <= 0) + { + throw new ScriptProcessingException("Got invalid null or empty element"); + } + if (name.equalsIgnoreCase("set")) + { + String varName = requireAttribute(var, "name"); + String varContent = var.getTextContent(); + currentEnvironment.put(varName, varContent); + } + else if (name.equalsIgnoreCase("clear")) + { + String varName = requireAttribute(var, "name"); + currentEnvironment.remove(varName); + } + } + } + + private void cloneProcessor(Element e) { + // TODO Auto-generated method stub + + } + + public File writeScriptToTempFile(String script, String type) throws ScriptProcessingException { + FileWriter writer = null; + File tempFile; + try + { + tempFile = File.createTempFile("job-script", type); + writer = new FileWriter(tempFile); + writer.write(script); + writer.close(); + } + catch (IOException ex) + { + throw new ScriptProcessingException("Unable to save script: " + ex.getMessage(), ex); + } + finally + { + if(writer != null) + { + try + { + writer.close(); + } + catch (IOException e) + { + e.printStackTrace(); + } + } + } + return tempFile; + } + + public int beginProcess(String... args) throws ScriptProcessingException + { + ProcessBuilder processBuilder = new ProcessBuilder(args); + Map environment = processBuilder.environment(); + + for(Entry set : currentEnvironment.entrySet()) + { + environment.put(set.getKey(), set.getValue()); + } + + if(runningProcess != null) + throw new ScriptProcessingException("Previous process not terminated"); + try + { + runningProcess = processBuilder.start(); + return runningProcess.exitValue(); + } + catch (IOException ex) + { + runningProcess = null; + throw new ScriptProcessingException("Unable to run batch script: " + ex.getMessage(), ex); + } + } + + private void batchProcessor(Element e) throws ScriptProcessingException { + File file = writeScriptToTempFile(e.getTextContent(), ".bat"); + int returnCode = beginProcess(properties.getProperty("win-cmd", "cmd.exe"), "/c", file.getAbsolutePath()); + if(returnCode != 0) + throw new ScriptProcessingException("Process returned exit code " + returnCode); + } + + + private void pythonProcessor(Element e) throws ScriptProcessingException { + File file = writeScriptToTempFile(e.getTextContent(), ".py"); + int returnCode = beginProcess(properties.getProperty("python", "python3"), file.getAbsolutePath()); + if(returnCode != 0) + throw new ScriptProcessingException("Process returned exit code " + returnCode); + } + + private void shellProcessor(Element e) throws ScriptProcessingException { + File file = writeScriptToTempFile(e.getTextContent(), ".sh"); + String shellName = getAttribute(e, "which", "bash"); + int returnCode = beginProcess(properties.getProperty(shellName+"-executor", shellName), file.getAbsolutePath()); + if(returnCode != 0) + throw new ScriptProcessingException("Process returned exit code " + returnCode); + } + + private void powershellProcessor(Element e) throws DOMException, ScriptProcessingException { + File file = writeScriptToTempFile(e.getTextContent(), ".ps1"); + int returnCode = beginProcess(properties.getProperty("win-ps", "powershell.exe"), "-ExecutionPolicy", "Bypass", "-File", file.getAbsolutePath()); + if(returnCode != 0) + throw new ScriptProcessingException("Process returned exit code " + returnCode); + } + + private void artifactProcessor(Element e) { + // TODO Auto-generated method stub + + } +} diff --git a/src/com/flaremicro/crossjeeves/net/ClientHandler.java b/src/com/flaremicro/crossjeeves/net/ClientHandler.java new file mode 100644 index 0000000..82deb9d --- /dev/null +++ b/src/com/flaremicro/crossjeeves/net/ClientHandler.java @@ -0,0 +1,81 @@ +package com.flaremicro.crossjeeves.net; + +import java.io.File; +import java.io.IOException; + +import com.flaremicro.crossjeeves.net.packet.Packet; +import com.flaremicro.crossjeeves.net.packet.Packet0Identify; +import com.flaremicro.crossjeeves.net.packet.Packet127KeepAlive; +import com.flaremicro.crossjeeves.net.packet.Packet1Status; +import com.flaremicro.crossjeeves.net.packet.Packet2Script; +import com.flaremicro.crossjeeves.net.packet.Packet3Clone; +import com.flaremicro.crossjeeves.net.packet.Packet4FileData; +import com.flaremicro.crossjeeves.net.packet.Packet5Artifact; +import com.flaremicro.util.ZipUtils; + +public class ClientHandler extends NetworkHandler { + + @Override + public void handlePacket(Packet packet) { + // TODO Auto-generated method stub + + } + + @Override + public void handlePacket(Packet0Identify packet) { + // TODO Auto-generated method stub + + } + + @Override + public void handlePacket(Packet1Status packet) { + // TODO Auto-generated method stub + + } + + @Override + public void handlePacket(Packet2Script packet) { + // TODO Auto-generated method stub + + } + + @Override + public void handlePacket(Packet3Clone packet) { + long fileId = packet.getFileID(); + String workspace = System.getenv("WORKSPACE"); + if(workspace == null || workspace.trim().length() <= 0) + { + //disconnect + } + try + { + File workspaceZip = File.createTempFile("workspace-"+fileId, ".zip"); + ZipUtils.zipDirectory(new File(workspace), workspaceZip); + + } + catch (IOException e) + { + //disconnect + e.printStackTrace(); + } + } + + @Override + public void handlePacket(Packet4FileData packet) { + // TODO Auto-generated method stub + + } + + @Override + public void handlePacket(Packet5Artifact packet) { + // TODO Auto-generated method stub + + } + + @Override + public void handlePacket(Packet127KeepAlive packet) { + // TODO Auto-generated method stub + + } + +} diff --git a/src/com/flaremicro/crossjeeves/net/NetworkHandler.java b/src/com/flaremicro/crossjeeves/net/NetworkHandler.java new file mode 100644 index 0000000..bc9138e --- /dev/null +++ b/src/com/flaremicro/crossjeeves/net/NetworkHandler.java @@ -0,0 +1,24 @@ +package com.flaremicro.crossjeeves.net; + +import com.flaremicro.crossjeeves.net.packet.Packet; +import com.flaremicro.crossjeeves.net.packet.Packet0Identify; +import com.flaremicro.crossjeeves.net.packet.Packet127KeepAlive; +import com.flaremicro.crossjeeves.net.packet.Packet1Status; +import com.flaremicro.crossjeeves.net.packet.Packet2Script; +import com.flaremicro.crossjeeves.net.packet.Packet3Clone; +import com.flaremicro.crossjeeves.net.packet.Packet4FileData; +import com.flaremicro.crossjeeves.net.packet.Packet5Artifact; + +public abstract class NetworkHandler { + + public abstract void handlePacket(Packet packet); + + public abstract void handlePacket(Packet0Identify packet); + public abstract void handlePacket(Packet1Status packet); + public abstract void handlePacket(Packet2Script packet); + public abstract void handlePacket(Packet3Clone packet); + public abstract void handlePacket(Packet4FileData packet); + public abstract void handlePacket(Packet5Artifact packet); + public abstract void handlePacket(Packet127KeepAlive packet); + +} diff --git a/src/com/flaremicro/crossjeeves/net/ServerHandler.java b/src/com/flaremicro/crossjeeves/net/ServerHandler.java new file mode 100644 index 0000000..9e6857b --- /dev/null +++ b/src/com/flaremicro/crossjeeves/net/ServerHandler.java @@ -0,0 +1,59 @@ +package com.flaremicro.crossjeeves.net; + +import com.flaremicro.crossjeeves.net.packet.Packet; +import com.flaremicro.crossjeeves.net.packet.Packet0Identify; +import com.flaremicro.crossjeeves.net.packet.Packet127KeepAlive; +import com.flaremicro.crossjeeves.net.packet.Packet1Status; +import com.flaremicro.crossjeeves.net.packet.Packet2Script; +import com.flaremicro.crossjeeves.net.packet.Packet3Clone; +import com.flaremicro.crossjeeves.net.packet.Packet4FileData; +import com.flaremicro.crossjeeves.net.packet.Packet5Artifact; + +public class ServerHandler extends NetworkHandler { + + @Override + public void handlePacket(Packet packet) { + // TODO Auto-generated method stub + + } + + @Override + public void handlePacket(Packet0Identify packet) { + // TODO Auto-generated method stub + + } + + @Override + public void handlePacket(Packet1Status packet) { + + } + + @Override + public void handlePacket(Packet2Script packet) { + // TODO Auto-generated method stub + + } + + @Override + public void handlePacket(Packet3Clone packet) { + } + + @Override + public void handlePacket(Packet4FileData packet) { + // TODO Auto-generated method stub + + } + + @Override + public void handlePacket(Packet5Artifact packet) { + // TODO Auto-generated method stub + + } + + @Override + public void handlePacket(Packet127KeepAlive packet) { + // TODO Auto-generated method stub + + } + +} diff --git a/src/com/flaremicro/crossjeeves/net/packet/Packet.java b/src/com/flaremicro/crossjeeves/net/packet/Packet.java new file mode 100644 index 0000000..5319b4c --- /dev/null +++ b/src/com/flaremicro/crossjeeves/net/packet/Packet.java @@ -0,0 +1,65 @@ +package com.flaremicro.crossjeeves.net.packet; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import com.flaremicro.crossjeeves.net.NetworkHandler; + +public abstract class Packet { + + public static final int PROTOCOL_VERSION = 0; + + public static Map, Byte> packetToOp = new HashMap, Byte>(); + public static Map opToPacket = new HashMap(); + + static + { + registerPacket((byte) 0, new Packet0Identify()); + registerPacket((byte) 1, new Packet1Status()); + registerPacket((byte) 2, new Packet2Script()); + registerPacket((byte) 3, new Packet3Clone()); + registerPacket((byte) 4, new Packet4FileData()); + registerPacket((byte) 5, new Packet5Artifact()); + + registerPacket((byte) 127, new Packet127KeepAlive()); + } + + public abstract Packet cloneTypeOnly(); + + public static void registerPacket(byte opcode, Packet packet) + { + opToPacket.put(Byte.valueOf(opcode), packet); + packetToOp.put(packet.getClass(), Byte.valueOf(opcode)); + } + + public final byte getId() + { + return ((Byte)packetToOp.get(this.getClass())).byteValue(); + } + + public Packet(){ + + } + + public void recievePacket(DataInputStream in) throws IOException { + } + + public void processPacket(NetworkHandler networkHandler){ + networkHandler.handlePacket(this); + } + + public void sendPacket(DataOutputStream out) throws IOException { + out.writeByte(getId()); + } + + public static byte[] toBytes(String data, int length) { + byte[] result = new byte[length]; + System.arraycopy(data.getBytes(), 0, result, 0, data.length()); + return result; + } + + +} diff --git a/src/com/flaremicro/crossjeeves/net/packet/Packet0Identify.java b/src/com/flaremicro/crossjeeves/net/packet/Packet0Identify.java new file mode 100644 index 0000000..555413d --- /dev/null +++ b/src/com/flaremicro/crossjeeves/net/packet/Packet0Identify.java @@ -0,0 +1,42 @@ +package com.flaremicro.crossjeeves.net.packet; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import com.flaremicro.crossjeeves.net.NetworkHandler; + +public class Packet0Identify extends Packet{ + public int protocolVersion; + int flags; + + public Packet0Identify(){ + } + + public Packet0Identify(int flags){ + this.protocolVersion = PROTOCOL_VERSION; + this.flags = flags; + } + + public void recievePacket(DataInputStream in) throws IOException { + this.protocolVersion = in.readInt(); + flags = in.readInt(); + } + + public void sendPacket(DataOutputStream out) throws IOException { + super.sendPacket(out); + out.writeInt(protocolVersion); + out.writeInt(flags); + } + + public void processPacket(NetworkHandler networkHandler){ + networkHandler.handlePacket(this); + } + + @Override + public Packet cloneTypeOnly() { + return new Packet0Identify(); + } + + +} diff --git a/src/com/flaremicro/crossjeeves/net/packet/Packet127KeepAlive.java b/src/com/flaremicro/crossjeeves/net/packet/Packet127KeepAlive.java new file mode 100644 index 0000000..461d98f --- /dev/null +++ b/src/com/flaremicro/crossjeeves/net/packet/Packet127KeepAlive.java @@ -0,0 +1,44 @@ +package com.flaremicro.crossjeeves.net.packet; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import com.flaremicro.crossjeeves.net.NetworkHandler; + +public class Packet127KeepAlive extends Packet{ + long fileId; + short chunkSize; + byte[] fileChunk; + + public Packet127KeepAlive(){ + } + + public Packet127KeepAlive(long fileId, byte[] fileChunk){ + this.fileId = fileId; + this.chunkSize = (short)fileChunk.length; + this.fileChunk = fileChunk; + } + + public void recievePacket(DataInputStream in) throws IOException { + fileId = in.readLong(); + } + + public void sendPacket(DataOutputStream out) throws IOException { + super.sendPacket(out); + out.writeLong(fileId); + out.writeShort(chunkSize); + out.write(fileChunk); + } + + public void processPacket(NetworkHandler networkHandler){ + networkHandler.handlePacket(this); + } + + @Override + public Packet cloneTypeOnly() { + return new Packet127KeepAlive(); + } + + +} diff --git a/src/com/flaremicro/crossjeeves/net/packet/Packet1Status.java b/src/com/flaremicro/crossjeeves/net/packet/Packet1Status.java new file mode 100644 index 0000000..45a6001 --- /dev/null +++ b/src/com/flaremicro/crossjeeves/net/packet/Packet1Status.java @@ -0,0 +1,41 @@ +package com.flaremicro.crossjeeves.net.packet; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import com.flaremicro.crossjeeves.net.NetworkHandler; + +public class Packet1Status extends Packet{ + public int protocolVersion; + int flags; + + public static final int BUSY = 0x00000001; + + public Packet1Status(){ + } + + public Packet1Status(int flags){ + this.flags = flags; + } + + public void recievePacket(DataInputStream in) throws IOException { + flags = in.readInt(); + } + + public void sendPacket(DataOutputStream out) throws IOException { + super.sendPacket(out); + out.writeInt(flags); + } + + public void processPacket(NetworkHandler networkHandler){ + networkHandler.handlePacket(this); + } + + @Override + public Packet cloneTypeOnly() { + return new Packet1Status(); + } + + +} diff --git a/src/com/flaremicro/crossjeeves/net/packet/Packet2Script.java b/src/com/flaremicro/crossjeeves/net/packet/Packet2Script.java new file mode 100644 index 0000000..d80a8f1 --- /dev/null +++ b/src/com/flaremicro/crossjeeves/net/packet/Packet2Script.java @@ -0,0 +1,38 @@ +package com.flaremicro.crossjeeves.net.packet; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import com.flaremicro.crossjeeves.net.NetworkHandler; + +public class Packet2Script extends Packet{ + String script; + + public Packet2Script(){ + } + + public Packet2Script(String script){ + this.script = script; + } + + public void recievePacket(DataInputStream in) throws IOException { + script = in.readUTF(); + } + + public void sendPacket(DataOutputStream out) throws IOException { + super.sendPacket(out); + out.writeUTF(script); + } + + public void processPacket(NetworkHandler networkHandler){ + networkHandler.handlePacket(this); + } + + @Override + public Packet cloneTypeOnly() { + return new Packet2Script(); + } + + +} diff --git a/src/com/flaremicro/crossjeeves/net/packet/Packet3Clone.java b/src/com/flaremicro/crossjeeves/net/packet/Packet3Clone.java new file mode 100644 index 0000000..33f3896 --- /dev/null +++ b/src/com/flaremicro/crossjeeves/net/packet/Packet3Clone.java @@ -0,0 +1,51 @@ +package com.flaremicro.crossjeeves.net.packet; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import com.flaremicro.crossjeeves.net.NetworkHandler; + +public class Packet3Clone extends Packet{ + long fileId; + long fileSize; + + public Packet3Clone(){ + } + + //TODO more parameters + public Packet3Clone(long fileId, long fileSize){ + this.fileId = fileId; + this.fileSize = fileSize; + } + + public void recievePacket(DataInputStream in) throws IOException { + fileId = in.readLong(); + fileSize = in.readLong(); + } + + public void sendPacket(DataOutputStream out) throws IOException { + super.sendPacket(out); + out.writeLong(fileId); + out.writeLong(fileSize); + } + + public void processPacket(NetworkHandler networkHandler){ + networkHandler.handlePacket(this); + } + + @Override + public Packet cloneTypeOnly() { + return new Packet3Clone(); + } + + public long getFileID() { + return fileId; + } + + public long getFileSize() { + return fileSize; + } + + +} diff --git a/src/com/flaremicro/crossjeeves/net/packet/Packet4FileData.java b/src/com/flaremicro/crossjeeves/net/packet/Packet4FileData.java new file mode 100644 index 0000000..8d05165 --- /dev/null +++ b/src/com/flaremicro/crossjeeves/net/packet/Packet4FileData.java @@ -0,0 +1,45 @@ +package com.flaremicro.crossjeeves.net.packet; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import com.flaremicro.crossjeeves.net.NetworkHandler; + +public class Packet4FileData extends Packet{ + long fileId; + byte[] fileChunk; + + public Packet4FileData(){ + } + + public Packet4FileData(long fileId, byte[] fileChunk){ + this.fileId = fileId; + this.fileChunk = fileChunk; + } + + public void recievePacket(DataInputStream in) throws IOException { + fileId = in.readLong(); + int chunkSize = in.readShort(); + fileChunk = new byte[chunkSize]; + in.readFully(fileChunk); + } + + public void sendPacket(DataOutputStream out) throws IOException { + super.sendPacket(out); + out.writeLong(fileId); + out.writeShort(fileChunk.length); + out.write(fileChunk); + } + + public void processPacket(NetworkHandler networkHandler){ + networkHandler.handlePacket(this); + } + + @Override + public Packet cloneTypeOnly() { + return new Packet4FileData(); + } + + +} diff --git a/src/com/flaremicro/crossjeeves/net/packet/Packet5Artifact.java b/src/com/flaremicro/crossjeeves/net/packet/Packet5Artifact.java new file mode 100644 index 0000000..5569b83 --- /dev/null +++ b/src/com/flaremicro/crossjeeves/net/packet/Packet5Artifact.java @@ -0,0 +1,41 @@ +package com.flaremicro.crossjeeves.net.packet; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import com.flaremicro.crossjeeves.net.NetworkHandler; + +public class Packet5Artifact extends Packet{ + long fileId; + String relativeFile; + + public Packet5Artifact(){ + } + + public Packet5Artifact(long fileId, String relativeFile){ + this.fileId = fileId; + } + + public void recievePacket(DataInputStream in) throws IOException { + fileId = in.readLong(); + relativeFile = in.readUTF(); + } + + public void sendPacket(DataOutputStream out) throws IOException { + super.sendPacket(out); + out.writeLong(fileId); + out.writeUTF(relativeFile); + } + + public void processPacket(NetworkHandler networkHandler){ + networkHandler.handlePacket(this); + } + + @Override + public Packet cloneTypeOnly() { + return new Packet5Artifact(); + } + + +} diff --git a/src/com/flaremicro/util/Util.java b/src/com/flaremicro/util/Util.java new file mode 100644 index 0000000..aec920d --- /dev/null +++ b/src/com/flaremicro/util/Util.java @@ -0,0 +1,35 @@ +package com.flaremicro.util; + +import java.util.HashMap; +import java.util.Map; + +public class Util { + public static Map parseArgs(String[] args, boolean toLowercaseKey, boolean exceptOnDuplicateKey) + { + Map map = new HashMap(); + for(String arg : args) + { + String key, value; + if(arg.contains("=")) + { + String[] param = arg.split("=", 1); + key = param[0]; + value = param[1]; + } + else + { + key = arg; + value = "isset"; + } + if(!map.containsKey(value)) + { + map.put(key, value); + } + else if(exceptOnDuplicateKey) + { + throw new RuntimeException("Duplicate parameter"); + } + } + return map; + } +} diff --git a/src/com/flaremicro/util/ZipUtils.java b/src/com/flaremicro/util/ZipUtils.java new file mode 100644 index 0000000..dbdf601 --- /dev/null +++ b/src/com/flaremicro/util/ZipUtils.java @@ -0,0 +1,49 @@ +package com.flaremicro.util; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +public class ZipUtils { + + + public static void zipDirectory(File sourceDir, File zipFile) throws IOException { + FileOutputStream fos = new FileOutputStream(zipFile); + ZipOutputStream zos = new ZipOutputStream(fos); + try { + zipFilesRecursively(sourceDir, sourceDir, zos); + } finally { + zos.close(); + } + } + + private static void zipFilesRecursively(File rootDir, File source, ZipOutputStream zos) throws IOException { + if (source.isDirectory()) { + File[] files = source.listFiles(); + if (files != null) { + for (File file : files) { + zipFilesRecursively(rootDir, file, zos); + } + } + } else { + FileInputStream fis = new FileInputStream(source); + try { + // Create the relative path for the entry + String zipEntryName = source.getAbsolutePath().substring(rootDir.getAbsolutePath().length() + 1).replace("\\", "/"); + ZipEntry zipEntry = new ZipEntry(zipEntryName); + zos.putNextEntry(zipEntry); + + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = fis.read(buffer)) != -1) { + zos.write(buffer, 0, bytesRead); + } + zos.closeEntry(); + } finally { + fis.close(); + } + } + } +} \ No newline at end of file diff --git a/src/test.xml b/src/test.xml new file mode 100644 index 0000000..6d74a97 --- /dev/null +++ b/src/test.xml @@ -0,0 +1,27 @@ + + + Variable Contents + + + + + echo this could be a whole batch script or just one command + + + print("this could be a whole python script or just one call") + + + echo "this could be a whole sh script or just one command" + + + echo "this could be a whole powershell script or just one command" + + + + + dist/* + + dist/ + + + \ No newline at end of file