summaryrefslogtreecommitdiff
path: root/python/examples/version_switcher.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/examples/version_switcher.py')
-rw-r--r--python/examples/version_switcher.py150
1 files changed, 150 insertions, 0 deletions
diff --git a/python/examples/version_switcher.py b/python/examples/version_switcher.py
new file mode 100644
index 00000000..9d5bbf05
--- /dev/null
+++ b/python/examples/version_switcher.py
@@ -0,0 +1,150 @@
+#!/usr/bin/env python
+# Copyright (c) 2015-2016 Vector 35 LLC
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+# IN THE SOFTWARE.
+
+import sys
+
+from binaryninja.update import UpdateChannel, are_auto_updates_enabled, set_auto_updates_enabled, is_update_installation_pending, install_pending_update
+from binaryninja import core_version
+import datetime
+
+chandefault = UpdateChannel.list[0].name
+channel = None
+versions = []
+
+
+def load_channel(newchannel):
+ global channel
+ global versions
+ if (channel is not None and newchannel == channel.name):
+ print "Same channel, not updating."
+ else:
+ try:
+ print "Loading channel %s" % newchannel
+ channel = UpdateChannel[newchannel]
+ print "Loading versions..."
+ versions = channel.versions
+ except Exception:
+ print "%s is not a valid channel name. Defaulting to " % chandefault
+ channel = UpdateChannel[chandefault]
+
+
+def select(version):
+ done = False
+ date = datetime.datetime.fromtimestamp(version.time).strftime('%c')
+ while not done:
+ print "Version:\t%s" % version.version
+ print "Updated:\t%s" % date
+ print "Notes:\n\n-----\n%s" % version.notes
+ print "-----"
+ print "\t1)\tSwitch to version"
+ print "\t2)\tMain Menu"
+ selection = raw_input('Choice: ')
+ if selection.isdigit():
+ selection = int(selection)
+ else:
+ selection = 0
+ if (selection == 2):
+ done = True
+ elif (selection == 1):
+ if (version.version == channel.latest_version.version):
+ print "Requesting update to latest version."
+ else:
+ print "Requesting update to prior version."
+ if are_auto_updates_enabled():
+ print "Disabling automatic updates."
+ set_auto_updates_enabled(False)
+ if (version.version == core_version):
+ print "Already running %s" % version.version
+ else:
+ print "version.version %s" % version.version
+ print "core_version %s" % core_version
+ print "Downloading..."
+ print version.update()
+ print "Installing..."
+ if is_update_installation_pending:
+ #note that the GUI will be launched after update but should still do the upgrade headless
+ install_pending_update()
+ # forward updating won't work without reloading
+ sys.exit()
+ else:
+ print "Invalid selection"
+
+
+def list_channels():
+ done = False
+ print "\tSelect channel:\n"
+ while not done:
+ channel_list = UpdateChannel.list
+ for index, item in enumerate(channel_list):
+ print "\t%d)\t%s" % (index + 1, item.name)
+ print "\t%d)\t%s" % (len(channel_list) + 1, "Main Menu")
+ selection = raw_input('Choice: ')
+ if selection.isdigit():
+ selection = int(selection)
+ else:
+ selection = 0
+ if (selection <= 0 or selection > len(channel_list) + 1):
+ print "%s is an invalid choice." % selection
+ else:
+ done = True
+ if (selection != len(channel_list) + 1):
+ load_channel(channel_list[selection - 1].name)
+
+
+def toggle_updates():
+ set_auto_updates_enabled(not are_auto_updates_enabled())
+
+
+def main():
+ global channel
+ done = False
+ load_channel(chandefault)
+ while not done:
+ print "\n\tBinary Ninja Version Switcher"
+ print "\t\tCurrent Channel:\t%s" % channel.name
+ print "\t\tCurrent Version:\t%s" % core_version
+ print "\t\tAuto-Updates On:\t%s\n" % are_auto_updates_enabled()
+ for index, version in enumerate(versions):
+ date = datetime.datetime.fromtimestamp(version.time).strftime('%c')
+ print "\t%d)\t%s (%s)" % (index + 1, version.version, date)
+ print "\t%d)\t%s" % (len(versions) + 1, "Switch Channel")
+ print "\t%d)\t%s" % (len(versions) + 2, "Toggle Auto Updates")
+ print "\t%d)\t%s" % (len(versions) + 3, "Exit")
+ selection = raw_input('Choice: ')
+ if selection.isdigit():
+ selection = int(selection)
+ else:
+ selection = 0
+ if (selection <= 0 or selection > len(versions) + 3):
+ print "%d is an invalid choice.\n\n" % selection
+ else:
+ if (selection == len(versions) + 3):
+ done = True
+ elif (selection == len(versions) + 2):
+ toggle_updates()
+ elif (selection == len(versions) + 1):
+ list_channels()
+ else:
+ select(versions[selection - 1])
+
+
+if __name__ == "__main__":
+ main()